diff --git a/.gn b/.gn index 4b0b203..727405fb 100644 --- a/.gn +++ b/.gn
@@ -27,6 +27,7 @@ "//chrome/common/*", "//chrome/installer/*", "//chrome/third_party/mozilla_security_manager/*", + "//chrome/utility/*", "//chromecast/*", "//chrome_elf/*", "//cloud_print/*",
diff --git a/AUTHORS b/AUTHORS index 1d4a7b253..1775d53d 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -610,6 +610,7 @@ Will Hirsch <chromium@willhirsch.co.uk> William Xie <william.xie@intel.com> Xiang Long <xiang.long@intel.com> +Xiaolei Yu <dreifachstein@gmail.com> Xinchao He <hexinchao@gmail.com> Xing Zhang <xzhang@adobe.com> Xu Samuel <samuel.xu@intel.com>
diff --git a/BUILD.gn b/BUILD.gn index 534bf9c..5207cb2 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -278,42 +278,18 @@ "//components/invalidation/impl:components_invalidation_impl_junit_tests", "//components/policy/android:components_policy_junit_tests", "//content/public/android:content_junit_tests", + "//content/shell/android:content_shell_apk", + "//content/test:video_decode_accelerator_unittest", "//net/android:net_junit_tests", "//testing/android/junit:junit_unittests", + "//third_party/android_tools:uiautomator_java", "//third_party/errorprone:chromium_errorprone", + "//third_party/smhasher:murmurhash3", "//tools/android:android_tools", "//tools/android:memconsumer", "//tools/android/heap_profiler:heap_profiler_unittests", "//tools/android/kerberos/SpnegoAuthenticator:spnego_authenticator_apk", "//tools/imagediff($host_toolchain)", - - # TODO(GYP): Remove these when the components_unittests work. - "//components/history/core/test:test", - "//components/policy:policy_component_test_support", - "//components/policy:test_support", - "//components/rappor:test_support", - "//components/signin/core/browser:test_support", - "//components/sync_driver:test_support", - "//components/user_manager", - "//components/wallpaper", - "//content/shell/android:content_shell_apk", - "//content/test:video_decode_accelerator_unittest", - - # TODO(GYP): Are these needed, or will they be pulled in automatically? - "//third_party/android_tools:android_gcm_java", - "//third_party/android_tools:android_support_v13_java", - "//third_party/android_tools:android_support_v7_appcompat_java", - "//third_party/android_tools:android_support_v7_mediarouter_java", - "//third_party/android_tools:uiautomator_java", - "//third_party/mesa", - "//third_party/mockito:mockito_java", - "//third_party/openmax_dl/dl", - "//ui/android:ui_java", - - # TODO(GYP): Are these needed? - "//chrome/test:test_support_unit", - "//third_party/smhasher:murmurhash3", - "//ui/message_center:test_support", ] deps -= [ "//net:net_perftests",
diff --git a/DEPS b/DEPS index c5c7702..41e6ec5d 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': '70509762c88df911c58c3984e6b1e673b5ecaeac', + 'skia_revision': '3819d2d767a1d25e5d2fef319741502eaffd4ed4', # 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': '6f5639eaa2f4a26aa00a3c172bbb1d5ce08130a4', + 'v8_revision': '9c7f2d70322cb9098f091bb4b00aa9bdeb0c758d', # 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. @@ -63,7 +63,7 @@ # 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. - 'openmax_dl_revision': '7a179b97899cf33d4a12c7ef590176c519016f4d', + 'openmax_dl_revision': 'ff8766d39ce6b9c1c59fd6b752833e138852e778', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -271,7 +271,7 @@ 'src/third_party/catapult': Var('chromium_git') + '/external/github.com/catapult-project/catapult.git' + '@' + - '4fdbcfa96dc806cfd03b23728d92e630221971ec', + '3392bbea5af11e182657b154957ebe9871c61411', 'src/third_party/openh264/src': Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b37cda248234162033e3e11b0335f3131cdfe488',
diff --git a/android_webview/browser/net/android_stream_reader_url_request_job.cc b/android_webview/browser/net/android_stream_reader_url_request_job.cc index dc288faa5..7b63a69 100644 --- a/android_webview/browser/net/android_stream_reader_url_request_job.cc +++ b/android_webview/browser/net/android_stream_reader_url_request_job.cc
@@ -16,6 +16,7 @@ #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/task_runner.h" +#include "base/thread_task_runner_handle.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread.h" #include "content/public/browser/browser_thread.h"
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java index abf9094..f417b696 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
@@ -4,7 +4,6 @@ package org.chromium.android_webview.test; -import android.graphics.Color; import android.test.suitebuilder.annotation.SmallTest; import android.view.View; import android.view.ViewGroup.LayoutParams; @@ -321,7 +320,7 @@ mOnContentSizeChangedHelper, expectedWidthCss, expectedHeightCss, false); GraphicsTestUtils.pollForBackgroundColor( - testContainerView.getAwContents(), Color.rgb(0x22, 0x77, 0x88)); + testContainerView.getAwContents(), 0xFF227788); } @SmallTest
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsRenderTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsRenderTest.java index a1a6c07..47aefc5 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsRenderTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsRenderTest.java
@@ -63,16 +63,15 @@ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), "data:text/html,<html><head><style>body {background-color:#227788}</style></head>" + "<body></body></html>"); - GraphicsTestUtils.pollForBackgroundColor(mAwContents, Color.rgb(0x22, 0x77, 0x88)); + final int teal = 0xFF227788; + GraphicsTestUtils.pollForBackgroundColor(mAwContents, teal); // Changing the base background should not override CSS background. setBackgroundColorOnUiThread(Color.MAGENTA); - assertEquals(Color.rgb(0x22, 0x77, 0x88), - GraphicsTestUtils.sampleBackgroundColorOnUiThread(mAwContents)); + assertEquals(teal, GraphicsTestUtils.sampleBackgroundColorOnUiThread(mAwContents)); // ...setting the background is asynchronous, so pause a bit and retest just to be sure. Thread.sleep(500); - assertEquals(Color.rgb(0x22, 0x77, 0x88), - GraphicsTestUtils.sampleBackgroundColorOnUiThread(mAwContents)); + assertEquals(teal, GraphicsTestUtils.sampleBackgroundColorOnUiThread(mAwContents)); } @SmallTest
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java index bf63aa7..2b681db 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -10,7 +10,6 @@ import org.chromium.android_webview.test.util.CommonResources; import org.chromium.android_webview.test.util.JSUtils; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.parameter.ParameterizedTest; import org.chromium.content.browser.test.util.TestCallbackHelperContainer; import org.chromium.net.test.util.TestWebServer; @@ -149,8 +148,6 @@ @MediumTest @Feature({"AndroidWebView"}) - // Run in single-process mode only. Blocked by multiple RVHs crbug.com/533516. - @ParameterizedTest.Set public void testNotCalledForValidSubresources() throws Throwable { TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = mContentsClient.getOnPageFinishedHelper(); @@ -374,8 +371,6 @@ @MediumTest @Feature({"AndroidWebView"}) - // Run in single-process mode only. Blocked by multiple RVHs crbug.com/533516. - @ParameterizedTest.Set public void testNotCalledOnDomModificationAfterLoadData() throws Throwable { TestWebServer webServer = TestWebServer.start();
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/LoadDataWithBaseUrlTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/LoadDataWithBaseUrlTest.java index 9318746a..c30caa7 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/LoadDataWithBaseUrlTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/LoadDataWithBaseUrlTest.java
@@ -185,8 +185,6 @@ @SmallTest @Feature({"AndroidWebView"}) - // Run in single-process mode only. Blocked by multiple RVHs crbug.com/533516. - @ParameterizedTest.Set public void testHistoryUrl() throws Throwable { final String pageHtml = "<html><body>Hello, world!</body></html>"; @@ -205,8 +203,6 @@ @SmallTest @Feature({"AndroidWebView"}) - // Run in single-process mode only. Blocked by multiple RVHs crbug.com/533516. - @ParameterizedTest.Set public void testOnPageFinishedUrlIsBaseUrl() throws Throwable { final String pageHtml = "<html><body>Hello, world!</body></html>"; final String baseUrl = "http://example.com/";
diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc index 8817abc..3fae6d4 100644 --- a/android_webview/native/aw_settings.cc +++ b/android_webview/native/aw_settings.cc
@@ -236,17 +236,9 @@ } } -void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) { - // A single WebContents can normally have 0 to many RenderViewHost instances - // associated with it. - // This is important since there is only one RenderViewHostExt instance per - // WebContents (and not one RVHExt per RVH, as you might expect) and updating - // settings via RVHExt only ever updates the 'current' RVH. - // In android_webview we don't swap out the RVH on cross-site navigations, so - // we shouldn't have to deal with the multiple RVH per WebContents case. That - // in turn means that the newly created RVH is always the 'current' RVH - // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK. - DCHECK_EQ(render_view_host, web_contents()->GetRenderViewHost()); +void AwSettings::RenderViewHostChanged(content::RenderViewHost* old_host, + content::RenderViewHost* new_host) { + DCHECK_EQ(new_host, web_contents()->GetRenderViewHost()); UpdateEverything(); }
diff --git a/android_webview/native/aw_settings.h b/android_webview/native/aw_settings.h index 79d4f758..8014489 100644 --- a/android_webview/native/aw_settings.h +++ b/android_webview/native/aw_settings.h
@@ -64,7 +64,8 @@ void UpdateEverything(); // WebContentsObserver overrides: - void RenderViewCreated(content::RenderViewHost* render_view_host) override; + void RenderViewHostChanged(content::RenderViewHost* old_host, + content::RenderViewHost* new_host) override; void WebContentsDestroyed() override; bool renderer_prefs_initialized_;
diff --git a/android_webview/tools/WebViewShell/test/webexposed/global-interface-listing-expected.txt b/android_webview/tools/WebViewShell/test/webexposed/global-interface-listing-expected.txt index 9074af1..ccffac36 100644 --- a/android_webview/tools/WebViewShell/test/webexposed/global-interface-listing-expected.txt +++ b/android_webview/tools/WebViewShell/test/webexposed/global-interface-listing-expected.txt
@@ -226,6 +226,9 @@ getter type method constructor method slice +interface BlobEvent : Event + getter data + method constructor interface CDATASection : Text method constructor interface CSS @@ -944,10 +947,6 @@ getter onpaste getter onsearch getter onselectstart - getter ontouchcancel - getter ontouchend - getter ontouchmove - getter ontouchstart getter onwebkitfullscreenchange getter onwebkitfullscreenerror getter onwheel @@ -1008,10 +1007,6 @@ setter onpaste setter onsearch setter onselectstart - setter ontouchcancel - setter ontouchend - setter ontouchmove - setter ontouchstart setter onwebkitfullscreenchange setter onwebkitfullscreenerror setter onwheel @@ -1299,9 +1294,11 @@ getter onpagehide getter onpageshow getter onpopstate + getter onrejectionhandled getter onresize getter onscroll getter onstorage + getter onunhandledrejection getter onunload getter text getter vLink @@ -1324,9 +1321,11 @@ setter onpagehide setter onpageshow setter onpopstate + setter onrejectionhandled setter onresize setter onscroll setter onstorage + setter onunhandledrejection setter onunload setter text setter vLink @@ -1495,6 +1494,10 @@ getter onsuspend getter ontimeupdate getter ontoggle + getter ontouchcancel + getter ontouchend + getter ontouchmove + getter ontouchstart getter onvolumechange getter onwaiting getter outerText @@ -1572,6 +1575,10 @@ setter onsuspend setter ontimeupdate setter ontoggle + setter ontouchcancel + setter ontouchend + setter ontouchmove + setter ontouchstart setter onvolumechange setter onwaiting setter outerText @@ -1684,9 +1691,11 @@ getter onpagehide getter onpageshow getter onpopstate + getter onrejectionhandled getter onresize getter onscroll getter onstorage + getter onunhandledrejection getter onunload getter rows method constructor @@ -1705,9 +1714,11 @@ setter onpagehide setter onpageshow setter onpopstate + setter onrejectionhandled setter onresize setter onscroll setter onstorage + setter onunhandledrejection setter onunload setter rows interface HTMLHRElement : HTMLElement @@ -2022,6 +2033,7 @@ getter currentTime getter defaultMuted getter defaultPlaybackRate + getter disableRemotePlayback getter duration getter ended getter error @@ -2055,6 +2067,7 @@ setter currentTime setter defaultMuted setter defaultPlaybackRate + setter disableRemotePlayback setter loop setter muted setter onencrypted @@ -2701,6 +2714,7 @@ attribute DOM_KEY_LOCATION_STANDARD getter altKey getter charCode + getter code getter ctrlKey getter keyCode getter keyIdentifier @@ -2837,6 +2851,31 @@ getter matches getter media method constructor +interface MediaRecorder : EventTarget + static method isTypeSupported + getter ignoreMutedMedia + getter mimeType + getter ondataavailable + getter onerror + getter onpause + getter onresume + getter onstart + getter onstop + getter state + getter stream + method constructor + method pause + method requestData + method resume + method start + method stop + setter ignoreMutedMedia + setter ondataavailable + setter onerror + setter onpause + setter onresume + setter onstart + setter onstop interface MediaSource : EventTarget static method isTypeSupported getter activeSourceBuffers @@ -3008,9 +3047,12 @@ method vibrate method webkitGetUserMedia interface NetworkInformation : EventTarget + getter downlinkMax + getter onchange getter ontypechange getter type method constructor + setter onchange setter ontypechange interface Node : EventTarget attribute ATTRIBUTE_NODE @@ -3100,7 +3142,9 @@ interface OfflineAudioContext : AudioContext getter oncomplete method constructor + method resume method startRendering + method suspend setter oncomplete interface Option method constructor @@ -3236,6 +3280,10 @@ getter loaded getter total method constructor +interface PromiseRejectionEvent : Event + getter promise + getter reason + method constructor interface RTCIceCandidate getter candidate getter sdpMLineIndex @@ -3533,6 +3581,10 @@ getter onsuspend getter ontimeupdate getter ontoggle + getter ontouchcancel + getter ontouchend + getter ontouchmove + getter ontouchstart getter onvolumechange getter onwaiting getter ownerSVGElement @@ -3599,6 +3651,10 @@ setter onsuspend setter ontimeupdate setter ontoggle + setter ontouchcancel + setter ontouchend + setter ontouchmove + setter ontouchstart setter onvolumechange setter onwaiting setter style @@ -3904,7 +3960,6 @@ method getBBox method getCTM method getScreenCTM - method getTransformToElement interface SVGImageElement : SVGGraphicsElement getter height getter href @@ -4415,6 +4470,7 @@ interface ServiceWorkerRegistration : EventTarget getter onupdatefound getter scope + getter sync method constructor method unregister method update @@ -4475,6 +4531,10 @@ method unwrapKey method verify method wrapKey +interface SyncManager + method constructor + method getTags + method register interface Text : CharacterData getter wholeText method constructor @@ -5514,7 +5574,9 @@ interface webkitOfflineAudioContext : AudioContext getter oncomplete method constructor + method resume method startRendering + method suspend setter oncomplete interface webkitRTCPeerConnection : EventTarget getter iceConnectionState @@ -5665,6 +5727,7 @@ attribute onpopstate attribute onprogress attribute onratechange + attribute onrejectionhandled attribute onreset attribute onresize attribute onscroll @@ -5684,6 +5747,7 @@ attribute ontouchmove attribute ontouchstart attribute ontransitionend + attribute onunhandledrejection attribute onunload attribute onvolumechange attribute onwaiting
diff --git a/base/BUILD.gn b/base/BUILD.gn index 94c7a86..90716ba 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -48,42 +48,58 @@ } } -source_set("base_paths") { - sources = [ - "base_paths.cc", - "base_paths.h", - "base_paths_android.cc", - "base_paths_android.h", - "base_paths_mac.h", - "base_paths_mac.mm", - "base_paths_posix.cc", - "base_paths_posix.h", - "base_paths_win.cc", - "base_paths_win.h", - ] - - if (is_android || is_mac || is_ios) { - sources -= [ "base_paths_posix.cc" ] +if (is_nacl) { + # None of the files apply to nacl, and we can't make an empty static library. + group("base_paths") { } - - if (is_nacl) { - sources -= [ +} else { + static_library("base_paths") { + sources = [ "base_paths.cc", + "base_paths.h", + "base_paths_android.cc", + "base_paths_android.h", + "base_paths_mac.h", + "base_paths_mac.mm", "base_paths_posix.cc", + "base_paths_posix.h", + "base_paths_win.cc", + "base_paths_win.h", ] + + if (is_android || is_mac || is_ios) { + sources -= [ "base_paths_posix.cc" ] + } + + configs += [ ":base_implementation" ] + + deps = [ + "//base/memory", + "//base/process", + ] + + visibility = [ ":base" ] } - - configs += [ ":base_implementation" ] - - deps = [ - "//base/memory", - "//base/process", - ] - - visibility = [ ":base" ] } -component("base") { +# Base and everything it depends on should be a static library rather than +# a source set. Base is more of a "library" in the classic sense in that many +# small parts of it are used in many different contexts. This combined with a +# few static initializers floating around means that dead code stripping +# still leaves a lot of code behind that isn't always used. For example, this +# saves more than 40K for a smaller target like chrome_elf. +# +# Use static libraries for the helper stuff as well like //base/debug since +# those things refer back to base code, which will force base compilation units +# to be linked in where they wouldn't have otherwise. This does not include +# test code (test support and anything in the test directory) which should use +# source_set as is recommended for GN targets). +if (is_component_build) { + base_target_type = "shared_library" +} else { + base_target_type = "static_library" +} +target(base_target_type, "base") { sources = [ "allocator/allocator_extension.cc", "allocator/allocator_extension.h", @@ -985,7 +1001,7 @@ # This is the subset of files from base that should not be used with a dynamic # library. Note that this library cannot depend on base because base depends on # base_static. -source_set("base_static") { +static_library("base_static") { sources = [ "base_switches.cc", "base_switches.h",
diff --git a/base/bind.h b/base/bind.h index 9b55924..4c2abed 100644 --- a/base/bind.h +++ b/base/bind.h
@@ -47,22 +47,6 @@ namespace base { -template <typename Functor> -base::Callback< - typename internal::BindState< - typename internal::FunctorTraits<Functor>::RunnableType, - typename internal::FunctorTraits<Functor>::RunType>::UnboundRunType> -Bind(Functor functor) { - // Typedefs for how to store and run the functor. - typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType; - typedef typename internal::FunctorTraits<Functor>::RunType RunType; - - typedef internal::BindState<RunnableType, RunType> BindState; - - return Callback<typename BindState::UnboundRunType>( - new BindState(internal::MakeRunnable(functor))); -} - template <typename Functor, typename... Args> base::Callback< typename internal::BindState< @@ -80,12 +64,16 @@ // functor is going to interpret the argument as. typedef typename RunnableType::RunType BoundRunType; + using BoundArgs = + internal::TakeTypeListItem<sizeof...(Args), + internal::ExtractArgs<BoundRunType>>; + // Do not allow binding a non-const reference parameter. Non-const reference // parameters are disallowed by the Google style guide. Also, binding a // non-const reference parameter can make for subtle bugs because the // invoked function will receive a reference to the stored copy of the // argument and not the original. - static_assert(!internal::HasNonConstReferenceParam<BoundRunType>::value, + static_assert(!internal::HasNonConstReferenceItem<BoundArgs>::value, "do not bind functions with nonconst ref"); const bool is_method = internal::HasIsMethodTag<RunnableType>::value;
diff --git a/base/bind_helpers.h b/base/bind_helpers.h index 434520a..68867c3c 100644 --- a/base/bind_helpers.h +++ b/base/bind_helpers.h
@@ -527,6 +527,31 @@ template <size_t n, typename List> using DropTypeListItem = typename DropTypeListItemImpl<n, List>::Type; +// Used for TakeTypeListItem implementation. +template <size_t n, typename List, typename... Accum> +struct TakeTypeListItemImpl; + +// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure. +template <size_t n, typename T, typename... List, typename... Accum> +struct TakeTypeListItemImpl<n, TypeList<T, List...>, Accum...> + : TakeTypeListItemImpl<n - 1, TypeList<List...>, Accum..., T> {}; + +template <typename T, typename... List, typename... Accum> +struct TakeTypeListItemImpl<0, TypeList<T, List...>, Accum...> { + using Type = TypeList<Accum...>; +}; + +template <typename... Accum> +struct TakeTypeListItemImpl<0, TypeList<>, Accum...> { + using Type = TypeList<Accum...>; +}; + +// A type-level function that takes first |n| list item from given TypeList. +// E.g. TakeTypeListItem<3, TypeList<A, B, C, D>> is evaluated to +// TypeList<A, B, C>. +template <size_t n, typename List> +using TakeTypeListItem = typename TakeTypeListItemImpl<n, List>::Type; + // Used for ConcatTypeLists implementation. template <typename List1, typename List2> struct ConcatTypeListsImpl; @@ -554,6 +579,20 @@ template <typename R, typename ArgList> using MakeFunctionType = typename MakeFunctionTypeImpl<R, ArgList>::Type; +// Used for ExtractArgs. +template <typename Signature> +struct ExtractArgsImpl; + +template <typename R, typename... Args> +struct ExtractArgsImpl<R(Args...)> { + using Type = TypeList<Args...>; +}; + +// A type-level function that extracts function arguments into a TypeList. +// E.g. ExtractArgs<R(A, B, C)> is evaluated to TypeList<A, B, C>. +template <typename Signature> +using ExtractArgs = typename ExtractArgsImpl<Signature>::Type; + } // namespace internal template <typename T>
diff --git a/base/bind_internal.h b/base/bind_internal.h index 49ce0ed..fbf43a0 100644 --- a/base/bind_internal.h +++ b/base/bind_internal.h
@@ -65,17 +65,17 @@ // |Sig| is a non-const reference. // Implementation note: This non-specialized case handles zero-arity case only. // Non-zero-arity cases should be handled by the specialization below. -template <typename Sig> -struct HasNonConstReferenceParam : false_type {}; +template <typename List> +struct HasNonConstReferenceItem : false_type {}; // Implementation note: Select true_type if the first parameter is a non-const // reference. Otherwise, skip the first parameter and check rest of parameters // recursively. -template <typename R, typename T, typename... Args> -struct HasNonConstReferenceParam<R(T, Args...)> +template <typename T, typename... Args> +struct HasNonConstReferenceItem<TypeList<T, Args...>> : std::conditional<is_non_const_reference<T>::value, true_type, - HasNonConstReferenceParam<R(Args...)>>::type {}; + HasNonConstReferenceItem<TypeList<Args...>>>::type {}; // HasRefCountedTypeAsRawPtr selects true_type when any of the |Args| is a raw // pointer to a RefCounted type.
diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc index a6f3653b..4c80001 100644 --- a/base/bind_unittest.cc +++ b/base/bind_unittest.cc
@@ -162,9 +162,10 @@ return t; } -template <typename T> -void VoidPolymorphic1(T t) { -} +template <typename... Ts> +struct VoidPolymorphic { + static void Run(Ts... t) {} +}; int Identity(int n) { return n; @@ -499,17 +500,20 @@ // - Unbound sized array. // - Unbound array-of-arrays. TEST_F(BindTest, UnboundArgumentTypeSupport) { - Callback<void(int)> unbound_value_cb = Bind(&VoidPolymorphic1<int>); - Callback<void(int*)> unbound_pointer_cb = Bind(&VoidPolymorphic1<int*>); - Callback<void(int&)> unbound_ref_cb = Bind(&VoidPolymorphic1<int&>); + Callback<void(int)> unbound_value_cb = Bind(&VoidPolymorphic<int>::Run); + Callback<void(int*)> unbound_pointer_cb = Bind(&VoidPolymorphic<int*>::Run); + Callback<void(int&)> unbound_ref_cb = Bind(&VoidPolymorphic<int&>::Run); Callback<void(const int&)> unbound_const_ref_cb = - Bind(&VoidPolymorphic1<const int&>); + Bind(&VoidPolymorphic<const int&>::Run); Callback<void(int[])> unbound_unsized_array_cb = - Bind(&VoidPolymorphic1<int[]>); + Bind(&VoidPolymorphic<int[]>::Run); Callback<void(int[2])> unbound_sized_array_cb = - Bind(&VoidPolymorphic1<int[2]>); + Bind(&VoidPolymorphic<int[2]>::Run); Callback<void(int[][2])> unbound_array_of_arrays_cb = - Bind(&VoidPolymorphic1<int[][2]>); + Bind(&VoidPolymorphic<int[][2]>::Run); + + Callback<void(int&)> unbound_ref_with_bound_arg = + Bind(&VoidPolymorphic<int, int&>::Run, 1); } // Function with unbound reference parameter. @@ -810,14 +814,14 @@ CopyCounter counter(&copies, &assigns); Callback<void(void)> copy_cb = - Bind(&VoidPolymorphic1<CopyCounter>, counter); + Bind(&VoidPolymorphic<CopyCounter>::Run, counter); EXPECT_GE(1, copies); EXPECT_EQ(0, assigns); copies = 0; assigns = 0; Callback<void(CopyCounter)> forward_cb = - Bind(&VoidPolymorphic1<CopyCounter>); + Bind(&VoidPolymorphic<CopyCounter>::Run); forward_cb.Run(counter); EXPECT_GE(1, copies); EXPECT_EQ(0, assigns); @@ -826,7 +830,7 @@ assigns = 0; DerivedCopyCounter derived(&copies, &assigns); Callback<void(CopyCounter)> coerce_cb = - Bind(&VoidPolymorphic1<CopyCounter>); + Bind(&VoidPolymorphic<CopyCounter>::Run); coerce_cb.Run(CopyCounter(derived)); EXPECT_GE(2, copies); EXPECT_EQ(0, assigns);
diff --git a/base/compiler_specific.h b/base/compiler_specific.h index 402bc5d..8de949d2 100644 --- a/base/compiler_specific.h +++ b/base/compiler_specific.h
@@ -123,7 +123,6 @@ // Use like: // int foo() WARN_UNUSED_RESULT; // To explicitly ignore a result, see |ignore_result()| in base/macros.h. -// TODO(dcheng): Update //third_party/webrtc's macro definition to match. #undef WARN_UNUSED_RESULT #if defined(COMPILER_GCC) || defined(__clang__) #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
diff --git a/base/debug/BUILD.gn b/base/debug/BUILD.gn index a910d96b..eb2a3097 100644 --- a/base/debug/BUILD.gn +++ b/base/debug/BUILD.gn
@@ -5,7 +5,8 @@ import("//build/buildflag_header.gni") import("//build/config/compiler/compiler.gni") -source_set("debug") { +# Should be static library, see documentation on //base:base for discussion. +static_library("debug") { sources = [ "alias.cc", "alias.h",
diff --git a/base/debug/close_handle_hook_win.cc b/base/debug/close_handle_hook_win.cc index 2f84bf15fe..359b758e 100644 --- a/base/debug/close_handle_hook_win.cc +++ b/base/debug/close_handle_hook_win.cc
@@ -16,9 +16,6 @@ #include "base/win/pe_image.h" #include "base/win/scoped_handle.h" -namespace base { -namespace debug { - namespace { typedef BOOL (WINAPI* CloseHandleType) (HANDLE handle); @@ -265,6 +262,9 @@ } // namespace +namespace base { +namespace debug { + bool InstallHandleHooks() { HandleHooks* hooks = g_hooks.Pointer();
diff --git a/base/json/BUILD.gn b/base/json/BUILD.gn index 5cb42a32..206b5b0 100644 --- a/base/json/BUILD.gn +++ b/base/json/BUILD.gn
@@ -4,7 +4,8 @@ import("//build/config/nacl/config.gni") -source_set("json") { +# Should be static library, see documentation on //base:base for discussion. +static_library("json") { sources = [ "json_file_value_serializer.cc", "json_file_value_serializer.h",
diff --git a/base/macros.h b/base/macros.h index 5f8d9705d2d..b3e32ca 100644 --- a/base/macros.h +++ b/base/macros.h
@@ -37,10 +37,11 @@ TypeName() = delete; \ DISALLOW_COPY_AND_ASSIGN(TypeName) -// The arraysize(arr) macro returns the # of elements in an array arr. -// The expression is a compile-time constant, and therefore can be -// used in defining new arrays, for example. If you use arraysize on -// a pointer by mistake, you will get a compile-time error. +// The arraysize(arr) macro returns the # of elements in an array arr. The +// expression is a compile-time constant, and therefore can be used in defining +// new arrays, for example. If you use arraysize on a pointer by mistake, you +// will get a compile-time error. For the technical details, refer to +// http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx. // This template function declaration is used in defining arraysize. // Note that the function doesn't need an implementation, as we only
diff --git a/base/memory/BUILD.gn b/base/memory/BUILD.gn index 672330e..f6a2907 100644 --- a/base/memory/BUILD.gn +++ b/base/memory/BUILD.gn
@@ -2,7 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("memory") { +# Should be static library, see documentation on //base:base for discussion. +static_library("memory") { sources = [ "aligned_memory.cc", "aligned_memory.h",
diff --git a/base/memory/shared_memory.h b/base/memory/shared_memory.h index b7a5ce1b4..c4c9247 100644 --- a/base/memory/shared_memory.h +++ b/base/memory/shared_memory.h
@@ -284,6 +284,9 @@ ShareMode); #if defined(OS_WIN) + // If true indicates this came from an external source so needs extra checks + // before being mapped. + bool external_section_; std::wstring name_; HANDLE mapped_file_; #elif defined(OS_MACOSX) && !defined(OS_IOS)
diff --git a/base/memory/shared_memory_unittest.cc b/base/memory/shared_memory_unittest.cc index e024dfa..7a41b55 100644 --- a/base/memory/shared_memory_unittest.cc +++ b/base/memory/shared_memory_unittest.cc
@@ -6,6 +6,7 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/memory/shared_memory.h" +#include "base/memory/shared_memory_handle.h" #include "base/process/kill.h" #include "base/rand_util.h" #include "base/strings/string_number_conversions.h" @@ -571,6 +572,55 @@ shared_memory.Close(); } +#if defined(OS_WIN) +TEST(SharedMemoryTest, UnsafeImageSection) { + const char kTestSectionName[] = "UnsafeImageSection"; + wchar_t path[MAX_PATH]; + EXPECT_GT(::GetModuleFileName(nullptr, path, arraysize(path)), 0U); + + // Map the current executable image to save us creating a new PE file on disk. + base::win::ScopedHandle file_handle( + ::CreateFile(path, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, nullptr)); + EXPECT_TRUE(file_handle.IsValid()); + base::win::ScopedHandle section_handle( + ::CreateFileMappingA(file_handle.Get(), nullptr, + PAGE_READONLY | SEC_IMAGE, 0, 0, kTestSectionName)); + EXPECT_TRUE(section_handle.IsValid()); + + // Check direct opening by name, from handle and duplicated from handle. + SharedMemory shared_memory_open; + EXPECT_TRUE(shared_memory_open.Open(kTestSectionName, true)); + EXPECT_FALSE(shared_memory_open.Map(1)); + EXPECT_EQ(nullptr, shared_memory_open.memory()); + + SharedMemory shared_memory_handle_dup( + SharedMemoryHandle(section_handle.Get(), ::GetCurrentProcessId()), true, + GetCurrentProcess()); + EXPECT_FALSE(shared_memory_handle_dup.Map(1)); + EXPECT_EQ(nullptr, shared_memory_handle_dup.memory()); + + SharedMemory shared_memory_handle_local( + SharedMemoryHandle(section_handle.Take(), ::GetCurrentProcessId()), true); + EXPECT_FALSE(shared_memory_handle_local.Map(1)); + EXPECT_EQ(nullptr, shared_memory_handle_local.memory()); + + // Check that a handle without SECTION_QUERY also can't be mapped as it can't + // be checked. + SharedMemory shared_memory_handle_dummy; + SharedMemoryCreateOptions options; + options.size = 0x1000; + EXPECT_TRUE(shared_memory_handle_dummy.Create(options)); + HANDLE handle_no_query; + EXPECT_TRUE(::DuplicateHandle( + ::GetCurrentProcess(), shared_memory_handle_dummy.handle().GetHandle(), + ::GetCurrentProcess(), &handle_no_query, FILE_MAP_READ, FALSE, 0)); + SharedMemory shared_memory_handle_no_query( + SharedMemoryHandle(handle_no_query, ::GetCurrentProcessId()), true); + EXPECT_FALSE(shared_memory_handle_no_query.Map(1)); + EXPECT_EQ(nullptr, shared_memory_handle_no_query.memory()); +} +#endif // defined(OS_WIN) + // iOS does not allow multiple processes. // Android ashmem does not support named shared memory. // Mac SharedMemory does not support named shared memory. crbug.com/345734
diff --git a/base/memory/shared_memory_win.cc b/base/memory/shared_memory_win.cc index fd8d2fd..34b306a4 100644 --- a/base/memory/shared_memory_win.cc +++ b/base/memory/shared_memory_win.cc
@@ -14,6 +14,23 @@ namespace { +typedef enum _SECTION_INFORMATION_CLASS { + SectionBasicInformation, +} SECTION_INFORMATION_CLASS; + +typedef struct _SECTION_BASIC_INFORMATION { + PVOID BaseAddress; + ULONG Attributes; + LARGE_INTEGER Size; +} SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION; + +typedef ULONG(__stdcall* NtQuerySectionType)( + HANDLE SectionHandle, + SECTION_INFORMATION_CLASS SectionInformationClass, + PVOID SectionInformation, + ULONG SectionInformationLength, + PULONG ResultLength); + // Returns the length of the memory section starting at the supplied address. size_t GetMemorySectionSize(void* address) { MEMORY_BASIC_INFORMATION memory_info; @@ -23,6 +40,26 @@ static_cast<char*>(memory_info.AllocationBase)); } +// Checks if the section object is safe to map. At the moment this just means +// it's not an image section. +bool IsSectionSafeToMap(HANDLE handle) { + static NtQuerySectionType nt_query_section_func; + if (!nt_query_section_func) { + nt_query_section_func = reinterpret_cast<NtQuerySectionType>( + ::GetProcAddress(::GetModuleHandle(L"ntdll.dll"), "NtQuerySection")); + DCHECK(nt_query_section_func); + } + + // The handle must have SECTION_QUERY access for this to succeed. + SECTION_BASIC_INFORMATION basic_information = {}; + ULONG status = + nt_query_section_func(handle, SectionBasicInformation, &basic_information, + sizeof(basic_information), nullptr); + if (status) + return false; + return (basic_information.Attributes & SEC_IMAGE) != SEC_IMAGE; +} + } // namespace. namespace base { @@ -35,24 +72,25 @@ share_read_only(false) {} SharedMemory::SharedMemory() - : mapped_file_(NULL), - mapped_size_(0), - memory_(NULL), - read_only_(false), - requested_size_(0) { -} - -SharedMemory::SharedMemory(const std::wstring& name) - : name_(name), + : external_section_(false), mapped_file_(NULL), mapped_size_(0), memory_(NULL), read_only_(false), - requested_size_(0) { -} + requested_size_(0) {} + +SharedMemory::SharedMemory(const std::wstring& name) + : external_section_(false), + name_(name), + mapped_file_(NULL), + mapped_size_(0), + memory_(NULL), + read_only_(false), + requested_size_(0) {} SharedMemory::SharedMemory(const SharedMemoryHandle& handle, bool read_only) - : mapped_file_(handle.GetHandle()), + : external_section_(true), + mapped_file_(handle.GetHandle()), mapped_size_(0), memory_(NULL), read_only_(read_only), @@ -63,14 +101,16 @@ SharedMemory::SharedMemory(const SharedMemoryHandle& handle, bool read_only, ProcessHandle process) - : mapped_file_(NULL), + : external_section_(true), + mapped_file_(NULL), mapped_size_(0), memory_(NULL), read_only_(read_only), requested_size_(0) { - ::DuplicateHandle( - process, handle.GetHandle(), GetCurrentProcess(), &mapped_file_, - read_only_ ? FILE_MAP_READ : FILE_MAP_READ | FILE_MAP_WRITE, FALSE, 0); + DWORD access = FILE_MAP_READ | SECTION_QUERY; + ::DuplicateHandle(process, handle.GetHandle(), GetCurrentProcess(), + &mapped_file_, + read_only_ ? access : access | FILE_MAP_WRITE, FALSE, 0); } SharedMemory::~SharedMemory() { @@ -170,6 +210,7 @@ // If the file already existed, set requested_size_ to 0 to show that // we don't know the size. requested_size_ = 0; + external_section_ = true; if (!options.open_existing_deprecated) { Close(); return false; @@ -186,17 +227,20 @@ bool SharedMemory::Open(const std::string& name, bool read_only) { DCHECK(!mapped_file_); - + DWORD access = FILE_MAP_READ | SECTION_QUERY; + if (!read_only) + access |= FILE_MAP_WRITE; name_ = ASCIIToUTF16(name); read_only_ = read_only; - mapped_file_ = OpenFileMapping( - read_only_ ? FILE_MAP_READ : FILE_MAP_READ | FILE_MAP_WRITE, - false, name_.empty() ? NULL : name_.c_str()); - if (mapped_file_ != NULL) { - // Note: size_ is not set in this case. - return true; - } - return false; + mapped_file_ = + OpenFileMapping(access, false, name_.empty() ? nullptr : name_.c_str()); + if (!mapped_file_) + return false; + // If a name specified assume it's an external section. + if (!name_.empty()) + external_section_ = true; + // Note: size_ is not set in this case. + return true; } bool SharedMemory::MapAt(off_t offset, size_t bytes) { @@ -209,6 +253,9 @@ if (memory_) return false; + if (external_section_ && !IsSectionSafeToMap(mapped_file_)) + return false; + memory_ = MapViewOfFile(mapped_file_, read_only_ ? FILE_MAP_READ : FILE_MAP_READ | FILE_MAP_WRITE, @@ -238,7 +285,7 @@ bool close_self, ShareMode share_mode) { *new_handle = SharedMemoryHandle(); - DWORD access = FILE_MAP_READ; + DWORD access = FILE_MAP_READ | SECTION_QUERY; DWORD options = 0; HANDLE mapped_file = mapped_file_; HANDLE result;
diff --git a/base/metrics/BUILD.gn b/base/metrics/BUILD.gn index 6dd212f8..4c95f5d 100644 --- a/base/metrics/BUILD.gn +++ b/base/metrics/BUILD.gn
@@ -2,7 +2,20 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("metrics") { +# TODO(phosek) bug 570839: If field_trial.cc is in a static library, +# hacl_helper_nonsfi doesn't link properly on Linux in debug builds. The +# reasons for this seem to involve obscure toolchain bugs. This should be fixed +# and this target should be a static_library unconditionally. +import("//build/config/nacl/config.gni") +if (is_nacl_nonsfi) { + metrics_target_type = "source_set" +} else { + metrics_target_type = "static_library" +} + +# Should be static library, see documentation on //base:base for discussion. +#static_library("metrics") { # Should be this when above TODO is resolved. +target(metrics_target_type, "metrics") { sources = [ "bucket_ranges.cc", "bucket_ranges.h",
diff --git a/base/process/BUILD.gn b/base/process/BUILD.gn index 63d65cd..cf3c401 100644 --- a/base/process/BUILD.gn +++ b/base/process/BUILD.gn
@@ -4,7 +4,8 @@ import("//build/config/nacl/config.gni") -source_set("process") { +# Should be static library, see documentation on //base:base for discussion. +static_library("process") { sources = [ "internal_linux.cc", "internal_linux.h",
diff --git a/base/third_party/dynamic_annotations/BUILD.gn b/base/third_party/dynamic_annotations/BUILD.gn index 86f6558..0fc4bf7 100644 --- a/base/third_party/dynamic_annotations/BUILD.gn +++ b/base/third_party/dynamic_annotations/BUILD.gn
@@ -12,7 +12,8 @@ ] } } else { - source_set("dynamic_annotations") { + # Should be static library, see documentation on //base:base for discussion. + static_library("dynamic_annotations") { sources = [ "../valgrind/valgrind.h", "dynamic_annotations.c",
diff --git a/base/trace_event/BUILD.gn b/base/trace_event/BUILD.gn index 9a85be81..475f738c 100644 --- a/base/trace_event/BUILD.gn +++ b/base/trace_event/BUILD.gn
@@ -2,7 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("trace_event") { +# Should be static library, see documentation on //base:base for discussion. +static_library("trace_event") { sources = [ "common/trace_event_common.h", "heap_profiler_allocation_context.cc",
diff --git a/base/trace_event/heap_profiler_allocation_register.cc b/base/trace_event/heap_profiler_allocation_register.cc index 37647ee..2920153 100644 --- a/base/trace_event/heap_profiler_allocation_register.cc +++ b/base/trace_event/heap_profiler_allocation_register.cc
@@ -10,10 +10,14 @@ namespace trace_event { AllocationRegister::AllocationRegister() - // Reserve enough address space to store |kNumCells| entries if necessary, + : AllocationRegister(kNumBuckets * kNumCellsPerBucket) {} + +AllocationRegister::AllocationRegister(uint32_t num_cells) + // Reserve enough address space to store |num_cells_| entries if necessary, // with a guard page after it to crash the program when attempting to store // more entries. - : cells_(static_cast<Cell*>(AllocateVirtualMemory(kNumCells * + : num_cells_(num_cells), + cells_(static_cast<Cell*>(AllocateVirtualMemory(num_cells_ * sizeof(Cell)))), buckets_(static_cast<CellIndex*>( AllocateVirtualMemory(kNumBuckets * sizeof(CellIndex)))), @@ -23,9 +27,10 @@ free_list_(0), next_unused_cell_(1) {} + AllocationRegister::~AllocationRegister() { FreeVirtualMemory(buckets_, kNumBuckets * sizeof(CellIndex)); - FreeVirtualMemory(cells_, kNumCells * sizeof(Cell)); + FreeVirtualMemory(cells_, num_cells_ * sizeof(Cell)); } void AllocationRegister::Insert(void* address, @@ -144,7 +149,7 @@ // the simplest solution is to just allocate a humongous chunk of address // space. - DCHECK_LT(next_unused_cell_, kNumCells + 1); + DCHECK_LT(next_unused_cell_, num_cells_ + 1); return idx; }
diff --git a/base/trace_event/heap_profiler_allocation_register.h b/base/trace_event/heap_profiler_allocation_register.h index 7c4ba99..940fb54 100644 --- a/base/trace_event/heap_profiler_allocation_register.h +++ b/base/trace_event/heap_profiler_allocation_register.h
@@ -60,6 +60,8 @@ }; AllocationRegister(); + explicit AllocationRegister(uint32_t num_cells); + ~AllocationRegister(); // Inserts allocation details into the table. If the address was present @@ -112,7 +114,7 @@ // not an option). A value of ~3M entries is large enough to handle spikes in // the number of allocations, and modest enough to require no more than a few // dozens of MiB of address space. - static const uint32_t kNumCells = kNumBuckets * 10; + static const uint32_t kNumCellsPerBucket = 10; // Returns a value in the range [0, kNumBuckets - 1] (inclusive). static uint32_t Hash(void* address); @@ -136,6 +138,9 @@ // from the free list or by taking a fresh cell) and returns its index. CellIndex GetFreeCell(); + // The maximum number of cells which can be allocated. + uint32_t const num_cells_; + // The array of cells. This array is backed by mmapped memory. Lower indices // are accessed first, higher indices are only accessed when required. In // this way, even if a huge amount of address space has been mmapped, only
diff --git a/base/trace_event/heap_profiler_allocation_register_unittest.cc b/base/trace_event/heap_profiler_allocation_register_unittest.cc index 6058f470..51d36e9 100644 --- a/base/trace_event/heap_profiler_allocation_register_unittest.cc +++ b/base/trace_event/heap_profiler_allocation_register_unittest.cc
@@ -14,7 +14,6 @@ class AllocationRegisterTest : public testing::Test { public: static const uint32_t kNumBuckets = AllocationRegister::kNumBuckets; - static const uint32_t kNumCells = AllocationRegister::kNumCells; // Returns the number of cells that the |AllocationRegister| can store per // system page. @@ -25,6 +24,10 @@ uint32_t GetHighWaterMark(const AllocationRegister& reg) { return reg.next_unused_cell_; } + + uint32_t GetNumCells(const AllocationRegister& reg) { + return reg.num_cells_; + } }; // Iterates over all entries in the allocation register and returns the bitwise @@ -203,14 +206,15 @@ // too many elements. #if GTEST_HAS_DEATH_TEST TEST_F(AllocationRegisterTest, OverflowDeathTest) { - AllocationRegister reg; + // Use a smaller register to prevent OOM errors on low-end devices. + AllocationRegister reg(GetNumCellsPerPage()); AllocationContext ctx = AllocationContext::Empty(); uintptr_t i; - // Fill up all of the memory allocated for the register. |kNumCells| minus 1 - // elements are inserted, because cell 0 is unused, so this should fill up - // the available cells exactly. - for (i = 1; i < kNumCells; i++) { + // Fill up all of the memory allocated for the register. |GetNumCells(reg)| + // minus 1 elements are inserted, because cell 0 is unused, so this should + // fill up the available cells exactly. + for (i = 1; i < GetNumCells(reg); i++) { reg.Insert(reinterpret_cast<void*>(i), 0, ctx); }
diff --git a/base/tuple.h b/base/tuple.h index 5a04858..96a46426 100644 --- a/base/tuple.h +++ b/base/tuple.h
@@ -241,11 +241,6 @@ // Non-Static Dispatchers with no out params. -template <typename ObjT, typename Method, typename A> -inline void DispatchToMethod(ObjT* obj, Method method, const A& arg) { - (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg)); -} - template <typename ObjT, typename Method, typename... Ts, size_t... Ns> inline void DispatchToMethodImpl(ObjT* obj, Method method, @@ -263,11 +258,6 @@ // Static Dispatchers with no out params. -template <typename Function, typename A> -inline void DispatchToMethod(Function function, const A& arg) { - (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg)); -} - template <typename Function, typename... Ts, size_t... Ns> inline void DispatchToFunctionImpl(Function function, const Tuple<Ts...>& arg, @@ -284,29 +274,6 @@ template <typename ObjT, typename Method, - typename In, - typename... OutTs, - size_t... OutNs> -inline void DispatchToMethodImpl(ObjT* obj, - Method method, - const In& in, - Tuple<OutTs...>* out, - IndexSequence<OutNs...>) { - (obj->*method)(base::internal::UnwrapTraits<In>::Unwrap(in), - &get<OutNs>(*out)...); -} - -template <typename ObjT, typename Method, typename In, typename... OutTs> -inline void DispatchToMethod(ObjT* obj, - Method method, - const In& in, - Tuple<OutTs...>* out) { - DispatchToMethodImpl(obj, method, in, out, - MakeIndexSequence<sizeof...(OutTs)>()); -} - -template <typename ObjT, - typename Method, typename... InTs, typename... OutTs, size_t... InNs,
diff --git a/blimp/client/session/blimp_client_session.cc b/blimp/client/session/blimp_client_session.cc index f0fcd39..b7973b26 100644 --- a/blimp/client/session/blimp_client_session.cc +++ b/blimp/client/session/blimp_client_session.cc
@@ -18,8 +18,8 @@ render_widget_feature_(new RenderWidgetFeature) { // Connect the features with the network layer. tab_control_feature_->set_outgoing_message_processor( - connection_handler_->RegisterFeature(BlimpMessage::CONTROL, - tab_control_feature_.get())); + connection_handler_->RegisterFeature(BlimpMessage::TAB_CONTROL, + tab_control_feature_.get())); navigation_feature_->set_outgoing_message_processor( connection_handler_->RegisterFeature(BlimpMessage::NAVIGATION, navigation_feature_.get()));
diff --git a/blimp/client/session/tab_control_feature.cc b/blimp/client/session/tab_control_feature.cc index 15cbdd1..3e156347 100644 --- a/blimp/client/session/tab_control_feature.cc +++ b/blimp/client/session/tab_control_feature.cc
@@ -6,8 +6,8 @@ #include "blimp/common/create_blimp_message.h" #include "blimp/common/proto/blimp_message.pb.h" -#include "blimp/common/proto/control.pb.h" #include "blimp/common/proto/size.pb.h" +#include "blimp/common/proto/tab_control.pb.h" #include "blimp/net/blimp_message_processor.h" #include "ui/gfx/geometry/size.h"
diff --git a/blimp/client/session/tab_control_feature.h b/blimp/client/session/tab_control_feature.h index 166dec7..840b7cd9 100644 --- a/blimp/client/session/tab_control_feature.h +++ b/blimp/client/session/tab_control_feature.h
@@ -22,7 +22,7 @@ ~TabControlFeature() override; // Set the BlimpMessageProcessor that will be used to send - // BlimpMessage::CONTROL messages to the engine. + // BlimpMessage::TAB_CONTROL messages to the engine. void set_outgoing_message_processor( scoped_ptr<BlimpMessageProcessor> processor); @@ -35,7 +35,7 @@ void ProcessMessage(scoped_ptr<BlimpMessage> message, const net::CompletionCallback& callback) override; - // Used to send BlimpMessage::CONTROL messages to the engine. + // Used to send BlimpMessage::TAB_CONTROL messages to the engine. scoped_ptr<BlimpMessageProcessor> outgoing_message_processor_; DISALLOW_COPY_AND_ASSIGN(TabControlFeature);
diff --git a/blimp/client/session/tab_control_feature_unittest.cc b/blimp/client/session/tab_control_feature_unittest.cc index d53bd97..c2969f5 100644 --- a/blimp/client/session/tab_control_feature_unittest.cc +++ b/blimp/client/session/tab_control_feature_unittest.cc
@@ -7,8 +7,8 @@ #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "blimp/common/proto/blimp_message.pb.h" -#include "blimp/common/proto/control.pb.h" #include "blimp/common/proto/size.pb.h" +#include "blimp/common/proto/tab_control.pb.h" #include "blimp/net/test_common.h" #include "net/base/net_errors.h" #include "testing/gmock/include/gmock/gmock.h" @@ -20,10 +20,10 @@ namespace blimp { MATCHER_P3(EqualsSizeMessage, width, height, dp_to_px, "") { - return arg.control().type() == ControlMessage::SIZE && - arg.control().size().width() == width && - arg.control().size().height() == height && - arg.control().size().device_pixel_ratio() == dp_to_px; + return arg.tab_control().type() == TabControlMessage::SIZE && + arg.tab_control().size().width() == width && + arg.tab_control().size().height() == height && + arg.tab_control().size().device_pixel_ratio() == dp_to_px; } class TabControlFeatureTest : public testing::Test {
diff --git a/blimp/common/create_blimp_message.cc b/blimp/common/create_blimp_message.cc index 13be17f1..f656a73 100644 --- a/blimp/common/create_blimp_message.cc +++ b/blimp/common/create_blimp_message.cc
@@ -8,10 +8,10 @@ #include "base/memory/scoped_ptr.h" #include "blimp/common/proto/blimp_message.pb.h" #include "blimp/common/proto/compositor.pb.h" -#include "blimp/common/proto/control.pb.h" #include "blimp/common/proto/input.pb.h" #include "blimp/common/proto/render_widget.pb.h" #include "blimp/common/proto/size.pb.h" +#include "blimp/common/proto/tab_control.pb.h" namespace blimp { @@ -26,11 +26,12 @@ return output; } -scoped_ptr<BlimpMessage> CreateBlimpMessage(ControlMessage** control_message) { +scoped_ptr<BlimpMessage> CreateBlimpMessage( + TabControlMessage** control_message) { DCHECK(control_message); scoped_ptr<BlimpMessage> output(new BlimpMessage); - output->set_type(BlimpMessage::CONTROL); - *control_message = output->mutable_control(); + output->set_type(BlimpMessage::TAB_CONTROL); + *control_message = output->mutable_tab_control(); return output; } @@ -66,9 +67,9 @@ scoped_ptr<BlimpMessage> CreateBlimpMessage(SizeMessage** size_message) { DCHECK(size_message); - ControlMessage* control_message; + TabControlMessage* control_message; scoped_ptr<BlimpMessage> output = CreateBlimpMessage(&control_message); - control_message->set_type(ControlMessage::SIZE); + control_message->set_type(TabControlMessage::SIZE); *size_message = control_message->mutable_size(); return output; }
diff --git a/blimp/common/create_blimp_message.h b/blimp/common/create_blimp_message.h index 995e969..32dc445 100644 --- a/blimp/common/create_blimp_message.h +++ b/blimp/common/create_blimp_message.h
@@ -14,7 +14,7 @@ class BlimpMessage; class CompositorMessage; -class ControlMessage; +class TabControlMessage; class InputMessage; class NavigationMessage; class RenderWidgetMessage; @@ -38,7 +38,7 @@ int target_tab_id); BLIMP_COMMON_EXPORT scoped_ptr<BlimpMessage> CreateBlimpMessage( - ControlMessage** control_message); + TabControlMessage** control_message); BLIMP_COMMON_EXPORT scoped_ptr<BlimpMessage> CreateBlimpMessage( InputMessage** input_message);
diff --git a/blimp/common/create_blimp_message_unittest.cc b/blimp/common/create_blimp_message_unittest.cc index 0c1760d..b33ce19 100644 --- a/blimp/common/create_blimp_message_unittest.cc +++ b/blimp/common/create_blimp_message_unittest.cc
@@ -5,11 +5,11 @@ #include "blimp/common/create_blimp_message.h" #include "blimp/common/proto/blimp_message.pb.h" #include "blimp/common/proto/compositor.pb.h" -#include "blimp/common/proto/control.pb.h" #include "blimp/common/proto/input.pb.h" #include "blimp/common/proto/navigation.pb.h" #include "blimp/common/proto/render_widget.pb.h" #include "blimp/common/proto/size.pb.h" +#include "blimp/common/proto/tab_control.pb.h" #include "testing/gtest/include/gtest/gtest.h" namespace blimp { @@ -26,12 +26,12 @@ EXPECT_EQ(kTabId, message->target_tab_id()); } -TEST(CreateBlimpMessageTest, ControlMessage) { - ControlMessage* details = nullptr; +TEST(CreateBlimpMessageTest, TabControlMessage) { + TabControlMessage* details = nullptr; scoped_ptr<BlimpMessage> message = CreateBlimpMessage(&details); EXPECT_NE(nullptr, details); EXPECT_NE(nullptr, message); - EXPECT_EQ(details, message->mutable_control()); + EXPECT_EQ(details, message->mutable_tab_control()); } TEST(CreateBlimpMessageTest, InputMessage) { @@ -65,8 +65,8 @@ scoped_ptr<BlimpMessage> message = CreateBlimpMessage(&details); EXPECT_NE(nullptr, details); EXPECT_NE(nullptr, message); - EXPECT_EQ(ControlMessage::SIZE, message->mutable_control()->type()); - EXPECT_EQ(details, message->mutable_control()->mutable_size()); + EXPECT_EQ(TabControlMessage::SIZE, message->mutable_tab_control()->type()); + EXPECT_EQ(details, message->mutable_tab_control()->mutable_size()); } TEST(CreateBlimpMessageTest, StartConnectionMessage) {
diff --git a/blimp/common/proto/BUILD.gn b/blimp/common/proto/BUILD.gn index 80d3d2a..3ed9400 100644 --- a/blimp/common/proto/BUILD.gn +++ b/blimp/common/proto/BUILD.gn
@@ -27,12 +27,12 @@ sources = [ "blimp_message.proto", "compositor.proto", - "control.proto", "input.proto", "navigation.proto", "protocol_control.proto", "render_widget.proto", "size.proto", + "tab_control.proto", ] cc_generator_options = "dllexport_decl=BLIMP_PROTO_EXPORT:"
diff --git a/blimp/common/proto/blimp_message.proto b/blimp/common/proto/blimp_message.proto index 3bf22f84..733c21fd 100644 --- a/blimp/common/proto/blimp_message.proto +++ b/blimp/common/proto/blimp_message.proto
@@ -23,19 +23,19 @@ option optimize_for = LITE_RUNTIME; -import "control.proto"; import "compositor.proto"; import "input.proto"; import "navigation.proto"; import "render_widget.proto"; import "protocol_control.proto"; +import "tab_control.proto"; package blimp; message BlimpMessage { enum Type { UNKNOWN = 0; - CONTROL = 1; + TAB_CONTROL = 1; NAVIGATION = 2; RENDER_WIDGET = 3; INPUT = 4; @@ -67,7 +67,7 @@ // Feature-specific messages follow. // Only one of these fields may be set per BlimpMessage. // TODO(kmarshall): use a 'oneof' union when it's supported in Chromium. - optional ControlMessage control = 1000; + optional TabControlMessage tab_control = 1000; optional NavigationMessage navigation = 1001; optional RenderWidgetMessage render_widget = 1002; optional InputMessage input = 1003;
diff --git a/blimp/common/proto/control.proto b/blimp/common/proto/tab_control.proto similarity index 80% rename from blimp/common/proto/control.proto rename to blimp/common/proto/tab_control.proto index 8d29789..d71397c 100644 --- a/blimp/common/proto/control.proto +++ b/blimp/common/proto/tab_control.proto
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Message definitions for browser control messages. +// Message definitions for browser tab control messages. syntax = "proto2"; @@ -12,7 +12,7 @@ package blimp; -message ControlMessage { +message TabControlMessage { enum Type { UNKNOWN = 0; @@ -27,7 +27,7 @@ optional Type type = 1; // Feature-specific messages follow. - // Only one of these fields may be set per ControlMessage. + // Only one of these fields may be set per TabControlMessage. // TODO(kmarshall): use a 'oneof' union when it's supported in Chromium. optional SizeMessage size = 1000; }
diff --git a/blimp/engine/DEPS b/blimp/engine/DEPS index b9a50e1..e4ebc4e 100644 --- a/blimp/engine/DEPS +++ b/blimp/engine/DEPS
@@ -2,6 +2,7 @@ "+base", "+cc", "-chrome", + "+components/version_info", "+components/web_cache/renderer", "+content/public", "+net",
diff --git a/blimp/engine/browser/blimp_browser_main_parts.cc b/blimp/engine/browser/blimp_browser_main_parts.cc index e4fa842..6265725 100644 --- a/blimp/engine/browser/blimp_browser_main_parts.cc +++ b/blimp/engine/browser/blimp_browser_main_parts.cc
@@ -36,15 +36,16 @@ net_log_.reset(new net::NetLog()); scoped_ptr<BlimpBrowserContext> browser_context( new BlimpBrowserContext(false, net_log_.get())); - engine_session_.reset(new BlimpEngineSession(std::move(browser_context))); + engine_session_.reset( + new BlimpEngineSession(std::move(browser_context), net_log_.get())); engine_session_->Initialize(); // TODO(haibinlu): Create EngineConnectionManager to accept new connections. // TODO(haibinlu): Remove these test messages and switch to using the // MessageDispatcher for incoming messages. scoped_ptr<BlimpMessage> message(new BlimpMessage); - message->set_type(BlimpMessage::CONTROL); - message->mutable_control()->set_type(ControlMessage::CREATE_TAB); + message->set_type(BlimpMessage::TAB_CONTROL); + message->mutable_tab_control()->set_type(TabControlMessage::CREATE_TAB); engine_session_->ProcessMessage(std::move(message), net::CompletionCallback()); message.reset(new BlimpMessage);
diff --git a/blimp/engine/browser/blimp_engine_session.cc b/blimp/engine/browser/blimp_engine_session.cc index aa17d29a..0dd5870 100644 --- a/blimp/engine/browser/blimp_engine_session.cc +++ b/blimp/engine/browser/blimp_engine_session.cc
@@ -8,15 +8,20 @@ #include "base/strings/utf_string_conversions.h" #include "blimp/common/create_blimp_message.h" #include "blimp/common/proto/blimp_message.pb.h" -#include "blimp/common/proto/control.pb.h" +#include "blimp/common/proto/tab_control.pb.h" #include "blimp/engine/browser/blimp_browser_context.h" #include "blimp/engine/ui/blimp_layout_manager.h" #include "blimp/engine/ui/blimp_screen.h" #include "blimp/engine/ui/blimp_ui_context_factory.h" #include "blimp/net/blimp_connection.h" #include "blimp/net/blimp_message_multiplexer.h" +#include "blimp/net/browser_connection_handler.h" +#include "blimp/net/engine_authentication_handler.h" +#include "blimp/net/engine_connection_manager.h" #include "blimp/net/null_blimp_message_processor.h" +#include "blimp/net/tcp_engine_transport.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_view_host.h" @@ -44,6 +49,7 @@ const float kDefaultScaleFactor = 1.f; const int kDefaultDisplayWidth = 800; const int kDefaultDisplayHeight = 600; +const uint16 kDefaultPortNumber = 25467; base::LazyInstance<blimp::NullBlimpMessageProcessor> g_blimp_message_processor = LAZY_INSTANCE_INITIALIZER; @@ -64,13 +70,62 @@ } // namespace +// This class's functions and destruction are all invoked on the IO thread by +// the BlimpEngineSession. +class BlimpNetworkComponents { + public: + explicit BlimpNetworkComponents(net::NetLog* net_log); + ~BlimpNetworkComponents(); + + void Initialize(); + + private: + net::NetLog* net_log_; + scoped_ptr<BrowserConnectionHandler> connection_handler_; + scoped_ptr<EngineAuthenticationHandler> authentication_handler_; + scoped_ptr<EngineConnectionManager> connection_manager_; + + DISALLOW_COPY_AND_ASSIGN(BlimpNetworkComponents); +}; + +BlimpNetworkComponents::BlimpNetworkComponents(net::NetLog* net_log) + : net_log_(net_log) {} + +BlimpNetworkComponents::~BlimpNetworkComponents() { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); +} + +void BlimpNetworkComponents::Initialize() { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + DCHECK(!connection_handler_); + + // Creates and connects net components. + // A BlimpConnection flows from + // connection_manager_ --> authentication_handler_ --> connection_handler_ + connection_handler_.reset(new BrowserConnectionHandler); + authentication_handler_.reset( + new EngineAuthenticationHandler(connection_handler_.get())); + connection_manager_.reset( + new EngineConnectionManager(authentication_handler_.get())); + + // Adds BlimpTransports to connection_manager_. + net::IPAddressNumber local_ip_any; + bool success = net::ParseIPLiteralToNumber("0.0.0.0", &local_ip_any); + DCHECK(success); + net::IPEndPoint address(local_ip_any, kDefaultPortNumber); + connection_manager_->AddTransport( + make_scoped_ptr(new TCPEngineTransport(address, net_log_))); +} + BlimpEngineSession::BlimpEngineSession( - scoped_ptr<BlimpBrowserContext> browser_context) + scoped_ptr<BlimpBrowserContext> browser_context, + net::NetLog* net_log) : browser_context_(std::move(browser_context)), screen_(new BlimpScreen), // TODO(dtrainor, haibinlu): Properly pull these from the BlimpMessageMux. render_widget_processor_(g_blimp_message_processor.Pointer(), - g_blimp_message_processor.Pointer()) { + g_blimp_message_processor.Pointer()), + net_components_(new BlimpNetworkComponents(net_log)) { screen_->UpdateDisplayScaleAndSize(kDefaultScaleFactor, gfx::Size(kDefaultDisplayWidth, kDefaultDisplayHeight)); @@ -79,6 +134,10 @@ BlimpEngineSession::~BlimpEngineSession() { render_widget_processor_.RemoveDelegate(kDummyTabId); + + // Safely delete network components on the IO thread. + content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE, + net_components_.release()); } void BlimpEngineSession::Initialize() { @@ -110,6 +169,11 @@ #endif window_tree_host_->SetBounds(gfx::Rect(screen_->GetPrimaryDisplay().size())); + + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::Bind(&BlimpNetworkComponents::Initialize, + base::Unretained(net_components_.get()))); } void BlimpEngineSession::CreateWebContents(const int target_tab_id) { @@ -197,20 +261,20 @@ void BlimpEngineSession::ProcessMessage( scoped_ptr<BlimpMessage> message, const net::CompletionCallback& callback) { - DCHECK(message->type() == BlimpMessage::CONTROL || - message->type() == BlimpMessage::NAVIGATION); + DCHECK(message->type() == BlimpMessage::TAB_CONTROL || + message->type() == BlimpMessage::NAVIGATION); - if (message->type() == BlimpMessage::CONTROL) { - switch (message->control().type()) { - case ControlMessage::CREATE_TAB: + if (message->type() == BlimpMessage::TAB_CONTROL) { + switch (message->tab_control().type()) { + case TabControlMessage::CREATE_TAB: CreateWebContents(message->target_tab_id()); break; - case ControlMessage::CLOSE_TAB: + case TabControlMessage::CLOSE_TAB: CloseWebContents(message->target_tab_id()); - case ControlMessage::SIZE: - HandleResize(message->control().size().device_pixel_ratio(), - gfx::Size(message->control().size().width(), - message->control().size().height())); + case TabControlMessage::SIZE: + HandleResize(message->tab_control().size().device_pixel_ratio(), + gfx::Size(message->tab_control().size().width(), + message->tab_control().size().height())); break; default: NOTIMPLEMENTED();
diff --git a/blimp/engine/browser/blimp_engine_session.h b/blimp/engine/browser/blimp_engine_session.h index 61f772b..d327d77 100644 --- a/blimp/engine/browser/blimp_engine_session.h +++ b/blimp/engine/browser/blimp_engine_session.h
@@ -34,6 +34,10 @@ class Size; } +namespace net { +class NetLog; +} + namespace wm { class FocusController; } @@ -47,6 +51,7 @@ class BlimpBrowserContext; class BlimpFocusClient; +class BlimpNetworkComponents; class BlimpScreen; class BlimpUiContextFactory; class BlimpWindowTreeHost; @@ -57,9 +62,13 @@ public content::WebContentsObserver, public EngineRenderWidgetMessageProcessor::RenderWidgetMessageDelegate { public: - explicit BlimpEngineSession(scoped_ptr<BlimpBrowserContext> browser_context); + explicit BlimpEngineSession(scoped_ptr<BlimpBrowserContext> browser_context, + net::NetLog* net_log); ~BlimpEngineSession() override; + // Starts the network stack on the IO thread, and sets default placeholder + // values for e.g. screen size pending real values being supplied by the + // client. void Initialize(); BlimpBrowserContext* browser_context() { return browser_context_.get(); } @@ -70,7 +79,7 @@ const net::CompletionCallback& callback) override; private: - // ControlMessage handler methods. + // TabControlMessage handler methods. // Creates a new WebContents, which will be indexed by |target_tab_id|. void CreateWebContents(const int target_tab_id); void CloseWebContents(const int target_tab_id); @@ -116,6 +125,7 @@ void PlatformSetContents(scoped_ptr<content::WebContents> new_contents); scoped_ptr<BlimpBrowserContext> browser_context_; + scoped_ptr<BlimpScreen> screen_; // Context factory for compositor. @@ -135,14 +145,16 @@ // Only one web_contents is supported for blimp 0.5 scoped_ptr<content::WebContents> web_contents_; - // Currently attached client connection. - scoped_ptr<BlimpConnection> client_connection_; - // The bridge to the network layer that does the RenderWidget proto/id work. // TODO(dtrainor, haibinlu): Move this to a higher level once we start dealing // with multiple tabs. EngineRenderWidgetMessageProcessor render_widget_processor_; + // Container for connection manager, authentication handler, and + // browser connection handler. The components run on the I/O thread, and + // this object is destroyed there. + scoped_ptr<BlimpNetworkComponents> net_components_; + DISALLOW_COPY_AND_ASSIGN(BlimpEngineSession); };
diff --git a/blimp/engine/common/BUILD.gn b/blimp/engine/common/BUILD.gn index 48632dc..066d6ca5 100644 --- a/blimp/engine/common/BUILD.gn +++ b/blimp/engine/common/BUILD.gn
@@ -10,6 +10,7 @@ deps = [ "//base", + "//components/version_info", "//content/public/common", "//ui/base", ]
diff --git a/blimp/engine/common/blimp_content_client.cc b/blimp/engine/common/blimp_content_client.cc index 00c2c2d..d348839 100644 --- a/blimp/engine/common/blimp_content_client.cc +++ b/blimp/engine/common/blimp_content_client.cc
@@ -4,6 +4,7 @@ #include "blimp/engine/common/blimp_content_client.h" +#include "components/version_info/version_info.h" #include "content/public/common/user_agent.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -11,11 +12,9 @@ namespace blimp { namespace engine { -// TODO(haibinlu) Generate proper version. See crbug/537367. -const char kProduct[] = "Chrome/20.77.33.5"; - std::string GetBlimpEngineUserAgent() { - return content::BuildUserAgentFromProduct(kProduct); + return content::BuildUserAgentFromProduct( + version_info::GetProductNameAndVersionForUserAgent() + " Mobile"); } BlimpContentClient::~BlimpContentClient() {}
diff --git a/blimp/net/BUILD.gn b/blimp/net/BUILD.gn index 94b8a01c..5a37dc7 100644 --- a/blimp/net/BUILD.gn +++ b/blimp/net/BUILD.gn
@@ -88,6 +88,7 @@ "blimp_message_multiplexer_unittest.cc", "blimp_message_output_buffer_unittest.cc", "blimp_message_pump_unittest.cc", + "browser_connection_handler_unittest.cc", "client_connection_manager_unittest.cc", "engine_authentication_handler_unittest.cc", "engine_connection_manager_unittest.cc",
diff --git a/blimp/net/blimp_connection.cc b/blimp/net/blimp_connection.cc index db2f63d5..dd40021 100644 --- a/blimp/net/blimp_connection.cc +++ b/blimp/net/blimp_connection.cc
@@ -113,7 +113,7 @@ message_pump_->SetMessageProcessor(processor); } -BlimpMessageProcessor* BlimpConnection::GetOutgoingMessageProcessor() const { +BlimpMessageProcessor* BlimpConnection::GetOutgoingMessageProcessor() { return outgoing_msg_processor_.get(); }
diff --git a/blimp/net/blimp_connection.h b/blimp/net/blimp_connection.h index f95a91c..36128af4 100644 --- a/blimp/net/blimp_connection.h +++ b/blimp/net/blimp_connection.h
@@ -35,7 +35,7 @@ virtual void SetIncomingMessageProcessor(BlimpMessageProcessor* processor); // Gets a processor for BrowserSession->BlimpConnection message routing. - virtual BlimpMessageProcessor* GetOutgoingMessageProcessor() const; + virtual BlimpMessageProcessor* GetOutgoingMessageProcessor(); protected: BlimpConnection();
diff --git a/blimp/net/blimp_connection_unittest.cc b/blimp/net/blimp_connection_unittest.cc index 759b426..8816b14 100644 --- a/blimp/net/blimp_connection_unittest.cc +++ b/blimp/net/blimp_connection_unittest.cc
@@ -49,7 +49,7 @@ scoped_ptr<BlimpMessage> CreateControlMessage() { scoped_ptr<BlimpMessage> msg(new BlimpMessage); - msg->set_type(BlimpMessage::CONTROL); + msg->set_type(BlimpMessage::TAB_CONTROL); return msg; }
diff --git a/blimp/net/blimp_message_checkpoint_observer.h b/blimp/net/blimp_message_checkpoint_observer.h index 127ce33b..890819c 100644 --- a/blimp/net/blimp_message_checkpoint_observer.h +++ b/blimp/net/blimp_message_checkpoint_observer.h
@@ -9,7 +9,7 @@ namespace blimp { -// Allows objects to subscribe to message acknowledgement checkpoints. +// Allows objects to subscribe to message acknowledgment checkpoints. class BlimpMessageCheckpointObserver { public: virtual ~BlimpMessageCheckpointObserver() {}
diff --git a/blimp/net/blimp_message_output_buffer.h b/blimp/net/blimp_message_output_buffer.h index 0a7bddf3..d8168ba 100644 --- a/blimp/net/blimp_message_output_buffer.h +++ b/blimp/net/blimp_message_output_buffer.h
@@ -23,7 +23,7 @@ // Messages are retained for redelivery until they are acknowledged by the // receiving end (via BlimpMessageCheckpointObserver). // Messages can be paired with callbacks that are invoked on successful -// message acknowledgement. +// message acknowledgment. // (Redelivery will be used in a future CL to implement Fast Recovery // of dropped connections.) class BLIMP_NET_EXPORT BlimpMessageOutputBuffer @@ -86,7 +86,7 @@ // List of unsent messages. MessageBuffer write_buffer_; - // List of messages that are sent and awaiting acknoweldgement. + // List of messages that are sent and awaiting acknowledgment. // The messages in |ack_buffer_| are contiguous with the messages in // |write_buffer_|. MessageBuffer ack_buffer_;
diff --git a/blimp/net/blimp_message_pump_unittest.cc b/blimp/net/blimp_message_pump_unittest.cc index 14b08c7..aede128 100644 --- a/blimp/net/blimp_message_pump_unittest.cc +++ b/blimp/net/blimp_message_pump_unittest.cc
@@ -33,7 +33,7 @@ BlimpMessagePumpTest() : message1_(new BlimpMessage), message2_(new BlimpMessage) { message1_->set_type(BlimpMessage::INPUT); - message2_->set_type(BlimpMessage::CONTROL); + message2_->set_type(BlimpMessage::TAB_CONTROL); message_pump_.reset(new BlimpMessagePump(&reader_)); message_pump_->set_error_observer(&error_observer_); }
diff --git a/blimp/net/browser_connection_handler.cc b/blimp/net/browser_connection_handler.cc index 9d3931cd..baa63c3 100644 --- a/blimp/net/browser_connection_handler.cc +++ b/blimp/net/browser_connection_handler.cc
@@ -11,6 +11,7 @@ #include "blimp/net/blimp_message_multiplexer.h" #include "blimp/net/blimp_message_output_buffer.h" #include "blimp/net/blimp_message_processor.h" +#include "net/base/net_errors.h" namespace blimp { namespace { @@ -41,6 +42,7 @@ // replace an existing one. DropCurrentConnection(); connection_ = std::move(connection); + connection_->SetConnectionErrorObserver(this); // Connect the incoming & outgoing message streams. connection_->SetIncomingMessageProcessor(demultiplexer_.get()); @@ -51,13 +53,15 @@ void BrowserConnectionHandler::DropCurrentConnection() { if (!connection_) return; + + connection_->SetConnectionErrorObserver(nullptr); connection_->SetIncomingMessageProcessor(nullptr); output_buffer_->SetOutputProcessor(nullptr); connection_.reset(); } void BrowserConnectionHandler::OnConnectionError(int error) { - LOG(WARNING) << "Connection error " << error; + LOG(WARNING) << "Connection error " << net::ErrorToString(error); DropCurrentConnection(); }
diff --git a/blimp/net/browser_connection_handler_unittest.cc b/blimp/net/browser_connection_handler_unittest.cc new file mode 100644 index 0000000..c838ba6e --- /dev/null +++ b/blimp/net/browser_connection_handler_unittest.cc
@@ -0,0 +1,223 @@ +// 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 <stddef.h> +#include <string> + +#include "base/callback_helpers.h" +#include "base/message_loop/message_loop.h" +#include "base/run_loop.h" +#include "blimp/common/proto/blimp_message.pb.h" +#include "blimp/net/blimp_message_processor.h" +#include "blimp/net/browser_connection_handler.h" +#include "blimp/net/common.h" +#include "blimp/net/connection_error_observer.h" +#include "blimp/net/test_common.h" +#include "net/base/completion_callback.h" +#include "net/base/io_buffer.h" +#include "net/base/net_errors.h" +#include "net/base/test_completion_callback.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; +using testing::InSequence; +using testing::Return; +using testing::SaveArg; + +namespace blimp { +namespace { + +// Compares two blimp messages and ignores message_id field. +MATCHER_P(EqualsMessageIgnoringId, message, "") { + BlimpMessage expected_message = message; + expected_message.clear_message_id(); + BlimpMessage actual_message = arg; + actual_message.clear_message_id(); + + std::string expected_serialized; + std::string actual_serialized; + expected_message.SerializeToString(&expected_serialized); + actual_message.SerializeToString(&actual_serialized); + return expected_serialized == actual_serialized; +} + +class FakeFeature { + public: + FakeFeature(BlimpMessage::Type type, + BrowserConnectionHandler* connection_handler) { + outgoing_message_processor_ = + connection_handler->RegisterFeature(type, &incoming_message_processor_); + } + + ~FakeFeature() {} + + BlimpMessageProcessor* outgoing_message_processor() { + return outgoing_message_processor_.get(); + } + + MockBlimpMessageProcessor* incoming_message_processor() { + return &incoming_message_processor_; + } + + private: + testing::StrictMock<MockBlimpMessageProcessor> incoming_message_processor_; + scoped_ptr<BlimpMessageProcessor> outgoing_message_processor_; +}; + +class FakeBlimpConnection : public BlimpConnection, + public BlimpMessageProcessor { + public: + FakeBlimpConnection() {} + ~FakeBlimpConnection() override {} + + void set_other_end(FakeBlimpConnection* other_end) { other_end_ = other_end; } + + ConnectionErrorObserver* error_observer() { return error_observer_; } + + // BlimpConnection implementation. + void SetConnectionErrorObserver(ConnectionErrorObserver* observer) override { + error_observer_ = observer; + } + + void SetIncomingMessageProcessor(BlimpMessageProcessor* processor) override { + incoming_message_processor_ = processor; + } + + BlimpMessageProcessor* GetOutgoingMessageProcessor() override { return this; } + + private: + void ForwardMessage(scoped_ptr<BlimpMessage> message) { + other_end_->incoming_message_processor_->ProcessMessage( + std::move(message), net::CompletionCallback()); + } + + // BlimpMessageProcessor implementation. + void ProcessMessage(scoped_ptr<BlimpMessage> message, + const net::CompletionCallback& callback) override { + base::MessageLoop::current()->PostTask( + FROM_HERE, base::Bind(&FakeBlimpConnection::ForwardMessage, + base::Unretained(this), base::Passed(&message))); + + callback.Run(net::OK); + } + + FakeBlimpConnection* other_end_ = nullptr; + ConnectionErrorObserver* error_observer_ = nullptr; + BlimpMessageProcessor* incoming_message_processor_ = nullptr; +}; + +scoped_ptr<BlimpMessage> CreateInputMessage(int tab_id) { + scoped_ptr<BlimpMessage> output(new BlimpMessage); + output->set_type(BlimpMessage::INPUT); + output->set_target_tab_id(tab_id); + return output; +} + +scoped_ptr<BlimpMessage> CreateControlMessage(int tab_id) { + scoped_ptr<BlimpMessage> output(new BlimpMessage); + output->set_type(BlimpMessage::TAB_CONTROL); + output->set_target_tab_id(tab_id); + return output; +} + +class BrowserConnectionHandlerTest : public testing::Test { + public: + BrowserConnectionHandlerTest() + : client_connection_handler_(new BrowserConnectionHandler), + engine_connection_handler_(new BrowserConnectionHandler) { + SetupConnections(); + + client_input_feature_.reset( + new FakeFeature(BlimpMessage::INPUT, client_connection_handler_.get())); + engine_input_feature_.reset( + new FakeFeature(BlimpMessage::INPUT, engine_connection_handler_.get())); + client_control_feature_.reset(new FakeFeature( + BlimpMessage::TAB_CONTROL, client_connection_handler_.get())); + engine_control_feature_.reset(new FakeFeature( + BlimpMessage::TAB_CONTROL, engine_connection_handler_.get())); + } + + ~BrowserConnectionHandlerTest() override {} + void TearDown() override { base::RunLoop().RunUntilIdle(); } + + protected: + void SetupConnections() { + client_connection_ = new FakeBlimpConnection(); + engine_connection_ = new FakeBlimpConnection(); + client_connection_->set_other_end(engine_connection_); + engine_connection_->set_other_end(client_connection_); + client_connection_handler_->HandleConnection( + make_scoped_ptr(client_connection_)); + engine_connection_handler_->HandleConnection( + make_scoped_ptr(engine_connection_)); + } + + base::MessageLoop message_loop_; + + FakeBlimpConnection* client_connection_; + FakeBlimpConnection* engine_connection_; + + scoped_ptr<BrowserConnectionHandler> client_connection_handler_; + scoped_ptr<BrowserConnectionHandler> engine_connection_handler_; + + scoped_ptr<FakeFeature> client_input_feature_; + scoped_ptr<FakeFeature> engine_input_feature_; + scoped_ptr<FakeFeature> client_control_feature_; + scoped_ptr<FakeFeature> engine_control_feature_; +}; + +TEST_F(BrowserConnectionHandlerTest, ExchangeMessages) { + scoped_ptr<BlimpMessage> client_input_message = CreateInputMessage(1); + scoped_ptr<BlimpMessage> client_control_message = CreateControlMessage(1); + scoped_ptr<BlimpMessage> engine_control_message = CreateControlMessage(2); + + EXPECT_CALL( + *(engine_input_feature_->incoming_message_processor()), + MockableProcessMessage(EqualsMessageIgnoringId(*client_input_message), _)) + .RetiresOnSaturation(); + EXPECT_CALL(*(engine_control_feature_->incoming_message_processor()), + MockableProcessMessage( + EqualsMessageIgnoringId(*client_control_message), _)) + .RetiresOnSaturation(); + EXPECT_CALL(*(client_control_feature_->incoming_message_processor()), + MockableProcessMessage( + EqualsMessageIgnoringId(*engine_control_message), _)) + .RetiresOnSaturation(); + + client_input_feature_->outgoing_message_processor()->ProcessMessage( + std::move(client_input_message), net::CompletionCallback()); + client_control_feature_->outgoing_message_processor()->ProcessMessage( + std::move(client_control_message), net::CompletionCallback()); + engine_control_feature_->outgoing_message_processor()->ProcessMessage( + std::move(engine_control_message), net::CompletionCallback()); +} + +TEST_F(BrowserConnectionHandlerTest, ConnectionError) { + // Engine will not get message after connection error. + client_connection_->error_observer()->OnConnectionError(net::ERR_FAILED); + scoped_ptr<BlimpMessage> client_input_message = CreateInputMessage(1); + client_input_feature_->outgoing_message_processor()->ProcessMessage( + std::move(client_input_message), net::CompletionCallback()); +} + +TEST_F(BrowserConnectionHandlerTest, ReconnectionAfterError) { + scoped_ptr<BlimpMessage> client_input_message = CreateInputMessage(1); + EXPECT_CALL( + *(engine_input_feature_->incoming_message_processor()), + MockableProcessMessage(EqualsMessageIgnoringId(*client_input_message), _)) + .RetiresOnSaturation(); + + client_connection_->error_observer()->OnConnectionError(net::ERR_FAILED); + // Message will be queued to be transmitted when the connection is + // re-established. + client_input_feature_->outgoing_message_processor()->ProcessMessage( + std::move(client_input_message), net::CompletionCallback()); + + // Simulates reconnection. + SetupConnections(); +} + +} // namespace +} // namespace blimp
diff --git a/blimp/net/test_common.h b/blimp/net/test_common.h index b42c3d8..b743c4a8 100644 --- a/blimp/net/test_common.h +++ b/blimp/net/test_common.h
@@ -177,7 +177,7 @@ MOCK_METHOD1(SetIncomingMessageProcessor, void(BlimpMessageProcessor* processor)); - MOCK_CONST_METHOD0(GetOutgoingMessageProcessor, BlimpMessageProcessor*()); + MOCK_METHOD0(GetOutgoingMessageProcessor, BlimpMessageProcessor*()); }; class MockConnectionErrorObserver : public ConnectionErrorObserver {
diff --git a/build/android/avd.py b/build/android/avd.py index 4b7d191..eb83e2a 100755 --- a/build/android/avd.py +++ b/build/android/avd.py
@@ -8,14 +8,14 @@ The script will launch a specified number of Android Virtual Devices (AVD's). """ - -import install_emulator_deps +import argparse import logging -import optparse import os import re import sys +import install_emulator_deps + from devil.utils import cmd_helper from pylib import constants from pylib.utils import emulator @@ -26,36 +26,48 @@ emulator_sdk = constants.ANDROID_SDK_ROOT os.environ['ANDROID_SDK_ROOT'] = emulator_sdk - opt_parser = optparse.OptionParser(description='AVD script.') - opt_parser.add_option('--name', help='Optinaly, name of existing AVD to ' - 'launch. If not specified, new AVD\'s will be created') - opt_parser.add_option('-n', '--num', dest='emulator_count', - help='Number of emulators to launch (default is 1).', - type='int', default='1') - opt_parser.add_option('--abi', default='x86', - help='Platform of emulators to launch (x86 default).') - opt_parser.add_option('--api-level', dest='api_level', - help='API level for the image, e.g. 19 for Android 4.4', - type='int', default=constants.ANDROID_SDK_VERSION) - opt_parser.add_option('--kill-existing-emulators', action='store_true', - dest='kill', default=False, - help='Shutdown all existing emulators') + arg_parser = argparse.ArgumentParser(description='AVD script.') + sub_parsers = arg_parser.add_subparsers(title='subparser', dest='command') + sub_parsers.add_parser( + 'kill', help='Shutdown all existing emulators') + sub_parsers.add_parser( + 'delete', help='Deleting all the avd files') + run_parser = sub_parsers.add_parser('run', help='Run emulators') + run_parser.add_argument('--name', help='Optinaly, name of existing AVD to ' + 'launch. If not specified, AVD\'s will be created') + run_parser.add_argument('-n', '--num', dest='emulator_count', + help='Number of emulators to launch (default is 1).', + type=int, default='1') + run_parser.add_argument('--abi', default='x86', + help='Platform of emulators to launch (x86 default)') + run_parser.add_argument('--api-level', dest='api_level', + help='API level for the image', + type=int, default=constants.ANDROID_SDK_VERSION) + run_parser.add_argument('--sdcard-size', dest='sdcard_size', + default=emulator.DEFAULT_SDCARD_SIZE, + help='Set sdcard size of the emulators' + ' e.g. --sdcard-size=512M') + run_parser.add_argument('--partition-size', dest='partition_size', + default=emulator.DEFAULT_STORAGE_SIZE, + help='Default internal storage size' + ' e.g. --partition-size=1024M') + run_parser.add_argument('--launch-without-kill', action='store_false', + dest='kill_and_launch', default=True, + help='Kill all emulators at launch') - options, _ = opt_parser.parse_args(argv[1:]) + arguments = arg_parser.parse_args(argv[1:]) logging.root.setLevel(logging.INFO) - # Make sure --kill-existing-emulators is mutually exclusive with other options - if options.kill and len(argv[1:]) > 1: - logging.error('--kill-existing-emulators was specified. ' - 'Ignoring all other arguments.') - - if options.kill: + if arguments.command == 'kill': logging.info('Killing all existing emulator and existing the program') emulator.KillAllEmulators() return + if arguments.command == 'delete': + emulator.DeleteAllTempAVDs() + return - # Check if SDK exist in ANDROID_SDK_ROOT + # Check if SDK exist in ANDROID_SDK_ROOT if not install_emulator_deps.CheckSDK(): raise Exception('Emulator SDK not installed in %s' % constants.ANDROID_SDK_ROOT) @@ -63,29 +75,30 @@ # Check if KVM is enabled for x86 AVD's and check for x86 system images. # TODO(andrewhayden) Since we can fix all of these with install_emulator_deps # why don't we just run it? - if options.abi == 'x86': + if arguments.abi == 'x86': if not install_emulator_deps.CheckKVM(): logging.critical('ERROR: KVM must be enabled in BIOS, and installed. ' 'Enable KVM in BIOS and run install_emulator_deps.py') return 1 - elif not install_emulator_deps.CheckX86Image(options.api_level): + elif not install_emulator_deps.CheckX86Image(arguments.api_level): logging.critical('ERROR: System image for x86 AVD not installed. Run ' 'install_emulator_deps.py') return 1 # If AVD is specified, check that the SDK has the required target. If not, # check that the SDK has the desired target for the temporary AVD's. - api_level = options.api_level - if options.name: + api_level = arguments.api_level + if arguments.name: android = os.path.join(constants.ANDROID_SDK_ROOT, 'tools', 'android') avds_output = cmd_helper.GetCmdOutput([android, 'list', 'avd']) names = re.findall(r'Name: (\w+)', avds_output) api_levels = re.findall(r'API level (\d+)', avds_output) try: - avd_index = names.index(options.name) + avd_index = names.index(arguments.name) except ValueError: - logging.critical('ERROR: Specified AVD %s does not exist.', options.name) + logging.critical('ERROR: Specified AVD %s does not exist.', + arguments.name) return 1 api_level = int(api_levels[avd_index]) @@ -94,13 +107,24 @@ 'Run install_emulator_deps.py.') return 1 - if options.name: - emulator.LaunchEmulator(options.name, options.abi) + if arguments.name: + emulator.LaunchEmulator( + arguments.name, + arguments.abi, + kill_and_launch=arguments.reset_and_launch, + sdcard_size=arguments.sdcard_size, + storage_size=arguments.partition_size + ) else: - emulator.LaunchTempEmulators(options.emulator_count, options.abi, - options.api_level, True) - - + emulator.LaunchTempEmulators( + arguments.emulator_count, + arguments.abi, + arguments.api_level, + kill_and_launch=arguments.kill_and_launch, + sdcard_size=arguments.sdcard_size, + storage_size=arguments.partition_size, + wait_for_boot=True + ) if __name__ == '__main__': sys.exit(main(sys.argv))
diff --git a/build/android/devil/android/device_utils.py b/build/android/devil/android/device_utils.py index db9ae6f..2c77203 100644 --- a/build/android/devil/android/device_utils.py +++ b/build/android/devil/android/device_utils.py
@@ -1987,16 +1987,11 @@ raise device_errors.CommandFailedError( 'Could not find memory peak value for pid %s', str(pid)) - @decorators.WithTimeoutAndRetriesFromInstance() - def GetLogcatMonitor(self, timeout=None, retries=None, *args, **kwargs): + def GetLogcatMonitor(self, *args, **kwargs): """Returns a new LogcatMonitor associated with this device. Parameters passed to this function are passed directly to |logcat_monitor.LogcatMonitor| and are documented there. - - Args: - timeout: timeout in seconds - retries: number of retries """ return logcat_monitor.LogcatMonitor(self.adb, *args, **kwargs)
diff --git a/build/android/devil/android/logcat_monitor.py b/build/android/devil/android/logcat_monitor.py index d162230..71f0d24 100644 --- a/build/android/devil/android/logcat_monitor.py +++ b/build/android/devil/android/logcat_monitor.py
@@ -6,24 +6,32 @@ import logging import re +import shutil +import tempfile +import threading +import time from devil.android import decorators +from devil.android import device_errors from devil.android.sdk import adb_wrapper +from devil.utils import reraiser_thread class LogcatMonitor(object): + _WAIT_TIME = 0.2 _THREADTIME_RE_FORMAT = ( r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +' r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$') - def __init__(self, adb, clear=True, filter_specs=None): + def __init__(self, adb, clear=True, filter_specs=None, output_file=None): """Create a LogcatMonitor instance. Args: adb: An instance of adb_wrapper.AdbWrapper. clear: If True, clear the logcat when monitoring starts. filter_specs: An optional list of '<tag>[:priority]' strings. + output_file: File path to save recorded logcat. """ if isinstance(adb, adb_wrapper.AdbWrapper): self._adb = adb @@ -31,9 +39,10 @@ raise ValueError('Unsupported type passed for argument "device"') self._clear = clear self._filter_specs = filter_specs - self._logcat_out = None - self._logcat_out_file = None - self._logcat_proc = None + self._output_file = output_file + self._record_file = None + self._record_thread = None + self._stop_recording_event = threading.Event() @decorators.WithTimeoutAndRetriesDefaults(10, 0) def WaitFor(self, success_regex, failure_regex=None, timeout=None, @@ -60,7 +69,13 @@ CommandTimeoutError if no logcat line matching either |success_regex| or |failure_regex| is found in |timeout| seconds. DeviceUnreachableError if the device becomes unreachable. + LogcatMonitorCommandError when calling |WaitFor| while not recording + logcat. """ + if self._record_thread is None: + raise LogcatMonitorCommandError( + 'Must be recording logcat when calling |WaitFor|', + device_serial=str(self._adb)) if isinstance(success_regex, basestring): success_regex = re.compile(success_regex) if isinstance(failure_regex, basestring): @@ -73,12 +88,17 @@ # returned. # - failure_regex matches a line, in which case None is returned # - the timeout is hit, in which case a CommandTimeoutError is raised. - for l in self._adb.Logcat(filter_specs=self._filter_specs): - m = success_regex.search(l) - if m: - return m - if failure_regex and failure_regex.search(l): - return None + with open(self._record_file.name, 'r') as f: + while True: + line = f.readline() + if line: + m = success_regex.search(line) + if m: + return m + if failure_regex and failure_regex.search(line): + return None + else: + time.sleep(self._WAIT_TIME) def FindAll(self, message_regex, proc_id=None, thread_id=None, log_level=None, component=None): @@ -92,12 +112,19 @@ log_level: The log level to match. If None, matches any log level. component: The component to match. If None, matches any component. + Raises: + LogcatMonitorCommandError when calling |FindAll| before recording logcat. + Yields: A match object for each matching line in the logcat. The match object will always contain, in addition to groups defined in |message_regex|, the following named groups: 'date', 'time', 'proc_id', 'thread_id', 'log_level', 'component', and 'message'. """ + if self._record_file is None: + raise LogcatMonitorCommandError( + 'Must have recorded or be recording a logcat to call |FindAll|', + device_serial=str(self._adb)) if proc_id is None: proc_id = r'\d+' if thread_id is None: @@ -111,10 +138,39 @@ type(self)._THREADTIME_RE_FORMAT % ( proc_id, thread_id, log_level, component, message_regex)) - for line in self._adb.Logcat(dump=True, logcat_format='threadtime'): - m = re.match(threadtime_re, line) - if m: - yield m + with open(self._record_file.name, 'r') as f: + for line in f: + m = re.match(threadtime_re, line) + if m: + yield m + + def _StartRecording(self): + """Starts recording logcat to file. + + Function spawns a thread that records logcat to file and will not die + until |StopRecording| is called. + """ + def record_to_file(): + with open(self._record_file.name, 'a') as f: + for data in self._adb.Logcat(filter_specs=self._filter_specs, + logcat_format='threadtime'): + if self._stop_recording_event.isSet(): + f.flush() + return + f.write(data + '\n') + + self._stop_recording_event.clear() + if not self._record_thread: + self._record_thread = reraiser_thread.ReraiserThread(record_to_file) + self._record_thread.start() + + def _StopRecording(self): + """Finish recording logcat.""" + if self._record_thread: + self._stop_recording_event.set() + self._record_thread.join() + self._record_thread.ReraiseIfException() + self._record_thread = None def Start(self): """Starts the logcat monitor. @@ -123,6 +179,28 @@ """ if self._clear: self._adb.Logcat(clear=True) + if not self._record_file: + self._record_file = tempfile.NamedTemporaryFile() + self._StartRecording() + + def Stop(self): + """Stops the logcat monitor. + + Stops recording the logcat. Copies currently recorded logcat to + |self._output_file|. + """ + self._StopRecording() + if self._record_file and self._output_file: + shutil.copy(self._record_file.name, self._output_file) + + def Close(self): + """Closes logcat recording file. + + Should be called when finished using the logcat monitor. + """ + if self._record_file: + self._record_file.close() + self._record_file = None def __enter__(self): """Starts the logcat monitor.""" @@ -131,4 +209,14 @@ def __exit__(self, exc_type, exc_val, exc_tb): """Stops the logcat monitor.""" - pass + self.Stop() + + def __del__(self): + """Closes logcat recording file in case |Close| was never called.""" + if self._record_file: + logging.warning('Need to call |Close| on the logcat monitor when done!') + self._record_file.close() + +class LogcatMonitorCommandError(device_errors.CommandFailedError): + """Exception for errors with logcat monitor commands.""" + pass
diff --git a/build/android/devil/android/logcat_monitor_test.py b/build/android/devil/android/logcat_monitor_test.py index 61985607..19dbd75c8 100755 --- a/build/android/devil/android/logcat_monitor_test.py +++ b/build/android/devil/android/logcat_monitor_test.py
@@ -22,7 +22,6 @@ test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False) return test_log - class LogcatMonitorTest(unittest.TestCase): _TEST_THREADTIME_LOGCAT_DATA = [ @@ -39,7 +38,7 @@ '01-01 01:02:03.461 2345 5432 F LogcatMonitorTest: ' 'fatal logcat monitor test message 6', '01-01 01:02:03.462 3456 6543 D LogcatMonitorTest: ' - 'ignore me',] + 'last line',] def assertIterEqual(self, expected_iter, actual_iter): for expected, actual in itertools.izip_longest(expected_iter, actual_iter): @@ -60,9 +59,11 @@ with self.assertRaises(StopIteration): next(expected_iter) + @mock.patch('time.sleep', mock.Mock()) def testWaitFor_success(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None) self.assertTrue(actual_match) self.assertEqual( @@ -70,17 +71,27 @@ 'error logcat monitor test message 5', actual_match.group(0)) self.assertEqual('error', actual_match.group(1)) + test_log.Stop() + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testWaitFor_failure(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() actual_match = test_log.WaitFor( r'.*My Success Regex.*', r'.*(fatal|error) logcat monitor.*') self.assertIsNone(actual_match) + test_log.Stop() + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testFindAll_defaults(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() + test_log.WaitFor(r'.*last line.*', None) + test_log.Stop() expected_results = [ ('7890', '0987', 'V', 'LogcatMonitorTest', 'verbose logcat monitor test message 1'), @@ -96,37 +107,57 @@ 'fatal logcat monitor test message 6')] actual_results = test_log.FindAll(r'\S* logcat monitor test message \d') self.assertIterEqual(iter(expected_results), actual_results) + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testFindAll_defaults_miss(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() + test_log.WaitFor(r'.*last line.*', None) + test_log.Stop() expected_results = [] actual_results = test_log.FindAll(r'\S* nothing should match this \d') self.assertIterEqual(iter(expected_results), actual_results) + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testFindAll_filterProcId(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() + test_log.WaitFor(r'.*last line.*', None) + test_log.Stop() actual_results = test_log.FindAll( r'\S* logcat monitor test message \d', proc_id=1234) expected_results = [ ('1234', '4321', 'E', 'LogcatMonitorTest', 'error logcat monitor test message 5')] self.assertIterEqual(iter(expected_results), actual_results) + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testFindAll_filterThreadId(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() + test_log.WaitFor(r'.*last line.*', None) + test_log.Stop() actual_results = test_log.FindAll( r'\S* logcat monitor test message \d', thread_id=2109) expected_results = [ ('9012', '2109', 'I', 'LogcatMonitorTest', 'info logcat monitor test message 3')] self.assertIterEqual(iter(expected_results), actual_results) + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testFindAll_filterLogLevel(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() + test_log.WaitFor(r'.*last line.*', None) + test_log.Stop() actual_results = test_log.FindAll( r'\S* logcat monitor test message \d', log_level=r'[DW]') expected_results = [ @@ -135,10 +166,15 @@ ('0123', '3210', 'W', 'LogcatMonitorTest', 'warning logcat monitor test message 4'),] self.assertIterEqual(iter(expected_results), actual_results) + test_log.Close() + @mock.patch('time.sleep', mock.Mock()) def testFindAll_filterComponent(self): test_log = _CreateTestLog( raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) + test_log.Start() + test_log.WaitFor(r'.*last line.*', None) + test_log.Stop() actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest') expected_results = [ ('7890', '0987', 'V', 'LogcatMonitorTest', @@ -154,8 +190,9 @@ ('2345', '5432', 'F', 'LogcatMonitorTest', 'fatal logcat monitor test message 6'), ('3456', '6543', 'D', 'LogcatMonitorTest', - 'ignore me'),] + 'last line'),] self.assertIterEqual(iter(expected_results), actual_results) + test_log.Close() if __name__ == '__main__':
diff --git a/build/android/pylib/utils/emulator.py b/build/android/pylib/utils/emulator.py index a74c06a6..6669aa6 100644 --- a/build/android/pylib/utils/emulator.py +++ b/build/android/pylib/utils/emulator.py
@@ -22,14 +22,19 @@ from pylib import pexpect from pylib.utils import time_profile -# SD card size -SDCARD_SIZE = '512M' +# Default sdcard size in the format of [amount][unit] +DEFAULT_SDCARD_SIZE = '512M' +# Default internal storage (MB) of emulator image +DEFAULT_STORAGE_SIZE = '1024M' + +# Path for avd files and avd dir +BASE_AVD_DIR = os.path.expanduser(os.path.join('~', '.android', 'avd')) # Template used to generate config.ini files for the emulator CONFIG_TEMPLATE = """avd.ini.encoding=ISO-8859-1 hw.dPad=no hw.lcd.density=320 -sdcard.size=512M +sdcard.size={sdcard.size} hw.cpu.arch={hw.cpu.arch} hw.device.hash=-708107041 hw.camera.back=none @@ -86,6 +91,7 @@ running but a device slot is taken. A little bot trouble and we're out of room forever. """ + logging.info('Killing all existing emulators and existing the program') emulators = [device_utils.DeviceUtils(a) for a in adb_wrapper.AdbWrapper.Devices() if a.is_emulator] @@ -106,6 +112,7 @@ If the test exits abnormally and some temporary AVDs created when testing may be left in the system. Clean these AVDs. """ + logging.info('Deleting all the avd files') avds = device_utils.GetAVDs() if not avds: return @@ -149,7 +156,9 @@ return port -def LaunchTempEmulators(emulator_count, abi, api_level, wait_for_boot=True): +def LaunchTempEmulators(emulator_count, abi, api_level, kill_and_launch=True, + sdcard_size=DEFAULT_SDCARD_SIZE, + storage_size=DEFAULT_STORAGE_SIZE, wait_for_boot=True): """Create and launch temporary emulators and wait for them to boot. Args: @@ -168,9 +177,9 @@ avd_name = 'run_tests_avd_%d' % n logging.info('Emulator launch %d with avd_name=%s and api=%d', n, avd_name, api_level) - emulator = Emulator(avd_name, abi) + emulator = Emulator(avd_name, abi, sdcard_size, storage_size) emulator.CreateAVD(api_level) - emulator.Launch(kill_all_emulators=n == 0) + emulator.Launch(kill_all_emulators=(n == 0 and kill_and_launch)) t.Stop() emulators.append(emulator) # Wait for all emulators to boot completed. @@ -180,7 +189,9 @@ return emulators -def LaunchEmulator(avd_name, abi): +def LaunchEmulator(avd_name, abi, kill_and_launch=True, + sdcard_size=DEFAULT_SDCARD_SIZE, + storage_size=DEFAULT_STORAGE_SIZE): """Launch an existing emulator with name avd_name. Args: @@ -191,8 +202,9 @@ emulator object. """ logging.info('Specified emulator named avd_name=%s launched', avd_name) - emulator = Emulator(avd_name, abi) - emulator.Launch(kill_all_emulators=True) + emulator = Emulator(avd_name, abi, sdcard_size=sdcard_size, + storage_size=storage_size) + emulator.Launch(kill_all_emulators=kill_and_launch) emulator.ConfirmLaunch(True) return emulator @@ -224,10 +236,12 @@ # process life check. _WAITFORDEVICE_TIMEOUT = 5 - # Time to wait for a "wait for boot complete" (property set on device). + # Time to wait for a 'wait for boot complete' (property set on device). _WAITFORBOOT_TIMEOUT = 300 - def __init__(self, avd_name, abi): + def __init__(self, avd_name, abi, + sdcard_size=DEFAULT_SDCARD_SIZE, + storage_size=DEFAULT_STORAGE_SIZE): """Init an Emulator. Args: @@ -241,6 +255,8 @@ self.device_serial = None self.abi = abi self.avd_name = avd_name + self.sdcard_size = sdcard_size + self.storage_size = storage_size @staticmethod def _DeviceName(): @@ -273,7 +289,7 @@ '--name', self.avd_name, '--abi', abi_option, '--target', api_target, - '--sdcard', SDCARD_SIZE, + '--sdcard', self.sdcard_size, '--force', ] avd_cmd_str = ' '.join(avd_command) @@ -286,9 +302,8 @@ avd_process.expect('Created AVD \'%s\'' % self.avd_name) # Replace current configuration with default Galaxy Nexus config. - avds_dir = os.path.join(os.path.expanduser('~'), '.android', 'avd') - ini_file = os.path.join(avds_dir, '%s.ini' % self.avd_name) - new_config_ini = os.path.join(avds_dir, '%s.avd' % self.avd_name, + ini_file = os.path.join(BASE_AVD_DIR, '%s.ini' % self.avd_name) + new_config_ini = os.path.join(BASE_AVD_DIR, '%s.avd' % self.avd_name, 'config.ini') # Remove config files with defaults to replace with Google's GN settings. @@ -299,7 +314,7 @@ with open(ini_file, 'w') as new_ini: new_ini.write('avd.ini.encoding=ISO-8859-1\n') new_ini.write('target=%s\n' % api_target) - new_ini.write('path=%s/%s.avd\n' % (avds_dir, self.avd_name)) + new_ini.write('path=%s/%s.avd\n' % (BASE_AVD_DIR, self.avd_name)) new_ini.write('path.rel=avd/%s.avd\n' % self.avd_name) custom_config = CONFIG_TEMPLATE @@ -307,6 +322,7 @@ for key in replacements: custom_config = custom_config.replace(key, replacements[key]) custom_config = custom_config.replace('{api.level}', str(api_level)) + custom_config = custom_config.replace('{sdcard.size}', self.sdcard_size) with open(new_config_ini, 'w') as new_config_ini: new_config_ini.write(custom_config) @@ -326,6 +342,21 @@ logging.info('Delete AVD command: %s', ' '.join(avd_command)) cmd_helper.RunCmd(avd_command) + def ResizeAndWipeAvd(self, storage_size): + """Wipes old AVD and creates new AVD of size |storage_size|. + + This serves as a work around for '-partition-size' and '-wipe-data' + """ + userdata_img = os.path.join(BASE_AVD_DIR, '%s.avd' % self.avd_name, + 'userdata.img') + userdata_qemu_img = os.path.join(BASE_AVD_DIR, '%s.avd' % self.avd_name, + 'userdata-qemu.img') + resize_cmd = ['resize2fs', userdata_img, '%s' % storage_size] + logging.info('Resizing userdata.img to ideal size') + cmd_helper.RunCmd(resize_cmd) + wipe_cmd = ['cp', userdata_img, userdata_qemu_img] + logging.info('Replacing userdata-qemu.img with the new userdata.img') + cmd_helper.RunCmd(wipe_cmd) def Launch(self, kill_all_emulators): """Launches the emulator asynchronously. Call ConfirmLaunch() to ensure the @@ -337,19 +368,14 @@ KillAllEmulators() # just to be sure self._AggressiveImageCleanup() (self.device_serial, port) = self._DeviceName() + self.ResizeAndWipeAvd(storage_size=self.storage_size) emulator_command = [ self.emulator, # Speed up emulator launch by 40%. Really. '-no-boot-anim', - # The default /data size is 64M. - # That's not enough for 8 unit test bundles and their data. - '-partition-size', '512', # Use a familiar name and port. '-avd', self.avd_name, '-port', str(port), - # Wipe the data. We've seen cases where an emulator gets 'stuck' if we - # don't do this (every thousand runs or so). - '-wipe-data', # Enable GPU by default. '-gpu', 'on', '-qemu', '-m', '1024',
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py new file mode 100755 index 0000000..db008bb --- /dev/null +++ b/build/android/resource_sizes.py
@@ -0,0 +1,388 @@ +#!/usr/bin/python +# Copyright (c) 2011 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. + +"""Prints the size of each given file and optionally computes the size of + libchrome.so without the dependencies added for building with android NDK. + Also breaks down the contents of the APK to determine the installed size + and assign size contributions to different classes of file. +""" + +import collections +import json +import operator +import optparse +import os +import re +import sys +import tempfile +import zipfile +import zlib + +from devil.utils import cmd_helper +from pylib import constants + +sys.path.append(os.path.join(constants.DIR_SOURCE_ROOT, 'tools', 'grit')) +from grit.format import data_pack # pylint: disable=import-error +sys.path.append(os.path.join( + constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) +import perf_tests_results_helper # pylint: disable=import-error + + +# Static initializers expected in official builds. Note that this list is built +# using 'nm' on libchrome.so which results from a GCC official build (i.e. +# Clang is not supported currently). + +STATIC_INITIALIZER_SYMBOL_PREFIX = '_GLOBAL__I_' + +EXPECTED_STATIC_INITIALIZERS = frozenset([ + 'allocators.cpp', + 'common.pb.cc', + 'defaults.cc', + 'generated_message_util.cc', + 'locale_impl.cpp', + 'timeutils.cc', + 'watchdog.cc', + # http://b/6354040 + 'SkFontHost_android.cpp', + # http://b/6354040 + 'isolate.cc', + 'assembler_arm.cc', + 'isolate.cc', +]) + +_BASE_CHART = { + 'format_version': '0.1', + 'benchmark_name': 'resource_sizes', + 'benchmark_description': 'APK resource size information.', + 'trace_rerun_options': [], + 'charts': {} +} + +_RC_HEADER_RE = re.compile(r'^#define (?P<name>\w+) (?P<id>\d+)$') + + +def GetStaticInitializers(so_path): + """Returns a list of static initializers found in the non-stripped library + located at the provided path. Note that this function assumes that the + library was compiled with GCC. + """ + output = cmd_helper.GetCmdOutput(['nm', so_path]) + static_initializers = [] + for line in output: + symbol_name = line.split(' ').pop().rstrip() + if STATIC_INITIALIZER_SYMBOL_PREFIX in symbol_name: + static_initializers.append( + symbol_name.replace(STATIC_INITIALIZER_SYMBOL_PREFIX, '')) + return static_initializers + + +def ReportPerfResult(chart_data, graph_title, trace_title, value, units, + improvement_direction='down', important=True): + """Outputs test results in correct format. + + If chart_data is None, it outputs data in old format. If chart_data is a + dictionary, formats in chartjson format. If any other format defaults to + old format. + """ + if chart_data and isinstance(chart_data, dict): + chart_data['charts'].setdefault(graph_title, {}) + chart_data['charts'][graph_title][trace_title] = { + 'type': 'scalar', + 'value': value, + 'units': units, + 'improvement_direction': improvement_direction, + 'important': important + } + else: + perf_tests_results_helper.PrintPerfResult( + graph_title, trace_title, [value], units) + + +def PrintResourceSizes(files, chartjson=None): + """Prints the sizes of each given file. + + Args: + files: List of files to print sizes for. + """ + for f in files: + ReportPerfResult(chartjson, 'ResourceSizes', os.path.basename(f) + ' size', + os.path.getsize(f), 'bytes') + + +def PrintApkAnalysis(apk_filename, chartjson=None): + """Analyse APK to determine size contributions of different file classes.""" + # Define a named tuple type for file grouping. + # name: Human readable name for this file group + # regex: Regular expression to match filename + # extracted: Function that takes a file name and returns whether the file is + # extracted from the apk at install/runtime. + FileGroup = collections.namedtuple('FileGroup', + ['name', 'regex', 'extracted']) + + # File groups are checked in sequence, so more specific regexes should be + # earlier in the list. + YES = lambda _: True + NO = lambda _: False + FILE_GROUPS = ( + FileGroup('Native code', r'\.so$', lambda f: 'crazy' not in f), + FileGroup('Java code', r'\.dex$', YES), + FileGroup('Native resources (no l10n)', r'\.pak$', NO), + # For locale paks, assume only english paks are extracted. + FileGroup('Native resources (l10n)', r'\.lpak$', lambda f: 'en_' in f), + FileGroup('ICU (i18n library) data', r'assets/icudtl\.dat$', NO), + FileGroup('V8 Snapshots', r'\.bin$', NO), + FileGroup('PNG drawables', r'\.png$', NO), + FileGroup('Non-compiled Android resources', r'^res/', NO), + FileGroup('Compiled Android resources', r'\.arsc$', NO), + FileGroup('Package metadata', r'^(META-INF/|AndroidManifest\.xml$)', NO), + FileGroup('Unknown files', r'.', NO), + ) + + apk = zipfile.ZipFile(apk_filename, 'r') + try: + apk_contents = apk.infolist() + finally: + apk.close() + + total_apk_size = os.path.getsize(apk_filename) + apk_basename = os.path.basename(apk_filename) + + found_files = {} + for group in FILE_GROUPS: + found_files[group] = [] + + for member in apk_contents: + for group in FILE_GROUPS: + if re.search(group.regex, member.filename): + found_files[group].append(member) + break + else: + raise KeyError('No group found for file "%s"' % member.filename) + + total_install_size = total_apk_size + + for group in FILE_GROUPS: + apk_size = sum(member.compress_size for member in found_files[group]) + install_size = apk_size + install_bytes = sum(f.file_size for f in found_files[group] + if group.extracted(f.filename)) + install_size += install_bytes + total_install_size += install_bytes + + ReportPerfResult(chartjson, apk_basename + '_Breakdown', + group.name + ' size', apk_size, 'bytes') + ReportPerfResult(chartjson, apk_basename + '_InstallBreakdown', + group.name + ' size', install_size, 'bytes') + + transfer_size = _CalculateCompressedSize(apk_filename) + ReportPerfResult(chartjson, apk_basename + '_InstallSize', + 'Estimated installed size', total_install_size, 'bytes') + ReportPerfResult(chartjson, apk_basename + '_InstallSize', 'APK size', + total_apk_size, 'bytes') + ReportPerfResult(chartjson, apk_basename + '_TransferSize', + 'Transfer size (deflate)', transfer_size, 'bytes') + + +def IsPakFileName(file_name): + """Returns whether the given file name ends with .pak or .lpak.""" + return file_name.endswith('.pak') or file_name.endswith('.lpak') + + +def PrintPakAnalysis(apk_filename, min_pak_resource_size, build_type): + """Print sizes of all resources in all pak files in |apk_filename|.""" + print + print 'Analyzing pak files in %s...' % apk_filename + + # A structure for holding details about a pak file. + Pak = collections.namedtuple( + 'Pak', ['filename', 'compress_size', 'file_size', 'resources']) + + # Build a list of Pak objets for each pak file. + paks = [] + apk = zipfile.ZipFile(apk_filename, 'r') + try: + for i in (x for x in apk.infolist() if IsPakFileName(x.filename)): + with tempfile.NamedTemporaryFile() as f: + f.write(apk.read(i.filename)) + f.flush() + paks.append(Pak(i.filename, i.compress_size, i.file_size, + data_pack.DataPack.ReadDataPack(f.name).resources)) + finally: + apk.close() + + # Output the overall pak file summary. + total_files = len(paks) + total_compress_size = sum(pak.compress_size for pak in paks) + total_file_size = sum(pak.file_size for pak in paks) + print 'Total pak files: %d' % total_files + print 'Total compressed size: %s' % _FormatBytes(total_compress_size) + print 'Total uncompressed size: %s' % _FormatBytes(total_file_size) + print + + # Output the table of details about all pak files. + print '%25s%11s%21s%21s' % ( + 'FILENAME', 'RESOURCES', 'COMPRESSED SIZE', 'UNCOMPRESSED SIZE') + for pak in sorted(paks, key=operator.attrgetter('file_size'), reverse=True): + print '%25s %10s %12s %6.2f%% %12s %6.2f%%' % ( + pak.filename, + len(pak.resources), + _FormatBytes(pak.compress_size), + 100.0 * pak.compress_size / total_compress_size, + _FormatBytes(pak.file_size), + 100.0 * pak.file_size / total_file_size) + + print + print 'Analyzing pak resources in %s...' % apk_filename + + # Calculate aggregate stats about resources across pak files. + resource_count_map = collections.defaultdict(int) + resource_size_map = collections.defaultdict(int) + resource_overhead_bytes = 6 + for pak in paks: + for r in pak.resources: + resource_count_map[r] += 1 + resource_size_map[r] += len(pak.resources[r]) + resource_overhead_bytes + + # Output the overall resource summary. + total_resource_size = sum(resource_size_map.values()) + total_resource_count = len(resource_count_map) + assert total_resource_size <= total_file_size + print 'Total pak resources: %s' % total_resource_count + print 'Total uncompressed resource size: %s' % _FormatBytes( + total_resource_size) + print + + resource_id_name_map = _GetResourceIdNameMap(build_type) + + # Output the table of details about all resources across pak files. + print + print '%56s %5s %17s' % ('RESOURCE', 'COUNT', 'UNCOMPRESSED SIZE') + for i in sorted(resource_size_map, key=resource_size_map.get, + reverse=True): + if resource_size_map[i] >= min_pak_resource_size: + print '%56s %5s %9s %6.2f%%' % ( + resource_id_name_map.get(i, i), + resource_count_map[i], + _FormatBytes(resource_size_map[i]), + 100.0 * resource_size_map[i] / total_resource_size) + + +def _GetResourceIdNameMap(build_type): + """Returns a map of {resource_id: resource_name}.""" + out_dir = os.path.join(constants.DIR_SOURCE_ROOT, 'out', build_type) + assert os.path.isdir(out_dir), 'Failed to locate out dir at %s' % out_dir + print 'Looking at resources in: %s' % out_dir + + grit_headers = [] + for root, _, files in os.walk(out_dir): + if root.endswith('grit'): + grit_headers += [os.path.join(root, f) for f in files if f.endswith('.h')] + assert grit_headers, 'Failed to find grit headers in %s' % out_dir + + id_name_map = {} + for header in grit_headers: + with open(header, 'r') as f: + for line in f.readlines(): + m = _RC_HEADER_RE.match(line.strip()) + if m: + i = int(m.group('id')) + name = m.group('name') + if i in id_name_map and name != id_name_map[i]: + print 'WARNING: Resource ID conflict %s (%s vs %s)' % ( + i, id_name_map[i], name) + id_name_map[i] = name + return id_name_map + + +def PrintStaticInitializersCount(so_with_symbols_path, chartjson=None): + """Emits the performance result for static initializers found in the provided + shared library. Additionally, files for which static initializers were + found are printed on the standard output. + + Args: + so_with_symbols_path: Path to the unstripped libchrome.so file. + """ + print 'Files with static initializers:' + static_initializers = GetStaticInitializers(so_with_symbols_path) + print '\n'.join(static_initializers) + + ReportPerfResult(chartjson, 'StaticInitializersCount', 'count', + len(static_initializers), 'count') + + +def _FormatBytes(byts): + """Pretty-print a number of bytes.""" + if byts > 2**20.0: + byts /= 2**20.0 + return '%.2fm' % byts + if byts > 2**10.0: + byts /= 2**10.0 + return '%.2fk' % byts + return str(byts) + + +def _CalculateCompressedSize(file_path): + CHUNK_SIZE = 256 * 1024 + compressor = zlib.compressobj() + total_size = 0 + with open(file_path, 'rb') as f: + for chunk in iter(lambda: f.read(CHUNK_SIZE), ''): + total_size += len(compressor.compress(chunk)) + total_size += len(compressor.flush()) + return total_size + + +def main(argv): + usage = """Usage: %prog [options] file1 file2 ... + +Pass any number of files to graph their sizes. Any files with the extension +'.apk' will be broken down into their components on a separate graph.""" + option_parser = optparse.OptionParser(usage=usage) + option_parser.add_option('--so-path', help='Path to libchrome.so.') + option_parser.add_option('--so-with-symbols-path', + help='Path to libchrome.so with symbols.') + option_parser.add_option('--min-pak-resource-size', type='int', + default=20*1024, + help='Minimum byte size of displayed pak resources.') + option_parser.add_option('--build_type', dest='build_type', default='Debug', + help='Sets the build type, default is Debug.') + option_parser.add_option('--chartjson', action="store_true", + help='Sets output mode to chartjson.') + option_parser.add_option('--output-dir', default='.', + help='Directory to save chartjson to.') + option_parser.add_option('-d', '--device', + help='Dummy option for perf runner.') + options, args = option_parser.parse_args(argv) + files = args[1:] + chartjson = _BASE_CHART.copy() if options.chartjson else None + + # For backward compatibilty with buildbot scripts, treat --so-path as just + # another file to print the size of. We don't need it for anything special any + # more. + if options.so_path: + files.append(options.so_path) + + if not files: + option_parser.error('Must specify a file') + + if options.so_with_symbols_path: + PrintStaticInitializersCount( + options.so_with_symbols_path, chartjson=chartjson) + + PrintResourceSizes(files, chartjson=chartjson) + + for f in files: + if f.endswith('.apk'): + PrintApkAnalysis(f, chartjson=chartjson) + PrintPakAnalysis(f, options.min_pak_resource_size, options.build_type) + + if chartjson: + results_path = os.path.join(options.outpur_dir, 'results-chart.json') + with open(results_path, 'w') as json_file: + json.dump(chartjson, json_file) + + +if __name__ == '__main__': + sys.exit(main(sys.argv))
diff --git a/build/gn_migration.gypi b/build/gn_migration.gypi index ca06e0ee..fd8a400 100644 --- a/build/gn_migration.gypi +++ b/build/gn_migration.gypi
@@ -180,6 +180,7 @@ ['OS=="android"', { 'dependencies': [ '../base/base.gyp:base_junit_tests', + '../base/base.gyp:base_perftests_apk', '../base/base.gyp:base_unittests_apk', '../base/base.gyp:chromium_android_linker', '../breakpad/breakpad.gyp:breakpad_unittests_deps', @@ -189,6 +190,7 @@ '../breakpad/breakpad.gyp:minidump_stackwalk#host', '../build/android/rezip.gyp:rezip_apk_jar', '../cc/blink/cc_blink_tests.gyp:cc_blink_unittests_apk', + '../cc/cc_tests.gyp:cc_perftests_apk', '../cc/cc_tests.gyp:cc_unittests_apk', #"//clank" TODO(GYP) - conditional somehow? '../components/components.gyp:cronet_sample_apk', @@ -199,23 +201,31 @@ '../components/components_tests.gyp:components_browsertests_apk', '../components/components_tests.gyp:components_junit_tests', '../components/components_tests.gyp:components_unittests_apk', + '../content/content_shell_and_tests.gyp:chromium_linker_test_apk', '../content/content_shell_and_tests.gyp:content_browsertests_apk', '../content/content_shell_and_tests.gyp:content_gl_tests_apk', '../content/content_shell_and_tests.gyp:content_junit_tests', '../content/content_shell_and_tests.gyp:content_shell_apk', + '../content/content_shell_and_tests.gyp:content_shell_test_apk', '../content/content_shell_and_tests.gyp:content_unittests_apk', '../content/content_shell_and_tests.gyp:video_decode_accelerator_unittest_apk', '../device/device_tests.gyp:device_unittests_apk', + '../gpu/gpu.gyp:gl_tests_apk', + '../gpu/gpu.gyp:gpu_perftests_apk', '../gpu/gpu.gyp:gpu_unittests_apk', + '../ipc/ipc.gyp:ipc_tests_apk', '../media/cast/cast.gyp:cast_unittests_apk', + '../media/media.gyp:media_perftests_apk', '../media/media.gyp:media_unittests_apk', '../media/midi/midi.gyp:midi_unittests_apk', '../net/net.gyp:net_junit_tests', '../net/net.gyp:net_unittests_apk', + '../sandbox/sandbox.gyp:sandbox_linux_unittests_deps', '../skia/skia_tests.gyp:skia_unittests_apk', '../sql/sql.gyp:sql_unittests_apk', '../sync/sync.gyp:sync_unit_tests_apk', '../testing/android/junit/junit_test.gyp:junit_unit_tests', + '../third_party/smhasher/smhasher.gyp:murmurhash3', '../third_party/WebKit/Source/platform/blink_platform_tests.gyp:blink_heap_unittests_apk', '../third_party/WebKit/Source/platform/blink_platform_tests.gyp:blink_platform_unittests_apk', '../third_party/WebKit/Source/web/web_tests.gyp:webkit_unit_tests_apk', @@ -224,37 +234,14 @@ '../tools/android/android_tools.gyp:memconsumer', '../tools/imagediff/image_diff.gyp:image_diff#host', '../tools/telemetry/telemetry.gyp:bitmaptools#host', + '../ui/android/ui_android.gyp:ui_android_unittests_apk', '../ui/base/ui_base_tests.gyp:ui_base_unittests_apk', '../ui/events/events_unittests.gyp:events_unittests_apk', '../ui/gfx/gfx_tests.gyp:gfx_unittests_apk', '../ui/gl/gl_tests.gyp:gl_unittests_apk', '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests_apk', - # TODO(GYP): Remove these when the components_unittests work. - #"//components/history/core/test:test", - #"//components/policy:policy_component_test_support", - #"//components/policy:test_support", - #"//components/rappor:test_support", - #"//components/signin/core/browser:test_support", - #"//components/sync_driver:test_support", - #"//components/user_manager", - #"//components/wallpaper", - - # TODO(GYP): Are these needed, or will they be pulled in automatically? - #"//third_party/android_tools:android_gcm_java", #"//third_party/android_tools:uiautomator_java", - #"//third_party/android_tools:android_support_v13_java", - #"//third_party/android_tools:android_support_v7_appcompat_java", - #"//third_party/android_tools:android_support_v7_mediarouter_java", - #"//third_party/mesa", - #"//third_party/mockito:mockito_java", - #"//third_party/openmax_dl/dl", - #"//ui/android:ui_java", - - # TODO(GYP): Are these needed? - #"//chrome/test:test_support_unit", - #"//third_party/smhasher:murmurhash3", - #"//ui/message_center:test_support", ], 'dependencies!': [ # TODO(GYP): All of these targets need to be ported over. @@ -265,6 +252,8 @@ 'dependencies': [ '../chrome/android/chrome_apk.gyp:chrome_public_apk', '../chrome/android/chrome_apk.gyp:chrome_public_test_apk', + '../chrome/android/chrome_apk.gyp:chrome_sync_shell_apk', + '../chrome/android/chrome_apk.gyp:chrome_sync_shell_test_apk', '../chrome/chrome.gyp:chromedriver_webview_shell_apk', '../chrome/chrome.gyp:chrome_junit_tests', '../chrome/chrome.gyp:unit_tests_apk', @@ -764,17 +753,7 @@ }], ['OS=="android"', { 'dependencies': [ - '../base/base.gyp:base_perftests_apk', - '../cc/cc_tests.gyp:cc_perftests_apk', '../components/components.gyp:cronet_perf_test_apk', - '../content/content_shell_and_tests.gyp:chromium_linker_test_apk', - '../content/content_shell_and_tests.gyp:content_shell_test_apk', - '../gpu/gpu.gyp:gl_tests_apk', - '../gpu/gpu.gyp:gpu_perftests_apk', - '../ipc/ipc.gyp:ipc_tests_apk', - '../media/media.gyp:media_perftests_apk', - '../sandbox/sandbox.gyp:sandbox_linux_unittests_deps', - '../ui/android/ui_android.gyp:ui_android_unittests_apk', '../url/url.gyp:url_unittests', ], }], @@ -787,8 +766,6 @@ '../android_webview/android_webview_shell.gyp:system_webview_shell_apk', '../android_webview/android_webview_shell.gyp:system_webview_shell_layout_test_apk', '../android_webview/android_webview_shell.gyp:system_webview_shell_page_cycler_apk', - '../chrome/android/chrome_apk.gyp:chrome_sync_shell_apk', - '../chrome/android/chrome_apk.gyp:chrome_sync_shell_test_apk', ], }], ['OS=="android" and chromecast==0 and use_webview_internal_framework==0', {
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py index e53eab5f..7f535ea9 100755 --- a/build/vs_toolchain.py +++ b/build/vs_toolchain.py
@@ -104,7 +104,7 @@ def _CopyRuntime2015(target_dir, source_dir, dll_pattern): """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't exist, but the target directory does exist.""" - for file_part in ('msvcp', 'vccorlib'): + for file_part in ('msvcp', 'vccorlib', 'vcruntime'): dll = dll_pattern % file_part target = os.path.join(target_dir, dll) source = os.path.join(source_dir, dll)
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index f0ea96c1..32d1542e 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc
@@ -3542,15 +3542,22 @@ ca_layer_overlay.contents_rect.width(), ca_layer_overlay.contents_rect.height(), }; - GLfloat bounds_size[2] = { - ca_layer_overlay.bounds_size.width(), + GLuint edge_aa_mask = 0; + GLfloat bounds_rect[4] = { + 0, 0, ca_layer_overlay.bounds_size.width(), ca_layer_overlay.bounds_size.height(), }; + GLboolean is_clipped = GL_FALSE; + GLfloat clip_rect[4] = { + 0, 0, 0, 0, + }; + GLint sorting_context_id = 0; GLfloat transform[16]; ca_layer_overlay.transform.asColMajorf(transform); gl_->ScheduleCALayerCHROMIUM( texture_id, contents_rect, ca_layer_overlay.opacity, - ca_layer_overlay.background_color, bounds_size, transform); + ca_layer_overlay.background_color, edge_aa_mask, bounds_rect, + is_clipped, clip_rect, sorting_context_id, transform); } }
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc index 2cea8bf..ff6ba40 100644 --- a/cc/trees/layer_tree_host_common.cc +++ b/cc/trees/layer_tree_host_common.cc
@@ -2600,6 +2600,8 @@ mask_layer_draw_properties.visible_layer_rect = gfx::Rect(layer->bounds()); mask_layer_draw_properties.target_space_transform = layer->draw_properties().target_space_transform; + mask_layer_draw_properties.screen_space_transform = + layer->draw_properties().screen_space_transform; mask_layer_draw_properties.maximum_animation_contents_scale = layer->draw_properties().maximum_animation_contents_scale; mask_layer_draw_properties.starting_animation_contents_scale =
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index 3c173094..feffcf3 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -9276,6 +9276,36 @@ EXPECT_EQ(gfx::Rect(-10, -10, 30, 30), render_surface2->clip_rect()); } +TEST_F(LayerTreeHostCommonTest, MaskLayerScreenSpaceTransform) { + // Tests that the mask layer gets its owning layer's screen space transform. + LayerImpl* root = root_layer(); + LayerImpl* child = AddChild<LayerImpl>(root); + + const gfx::Transform identity_matrix; + gfx::Transform transform; + transform.Translate(10, 10); + + SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(), + gfx::PointF(), gfx::Size(30, 30), true, false, + true); + SetLayerPropertiesForTesting(child, transform, gfx::Point3F(), gfx::PointF(), + gfx::Size(30, 30), true, false, false); + root->SetDrawsContent(true); + child->SetDrawsContent(false); + child->SetMaskLayer(LayerImpl::Create(root->layer_tree_impl(), 100)); + ExecuteCalculateDrawProperties(root); + + EXPECT_TRANSFORMATION_MATRIX_EQ(transform, + child->mask_layer()->ScreenSpaceTransform()); + transform.Translate(10, 10); + child->SetTransform(transform); + child->SetDrawsContent(true); + root->layer_tree_impl()->property_trees()->needs_rebuild = true; + ExecuteCalculateDrawProperties(root); + EXPECT_TRANSFORMATION_MATRIX_EQ(transform, + child->mask_layer()->ScreenSpaceTransform()); +} + TEST_F(LayerTreeHostCommonTest, LargeTransformTest) { LayerImpl* root = root_layer(); LayerImpl* render_surface1 = AddChild<LayerImpl>(root);
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index cadd2eb..2978af6 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc
@@ -301,6 +301,8 @@ layer->set_should_flatten_transform_from_property_tree( data_from_ancestor.should_flatten); layer->SetTransformTreeIndex(parent_index); + if (layer->mask_layer()) + layer->mask_layer()->SetTransformTreeIndex(parent_index); return false; } @@ -308,6 +310,8 @@ TransformNode* node = data_for_children->transform_tree->back(); layer->SetTransformTreeIndex(node->id); + if (layer->mask_layer()) + layer->mask_layer()->SetTransformTreeIndex(node->id); node->data.scrolls = is_scrollable; node->data.flattens_inherited_transform = data_for_children->should_flatten;
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 7698bac..d880717 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -133,8 +133,6 @@ "//base:base_java", "//components/safe_json/android:safe_json_java", "//components/variations/android:variations_java", - "//components/web_contents_delegate_android:web_contents_delegate_android_java", - "//components/web_restriction:web_restriction_java", "//content/public/android:content_java", "//media/base/android:media_java", "//media/midi:midi_java", @@ -342,7 +340,6 @@ "//components/precache/android:precache_java", "//components/precache/android:precache_javatests", "//components/web_contents_delegate_android:web_contents_delegate_android_java", - "//components/web_restriction:web_restriction_java", "//content/public/android:content_java", "//content/public/test/android:content_java_test_support", "//net/android:net_java",
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index 3b2cd4b..47cca4c 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -423,12 +423,6 @@ android:resource="@xml/file_paths" /> </provider> - <provider android:name="org.chromium.chrome.browser.superviseduser.SupervisedUserContentProvider" - android:authorities="{{ manifest_package }}.SupervisedUserProvider" - android:permission="android.permission.INTERNET" - android:exported="true"> - </provider> - <!-- Sync adapter for browser invalidation. --> <service android:name="org.chromium.chrome.browser.invalidation.ChromeBrowserSyncAdapterService" android:exported="false">
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS index 5c33936..acf1ccfa 100644 --- a/chrome/android/java/DEPS +++ b/chrome/android/java/DEPS
@@ -7,7 +7,6 @@ "+components/precache/android/java", "+components/service_tab_launcher", "+components/web_contents_delegate_android", - "+components/web_restriction", "+content/public/android/java", "+sync/android/java/src/org/chromium/sync", ]
diff --git a/chrome/android/java/res/drawable-hdpi/physical_web_logo.png b/chrome/android/java/res/drawable-hdpi/physical_web_logo.png index d4b2ac1..3255d19 100644 --- a/chrome/android/java/res/drawable-hdpi/physical_web_logo.png +++ b/chrome/android/java/res/drawable-hdpi/physical_web_logo.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim1.png b/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim1.png index 7264d43..d4042ef 100644 --- a/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim1.png +++ b/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim1.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim2.png b/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim2.png index fb10466..a35a22c 100644 --- a/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim2.png +++ b/chrome/android/java/res/drawable-hdpi/physical_web_logo_anim2.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/physical_web_logo.png b/chrome/android/java/res/drawable-mdpi/physical_web_logo.png index 478eb80..27d1f2a 100644 --- a/chrome/android/java/res/drawable-mdpi/physical_web_logo.png +++ b/chrome/android/java/res/drawable-mdpi/physical_web_logo.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim1.png b/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim1.png index c084273..496ea1e5 100644 --- a/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim1.png +++ b/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim1.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim2.png b/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim2.png index 5c4f1d9c..1142cd38 100644 --- a/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim2.png +++ b/chrome/android/java/res/drawable-mdpi/physical_web_logo_anim2.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/physical_web_logo.png b/chrome/android/java/res/drawable-xhdpi/physical_web_logo.png index 27d1f2a..b5cfa65c 100644 --- a/chrome/android/java/res/drawable-xhdpi/physical_web_logo.png +++ b/chrome/android/java/res/drawable-xhdpi/physical_web_logo.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim1.png b/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim1.png index 496ea1e5..a346967d 100644 --- a/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim1.png +++ b/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim1.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim2.png b/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim2.png index 1142cd38..ad8a13e 100644 --- a/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim2.png +++ b/chrome/android/java/res/drawable-xhdpi/physical_web_logo_anim2.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/physical_web_logo.png b/chrome/android/java/res/drawable-xxhdpi/physical_web_logo.png index 8147147..5ebccf6 100644 --- a/chrome/android/java/res/drawable-xxhdpi/physical_web_logo.png +++ b/chrome/android/java/res/drawable-xxhdpi/physical_web_logo.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim1.png b/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim1.png index 4f4d838a..124b636 100644 --- a/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim1.png +++ b/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim1.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim2.png b/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim2.png index 452dade..52fed04b 100644 --- a/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim2.png +++ b/chrome/android/java/res/drawable-xxhdpi/physical_web_logo_anim2.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo.png b/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo.png index 96146164..3cd708e 100644 --- a/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo.png +++ b/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim1.png b/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim1.png index 35881a4..4affeb9 100644 --- a/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim1.png +++ b/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim1.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim2.png b/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim2.png index 111a169..3ea22c39 100644 --- a/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim2.png +++ b/chrome/android/java/res/drawable-xxxhdpi/physical_web_logo_anim2.png Binary files differ
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml index abd10677..026d221 100644 --- a/chrome/android/java/res/values/values.xml +++ b/chrome/android/java/res/values/values.xml
@@ -54,5 +54,6 @@ <string name="help_context_incognito_learn_more">chrome_incognito</string> <string name="help_context_usage_reports">send_crash_report</string> <string name="help_context_sad_tab">mobile_awsnap</string> + <string name="help_context_physical_web">physical_web</string> </resources>
diff --git a/chrome/android/java/res/xml/physical_web_preferences.xml b/chrome/android/java/res/xml/physical_web_preferences.xml new file mode 100644 index 0000000..4d42d99 --- /dev/null +++ b/chrome/android/java/res/xml/physical_web_preferences.xml
@@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<PreferenceScreen + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:chrome="http://schemas.android.com/apk/res-auto"> + + <org.chromium.chrome.browser.preferences.ChromeSwitchPreference + android:key="physical_web_switch" + android:summaryOn="@string/text_on" + android:summaryOff="@string/text_off" /> + + <org.chromium.chrome.browser.preferences.TextMessagePreference + android:title="@string/physical_web_pref_description" /> + + <org.chromium.chrome.browser.preferences.LearnMorePreference + android:key="physical_web_learn_more" + chrome:helpContext="@string/help_context_physical_web" /> + +</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml index 8a416c8..ecea52fc 100644 --- a/chrome/android/java/res/xml/privacy_preferences.xml +++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -63,6 +63,10 @@ android:key="contextual_search" android:title="@string/contextual_search_title" android:fragment="org.chromium.chrome.browser.preferences.privacy.ContextualSearchPreferenceFragment" /> + <Preference + android:key="physical_web" + android:title="@string/physical_web_pref_title" + android:fragment="org.chromium.chrome.browser.preferences.privacy.PhysicalWebPreferenceFragment" /> <org.chromium.chrome.browser.preferences.ButtonPreference android:key="clear_browsing_data" android:title="@string/clear_browsing_data_title" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java index 2c99eb62..ac8e02b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java
@@ -128,7 +128,7 @@ } // Start or stop Physical Web - if (PhysicalWeb.featureIsEnabled()) { + if (PhysicalWeb.shouldStartOnLaunch(application)) { PhysicalWeb.startPhysicalWeb(application); PhysicalWeb.uploadDeferredMetrics(application); } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java index 6913308..c519959a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
@@ -318,16 +318,24 @@ content.setContentViewClient(new ContentViewClient() { @Override public int getDesiredWidthMeasureSpec() { - return MeasureSpec.makeMeasureSpec( - getSearchContentViewWidthPx(), - MeasureSpec.EXACTLY); + if (isFullscreenSizePanel()) { + return super.getDesiredWidthMeasureSpec(); + } else { + return MeasureSpec.makeMeasureSpec( + getSearchContentViewWidthPx(), + MeasureSpec.EXACTLY); + } } @Override public int getDesiredHeightMeasureSpec() { - return MeasureSpec.makeMeasureSpec( - getSearchContentViewHeightPx(), - MeasureSpec.EXACTLY); + if (isFullscreenSizePanel()) { + return super.getDesiredHeightMeasureSpec(); + } else { + return MeasureSpec.makeMeasureSpec( + getSearchContentViewHeightPx(), + MeasureSpec.EXACTLY); + } } }); return content;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java index 8a3b0cca..9b349175 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -143,6 +143,8 @@ mActivity = activity; mWebContentsDelegate = new WebContentsDelegateAndroid() { + private boolean mIsFullscreen; + @Override public void onLoadStarted(boolean toDifferentDocument) { super.onLoadStarted(toDifferentDocument); @@ -160,6 +162,16 @@ super.onLoadProgressChanged(progress); mProgressObserver.onProgressBarUpdated(progress); } + + @Override + public void toggleFullscreenModeForTab(boolean enterFullscreen) { + mIsFullscreen = enterFullscreen; + } + + @Override + public boolean isFullscreenForTabOrPending() { + return mIsFullscreen; + } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java index 893a8f8d..e4ef8ee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java
@@ -139,6 +139,7 @@ searchPeekPromoTextViewId, R.drawable.google_icon_sprite, R.raw.google_icon_sprite, + mDpToPx, panel.getContentViewCore(), searchPromoVisible, searchPromoHeightPx, @@ -207,6 +208,7 @@ int peekPromoTextResourceId, int searchProviderIconSpriteBitmapResourceId, int searchProviderIconSpriteMetadataResourceId, + float dpToPx, ContentViewCore contentViewCore, boolean searchPromoVisible, float searchPromoHeight,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 6081c641..6a34125 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -37,6 +37,7 @@ import org.chromium.chrome.browser.rappor.RapporServiceBridge; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabIdManager; +import org.chromium.chrome.browser.tab.TopControlsVisibilityDelegate; import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; @@ -262,14 +263,7 @@ } Tab tab = new Tab(TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID), Tab.INVALID_TAB_ID, false, this, getWindowAndroid(), - TabLaunchType.FROM_EXTERNAL_APP, null, null) { - @Override - protected boolean isHidingTopControlsEnabled() { - // TODO(yusufo) : Get rid of this call once all other Tab classes are removed. - return mIntentDataProvider.shouldEnableUrlBarHiding() - && super.isHidingTopControlsEnabled(); - } - }; + TabLaunchType.FROM_EXTERNAL_APP, null, null); CustomTabsConnection customTabsConnection = CustomTabsConnection.getInstance(getApplication()); WebContents webContents = @@ -282,8 +276,20 @@ if (webContents == null) { webContents = WebContentsFactory.createWebContents(false, false); } - tab.initialize(webContents, getTabContentManager(), new CustomTabDelegateFactory(), false, - false); + tab.initialize(webContents, getTabContentManager(), + new CustomTabDelegateFactory() { + @Override + public TopControlsVisibilityDelegate createTopControlsVisibilityDelegate( + Tab tab) { + return new TopControlsVisibilityDelegate(tab) { + @Override + public boolean isHidingTopControlsEnabled() { + return mIntentDataProvider.shouldEnableUrlBarHiding() + && super.isHidingTopControlsEnabled(); + } + }; + } + }, false, false); tab.getView().requestFocus(); return tab; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivityIcon.java b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivityIcon.java index 59cb08b..8a0b0c0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivityIcon.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivityIcon.java
@@ -6,7 +6,6 @@ import android.content.Context; import android.graphics.Bitmap; -import android.graphics.Color; import android.text.TextUtils; import org.chromium.chrome.browser.widget.RoundedIconGenerator; @@ -19,7 +18,7 @@ private static final int APP_ICON_SIZE_DP = 64; private static final int APP_ICON_CORNER_RADIUS_DP = 3; private static final int APP_ICON_TEXT_SIZE_DP = 30; - private static final int APP_ICON_DEFAULT_BACKGROUND_COLOR = Color.rgb(50, 50, 50); + private static final int APP_ICON_DEFAULT_BACKGROUND_COLOR = 0xFF323232; private Context mContext;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/RouteDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/RouteDelegate.java index 7056cbd..bc7f844 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/RouteDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/RouteDelegate.java
@@ -24,6 +24,11 @@ void onRouteRequestError(String message, int requestId); /** + * Called when the user wants to stop the session via the UI (e.g. notification). + */ + void onSessionStopAction(); + + /** * Called when the session is closed. */ void onSessionClosed();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java index adc7797c..2a571652 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java
@@ -10,6 +10,7 @@ import android.support.v7.media.MediaRouter; import android.support.v7.media.MediaRouter.RouteInfo; +import org.chromium.base.Log; import org.chromium.chrome.browser.media.router.ChromeMediaRouter; import org.chromium.chrome.browser.media.router.DiscoveryDelegate; import org.chromium.chrome.browser.media.router.MediaRoute; @@ -17,6 +18,8 @@ import org.chromium.chrome.browser.media.router.MediaRouteProvider; import org.chromium.chrome.browser.media.router.RouteController; import org.chromium.chrome.browser.media.router.RouteDelegate; +import org.json.JSONException; +import org.json.JSONObject; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -32,8 +35,11 @@ public class CastMediaRouteProvider implements MediaRouteProvider, DiscoveryDelegate, RouteDelegate { + private static final String TAG = "MediaRouter"; + private static final String AUTO_JOIN_PRESENTATION_ID = "auto-join"; private static final String PRESENTATION_ID_SESSION_ID_PREFIX = "cast-session_"; + private static final String RECEIVER_ACTION_PRESENTATION_ID = "_receiver-action"; private final Context mApplicationContext; private final MediaRouter mAndroidMediaRouter; @@ -78,32 +84,12 @@ @Override public void onRouteCreated(int requestId, MediaRoute route, RouteController routeController) { - String routeId = route.id; - - MediaSource source = MediaSource.from(route.sourceId); - final String clientId = source.getClientId(); - if (clientId != null && getClientRecordByClientId(clientId) == null) { - mClientRecords.add(new ClientRecord( - routeId, - clientId, - source.getApplicationId(), - source.getAutoJoinPolicy(), - routeController.getOrigin(), - routeController.getTabId())); - } - if (mSession == null) { mSession = new SessionRecord(route.sinkId, (CastRouteController) routeController); } - mSession.routeIds.add(routeId); - if (clientId != null && !mSession.clientIds.contains(clientId)) { - mSession.clientIds.add(clientId); - } - - mRoutes.put(routeId, route); - - mManager.onRouteCreated(routeId, route.sinkId, requestId, this, true); + addRoute(route, routeController.getOrigin(), routeController.getTabId()); + mManager.onRouteCreated(route.id, route.sinkId, requestId, this, true); } @Override @@ -112,6 +98,13 @@ } @Override + public void onSessionStopAction() { + if (mSession == null) return; + + for (String routeId : mRoutes.keySet()) closeRoute(routeId); + } + + @Override public void onSessionClosed() { if (mSession == null) return; @@ -252,11 +245,19 @@ return; } + if (source.getClientId() != null) { + String receiverActionClientId = source.getClientId() + RECEIVER_ACTION_PRESENTATION_ID; + ClientRecord clientRecord = getClientRecordByClientId(receiverActionClientId); + if (clientRecord != null) { + sendReceiverAction(clientRecord.routeId, sink, receiverActionClientId, "cast"); + detachRoute(clientRecord.routeId); + mManager.onRouteClosed(clientRecord.routeId); + } + } + CreateRouteRequest createRouteRequest = new CreateRouteRequest( source, sink, presentationId, origin, tabId, nativeRequestId, this); - // TODO(avayvod): Implement ReceiverAction.CAST, https://crbug.com/561470. - // Since we only have one session, close it before starting a new one. if (mSession != null && !mSession.isStopping) { mPendingCreateRouteRequest = createRouteRequest; @@ -271,19 +272,24 @@ @Override public void joinRoute(String sourceId, String presentationId, String origin, int tabId, int nativeRequestId) { - if (mSession == null) { - mManager.onRouteRequestError("No presentation", nativeRequestId); - return; - } - MediaSource source = MediaSource.from(sourceId); if (source == null || source.getClientId() == null) { mManager.onRouteRequestError("Unsupported presentation URL", nativeRequestId); return; } - // TODO(avayvod): Implement _receiver-action route for ReceiverAction messages, - // https://crbug.com/561470. + // For the ReceiverAction presentation id there's no need to have a session or a route. + if (RECEIVER_ACTION_PRESENTATION_ID.equals(presentationId)) { + MediaRoute route = new MediaRoute("", sourceId, presentationId); + addRoute(route, origin, tabId); + mManager.onRouteCreated(route.id, route.sinkId, nativeRequestId, this, true); + return; + } + + if (mSession == null) { + mManager.onRouteRequestError("No presentation", nativeRequestId); + return; + } if (!canJoinExistingSession(presentationId, origin, tabId, source)) { mManager.onRouteRequestError("No matching route", nativeRequestId); @@ -291,7 +297,8 @@ } MediaRoute route = new MediaRoute(mSession.session.getSinkId(), sourceId, presentationId); - this.onRouteCreated(nativeRequestId, route, mSession.session); + addRoute(route, origin, tabId); + mManager.onRouteCreated(route.id, route.sinkId, nativeRequestId, this, false); } @Override @@ -305,7 +312,11 @@ return; } - // TODO(avayvod): Implement ReceiverAction.STOP, https://crbug.com/561470. + ClientRecord client = getClientRecordByRouteId(routeId); + if (client != null) { + MediaSink sink = MediaSink.fromSinkId(mSession.sinkId, mAndroidMediaRouter); + if (sink != null) sendReceiverAction(routeId, sink, client.clientId, "stop"); + } if (mSession.isStopping) return; @@ -331,6 +342,13 @@ @Override public void sendStringMessage(String routeId, String message, int nativeCallbackId) { + ClientRecord clientRecord = getClientRecordByRouteId(routeId); + if (clientRecord != null + && clientRecord.clientId.endsWith(RECEIVER_ACTION_PRESENTATION_ID)) { + mManager.onMessageSentResult(true, nativeCallbackId); + return; + } + if (mSession == null || !mSession.routeIds.contains(routeId)) { mManager.onMessageSentResult(false, nativeCallbackId); return; @@ -399,11 +417,6 @@ return false; } - private void onRouteClosed(String routeId) { - mManager.onRouteClosed(routeId); - detachRoute(routeId); - } - @Nullable private ClientRecord getClientRecordByClientId(String clientId) { for (ClientRecord record : mClientRecords) { @@ -419,4 +432,53 @@ } return null; } + + private void addRoute(MediaRoute route, String origin, int tabId) { + mRoutes.put(route.id, route); + if (mSession != null) mSession.routeIds.add(route.id); + + MediaSource source = MediaSource.from(route.sourceId); + final String clientId = source.getClientId(); + + if (clientId == null || getClientRecordByClientId(clientId) != null) return; + + mClientRecords.add(new ClientRecord( + route.id, + clientId, + source.getApplicationId(), + source.getAutoJoinPolicy(), + origin, + tabId)); + if (mSession != null) mSession.clientIds.add(clientId); + } + + private void sendReceiverAction( + String routeId, MediaSink sink, String clientId, String action) { + try { + JSONObject jsonReceiver = new JSONObject(); + jsonReceiver.put("label", sink.getId()); + jsonReceiver.put("friendlyName", sink.getName()); + jsonReceiver.put("capabilities", CastRouteController.getCapabilities(sink.getDevice())); + jsonReceiver.put("volume", null); + jsonReceiver.put("isActiveInput", null); + jsonReceiver.put("displayStatus", null); + jsonReceiver.put("receiverType", "cast"); + + JSONObject jsonReceiverAction = new JSONObject(); + jsonReceiverAction.put("receiver", jsonReceiver); + jsonReceiverAction.put("action", action); + + JSONObject json = new JSONObject(); + json.put("type", "receiver_action"); + json.put("sequenceNumber", -1); + json.put("timeoutMillis", 0); + json.put("clientId", clientId); + json.put("message", jsonReceiverAction); + + Log.d(TAG, "Sending receiver action to %s: %s", routeId, json.toString()); + mManager.onMessage(routeId, json.toString()); + } catch (JSONException e) { + Log.e(TAG, "Failed to send receiver action message", e); + } + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastRouteController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastRouteController.java index d21807b..bb2554b1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastRouteController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastRouteController.java
@@ -331,7 +331,7 @@ @Override public void onStop(int actionSource) { - stopApplication(); + mRouteDelegate.onSessionStopAction(); } @@ -869,7 +869,7 @@ buildInternalMessage(type, message, clientId, sequenceNumber)); } - private JSONArray getCapabilities(CastDevice device) { + static JSONArray getCapabilities(CastDevice device) { JSONArray jsonCapabilities = new JSONArray(); if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_IN)) { jsonCapabilities.put("audio_in");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java index 8f14aa0..66145cc2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
@@ -11,7 +11,6 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.text.Spannable; @@ -58,7 +57,7 @@ // that it was set by us. private static final String PLATFORM_TAG_PREFIX = NotificationUIManager.class.getSimpleName(); - private static final int NOTIFICATION_ICON_BG_COLOR = Color.rgb(150, 150, 150); + private static final int NOTIFICATION_ICON_BG_COLOR = 0xFF969696; private static final int NOTIFICATION_TEXT_SIZE_DP = 28; // We always use the same request code for pending intents. We use other ways to force
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 2c7a9bb8..f55d4fda 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -128,9 +128,9 @@ // response (as opposed to treating it like a typed string in the Omnibox). private static final float VOICE_SEARCH_CONFIDENCE_NAVIGATE_THRESHOLD = 0.9f; - private static final int CONTENT_OVERLAY_COLOR = Color.argb(166, 0, 0, 0); - private static final int OMNIBOX_RESULTS_BG_COLOR = Color.rgb(245, 245, 246); - private static final int OMNIBOX_INCOGNITO_RESULTS_BG_COLOR = Color.rgb(50, 50, 50); + private static final int CONTENT_OVERLAY_COLOR = 0xA6000000; + private static final int OMNIBOX_RESULTS_BG_COLOR = 0xFFF5F5F6; + private static final int OMNIBOX_INCOGNITO_RESULTS_BG_COLOR = 0xFF323232; /** * URI schemes that ContentView can handle.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java index fd4762c..f030ca0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionView.java
@@ -55,9 +55,9 @@ private static final long RELAYOUT_DELAY_MS = 20; - private static final int TITLE_COLOR_STANDARD_FONT_DARK = Color.rgb(51, 51, 51); - private static final int TITLE_COLOR_STANDARD_FONT_LIGHT = Color.rgb(255, 255, 255); - private static final int URL_COLOR = Color.rgb(85, 149, 254); + private static final int TITLE_COLOR_STANDARD_FONT_DARK = 0xFF333333; + private static final int TITLE_COLOR_STANDARD_FONT_LIGHT = 0xFFFFFFFF; + private static final int URL_COLOR = 0xFF5595FE; private static final int ANSWER_IMAGE_HORIZONTAL_SPACING_DP = 4; private static final int ANSWER_IMAGE_VERTICAL_SPACING_DP = 5;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivity.java index 6b4c5c9..a08c1423 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivity.java
@@ -104,7 +104,7 @@ @Override public void onPwsResults(Collection<PwsResult> pwsResults) { long duration = SystemClock.elapsedRealtime() - timestamp; - PhysicalWebUma.onPwsResponse(ListUrlsActivity.this, duration); + PhysicalWebUma.onForegroundPwsResolution(ListUrlsActivity.this, duration); // filter out duplicate site URLs Collection<String> siteUrls = new HashSet<>(); for (PwsResult pwsResult : pwsResults) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java index 5923cfea..fbd92ab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java
@@ -11,6 +11,7 @@ import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeVersionInfo; +import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager; /** * This class provides the basic interface to the Physical Web feature. @@ -30,6 +31,38 @@ } /** + * Checks whether the Physical Web preference is switched to On. + * + * @param context An instance of android.content.Context + * @return boolean {@code true} if the preference is On. + */ + public static boolean isPhysicalWebPreferenceEnabled(Context context) { + return PrivacyPreferencesManager.getInstance(context).isPhysicalWebEnabled(); + } + + /** + * Checks whether the Physical Web onboard flow is active and the user has + * not yet elected to either enable or decline the feature. + * + * @param context An instance of android.content.Context + * @return boolean {@code true} if onboarding is complete. + */ + public static boolean isOnboarding(Context context) { + return PrivacyPreferencesManager.getInstance(context).isPhysicalWebOnboarding(); + } + + /** + * Evaluate whether the Physical Web should be enabled when the application starts. + * + * @param context An instance of android.content.Context + * @return true if the Physical Web should be started at launch + */ + public static boolean shouldStartOnLaunch(Context context) { + // TODO(mattreynolds): start for onboarding + return featureIsEnabled() && isPhysicalWebPreferenceEnabled(context); + } + + /** * Start the Physical Web feature. * At the moment, this only enables URL discovery over BLE. * @param application An instance of {@link ChromeApplication}, used to get the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java index 0052e86..9c6d6f5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java
@@ -27,7 +27,8 @@ class PhysicalWebUma { private static final String TAG = "PhysicalWeb"; private static final String NOTIFICATION_PRESS_COUNT = "PhysicalWeb.NotificationPressed"; - private static final String PWS_RESPONSE_TIMES = "PhysicalWeb.RoundTripTimeMilliseconds"; + private static final String PWS_BACKGROUND_RESOLVE_TIMES = "PhysicalWeb.ResolveTime.Background"; + private static final String PWS_FOREGROUND_RESOLVE_TIMES = "PhysicalWeb.ResolveTime.Foreground"; private static final String URL_SELECTED_COUNT = "PhysicalWeb.UrlSelected"; private static final String URLS_DISPLAYED_COUNTS = "PhysicalWeb.TotalBeaconsDetected"; private static boolean sUploadAllowed = false; @@ -47,16 +48,19 @@ } /** - * Records a response time from PWS. + * Records a response time from PWS for a resolution during a background scan. * @param duration The length of time PWS took to respond. */ - public static void onPwsResponse(Context context, long duration) { - if (sUploadAllowed) { - RecordHistogram.recordTimesHistogram(PWS_RESPONSE_TIMES, duration, - TimeUnit.MILLISECONDS); - } else { - storeValue(context, PWS_RESPONSE_TIMES, duration); - } + public static void onBackgroundPwsResolution(Context context, long duration) { + handleTime(context, PWS_BACKGROUND_RESOLVE_TIMES, duration, TimeUnit.MILLISECONDS); + } + + /** + * Records a response time from PWS for a resolution during a foreground scan. + * @param duration The length of time PWS took to respond. + */ + public static void onForegroundPwsResolution(Context context, long duration) { + handleTime(context, PWS_FOREGROUND_RESOLVE_TIMES, duration, TimeUnit.MILLISECONDS); } /** @@ -85,7 +89,8 @@ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); uploader.notificationPressCount = prefs.getInt(NOTIFICATION_PRESS_COUNT, 0); uploader.urlSelectedCount = prefs.getInt(URL_SELECTED_COUNT, 0); - uploader.pwsResponseTimes = prefs.getString(PWS_RESPONSE_TIMES, "[]"); + uploader.pwsBackgroundResolveTimes = prefs.getString(PWS_BACKGROUND_RESOLVE_TIMES, "[]"); + uploader.pwsForegroundResolveTimes = prefs.getString(PWS_FOREGROUND_RESOLVE_TIMES, "[]"); uploader.urlsDisplayedCounts = prefs.getString(URLS_DISPLAYED_COUNTS, "[]"); // If the metrics are empty, we are done. @@ -97,7 +102,8 @@ prefs.edit() .remove(NOTIFICATION_PRESS_COUNT) .remove(URL_SELECTED_COUNT) - .remove(PWS_RESPONSE_TIMES) + .remove(PWS_BACKGROUND_RESOLVE_TIMES) + .remove(PWS_FOREGROUND_RESOLVE_TIMES) .remove(URLS_DISPLAYED_COUNTS) .apply(); @@ -135,16 +141,26 @@ } } + private static void handleTime(Context context, String key, long duration, TimeUnit tu) { + if (sUploadAllowed) { + RecordHistogram.recordTimesHistogram(key, duration, tu); + } else { + storeValue(context, key, duration); + } + } + private static class UmaUploader implements Runnable { public int notificationPressCount; public int urlSelectedCount; - public String pwsResponseTimes; + public String pwsBackgroundResolveTimes; + public String pwsForegroundResolveTimes; public String urlsDisplayedCounts; public boolean isEmpty() { return notificationPressCount == 0 && urlSelectedCount == 0 - && pwsResponseTimes.equals("[]") + && pwsBackgroundResolveTimes.equals("[]") + && pwsForegroundResolveTimes.equals("[]") && urlsDisplayedCounts.equals("[]"); } @@ -155,7 +171,10 @@ public void run() { uploadActions(notificationPressCount, NOTIFICATION_PRESS_COUNT); uploadActions(urlSelectedCount, URL_SELECTED_COUNT); - uploadTimes(pwsResponseTimes, PWS_RESPONSE_TIMES, TimeUnit.MILLISECONDS); + uploadTimes(pwsBackgroundResolveTimes, PWS_BACKGROUND_RESOLVE_TIMES, + TimeUnit.MILLISECONDS); + uploadTimes(pwsForegroundResolveTimes, PWS_FOREGROUND_RESOLVE_TIMES, + TimeUnit.MILLISECONDS); uploadCounts(urlsDisplayedCounts, URLS_DISPLAYED_COUNTS); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java index eaf83d0..8b5d2f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java
@@ -12,6 +12,7 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.SystemClock; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; @@ -198,9 +199,13 @@ private void resolveUrl(final String url) { Set<String> urls = new HashSet<String>(Arrays.asList(url)); + final long timestamp = SystemClock.elapsedRealtime(); mPwsClient.resolve(urls, new PwsClient.ResolveScanCallback() { @Override public void onPwsResults(Collection<PwsResult> pwsResults) { + long duration = SystemClock.elapsedRealtime() - timestamp; + PhysicalWebUma.onBackgroundPwsResolution(mContext, duration); + for (PwsResult pwsResult : pwsResults) { String requestUrl = pwsResult.requestUrl; if (url.equalsIgnoreCase(requestUrl)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/DocumentModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/DocumentModeManager.java index 34cf0f49..45b951a6d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/DocumentModeManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/DocumentModeManager.java
@@ -260,7 +260,7 @@ if (optOutState == OPT_OUT_STATE_UNSET) { boolean hasMigrated = mSharedPreferences.getBoolean( ChromePreferenceManager.MIGRATION_ON_UPGRADE_ATTEMPTED, false); - if (isDeviceTabbedModeByDefault() && !hasMigrated) { + if (!hasMigrated) { optOutState = OPTED_OUT_OF_DOCUMENT_MODE; } else { optOutState = OPT_IN_TO_DOCUMENT_MODE;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java index 40df783..1d6755a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -10,7 +10,6 @@ import android.util.Log; import org.chromium.base.ThreadUtils; -import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.chrome.browser.ContentSettingsType; import org.chromium.chrome.browser.preferences.website.ContentSetting; @@ -924,11 +923,6 @@ return nativeGetClickedUpdateMenuItem(); } - @VisibleForTesting - public void setSupervisedUserId(String supervisedUserId) { - nativeSetSupervisedUserId(supervisedUserId); - } - private native boolean nativeGetAcceptCookiesEnabled(); private native boolean nativeGetAcceptCookiesManaged(); private native boolean nativeGetBlockThirdPartyCookiesEnabled(); @@ -1023,5 +1017,4 @@ private native boolean nativeHasSetMetricsReporting(); private native void nativeSetClickedUpdateMenuItem(boolean clicked); private native boolean nativeGetClickedUpdateMenuItem(); - private native void nativeSetSupervisedUserId(String supervisedUserId); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PhysicalWebPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PhysicalWebPreferenceFragment.java new file mode 100644 index 0000000..5a802b5 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PhysicalWebPreferenceFragment.java
@@ -0,0 +1,48 @@ +// 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. + +package org.chromium.chrome.browser.preferences.privacy; + +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceFragment; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.preferences.ChromeSwitchPreference; + +/** + * Fragment to manage the Physical Web preference and to explain to the user what it does. + */ +public class PhysicalWebPreferenceFragment extends PreferenceFragment { + + private static final String PREF_PHYSICAL_WEB_SWITCH = "physical_web_switch"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.physical_web_preferences); + getActivity().setTitle(R.string.physical_web_pref_title); + initPhysicalWebSwitch(); + } + + private void initPhysicalWebSwitch() { + ChromeSwitchPreference physicalWebSwitch = + (ChromeSwitchPreference) findPreference(PREF_PHYSICAL_WEB_SWITCH); + + boolean isPhysicalWebEnabled = + PrivacyPreferencesManager.getInstance(getActivity()).isPhysicalWebEnabled(); + physicalWebSwitch.setChecked(isPhysicalWebEnabled); + + physicalWebSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + PrivacyPreferencesManager.getInstance(getActivity()).setPhysicalWebEnabled( + (boolean) newValue); + return true; + } + }); + } + +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java index f16de915..0f401926 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial; import org.chromium.chrome.browser.help.HelpAndFeedback; +import org.chromium.chrome.browser.physicalweb.PhysicalWeb; import org.chromium.chrome.browser.precache.PrecacheLauncher; import org.chromium.chrome.browser.preferences.ButtonPreference; import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference; @@ -55,6 +56,7 @@ private static final String PREF_DO_NOT_TRACK = "do_not_track"; private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data"; private static final String PREF_USAGE_AND_CRASH_REPORTING = "usage_and_crash_reports"; + private static final String PREF_PHYSICAL_WEB = "physical_web"; private ClearBrowsingDataDialogFragment mClearBrowsingDataDialogFragment; private ManagedPreferenceDelegate mManagedPreferenceDelegate; @@ -158,6 +160,11 @@ getArguments().getBoolean(SHOW_CLEAR_BROWSING_DATA_EXTRA, false); if (showClearBrowsingData) showClearBrowsingDialog(); } + + if (!PhysicalWeb.featureIsEnabled()) { + preferenceScreen.removePreference(findPreference(PREF_PHYSICAL_WEB)); + } + updateSummaries(); } @@ -218,6 +225,12 @@ public void updateSummaries() { PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance(); + PrivacyPreferencesManager privacyPrefManager = + PrivacyPreferencesManager.getInstance(getActivity()); + + CharSequence textOn = getActivity().getResources().getText(R.string.text_on); + CharSequence textOff = getActivity().getResources().getText(R.string.text_off); + CheckBoxPreference navigationErrorPref = (CheckBoxPreference) findPreference( PREF_NAVIGATION_ERROR); navigationErrorPref.setChecked(prefServiceBridge.isResolveNavigationErrorEnabled()); @@ -236,30 +249,24 @@ safeBrowsingPref.setChecked(prefServiceBridge.isSafeBrowsingEnabled()); Preference doNotTrackPref = findPreference(PREF_DO_NOT_TRACK); - if (prefServiceBridge.isDoNotTrackEnabled()) { - doNotTrackPref.setSummary(getActivity().getResources().getText(R.string.text_on)); - } else { - doNotTrackPref.setSummary(getActivity().getResources().getText(R.string.text_off)); - } + doNotTrackPref.setSummary(prefServiceBridge.isDoNotTrackEnabled() ? textOn : textOff); + Preference contextualPref = findPreference(PREF_CONTEXTUAL_SEARCH); if (contextualPref != null) { - if (prefServiceBridge.isContextualSearchDisabled()) { - contextualPref.setSummary(getActivity().getResources().getText(R.string.text_off)); - } else { - contextualPref.setSummary(getActivity().getResources().getText(R.string.text_on)); - } + boolean isContextualSearchEnabled = !prefServiceBridge.isContextualSearchDisabled(); + contextualPref.setSummary(isContextualSearchEnabled ? textOn : textOff); } - PrivacyPreferencesManager privacyPrefManager = - PrivacyPreferencesManager.getInstance(getActivity()); + + Preference physicalWebPref = findPreference(PREF_PHYSICAL_WEB); + if (physicalWebPref != null) { + physicalWebPref.setSummary(privacyPrefManager.isPhysicalWebEnabled() + ? textOn : textOff); + } + if (privacyPrefManager.isCellularExperimentEnabled()) { Preference usageAndCrashPref = findPreference(PREF_USAGE_AND_CRASH_REPORTING); - if (privacyPrefManager.isUsageAndCrashReportingEnabled()) { - usageAndCrashPref.setSummary( - getActivity().getResources().getText(R.string.text_on)); - } else { - usageAndCrashPref.setSummary( - getActivity().getResources().getText(R.string.text_off)); - } + usageAndCrashPref.setSummary(privacyPrefManager.isUsageAndCrashReportingEnabled() + ? textOn : textOff); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java index d99d9cd2..92e63055 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java
@@ -13,8 +13,10 @@ import org.chromium.base.CommandLine; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.device.DeviceClassManager; +import org.chromium.chrome.browser.physicalweb.PhysicalWeb; import org.chromium.chrome.browser.preferences.NetworkPredictionOptions; import org.chromium.chrome.browser.preferences.PrefServiceBridge; @@ -31,6 +33,10 @@ private static final String PREF_METRICS_REPORTING = "metrics_reporting"; private static final String PREF_CELLULAR_EXPERIMENT = "cellular_experiment"; private static final String ALLOW_PRERENDER_OLD = "allow_prefetch"; + private static final String PREF_PHYSICAL_WEB = "physical_web"; + private static final int PHYSICAL_WEB_OFF = 0; + private static final int PHYSICAL_WEB_ON = 1; + private static final int PHYSICAL_WEB_ONBOARDING = 2; private static PrivacyPreferencesManager sInstance; @@ -408,4 +414,43 @@ public boolean isUploadLimited() { return isCellularExperimentEnabled() && !isWiFiOrEthernetNetwork(); } + + /** + * Sets the Physical Web preference, which enables background scanning for bluetooth beacons + * and displays a notification when beacons are found. + * + * @param enabled A boolean indicating whether to notify on nearby beacons. + */ + public void setPhysicalWebEnabled(boolean enabled) { + int state = enabled ? PHYSICAL_WEB_ON : PHYSICAL_WEB_OFF; + boolean isOnboarding = isPhysicalWebOnboarding(); + mSharedPreferences.edit().putInt(PREF_PHYSICAL_WEB, state).apply(); + if (enabled) { + if (!isOnboarding) { + PhysicalWeb.startPhysicalWeb((ChromeApplication) mContext); + } + } else { + PhysicalWeb.stopPhysicalWeb((ChromeApplication) mContext); + } + } + + /** + * Check whether the user is still in the Physical Web onboarding flow. + * + * @return boolean {@code true} if onboarding is not yet complete. + */ + public boolean isPhysicalWebOnboarding() { + int state = mSharedPreferences.getInt(PREF_PHYSICAL_WEB, PHYSICAL_WEB_ONBOARDING); + return (state == PHYSICAL_WEB_ONBOARDING); + } + + /** + * Check whether Physical Web is configured to notify on nearby beacons. + * + * @return boolean {@code true} if the feature is enabled. + */ + public boolean isPhysicalWebEnabled() { + int state = mSharedPreferences.getInt(PREF_PHYSICAL_WEB, PHYSICAL_WEB_ONBOARDING); + return (state == PHYSICAL_WEB_ON); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java deleted file mode 100644 index 3baf141b..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java +++ /dev/null
@@ -1,180 +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. - -package org.chromium.chrome.browser.superviseduser; - -import android.os.Bundle; -import android.util.Pair; - -import org.chromium.base.ThreadUtils; -import org.chromium.base.VisibleForTesting; -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.library_loader.LibraryProcessType; -import org.chromium.base.library_loader.ProcessInitException; -import org.chromium.components.webrestriction.WebRestrictionsContentProvider; -import org.chromium.content.browser.BrowserStartupController; - -import java.util.concurrent.CountDownLatch; - -/** - * Content provider for telling other apps (e.g. WebView apps) about the supervised user URL filter. - */ -public class SupervisedUserContentProvider extends WebRestrictionsContentProvider { - private long mNativeSupervisedUserContentProvider = 0; - - private long getSupervisedUserContentProvider() throws ProcessInitException { - if (mNativeSupervisedUserContentProvider != 0) { - return mNativeSupervisedUserContentProvider; - } - - BrowserStartupController.get(getContext(), LibraryProcessType.PROCESS_BROWSER) - .startBrowserProcessesSync(false); - - mNativeSupervisedUserContentProvider = nativeCreateSupervisedUserContentProvider(); - return mNativeSupervisedUserContentProvider; - } - - @VisibleForTesting - void setNativeSupervisedUserContentProviderForTesting(long nativeProvider) { - mNativeSupervisedUserContentProvider = nativeProvider; - } - - @VisibleForTesting - static class SupervisedUserQueryReply { - final CountDownLatch mLatch = new CountDownLatch(1); - private Pair<Boolean, String> mResult; - @VisibleForTesting - @CalledByNative("SupervisedUserQueryReply") - void onQueryComplete(boolean result, String errorMessage) { - // This must be called precisely once per query. - assert mResult == null; - mResult = new Pair<Boolean, String>(result, errorMessage); - mLatch.countDown(); - } - Pair<Boolean, String> getResult() throws InterruptedException { - mLatch.await(); - return mResult; - } - } - - @Override - protected Pair<Boolean, String> shouldProceed(final String url) { - // This will be called on multiple threads (but never the UI thread), - // see http://developer.android.com/guide/components/processes-and-threads.html#ThreadSafe. - // The reply comes back on a different thread (possibly the UI thread) some time later. - // As such it needs to correctly match the replies to the calls. It does this by creating a - // reply object for each query, and passing this through the callback structure. The reply - // object also handles waiting for the reply. - assert !ThreadUtils.runningOnUiThread(); - final SupervisedUserQueryReply queryReply = new SupervisedUserQueryReply(); - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - try { - nativeShouldProceed(getSupervisedUserContentProvider(), queryReply, url); - } catch (ProcessInitException e) { - queryReply.onQueryComplete(false, null); - } - } - }); - try { - // This will block until an onQueryComplete call on a different thread adds - // something to the queue. - return queryReply.getResult(); - } catch (InterruptedException e) { - return new Pair<Boolean, String>(false, null); - } - } - - @Override - protected boolean canInsert() { - // Chrome always allows insertion requests. - return true; - } - - @VisibleForTesting - static class SupervisedUserInsertReply { - final CountDownLatch mLatch = new CountDownLatch(1); - boolean mResult; - @VisibleForTesting - @CalledByNative("SupervisedUserInsertReply") - void onInsertRequestSendComplete(boolean result) { - // This must be called precisely once per query. - assert mLatch.getCount() == 1; - mResult = result; - mLatch.countDown(); - } - boolean getResult() throws InterruptedException { - mLatch.await(); - return mResult; - } - } - - @Override - protected boolean requestInsert(final String url) { - // This will be called on multiple threads (but never the UI thread), - // see http://developer.android.com/guide/components/processes-and-threads.html#ThreadSafe. - // The reply comes back on a different thread (possibly the UI thread) some time later. - // As such it needs to correctly match the replies to the calls. It does this by creating a - // reply object for each query, and passing this through the callback structure. The reply - // object also handles waiting for the reply. - assert !ThreadUtils.runningOnUiThread(); - final SupervisedUserInsertReply insertReply = new SupervisedUserInsertReply(); - ThreadUtils.runOnUiThread(new Runnable() { - @Override - public void run() { - try { - nativeRequestInsert(getSupervisedUserContentProvider(), insertReply, url); - } catch (ProcessInitException e) { - insertReply.onInsertRequestSendComplete(false); - } - } - }); - try { - return insertReply.getResult(); - } catch (InterruptedException e) { - return false; - } - } - - @VisibleForTesting - @Override - public Bundle call(String method, String arg, Bundle bundle) { - if (method.equals("setFilterForTesting")) setFilterForTesting(); - return null; - } - - @VisibleForTesting - void setFilterForTesting() { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - try { - nativeSetFilterForTesting(getSupervisedUserContentProvider()); - } catch (ProcessInitException e) { - // There is no way of returning anything sensible here, so ignore the error and - // do nothing. - } - } - }); - } - - @VisibleForTesting - @CalledByNative - void onSupervisedUserFilterUpdated() { - onFilterChanged(); - } - - @VisibleForTesting native long nativeCreateSupervisedUserContentProvider(); - - @VisibleForTesting - native void nativeShouldProceed(long nativeSupervisedUserContentProvider, - SupervisedUserQueryReply queryReply, String url); - - @VisibleForTesting - native void nativeRequestInsert(long nativeSupervisedUserContentProvider, - SupervisedUserInsertReply insertReply, String url); - - private native void nativeSetFilterForTesting(long nativeSupervisedUserContentProvider); -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 4423ef8..d2310562 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -49,7 +49,6 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchTabHelper; import org.chromium.chrome.browser.crash.MinidumpUploadService; import org.chromium.chrome.browser.customtabs.CustomTabActivity; -import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.download.ChromeDownloadDelegate; import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils; import org.chromium.chrome.browser.fullscreen.FullscreenManager; @@ -73,7 +72,6 @@ import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; import org.chromium.chrome.browser.tabmodel.TabModelImpl; -import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.content.browser.ActivityContentVideoViewClient; @@ -521,6 +519,8 @@ private TabDelegateFactory mDelegateFactory; + private TopControlsVisibilityDelegate mTopControlsVisibilityDelegate; + /** * Creates an instance of a {@link Tab}. * @param id The id this tab should be identified with. @@ -1263,6 +1263,9 @@ if (mAppBannerManager != null) addObserver(mAppBannerManager); } + mTopControlsVisibilityDelegate = + mDelegateFactory.createTopControlsVisibilityDelegate(this); + // Attach the TabContentManager if we have one. This will bind this Tab's content layer // to this manager. // TODO(dtrainor): Remove this and move to a pull model instead of pushing the layer. @@ -1449,6 +1452,13 @@ } /** + * @return Whether fullscreen state is waiting for the load to finish for an update. + */ + boolean isFullscreenWaitingForLoad() { + return mIsFullscreenWaitingForLoad; + } + + /** * Called when a page has failed loading. * @param errorCode The error code causing the page to fail loading. */ @@ -2406,29 +2416,8 @@ /** * @return Whether hiding top controls is enabled or not. */ - protected boolean isHidingTopControlsEnabled() { - WebContents webContents = getWebContents(); - if (webContents == null || webContents.isDestroyed()) return false; - - String url = getUrl(); - boolean enableHidingTopControls = url != null && !url.startsWith(UrlConstants.CHROME_SCHEME) - && !url.startsWith(UrlConstants.CHROME_NATIVE_SCHEME); - - int securityState = getSecurityLevel(); - enableHidingTopControls &= (securityState != ConnectionSecurityLevel.SECURITY_ERROR - && securityState != ConnectionSecurityLevel.SECURITY_WARNING); - - enableHidingTopControls &= - !AccessibilityUtil.isAccessibilityEnabled(getApplicationContext()); - enableHidingTopControls &= !mContentViewCore.isFocusedNodeEditable(); - enableHidingTopControls &= !mIsShowingErrorPage; - enableHidingTopControls &= !webContents.isShowingInterstitialPage(); - enableHidingTopControls &= (mFullscreenManager != null); - enableHidingTopControls &= DeviceClassManager.enableFullscreen(); - enableHidingTopControls &= !DeviceClassManager.isAutoHidingToolbarDisabled(mActivity); - enableHidingTopControls &= !mIsFullscreenWaitingForLoad; - - return enableHidingTopControls; + private boolean isHidingTopControlsEnabled() { + return mTopControlsVisibilityDelegate.isHidingTopControlsEnabled(); } /** @@ -2464,8 +2453,7 @@ * @return Whether showing top controls is enabled or not. */ public boolean isShowingTopControlsEnabled() { - if (mFullscreenManager == null) return true; - return !mFullscreenManager.getPersistentFullscreenMode(); + return mTopControlsVisibilityDelegate.isShowingTopControlsEnabled(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java index aa616f2..da692ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java
@@ -57,4 +57,13 @@ public AppBannerManager createAppBannerManager(Tab tab) { return new AppBannerManager(tab, tab.getApplicationContext()); } + + /** + * Creates the {@link TopControlsVisibilityDelegate} the tab will be initialized with. + * @param tab The associated {@link Tab}. + * @return {@link TopControlsVisibilityDelegate} to be used for the given tab. + */ + public TopControlsVisibilityDelegate createTopControlsVisibilityDelegate(Tab tab) { + return new TopControlsVisibilityDelegate(tab); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TopControlsVisibilityDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TopControlsVisibilityDelegate.java new file mode 100644 index 0000000..ac0dcddad --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TopControlsVisibilityDelegate.java
@@ -0,0 +1,67 @@ +// 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. + +package org.chromium.chrome.browser.tab; + +import org.chromium.chrome.browser.UrlConstants; +import org.chromium.chrome.browser.device.DeviceClassManager; +import org.chromium.chrome.browser.ssl.ConnectionSecurityLevel; +import org.chromium.chrome.browser.util.AccessibilityUtil; +import org.chromium.content.browser.ContentViewCore; +import org.chromium.content_public.browser.WebContents; + +/** + * A delegate to determine visibility of the top controls. + */ +public class TopControlsVisibilityDelegate { + protected final Tab mTab; + + /** + * Basic constructor. + * @param tab The associated {@link Tab}. + */ + public TopControlsVisibilityDelegate(Tab tab) { + mTab = tab; + } + + /** + * @return Whether hiding top controls is enabled or not. + */ + public boolean isHidingTopControlsEnabled() { + WebContents webContents = mTab.getWebContents(); + if (webContents == null || webContents.isDestroyed()) return false; + + String url = mTab.getUrl(); + boolean enableHidingTopControls = url != null; + enableHidingTopControls &= !url.startsWith(UrlConstants.CHROME_SCHEME); + enableHidingTopControls &= !url.startsWith(UrlConstants.CHROME_NATIVE_SCHEME); + + int securityState = mTab.getSecurityLevel(); + enableHidingTopControls &= (securityState != ConnectionSecurityLevel.SECURITY_ERROR + && securityState != ConnectionSecurityLevel.SECURITY_WARNING); + + enableHidingTopControls &= + !AccessibilityUtil.isAccessibilityEnabled(mTab.getApplicationContext()); + + ContentViewCore cvc = mTab.getContentViewCore(); + enableHidingTopControls &= cvc == null || !cvc.isFocusedNodeEditable(); + enableHidingTopControls &= !mTab.isShowingErrorPage(); + enableHidingTopControls &= !webContents.isShowingInterstitialPage(); + enableHidingTopControls &= (mTab.getFullscreenManager() != null); + enableHidingTopControls &= DeviceClassManager.enableFullscreen(); + enableHidingTopControls &= !DeviceClassManager.isAutoHidingToolbarDisabled( + mTab.getApplicationContext()); + enableHidingTopControls &= !mTab.isFullscreenWaitingForLoad(); + + return enableHidingTopControls; + } + + /** + * @return Whether showing top controls is enabled or not. + */ + public boolean isShowingTopControlsEnabled() { + if (mTab.getFullscreenManager() == null) return true; + return !mTab.getFullscreenManager().getPersistentFullscreenMode(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java index e0f305e..b20e9061 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java
@@ -12,6 +12,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; @@ -30,8 +31,7 @@ * the regular browser's UI is either unnecessary or undesirable. * Subclasses can override {@link #createUI()} if they need something more exotic. */ -public abstract class FullScreenActivity extends ChromeActivity - implements FullScreenActivityTab.TopControlsVisibilityDelegate { +public abstract class FullScreenActivity extends ChromeActivity { private FullScreenActivityTab mTab; @Override @@ -62,8 +62,8 @@ @Override public void finishNativeInitialization() { - mTab = FullScreenActivityTab.create( - this, getWindowAndroid(), getActivityDirectory(), getSavedInstanceState(), this); + mTab = FullScreenActivityTab.create(this, getWindowAndroid(), + getActivityDirectory(), getSavedInstanceState(), createTabDelegateFactory()); getTabModelSelector().setTab(mTab); mTab.show(TabSelectionType.FROM_NEW); @@ -90,18 +90,19 @@ } /** + * @return {@link TabDelegateFactory} to be used while creating the associated {@link Tab}. + */ + protected TabDelegateFactory createTabDelegateFactory() { + return new FullScreenDelegateFactory(); + } + + /** * @return {@link File} pointing at a directory specific for this class. */ protected File getActivityDirectory() { return null; } - // Implements {@link FullScreenActivityTab.TopControlsVisibilityDelegate}. - @Override - public boolean shouldShowTopControls(String url, int securityLevel) { - return false; - } - @Override protected boolean handleBackPressed() { if (mTab == null) return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivityTab.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivityTab.java index 256a8ca..4dfa36e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivityTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivityTab.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.TabState; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabUma.TabCreationState; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.content_public.browser.LoadUrlParams; @@ -34,47 +35,31 @@ public class FullScreenActivityTab extends Tab { private static final String TAG = "FullScreenActivityTab"; - /** - * A delegate to determine top controls visibility. - */ - public interface TopControlsVisibilityDelegate { - /** - * Determines whether top controls should be shown. - * - * @param uri The URI to display. - * @param securityLevel Security level of the Tab. - * @return Whether the URL bar should be visible or not. - */ - boolean shouldShowTopControls(String uri, int securityLevel); - } - static final String BUNDLE_TAB_ID = "tabId"; static final String BUNDLE_TAB_URL = "tabUrl"; private WebContentsObserver mObserver; - private TopControlsVisibilityDelegate mTopControlsVisibilityDelegate; private FullScreenActivityTab(ChromeActivity activity, WindowAndroid window, - TopControlsVisibilityDelegate topControlsVisibilityDelegate) { + TabDelegateFactory delegateFactory) { super(INVALID_TAB_ID, INVALID_TAB_ID, false, activity, window, TabLaunchType.FROM_MENU_OR_OVERVIEW, null, null); initializeFullScreenActivityTab( - activity.getTabContentManager(), false, topControlsVisibilityDelegate); + activity.getTabContentManager(), false, delegateFactory); } private FullScreenActivityTab(int id, ChromeActivity activity, WindowAndroid window, - TabState state, TopControlsVisibilityDelegate topControlsVisibilityDelegate) { + TabState state, TabDelegateFactory delegateFactory) { super(id, Tab.INVALID_TAB_ID, false, activity, window, TabLaunchType.FROM_RESTORE, TabCreationState.FROZEN_ON_RESTORE, state); initializeFullScreenActivityTab( - activity.getTabContentManager(), true, topControlsVisibilityDelegate); + activity.getTabContentManager(), true, delegateFactory); } private void initializeFullScreenActivityTab(TabContentManager tabContentManager, - boolean unfreeze, TopControlsVisibilityDelegate topControlsVisibilityDelegate) { - initialize(null, tabContentManager, new FullScreenDelegateFactory(), false, unfreeze); + boolean unfreeze, TabDelegateFactory delegateFactory) { + initialize(null, tabContentManager, delegateFactory, false, unfreeze); mObserver = createWebContentsObserver(); - mTopControlsVisibilityDelegate = topControlsVisibilityDelegate; } /** @@ -149,12 +134,11 @@ * @param activity Activity that will own the Tab. * @param directory Directory associated with the Activity. Null implies tab state isn't saved. * @param savedInstanceState Bundle saved out when the app was killed by Android. May be null. - * @param topControlsVisibilityDelegate Delegate to determine top controls visibility. + * @param delegateFactory {@link TabDelegateFactory} to use while creating the {@link Tab}. * @return {@link FullScreenActivityTab} for the Activity. */ public static FullScreenActivityTab create(ChromeActivity activity, WindowAndroid window, - File directory, Bundle savedInstanceState, - TopControlsVisibilityDelegate topControlsVisibilityDelegate) { + File directory, Bundle savedInstanceState, TabDelegateFactory delegateFactory) { FullScreenActivityTab tab = null; int tabId = Tab.INVALID_TAB_ID; @@ -171,7 +155,7 @@ stream = new FileInputStream(getTabFile(directory, tabId)); TabState tabState = TabState.readState(stream, false); tab = new FullScreenActivityTab( - tabId, activity, window, tabState, topControlsVisibilityDelegate); + tabId, activity, window, tabState, delegateFactory); } catch (FileNotFoundException exception) { Log.e(TAG, "Failed to restore tab state.", exception); } catch (IOException exception) { @@ -183,24 +167,9 @@ if (tab == null) { // Create a new tab. - tab = new FullScreenActivityTab(activity, window, topControlsVisibilityDelegate); + tab = new FullScreenActivityTab(activity, window, delegateFactory); } return tab; } - - @Override - protected boolean isHidingTopControlsEnabled() { - if (getFullscreenManager() == null) return true; - if (getFullscreenManager().getPersistentFullscreenMode()) return true; - if (mTopControlsVisibilityDelegate == null) return false; - return !mTopControlsVisibilityDelegate.shouldShowTopControls(getUrl(), getSecurityLevel()); - } - - @Override - public boolean isShowingTopControlsEnabled() { - // On webapp activity and embedd content view activity, it's either hiding or showing. - // Users cannot change the visibility state by sliding it in or out. - return !isHidingTopControlsEnabled(); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenDelegateFactory.java index b112522..fa32d73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenDelegateFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenDelegateFactory.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.tab.TabContextMenuItemDelegate; import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid; +import org.chromium.chrome.browser.tab.TopControlsVisibilityDelegate; /** * A {@link TabDelegateFactory} class to be used in all {@link Tab} instances owned @@ -61,4 +62,14 @@ new TabContextMenuItemDelegate(tab, activity), ChromeContextMenuPopulator.FULLSCREEN_TAB_MODE); } + + @Override + public TopControlsVisibilityDelegate createTopControlsVisibilityDelegate(Tab tab) { + return new TopControlsVisibilityDelegate(tab) { + @Override + public boolean isHidingTopControlsEnabled() { + return !isShowingTopControlsEnabled(); + } + }; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index a2fdd31..9ac72135 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -31,7 +31,9 @@ import org.chromium.chrome.browser.ssl.ConnectionSecurityLevel; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabObserver; +import org.chromium.chrome.browser.tab.TopControlsVisibilityDelegate; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.content.browser.ScreenOrientationProvider; @@ -495,17 +497,32 @@ return null; } - // Implements {@link FullScreenActivityTab.TopControlsVisibilityDelegate}. @Override - public boolean shouldShowTopControls(String url, int securityLevel) { - boolean visible = false; // do not show top controls when URL is not ready yet. - if (!TextUtils.isEmpty(url)) { - boolean isSameWebsite = - UrlUtilities.sameDomainOrHost(mWebappInfo.uri().toString(), url, true); - visible = !isSameWebsite || securityLevel == ConnectionSecurityLevel.SECURITY_ERROR - || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING; - } + protected TabDelegateFactory createTabDelegateFactory() { + return new FullScreenDelegateFactory() { + @Override + public TopControlsVisibilityDelegate createTopControlsVisibilityDelegate(Tab tab) { + return new TopControlsVisibilityDelegate(tab) { + @Override + public boolean isShowingTopControlsEnabled() { + if (!super.isShowingTopControlsEnabled()) return false; + return shouldShowTopControls(mTab.getUrl(), mTab.getSecurityLevel()); + } + }; + } + }; + } + public boolean shouldShowTopControls(String url, int securityLevel) { + // Do not show top controls when URL is not ready yet. + boolean visible = false; + if (TextUtils.isEmpty(url)) return false; + + boolean isSameWebsite = UrlUtilities.sameDomainOrHost( + mWebappInfo.uri().toString(), url, true); + visible = !isSameWebsite + || securityLevel == ConnectionSecurityLevel.SECURITY_ERROR + || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING; return visible; }
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index c33dd09..b0c45d80 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -2293,6 +2293,14 @@ </message> <!-- Physical Web strings --> + <message name="IDS_PHYSICAL_WEB_PREF_TITLE" desc="Title for Physical Web preference."> + Physical Web + </message> + <message name="IDS_PHYSICAL_WEB_PREF_DESCRIPTION" desc="Description for Physical Web preference"> + Discover web pages sent by nearby objects. Chrome gathers web pages associated with objects around you, sends them anonymously to a Google service to find the ones most useful to you, then displays them. + +You must have Bluetooth and Location turned on in order to use the Physical Web. + </message> <message name="IDS_PHYSICAL_WEB_LIST_URLS_ACTIVITY_TITLE" desc="The title for a dialog that shows a list of URLs broadcasted from nearby devices."> The Physical Web </message>
diff --git a/chrome/android/javatests/DEPS b/chrome/android/javatests/DEPS index 51445be..6f2d48d 100644 --- a/chrome/android/javatests/DEPS +++ b/chrome/android/javatests/DEPS
@@ -4,7 +4,6 @@ "+components/gcm_driver/android/java/src/org/chromium/components/gcm_driver", "+components/navigation_interception", "+components/precache/android/javatests", - "+components/web_restriction", "+content/public/android/java", "+sync/android/java/src/org/chromium/sync", # We should only depend on the util package of something that lives in
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/prerender/PrerenderServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/prerender/PrerenderServiceTest.java index 63096878..a3935ac 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/prerender/PrerenderServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/prerender/PrerenderServiceTest.java
@@ -11,6 +11,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.test.BaseActivityInstrumentationTestCase; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; @@ -58,6 +59,7 @@ * @throws InterruptedException */ @SmallTest + @DisabledTest @Feature({"PrerenderService"}) public void testBindingAndInitializing() throws InterruptedException { if (SysUtils.isLowEndDevice()) return; @@ -75,6 +77,7 @@ * @Feature({"PrerenderService"}) * @SmallTest */ + @DisabledTest public void testPrerenderingSameUrl() throws InterruptedException { if (SysUtils.isLowEndDevice()) return; ensureBindingAndInitializingUI(); @@ -89,6 +92,7 @@ * @throws InterruptedException */ @SmallTest + @DisabledTest @Feature({"PrerenderService"}) public void testPrerenderingDifferentUrl() throws InterruptedException { if (SysUtils.isLowEndDevice()) return;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java deleted file mode 100644 index 432f48f..0000000 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java +++ /dev/null
@@ -1,112 +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. - -package org.chromium.chrome.browser.superviseduser; - -import android.accounts.Account; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.database.Cursor; -import android.net.Uri; -import android.os.RemoteException; -import android.test.suitebuilder.annotation.SmallTest; - -import org.chromium.base.ThreadUtils; -import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.childaccounts.ChildAccountService; -import org.chromium.chrome.browser.preferences.PrefServiceBridge; -import org.chromium.chrome.test.ChromeActivityTestCaseBase; -import org.chromium.chrome.test.util.browser.signin.SigninTestUtil; -import org.chromium.components.webrestriction.WebRestrictionsContentProvider; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; - -/** - * Instrumentation test for SupervisedUserContentProvider. - */ -public class SupervisedUserContentProviderTest extends ChromeActivityTestCaseBase<ChromeActivity> { - private static final String DEFAULT_ACCOUNT = "test@gmail.com"; - private static final String AUTHORITY_SUFFIX = ".SupervisedUserProvider"; - private ContentResolver mResolver; - private String mAuthority; - private Uri mUri; - - public SupervisedUserContentProviderTest() { - super(ChromeActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - mResolver = getInstrumentation().getContext().getContentResolver(); - assertNotNull(mResolver); - mAuthority = getInstrumentation().getTargetContext().getPackageName() + AUTHORITY_SUFFIX; - mUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(mAuthority) - .path("authorized") - .build(); - SigninTestUtil.get().resetSigninState(); - } - - @Override - public void tearDown() throws Exception { - SigninTestUtil.get().resetSigninState(); - super.tearDown(); - } - - @Override - public void startMainActivity() throws InterruptedException { - SigninTestUtil.setUpAuthForTest(getInstrumentation()); - - // In principle the SupervisedUserContentProvider should work whenever Chrome is installed - // (even if it isn't running), but to test it we need to set up a dummy child, and to do - // this within a test we need to start Chrome. - startMainActivityOnBlankPage(); - } - - @SmallTest - public void testNoSupervisedUser() throws RemoteException, ExecutionException { - assertFalse(ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { - - @Override - public Boolean call() throws Exception { - PrefServiceBridge.getInstance().setSupervisedUserId(""); - return ChildAccountService.isChildAccount(); - } - - })); - ContentProviderClient client = mResolver.acquireContentProviderClient(mAuthority); - assertNotNull(client); - Cursor cursor = client.query(mUri, null, "url = 'http://google.com'", null, null); - assertNotNull(cursor); - assertEquals(WebRestrictionsContentProvider.PROCEED, cursor.getInt(0)); - cursor = client.query(mUri, null, "url = 'http://www.notgoogle.com'", null, null); - assertNotNull(cursor); - assertEquals(WebRestrictionsContentProvider.PROCEED, cursor.getInt(0)); - } - - @SmallTest - public void testWithSupervisedUser() throws RemoteException, ExecutionException { - final Account account = SigninTestUtil.get().addAndSignInTestAccount(); - assertNotNull(account); - assertTrue(ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { - - @Override - public Boolean call() throws Exception { - PrefServiceBridge.getInstance().setSupervisedUserId("ChildAccountSUID"); - return ChildAccountService.isChildAccount(); - } - - })); - ContentProviderClient client = mResolver.acquireContentProviderClient(mAuthority); - assertNotNull(client); - // setFilter for testing sets a default filter that blocks by default. - mResolver.call(mUri, "setFilterForTesting", null, null); - Cursor cursor = client.query(mUri, null, "url = 'http://www.google.com'", null, null); - assertNotNull(cursor); - assertEquals(WebRestrictionsContentProvider.BLOCKED, cursor.getInt(0)); - } -}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java index 4959da3..2499491 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java
@@ -23,7 +23,7 @@ protected Intent createIntent() { Intent intent = super.createIntent(); // This is setting Color.GREEN with 50% opacity. - intent.putExtra(ShortcutHelper.EXTRA_BACKGROUND_COLOR, (long) Color.argb(128, 0, 255, 0)); + intent.putExtra(ShortcutHelper.EXTRA_BACKGROUND_COLOR, 0x8000FF00L); return intent; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java index d6600c91..3faea04 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
@@ -35,7 +35,7 @@ Intent intent = super.createIntent(); intent.putExtra(ShortcutHelper.EXTRA_URL, "http://localhost"); // This is setting Color.Magenta with 50% opacity. - intent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, (long) Color.argb(128, 255, 0, 255)); + intent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, 0x80FF00FFL); return intent; }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java deleted file mode 100644 index 17348266..0000000 --- a/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java +++ /dev/null
@@ -1,230 +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. - -package org.chromium.chrome.browser.superviseduser; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import android.os.Handler; -import android.os.Looper; -import android.util.Pair; - -import org.chromium.testing.local.LocalRobolectricTestRunner; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; - -import java.util.concurrent.CountDownLatch; - -/** - * Tests of SupervisedUserContentProvider. This is tested as a simple class, not as a content - * provider. The content provider aspects are tested with WebRestrictionsContentProviderTest. - */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE, - shadows = {SupervisedUserContentProviderUnitTest.ShadowHander.class}) -public class SupervisedUserContentProviderUnitTest { - private static CountDownLatch sLatch; - - /** - * Special Handler shadow class that allows the test to wait for a post() call. - */ - @Implements(Handler.class) - public static class ShadowHander extends org.robolectric.shadows.ShadowHandler { - @Override - @Implementation - public boolean post(Runnable r) { - boolean result = super.post(r); - // If the test wants to wait it should initialize sLatch before post is called. - if (sLatch != null) sLatch.countDown(); - return result; - } - } - - private SupervisedUserContentProvider mSupervisedUserContentProvider; - private Looper mNativeCallLooper; - - @Before - public void setUp() { - sLatch = null; - mNativeCallLooper = null; - mSupervisedUserContentProvider = Mockito.spy(new SupervisedUserContentProvider()); - mSupervisedUserContentProvider.setNativeSupervisedUserContentProviderForTesting(1234L); - } - - @Test - public void testShouldProceed() throws InterruptedException { - // Runnable for test thread. - class TestRunnable implements Runnable { - private Pair<Boolean, String> mResult; - - @Override - public void run() { - this.mResult = mSupervisedUserContentProvider.shouldProceed("url"); - } - - public Pair<Boolean, String> getResult() { - return mResult; - } - } - // Mock the native call for a permitted URL - doAnswer(new Answer<Void>() { - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - Object args[] = invocation.getArguments(); - mNativeCallLooper = Looper.myLooper(); - ((SupervisedUserContentProvider.SupervisedUserQueryReply) args[1]) - .onQueryComplete(true, null); - return null; - } - - }) - .when(mSupervisedUserContentProvider) - .nativeShouldProceed(anyLong(), - any(SupervisedUserContentProvider.SupervisedUserQueryReply.class), - anyString()); - TestRunnable r1 = new TestRunnable(); - // Because SupervisedUserContentProvider uses a CountDownLatch (which is a java.util - // class, so can't be shadowed or mocked) we need to make the calls to shouldProceed on a - // real thread. This can't be the main thread because Robolectric emulates UI event handling - // on the main thread. - Thread t1 = new Thread(r1); - sLatch = new CountDownLatch(1); - t1.start(); - // Wait for the event to be posted to the emulated UI thread. - sLatch.await(); - Robolectric.runUiThreadTasks(); - t1.join(); - verify(mSupervisedUserContentProvider) - .nativeShouldProceed(eq(1234L), - any(SupervisedUserContentProvider.SupervisedUserQueryReply.class), - eq("url")); - // Assert has to be on main thread for failures to cause test failure. - assertThat(r1.getResult(), is(new Pair<Boolean, String>(true, null))); - // Check that the native code was called on the right thread. - assertThat(mNativeCallLooper, is(Looper.getMainLooper())); - // Mock the native call for a forbidden URL - doAnswer(new Answer<Void>() { - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - Object args[] = invocation.getArguments(); - mNativeCallLooper = Looper.myLooper(); - ((SupervisedUserContentProvider.SupervisedUserQueryReply) args[1]) - .onQueryComplete(false, "Hello"); - return null; - } - - }) - .when(mSupervisedUserContentProvider) - .nativeShouldProceed(anyLong(), - any(SupervisedUserContentProvider.SupervisedUserQueryReply.class), - anyString()); - TestRunnable r2 = new TestRunnable(); - // Create a new thread for the second call - Thread t2 = new Thread(r2); - sLatch = new CountDownLatch(1); - t2.start(); - // Wait for the event to be posted to the emulated UI thread. - sLatch.await(); - Robolectric.runUiThreadTasksIncludingDelayedTasks(); - t2.join(); - assertThat(r2.getResult(), is(new Pair<Boolean, String>(false, "Hello"))); - // Check that the native code was called on the UI thread. - assertThat(mNativeCallLooper, is(Looper.getMainLooper())); - } - - @Test - public void testRequestInsert() throws InterruptedException { - // Runnable for test thread. - class TestRunnable implements Runnable { - private boolean mResult; - - @Override - public void run() { - this.mResult = mSupervisedUserContentProvider.requestInsert("url"); - } - - public boolean getResult() { - return mResult; - } - } - // Mock native call. - doAnswer(new Answer<Void>() { - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - Object args[] = invocation.getArguments(); - mNativeCallLooper = Looper.myLooper(); - ((SupervisedUserContentProvider.SupervisedUserInsertReply) args[1]) - .onInsertRequestSendComplete(true); - return null; - } - - }) - .when(mSupervisedUserContentProvider) - .nativeRequestInsert(anyLong(), - any(SupervisedUserContentProvider.SupervisedUserInsertReply.class), - anyString()); - TestRunnable r1 = new TestRunnable(); - Thread t1 = new Thread(r1); - sLatch = new CountDownLatch(1); - t1.start(); - sLatch.await(); - Robolectric.runUiThreadTasks(); - t1.join(); - verify(mSupervisedUserContentProvider) - .nativeRequestInsert(eq(1234L), - any(SupervisedUserContentProvider.SupervisedUserInsertReply.class), - eq("url")); - assertThat(r1.getResult(), is(true)); - assertThat(mNativeCallLooper, is(Looper.getMainLooper())); - doAnswer(new Answer<Void>() { - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - Object args[] = invocation.getArguments(); - mNativeCallLooper = Looper.myLooper(); - ((SupervisedUserContentProvider.SupervisedUserInsertReply) args[1]) - .onInsertRequestSendComplete(false); - return null; - } - - }) - .when(mSupervisedUserContentProvider) - .nativeRequestInsert(anyLong(), - any(SupervisedUserContentProvider.SupervisedUserInsertReply.class), - anyString()); - TestRunnable r2 = new TestRunnable(); - Thread t2 = new Thread(r2); - sLatch = new CountDownLatch(1); - t2.start(); - sLatch.await(); - Robolectric.runUiThreadTasks(); - t2.join(); - Robolectric.runUiThreadTasks(); - verify(mSupervisedUserContentProvider, times(2)) - .nativeRequestInsert(eq(1234L), - any(SupervisedUserContentProvider.SupervisedUserInsertReply.class), - eq("url")); - assertThat(r2.getResult(), is(false)); - assertThat(mNativeCallLooper, is(Looper.getMainLooper())); - } -}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 366f76e..74f5691 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -2083,6 +2083,12 @@ Downloaded in Incognito </message> + <!-- Download Notification Labels --> + <message name="IDS_DOWNLOAD_NOTIFICATION_COPY_TO_CLIPBOARD" + desc="In the download notification, the text of 'Copy to clipboard' button, which is to copy the file content (eg. an image for image files) to the clipboard"> + Copy to clipboard + </message> + <!-- Download Context Menu Items --> <if expr="not is_android"> <if expr="not use_titlecase"> @@ -6055,9 +6061,6 @@ <message name="IDS_UPDATE_PASSWORD" desc="The title of the save password bubble when a password can be updated."> Do you want <ph name="PASSWORD_MANAGER_BRAND">$1<ex>Google Chrome</ex></ph> to update your password for this site? </message> - <message name="IDS_PASSWORD_MANAGER_SMART_LOCK" desc="The brand name of the password manager for the title of the save password bubble when a user is signed in."> - Google Smart Lock - </message> <message name="IDS_PASSWORD_MANAGER_SMART_LOCK_FOR_PASSWORDS" desc="The more descriptive brand name of the password manager when the user is signed in. Used in various UI elements, can be in link format."> Google Smart Lock for Passwords </message> @@ -6686,7 +6689,7 @@ Enables the use of an AppContainer on sandboxed processes to improve security. </message> </if> - <if expr="toolkit_views"> + <if expr="toolkit_views or is_android"> <message name="IDS_FLAGS_AUTOFILL_CREDIT_CARD_UPLOAD_NAME" desc="Name of the flag to enable uploading Autofill credit cards."> Enable offering upload of Autofilled credit cards </message>
diff --git a/chrome/app/theme/default_100_percent/cros/downloads/copy_to_clipboard.png b/chrome/app/theme/default_100_percent/cros/downloads/copy_to_clipboard.png new file mode 100644 index 0000000..6679ab4 --- /dev/null +++ b/chrome/app/theme/default_100_percent/cros/downloads/copy_to_clipboard.png Binary files differ
diff --git a/chrome/app/theme/default_200_percent/cros/downloads/copy_to_clipboard.png b/chrome/app/theme/default_200_percent/cros/downloads/copy_to_clipboard.png new file mode 100644 index 0000000..8043513 --- /dev/null +++ b/chrome/app/theme/default_200_percent/cros/downloads/copy_to_clipboard.png Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd index 28f35b5..d794909 100644 --- a/chrome/app/theme/theme_resources.grd +++ b/chrome/app/theme/theme_resources.grd
@@ -246,6 +246,7 @@ <structure type="chrome_scaled_image" name="IDR_DOWNLOAD_NOTIFICATION_MENU_DOWNLOAD" file="cros/downloads/download.png" /> <structure type="chrome_scaled_image" name="IDR_DOWNLOAD_NOTIFICATION_MENU_FOLDER" file="cros/downloads/folder.png" /> <structure type="chrome_scaled_image" name="IDR_DOWNLOAD_NOTIFICATION_MENU_PAUSE" file="cros/downloads/pause.png" /> + <structure type="chrome_scaled_image" name="IDR_DOWNLOAD_NOTIFICATION_MENU_COPY_TO_CLIPBOARD" file="cros/downloads/copy_to_clipboard.png" /> <structure type="chrome_scaled_image" name="IDR_ENABLE_DEBUGGING_FAILURE" file="cros/enable_debugging_failure.png" /> <structure type="chrome_scaled_image" name="IDR_ENABLE_DEBUGGING_SUCCESS" file="cros/enable_debugging_success.png" /> </if>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 8d53d15..4ae8be6 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -764,7 +764,7 @@ sources += rebase_path(gypi_values.chrome_browser_android_java_ui_sources, ".", "//chrome") - sources += rebase_path(gypi_values.chrome_browser_bookmark_android_sources, + sources += rebase_path(gypi_values.chrome_browser_offline_pages_sources, ".", "//chrome") deps += [
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 9e2bdcb..9f236f3 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2022,15 +2022,15 @@ SINGLE_VALUE_TYPE_AND_VALUE(switches::kDisableAutoHidingToolbarThreshold, "800")}, #endif -#if defined(TOOLKIT_VIEWS) +#if defined(TOOLKIT_VIEWS) || defined(OS_ANDROID) {"enable-autofill-credit-card-upload", IDS_FLAGS_AUTOFILL_CREDIT_CARD_UPLOAD_NAME, IDS_FLAGS_AUTOFILL_CREDIT_CARD_UPLOAD_DESCRIPTION, - kOsCrOS | kOsWin | kOsLinux, + kOsCrOS | kOsWin | kOsLinux | kOsAndroid, ENABLE_DISABLE_VALUE_TYPE( autofill::switches::kEnableOfferUploadCreditCards, autofill::switches::kDisableOfferUploadCreditCards)}, -#endif // defined(TOOLKIT_VIEWS) +#endif // defined(TOOLKIT_VIEWS) || defined(OS_ANDROID) #if defined(OS_ANDROID) {"enable-tab-switcher-in-document-mode", IDS_FLAGS_TAB_SWITCHER_IN_DOCUMENT_MODE_NAME,
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc index 579732a0c..b24d754 100644 --- a/chrome/browser/android/chrome_jni_registrar.cc +++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -112,7 +112,6 @@ #include "chrome/browser/ssl/security_state_model_android.h" #include "chrome/browser/supervised_user/child_accounts/child_account_feedback_reporter_android.h" #include "chrome/browser/supervised_user/child_accounts/child_account_service_android.h" -#include "chrome/browser/supervised_user/supervised_user_content_provider_android.h" #include "chrome/browser/sync/profile_sync_service_android.h" #include "chrome/browser/ui/android/autofill/autofill_dialog_controller_android.h" #include "chrome/browser/ui/android/autofill/autofill_dialog_result.h" @@ -335,7 +334,6 @@ {"SSLClientCertificateRequest", RegisterSSLClientCertificateRequestAndroid}, {"StartupMetricUtils", RegisterStartupMetricUtils}, {"StaticTabSceneLayer", chrome::android::RegisterStaticTabSceneLayer}, - {"SupervisedUserContentProvider", SupervisedUserContentProvider::Register}, {"Sync", syncer::RegisterSyncJni}, {"TabAndroid", TabAndroid::RegisterTabAndroid}, {"TabContentManager", chrome::android::RegisterTabContentManager},
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.cc b/chrome/browser/android/compositor/layer/contextual_search_layer.cc index 1c5bd77a..cafbcb8c 100644 --- a/chrome/browser/android/compositor/layer/contextual_search_layer.cc +++ b/chrome/browser/android/compositor/layer/contextual_search_layer.cc
@@ -29,6 +29,9 @@ // a lighter shade of the color of the Peek Promo Ripple. const SkAlpha kPeekPromoBackgroundMaximumAlphaBlend = 0.25f * 255; +// This is the default width for any icon displayed on an OverlayPanel. +const float kDefaultIconWidthDp = 36.0f; + } // namespace namespace chrome { @@ -55,6 +58,7 @@ int peek_promo_text_resource_id, int search_provider_icon_sprite_bitmap_resource_id, int search_provider_icon_sprite_metadata_resource_id, + float dp_to_px, content::ContentViewCore* content_view_core, bool search_promo_visible, float search_promo_height, @@ -272,13 +276,19 @@ panel_icon_resource_id); DCHECK(panel_icon_resource); + // If the icon is not the default width, add or remove padding so it appears + // centered. + float icon_padding = (kDefaultIconWidthDp * dp_to_px - + panel_icon_resource->size.width()) / 2.0f; + // Positions the Icon at the start of the Search Bar. float search_provider_icon_left; if (is_rtl) { search_provider_icon_left = search_panel_width - - panel_icon_resource->size.width() - search_bar_margin_side; + panel_icon_resource->size.width() - + (search_bar_margin_side + icon_padding); } else { - search_provider_icon_left = search_bar_margin_side; + search_provider_icon_left = search_bar_margin_side + icon_padding; } // Centers the Icon vertically in the Search Bar.
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.h b/chrome/browser/android/compositor/layer/contextual_search_layer.h index e020404..83ce9eb 100644 --- a/chrome/browser/android/compositor/layer/contextual_search_layer.h +++ b/chrome/browser/android/compositor/layer/contextual_search_layer.h
@@ -48,6 +48,7 @@ int peek_promo_text_resource_id, int search_provider_icon_sprite_bitmap_resource_id, int search_provider_icon_sprite_metadata_resource_id, + float dp_to_px, content::ContentViewCore* content_view_core, bool search_promo_visible, float search_promo_height,
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc index 624f178f..d330d58 100644 --- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc +++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc
@@ -40,6 +40,7 @@ jint peek_promo_text_resource_id, jint search_provider_icon_sprite_bitmap_resource_id, jint search_provider_icon_sprite_metadata_resource_id, + jfloat dp_to_px, const JavaParamRef<jobject>& jcontent_view_core, jboolean search_promo_visible, jfloat search_promo_height, @@ -106,6 +107,7 @@ peek_promo_text_resource_id, search_provider_icon_sprite_bitmap_resource_id, search_provider_icon_sprite_metadata_resource_id, + dp_to_px, content_view_core, search_promo_visible, search_promo_height,
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h index 043dff4..1e9e068 100644 --- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h
@@ -41,6 +41,7 @@ jint peek_promo_text_resource_id, jint search_provider_icon_sprite_bitmap_resource_id, jint search_provider_icon_sprite_metadata_resource_id, + jfloat dp_to_px, const base::android::JavaParamRef<jobject>& jcontent_view_core, jboolean search_promo_visible, jfloat search_promo_height,
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index b4e206e..ded49f7 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -22,7 +22,7 @@ #include "chrome/common/pref_names.h" #include "components/browser_sync/browser/profile_sync_service.h" #include "components/search_engines/template_url_service.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "components/variations/variations_associated_data.h" #include "content/public/browser/android/content_view_core.h" #include "content/public/browser/web_contents.h" @@ -128,11 +128,10 @@ // Add Chrome experiment state to the request headers. net::HttpRequestHeaders headers; - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( + variations::AppendVariationHeaders( search_term_fetcher_->GetOriginalURL(), false, // Impossible to be incognito at this point. - false, - &headers); + false, &headers); search_term_fetcher_->SetExtraRequestHeaders(headers.ToString()); SetDiscourseContextAndAddToHeader(*context_);
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc index 62f1aac5..54f42a4 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.cc +++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -7,7 +7,6 @@ #include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "base/basictypes.h" -#include "base/strings/string_util.h" #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" #include "chrome/browser/profiles/profile.h" @@ -248,16 +247,6 @@ offline_page.last_access_time.ToJavaTime()); } -// static -bool OfflinePageBridge::MightBeOfflineURL(const GURL& url) { - // It has to be a file URL ending with .mhtml extension. - return url.is_valid() && - url.SchemeIsFile() && - base::EndsWith(url.spec(), - OfflinePageMHTMLArchiver::GetFileNameExtension(), - base::CompareCase::INSENSITIVE_ASCII); -} - static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& j_profile) {
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.h b/chrome/browser/android/offline_pages/offline_page_bridge.h index cf53187b5..a141e55 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.h +++ b/chrome/browser/android/offline_pages/offline_page_bridge.h
@@ -22,9 +22,6 @@ */ class OfflinePageBridge : public OfflinePageModel::Observer { public: - // Returns true if |url| might points to an offline page. - static bool MightBeOfflineURL(const GURL& url); - OfflinePageBridge(JNIEnv* env, jobject obj, content::BrowserContext* browser_context);
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.cc b/chrome/browser/android/offline_pages/offline_page_utils.cc new file mode 100644 index 0000000..0387549 --- /dev/null +++ b/chrome/browser/android/offline_pages/offline_page_utils.cc
@@ -0,0 +1,138 @@ +// 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/android/offline_pages/offline_page_utils.h" + +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" +#include "chrome/browser/android/offline_pages/offline_page_model_factory.h" +#include "components/offline_pages/offline_page_feature.h" +#include "components/offline_pages/offline_page_item.h" +#include "components/offline_pages/offline_page_model.h" +#include "content/public/browser/browser_context.h" +#include "url/gurl.h" + +namespace offline_pages { +namespace { + +// Returns an offline page originated from the |online_url|. +const offline_pages::OfflinePageItem* GetOfflinePageForOnlineURL( + content::BrowserContext* browser_context, + const GURL& online_url) { + DCHECK(browser_context); + + if (!offline_pages::IsOfflinePagesEnabled()) + return nullptr; + + offline_pages::OfflinePageModel* offline_page_model = + offline_pages::OfflinePageModelFactory::GetForBrowserContext( + browser_context); + if (!offline_page_model) + return nullptr; + + return offline_page_model->GetPageByOnlineURL(online_url); +} + +// Returns an offline page that is stored as the |offline_url|. +const offline_pages::OfflinePageItem* GetOfflinePageForOfflineURL( + content::BrowserContext* browser_context, + const GURL& offline_url) { + DCHECK(browser_context); + + if (!offline_pages::IsOfflinePagesEnabled()) + return nullptr; + + // Note that we first check if the url likely points to an offline page + // before calling GetPageByOfflineURL in order to avoid unnecessary lookup + // cost. + if (!OfflinePageUtils::MightBeOfflineURL(offline_url)) + return nullptr; + + offline_pages::OfflinePageModel* offline_page_model = + offline_pages::OfflinePageModelFactory::GetForBrowserContext( + browser_context); + if (!offline_page_model) + return nullptr; + + return offline_page_model->GetPageByOfflineURL(offline_url); +} + +} // namespace + +// static +bool OfflinePageUtils::MightBeOfflineURL(const GURL& url) { + // It has to be a file URL ending with .mhtml extension. + return url.is_valid() && url.SchemeIsFile() && + base::EndsWith(url.spec(), + OfflinePageMHTMLArchiver::GetFileNameExtension(), + base::CompareCase::INSENSITIVE_ASCII); +} + +// static +GURL OfflinePageUtils::GetOfflineURLForOnlineURL( + content::BrowserContext* browser_context, + const GURL& online_url) { + const offline_pages::OfflinePageItem* offline_page = + GetOfflinePageForOnlineURL(browser_context, online_url); + if (!offline_page) + return GURL(); + + return offline_page->GetOfflineURL(); +} + +// static +GURL OfflinePageUtils::GetOnlineURLForOfflineURL( + content::BrowserContext* browser_context, + const GURL& offline_url) { + const offline_pages::OfflinePageItem* offline_page = + GetOfflinePageForOfflineURL(browser_context, offline_url); + if (!offline_page) + return GURL(); + + return offline_page->url; +} + +// static +int64 OfflinePageUtils::GetBookmarkIdForOfflineURL( + content::BrowserContext* browser_context, + const GURL& offline_url) { + const offline_pages::OfflinePageItem* offline_page = + GetOfflinePageForOfflineURL(browser_context, offline_url); + if (!offline_page) + return -1; + + return offline_page->bookmark_id; +} + +// static +bool OfflinePageUtils::IsOfflinePage(content::BrowserContext* browser_context, + const GURL& offline_url) { + return GetOfflinePageForOfflineURL(browser_context, offline_url) != nullptr; +} + +// static +bool OfflinePageUtils::HasOfflinePageForOnlineURL( + content::BrowserContext* browser_context, + const GURL& online_url) { + const offline_pages::OfflinePageItem* offline_page = + GetOfflinePageForOnlineURL(browser_context, online_url); + return offline_page && !offline_page->file_path.empty(); +} + +// static +const bool OfflinePageUtils::HasOfflinePages( + content::BrowserContext* browser_context) { + DCHECK(browser_context); + + if (!offline_pages::IsOfflinePagesEnabled()) + return false; + + offline_pages::OfflinePageModel* offline_page_model = + offline_pages::OfflinePageModelFactory::GetForBrowserContext( + browser_context); + return offline_page_model->HasOfflinePages(); +} + +} // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.h b/chrome/browser/android/offline_pages/offline_page_utils.h new file mode 100644 index 0000000..54ef117 --- /dev/null +++ b/chrome/browser/android/offline_pages/offline_page_utils.h
@@ -0,0 +1,54 @@ +// 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_ANDROID_OFFLINE_PAGES_OFFLINE_PAGE_UTILS_H_ +#define CHROME_BROWSER_ANDROID_OFFLINE_PAGES_OFFLINE_PAGE_UTILS_H_ + +#include "base/basictypes.h" + +class GURL; + +namespace content { +class BrowserContext; +} + +namespace offline_pages { +struct OfflinePageItem; + +class OfflinePageUtils { + public: + // Returns true if |url| might point to an offline page. + static bool MightBeOfflineURL(const GURL& url); + + // Gets an offline URL of an offline page with |online_url| if one exists. + static GURL GetOfflineURLForOnlineURL( + content::BrowserContext* browser_context, + const GURL& online_url); + + // Gets an online URL of an offline page with |offline_url| if one exists. + static GURL GetOnlineURLForOfflineURL( + content::BrowserContext* browser_context, + const GURL& offline_url); + + // Gets a bookmark ID related to the |offline_url|. + static int64 GetBookmarkIdForOfflineURL( + content::BrowserContext* browser_context, + const GURL& offline_url); + + // Checks whether |offline_url| points to an offline page. + static bool IsOfflinePage(content::BrowserContext* browser_context, + const GURL& offline_url); + + // Checks whether offline page for |online_url| exists. + static bool HasOfflinePageForOnlineURL( + content::BrowserContext* browser_context, + const GURL& online_url); + + // Checks whether any offline page is saved. + static const bool HasOfflinePages(content::BrowserContext* browser_context); +}; + +} // namespace offline_pages + +#endif // CHROME_BROWSER_ANDROID_OFFLINE_PAGES_OFFLINE_PAGE_UTILS_H_
diff --git a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc new file mode 100644 index 0000000..8c2f940 --- /dev/null +++ b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
@@ -0,0 +1,230 @@ +// 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/android/offline_pages/offline_page_utils.h" + +#include "base/callback.h" +#include "base/command_line.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/test/test_simple_task_runner.h" +#include "base/thread_task_runner_handle.h" +#include "chrome/browser/android/offline_pages/offline_page_model_factory.h" +#include "chrome/browser/android/offline_pages/test_offline_page_model_builder.h" +#include "chrome/common/chrome_constants.h" +#include "chrome/test/base/testing_profile.h" +#include "components/offline_pages/offline_page_model.h" +#include "components/offline_pages/offline_page_switches.h" +#include "components/offline_pages/offline_page_test_archiver.h" +#include "components/offline_pages/offline_page_test_store.h" +#include "net/base/filename_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace offline_pages { +namespace { + +const GURL kTestPage1Url("http://test.org/page1"); +const GURL kTestPage2Url("http://test.org/page2"); +const GURL kTestPage3Url("http://test.org/page3"); +const int64 kTestPage1BookmarkId = 1234; +const int64 kTestPage2BookmarkId = 5678; +const int64 kTestFileSize = 876543LL; + +} // namespace + +class OfflinePageUtilsTest + : public testing::Test, + public OfflinePageTestArchiver::Observer, + public base::SupportsWeakPtr<OfflinePageUtilsTest> { + public: + OfflinePageUtilsTest(); + ~OfflinePageUtilsTest() override; + + void SetUp() override; + void RunUntilIdle(); + + // Necessary callbacks for the offline page model. + void OnSavePageDone(OfflinePageModel::SavePageResult result); + void OnClearAllDone(); + + // OfflinePageTestArchiver::Observer implementation: + void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override; + + // Offline page URL for the first page. + const GURL& offline_url_page_1() const { return offline_url_page_1_; } + // Offline page URL for the second page. + const GURL& offline_url_page_2() const { return offline_url_page_2_; } + // Offline page URL not related to any page. + const GURL& offline_url_missing() const { return offline_url_missing_; } + + TestingProfile* profile() { return &profile_; } + + private: + void CreateOfflinePages(); + scoped_ptr<OfflinePageTestArchiver> BuildArchiver( + const GURL& url, + const base::FilePath& file_name); + + GURL offline_url_page_1_; + GURL offline_url_page_2_; + GURL offline_url_missing_; + + scoped_refptr<base::TestSimpleTaskRunner> task_runner_; + base::ThreadTaskRunnerHandle task_runner_handle_; + TestingProfile profile_; +}; + +OfflinePageUtilsTest::OfflinePageUtilsTest() + : task_runner_(new base::TestSimpleTaskRunner), + task_runner_handle_(task_runner_) {} + +OfflinePageUtilsTest::~OfflinePageUtilsTest() {} + +void OfflinePageUtilsTest::SetUp() { + // Enable offline pages feature. + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableOfflinePages); + + // Set up the factory for testing. + OfflinePageModelFactory::GetInstance()->SetTestingFactoryAndUse( + &profile_, BuildTestOfflinePageModel); + RunUntilIdle(); + + // Make sure the store contains the right offline pages before the load + // happens. + CreateOfflinePages(); +} + +void OfflinePageUtilsTest::RunUntilIdle() { + task_runner_->RunUntilIdle(); +} + +void OfflinePageUtilsTest::OnSavePageDone( + OfflinePageModel::SavePageResult result) { + // Result ignored here. +} + +void OfflinePageUtilsTest::OnClearAllDone() { + // Result ignored here. +} + +void OfflinePageUtilsTest::SetLastPathCreatedByArchiver( + const base::FilePath& file_path) {} + +void OfflinePageUtilsTest::CreateOfflinePages() { + OfflinePageModel* model = + OfflinePageModelFactory::GetForBrowserContext(profile()); + + // Create page 1. + scoped_ptr<OfflinePageTestArchiver> archiver( + BuildArchiver(kTestPage1Url, + base::FilePath(FILE_PATH_LITERAL("page1.mhtml"))) + .Pass()); + model->SavePage( + kTestPage1Url, kTestPage1BookmarkId, archiver.Pass(), + base::Bind(&OfflinePageUtilsTest::OnSavePageDone, AsWeakPtr())); + RunUntilIdle(); + + // Create page 2. + archiver = BuildArchiver(kTestPage2Url, + base::FilePath(FILE_PATH_LITERAL("page2.mhtml"))) + .Pass(); + model->SavePage( + kTestPage2Url, kTestPage2BookmarkId, archiver.Pass(), + base::Bind(&OfflinePageUtilsTest::OnSavePageDone, AsWeakPtr())); + RunUntilIdle(); + + // Make a copy of local paths of the two pages stored in the model. + offline_url_page_1_ = + model->GetPageByBookmarkId(kTestPage1BookmarkId)->GetOfflineURL(); + offline_url_page_2_ = + model->GetPageByBookmarkId(kTestPage2BookmarkId)->GetOfflineURL(); + // Create a file path that is not associated with any offline page. + offline_url_missing_ = net::FilePathToFileURL( + profile() + ->GetPath() + .Append(chrome::kOfflinePageArchviesDirname) + .Append(FILE_PATH_LITERAL("missing_file.mhtml"))); +} + +scoped_ptr<OfflinePageTestArchiver> OfflinePageUtilsTest::BuildArchiver( + const GURL& url, + const base::FilePath& file_name) { + scoped_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( + this, url, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED, + kTestFileSize, base::ThreadTaskRunnerHandle::Get())); + archiver->set_filename(file_name); + return archiver.Pass(); +} + +// Simple test for offline page model having any pages loaded. +TEST_F(OfflinePageUtilsTest, HasOfflinePages) { + EXPECT_TRUE(OfflinePageUtils::HasOfflinePages(profile())); + + OfflinePageModelFactory::GetForBrowserContext(profile())->ClearAll( + base::Bind(&OfflinePageUtilsTest::OnClearAllDone, AsWeakPtr())); + RunUntilIdle(); + + EXPECT_FALSE(OfflinePageUtils::HasOfflinePages(profile())); +} + +TEST_F(OfflinePageUtilsTest, MightBeOfflineURL) { + // URL is invalid. + EXPECT_FALSE(OfflinePageUtils::MightBeOfflineURL(GURL("/test.mhtml"))); + // Scheme is not file. + EXPECT_FALSE(OfflinePageUtils::MightBeOfflineURL(GURL("http://test.com/"))); + // Does not end with .mhtml. + EXPECT_FALSE(OfflinePageUtils::MightBeOfflineURL(GURL("file:///test.txt"))); + // Might still be an offline page. + EXPECT_TRUE(OfflinePageUtils::MightBeOfflineURL(GURL("file:///test.mhtml"))); +} + +TEST_F(OfflinePageUtilsTest, GetOfflineURLForOnlineURL) { + EXPECT_EQ(offline_url_page_1(), OfflinePageUtils::GetOfflineURLForOnlineURL( + profile(), kTestPage1Url)); + EXPECT_EQ(offline_url_page_2(), OfflinePageUtils::GetOfflineURLForOnlineURL( + profile(), kTestPage2Url)); + EXPECT_EQ(GURL(), OfflinePageUtils::GetOfflineURLForOnlineURL( + profile(), GURL(kTestPage3Url))); +} + +TEST_F(OfflinePageUtilsTest, GetOnlineURLForOfflineURL) { + EXPECT_EQ(kTestPage1Url, OfflinePageUtils::GetOnlineURLForOfflineURL( + profile(), offline_url_page_1())); + EXPECT_EQ(kTestPage2Url, OfflinePageUtils::GetOnlineURLForOfflineURL( + profile(), offline_url_page_2())); + EXPECT_EQ(GURL::EmptyGURL(), OfflinePageUtils::GetOfflineURLForOnlineURL( + profile(), offline_url_missing())); +} + +TEST_F(OfflinePageUtilsTest, GetBookmarkIdForOfflineURL) { + EXPECT_EQ(kTestPage1BookmarkId, OfflinePageUtils::GetBookmarkIdForOfflineURL( + profile(), offline_url_page_1())); + EXPECT_EQ(kTestPage2BookmarkId, OfflinePageUtils::GetBookmarkIdForOfflineURL( + profile(), offline_url_page_2())); + EXPECT_EQ(-1, OfflinePageUtils::GetBookmarkIdForOfflineURL( + profile(), offline_url_missing())); +} + +TEST_F(OfflinePageUtilsTest, IsOfflinePage) { + EXPECT_TRUE(OfflinePageUtils::IsOfflinePage(profile(), offline_url_page_1())); + EXPECT_TRUE(OfflinePageUtils::IsOfflinePage(profile(), offline_url_page_2())); + EXPECT_FALSE( + OfflinePageUtils::IsOfflinePage(profile(), offline_url_missing())); + EXPECT_FALSE(OfflinePageUtils::IsOfflinePage(profile(), kTestPage1Url)); + EXPECT_FALSE(OfflinePageUtils::IsOfflinePage(profile(), kTestPage2Url)); +} + +TEST_F(OfflinePageUtilsTest, HasOfflinePageForOnlineURL) { + EXPECT_TRUE( + OfflinePageUtils::HasOfflinePageForOnlineURL(profile(), kTestPage1Url)); + EXPECT_TRUE( + OfflinePageUtils::HasOfflinePageForOnlineURL(profile(), kTestPage2Url)); + EXPECT_FALSE( + OfflinePageUtils::HasOfflinePageForOnlineURL(profile(), kTestPage3Url)); +} + +} // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc b/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc new file mode 100644 index 0000000..2a155cce --- /dev/null +++ b/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc
@@ -0,0 +1,32 @@ +// 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/android/offline_pages/test_offline_page_model_builder.h" + +#include "base/memory/ref_counted.h" +#include "base/single_thread_task_runner.h" +#include "base/thread_task_runner_handle.h" +#include "chrome/common/chrome_constants.h" +#include "components/offline_pages/offline_page_model.h" +#include "components/offline_pages/offline_page_test_store.h" +#include "content/public/browser/browser_context.h" + +namespace offline_pages { + +scoped_ptr<KeyedService> BuildTestOfflinePageModel( + content::BrowserContext* context) { + scoped_refptr<base::SingleThreadTaskRunner> task_runner = + base::ThreadTaskRunnerHandle::Get(); + + scoped_ptr<OfflinePageTestStore> metadata_store( + new OfflinePageTestStore(task_runner)); + + base::FilePath archives_dir = + context->GetPath().Append(chrome::kOfflinePageArchviesDirname); + + return scoped_ptr<KeyedService>( + new OfflinePageModel(metadata_store.Pass(), archives_dir, task_runner)); +} + +} // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/test_offline_page_model_builder.h b/chrome/browser/android/offline_pages/test_offline_page_model_builder.h new file mode 100644 index 0000000..6c56d5a --- /dev/null +++ b/chrome/browser/android/offline_pages/test_offline_page_model_builder.h
@@ -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. + +#ifndef CHROME_BROWSER_ANDROID_OFFLINE_PAGES_TEST_OFFLINE_PAGE_MODEL_BUILDER_H_ +#define CHROME_BROWSER_ANDROID_OFFLINE_PAGES_TEST_OFFLINE_PAGE_MODEL_BUILDER_H_ + +#include "base/memory/scoped_ptr.h" + +class KeyedService; + +namespace content { +class BrowserContext; +} + +namespace offline_pages { + +// Helper function to be used with +// BrowserContextKeyedServiceFactory::SetTestingFactory() that returns a +// OfflinePageModel object with mocked store. +scoped_ptr<KeyedService> BuildTestOfflinePageModel( + content::BrowserContext* context); + +} // namespace offline_pages + +#endif // CHROME_BROWSER_ANDROID_OFFLINE_PAGES_TEST_OFFLINE_PAGE_MODEL_BUILDER_H_
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc index e86b6c4..bfd5d66c 100644 --- a/chrome/browser/android/preferences/pref_service_bridge.cc +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -953,10 +953,3 @@ return ConvertJavaStringToUTF8(android_permission); } - -static void SetSupervisedUserId(JNIEnv* env, - const JavaParamRef<jobject>& obj, - const JavaParamRef<jstring>& pref) { - GetPrefService()->SetString(prefs::kSupervisedUserId, - ConvertJavaStringToUTF8(env, pref)); -}
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc index ac5297e..7f54e987 100644 --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc
@@ -12,8 +12,8 @@ #include "cc/layers/layer.h" #include "chrome/browser/android/compositor/tab_content_manager.h" #include "chrome/browser/android/metrics/uma_utils.h" -#include "chrome/browser/android/offline_pages/offline_page_bridge.h" #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" +#include "chrome/browser/android/offline_pages/offline_page_utils.h" #include "chrome/browser/android/tab_web_contents_delegate_android.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" @@ -773,10 +773,10 @@ web_contents()->GetURL()); Profile* profile = GetProfile(); - // If the url points to an offline page, replace it with the original url. - const offline_pages::OfflinePageItem* offline_page = GetOfflinePage(url); - if (offline_page) - url = offline_page->url; + // If the url points to an offline page, it already has a bookmark ID that it + // is related to. + int64_t candidate_bookmark_id = + offline_pages::OfflinePageUtils::GetBookmarkIdForOfflineURL(profile, url); // Get all the nodes for |url| and sort them by date added. std::vector<const bookmarks::BookmarkNode*> nodes; @@ -784,6 +784,14 @@ ManagedBookmarkServiceFactory::GetForProfile(profile); bookmarks::BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile); + + // If we have a candidate bookmark ID from the offline page model and that ID + // matches an existing bookmark, return it. + if (candidate_bookmark_id != -1 && + bookmarks::GetBookmarkNodeByID(model, candidate_bookmark_id) != nullptr) { + return candidate_bookmark_id; + } + model->GetNodesByURL(url, &nodes); std::sort(nodes.begin(), nodes.end(), &bookmarks::MoreRecentlyAdded); @@ -798,12 +806,7 @@ } bool TabAndroid::HasOfflinePages() const { - if (!offline_pages::IsOfflinePagesEnabled()) - return false; - offline_pages::OfflinePageModel* offline_page_model = - offline_pages::OfflinePageModelFactory::GetForBrowserContext( - GetProfile()); - return !offline_page_model->GetAllPages().empty(); + return offline_pages::OfflinePageUtils::HasOfflinePages(GetProfile()); } void TabAndroid::ShowOfflinePages() { @@ -812,26 +815,8 @@ } void TabAndroid::LoadOfflineCopy(const GURL& url) { - if (!offline_pages::IsOfflinePagesEnabled()) - return; - - // Offline copy is only saved for a bookmarked page. - int64_t bookmark_id = GetBookmarkIdHelper(true); - if (bookmark_id == -1) - return; - - offline_pages::OfflinePageModel* offline_page_model = - offline_pages::OfflinePageModelFactory::GetForBrowserContext( - GetProfile()); - if (!offline_page_model) - return; - - const offline_pages::OfflinePageItem* offline_page = - offline_page_model->GetPageByBookmarkId(bookmark_id); - if (!offline_page || offline_page->url != url) - return; - - GURL offline_url = offline_page->GetOfflineURL(); + GURL offline_url = offline_pages::OfflinePageUtils::GetOfflineURLForOnlineURL( + GetProfile(), url); if (!offline_url.is_valid()) return; @@ -841,26 +826,17 @@ jboolean TabAndroid::HasOfflineCopy(JNIEnv* env, const JavaParamRef<jobject>& obj) { - // Offline copy is only saved for a bookmarked page. - int64_t bookmark_id = GetBookmarkIdHelper(true); - if (bookmark_id == -1) - return false; - - offline_pages::OfflinePageModel* offline_page_model = - offline_pages::OfflinePageModelFactory::GetForBrowserContext( - GetProfile()); - if (!offline_page_model) - return false; - const offline_pages::OfflinePageItem* offline_page = - offline_page_model->GetPageByBookmarkId(bookmark_id); - return offline_page && !offline_page->file_path.empty(); + GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( + web_contents()->GetURL()); + return offline_pages::OfflinePageUtils::HasOfflinePageForOnlineURL( + GetProfile(), url); } jboolean TabAndroid::IsOfflinePage(JNIEnv* env, const JavaParamRef<jobject>& obj) { GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( web_contents()->GetURL()); - return GetOfflinePage(url) != nullptr; + return offline_pages::OfflinePageUtils::IsOfflinePage(GetProfile(), url); } ScopedJavaLocalRef<jstring> TabAndroid::GetOfflinePageOriginalUrl( @@ -868,29 +844,14 @@ const JavaParamRef<jobject>& obj) { GURL url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( web_contents()->GetURL()); - const offline_pages::OfflinePageItem* offline_page = GetOfflinePage(url); - if (offline_page == nullptr) + GURL original_url = + offline_pages::OfflinePageUtils::GetOnlineURLForOfflineURL(GetProfile(), + url); + if (!original_url.is_valid()) return ScopedJavaLocalRef<jstring>(); return ScopedJavaLocalRef<jstring>( - ConvertUTF8ToJavaString(env, offline_page->url.spec())); -} - -const offline_pages::OfflinePageItem* TabAndroid::GetOfflinePage( - const GURL& url) const { - if (!offline_pages::IsOfflinePagesEnabled()) - return nullptr; - - // Note that we first check if the url likely points to an offline page - // before calling GetPageByOfflineURL in order to avoid unnecessary lookup - // cost. - if (!offline_pages::android::OfflinePageBridge::MightBeOfflineURL(url)) - return nullptr; - - offline_pages::OfflinePageModel* offline_page_model = - offline_pages::OfflinePageModelFactory::GetForBrowserContext( - GetProfile()); - return offline_page_model->GetPageByOfflineURL(url); + ConvertUTF8ToJavaString(env, original_url.spec())); } bool TabAndroid::HasPrerenderedUrl(JNIEnv* env,
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h index aa79ad4..f15afa414 100644 --- a/chrome/browser/android/tab_android.h +++ b/chrome/browser/android/tab_android.h
@@ -50,10 +50,6 @@ class InfoBar; } -namespace offline_pages { -struct OfflinePageItem; -} - namespace prerender { class PrerenderManager; } @@ -264,8 +260,6 @@ int64_t GetBookmarkIdHelper(bool only_editable) const; - const offline_pages::OfflinePageItem* GetOfflinePage(const GURL& url) const; - JavaObjectWeakGlobalRef weak_java_tab_; // The identifier used by session restore for this tab.
diff --git a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc index fae9849f..54ef919 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc
@@ -8,7 +8,7 @@ #include "base/location.h" #include "base/strings/string16.h" #include "base/task/cancelable_task_tracker.h" -#include "chrome/browser/android/offline_pages/offline_page_model_factory.h" +#include "chrome/browser/android/offline_pages/offline_page_utils.h" #include "chrome/browser/android/shortcut_helper.h" #include "chrome/browser/favicon/favicon_service_factory.h" #include "chrome/browser/manifest/manifest_icon_downloader.h" @@ -19,9 +19,6 @@ #include "chrome/common/web_application_info.h" #include "components/dom_distiller/core/url_utils.h" #include "components/favicon/core/favicon_service.h" -#include "components/offline_pages/offline_page_feature.h" -#include "components/offline_pages/offline_page_item.h" -#include "components/offline_pages/offline_page_model.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" @@ -276,21 +273,14 @@ } GURL AddToHomescreenDataFetcher::GetShortcutUrl(const GURL& actual_url) { - GURL shortcut_url = + GURL original_url = dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl(actual_url); - if (!offline_pages::IsOfflinePagesEnabled()) - return shortcut_url; + // If URL points to an offline content, get original URL. + GURL online_url = offline_pages::OfflinePageUtils::GetOnlineURLForOfflineURL( + web_contents()->GetBrowserContext(), original_url); + if (online_url.is_valid()) + return online_url; - Profile* profile = - Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - - offline_pages::OfflinePageModel* offline_page_model = - offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile); - const offline_pages::OfflinePageItem* offline_page = - offline_page_model->GetPageByOfflineURL(shortcut_url); - if (!offline_page) - return shortcut_url; - - return offline_page->url; + return original_url; }
diff --git a/chrome/browser/autofill/autofill_cc_infobar_delegate_unittest.cc b/chrome/browser/autofill/autofill_cc_infobar_delegate_unittest.cc index 50f86423..2dc1fa5 100644 --- a/chrome/browser/autofill/autofill_cc_infobar_delegate_unittest.cc +++ b/chrome/browser/autofill/autofill_cc_infobar_delegate_unittest.cc
@@ -90,7 +90,6 @@ base::HistogramTester histogram_tester; CreditCard credit_card; scoped_ptr<ConfirmInfoBarDelegate> delegate(AutofillCCInfoBarDelegate::Create( - ChromeAutofillClient::FromWebContents(web_contents()), base::Bind( base::IgnoreResult(&TestPersonalDataManager::SaveImportedCreditCard), base::Unretained(personal_data_.get()), credit_card)));
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 3f042a72..286cf34 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -123,10 +123,10 @@ #include "components/translate/content/browser/browser_cld_utils.h" #include "components/translate/content/common/cld_data_source.h" #include "components/translate/core/browser/translate_download_manager.h" -#include "components/variations/net/variations_http_header_provider.h" #include "components/variations/pref_names.h" #include "components/variations/service/variations_service.h" #include "components/variations/variations_associated_data.h" +#include "components/variations/variations_http_header_provider.h" #include "components/variations/variations_switches.h" #include "components/version_info/version_info.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc index 99dd8359..67b9b52 100644 --- a/chrome/browser/devtools/devtools_sanity_browsertest.cc +++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -13,6 +13,7 @@ #include "base/prefs/pref_service.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/test_timeouts.h" @@ -23,6 +24,7 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/extensions/unpacked_installer.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h" @@ -55,6 +57,8 @@ #include "extensions/browser/extension_system.h" #include "extensions/browser/notification_types.h" #include "extensions/common/switches.h" +#include "extensions/common/value_builder.h" +#include "net/dns/mock_host_resolver.h" #include "net/test/spawned_test_server/spawned_test_server.h" #include "ui/compositor/compositor_switches.h" #include "ui/gl/gl_switches.h" @@ -69,6 +73,7 @@ using content::WebContents; using content::WorkerService; using content::WorkerServiceObserver; +using extensions::Extension; namespace { @@ -131,12 +136,28 @@ DispatchOnTestSuite(window, "switchToPanel", panel); } +// Version of SwitchToPanel that works with extension-created panels. +void SwitchToExtensionPanel(DevToolsWindow* window, + const Extension* devtools_extension, + const char* panel_name) { + // The full name is the concatenation of the extension URL (stripped of its + // trailing '/') and the |panel_name| that was passed to panels.create(). + std::string prefix = base::TrimString(devtools_extension->url().spec(), "/", + base::TRIM_TRAILING) + .as_string(); + SwitchToPanel(window, (prefix + panel_name).c_str()); +} + } // namespace class DevToolsSanityTest : public InProcessBrowserTest { public: DevToolsSanityTest() : window_(NULL) {} + void SetUpOnMainThread() override { + host_resolver()->AddRule("*", "127.0.0.1"); + } + protected: void RunTest(const std::string& test_name, const std::string& test_page) { OpenDevToolsWindow(test_page, false); @@ -337,8 +358,7 @@ ASSERT_TRUE(LoadExtensionFromPath(path)) << "Failed to load extension."; } - private: - bool LoadExtensionFromPath(const base::FilePath& path) { + const Extension* LoadExtensionFromPath(const base::FilePath& path) { ExtensionService* service = extensions::ExtensionSystem::Get( browser()->profile())->extension_service(); extensions::ExtensionRegistry* registry = @@ -359,9 +379,26 @@ } size_t num_after = registry->enabled_extensions().size(); if (num_after != (num_before + 1)) - return false; + return nullptr; - return WaitForExtensionViewsToLoad(); + if (!WaitForExtensionViewsToLoad()) + return nullptr; + + return GetExtensionByPath(registry->enabled_extensions(), path); + } + + private: + const Extension* GetExtensionByPath( + const extensions::ExtensionSet& extensions, + const base::FilePath& path) { + base::FilePath extension_path = base::MakeAbsoluteFilePath(path); + EXPECT_TRUE(!extension_path.empty()); + for (const scoped_refptr<const Extension>& extension : extensions) { + if (extension->path() == extension_path) { + return extension.get(); + } + } + return nullptr; } bool WaitForExtensionViewsToLoad() { @@ -736,6 +773,68 @@ RunTest("waitForTestResultsInConsole", std::string()); } +// Tests a chrome.devtools extension panel that embeds an http:// iframe. +IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionWithHttpIframe) { + ASSERT_TRUE(embedded_test_server()->Start()); + + // Our extension must load an URL from the test server, whose port is only + // known at runtime. So, to embed the URL, we must dynamically generate the + // extension, rather than loading it from static content. + scoped_ptr<extensions::TestExtensionDir> dir( + new extensions::TestExtensionDir()); + + extensions::DictionaryBuilder manifest; + dir->WriteManifest(extensions::DictionaryBuilder() + .Set("name", "Devtools Panel w/ HTTP Iframe") + .Set("version", "1") + .Set("manifest_version", 2) + .Set("devtools_page", "devtools.html") + .ToJSON()); + + dir->WriteFile( + FILE_PATH_LITERAL("devtools.html"), + "<html><head><script src='devtools.js'></script></head></html>"); + + dir->WriteFile( + FILE_PATH_LITERAL("devtools.js"), + "chrome.devtools.panels.create('iframe_panel',\n" + " null,\n" + " 'panel.html',\n" + " function(panel) {\n" + " chrome.devtools.inspectedWindow.eval('console.log(\"PASS\")');\n" + " }\n" + ");\n"); + + GURL http_iframe = + embedded_test_server()->GetURL("a.com", "/popup_iframe.html"); + dir->WriteFile(FILE_PATH_LITERAL("panel.html"), + "<html><body>Extension panel.<iframe src='" + + http_iframe.spec() + "'></iframe>"); + + // Install the extension. + const Extension* extension = LoadExtensionFromPath(dir->unpacked_path()); + ASSERT_TRUE(extension); + + // Open a devtools window. + OpenDevToolsWindow(kDebuggerTestPage, false); + + // Wait for the panel extension to finish loading -- it'll output 'PASS' + // when it's installed. waitForTestResultsInConsole waits until that 'PASS'. + RunTestFunction(window_, "waitForTestResultsInConsole"); + + // Now that we know the panel is loaded, switch to it. We'll wait until we + // see a 'DONE' message sent from popup_iframe.html, indicating that it + // loaded successfully. + content::DOMMessageQueue message_queue; + SwitchToExtensionPanel(window_, extension, "iframe_panel"); + std::string message; + while (true) { + ASSERT_TRUE(message_queue.WaitForMessage(&message)); + if (message == "\"DONE\"") + break; + } +} + // Disabled on Windows due to flakiness. http://crbug.com/183649 #if defined(OS_WIN) #define MAYBE_TestDevToolsExtensionMessaging DISABLED_TestDevToolsExtensionMessaging
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc index 24edca1..e5f6c5d 100644 --- a/chrome/browser/download/download_browsertest.cc +++ b/chrome/browser/download/download_browsertest.cc
@@ -37,8 +37,6 @@ #include "chrome/browser/download/download_shelf.h" #include "chrome/browser/download/download_target_determiner.h" #include "chrome/browser/download/download_test_file_activity_observer.h" -#include "chrome/browser/extensions/extension_install_prompt.h" -#include "chrome/browser/extensions/extension_install_prompt_show_params.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/infobars/infobar_service.h" @@ -88,6 +86,7 @@ #include "content/public/test/download_test_observer.h" #include "content/public/test/test_file_error_injector.h" #include "content/public/test/test_navigation_observer.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_system.h" #include "extensions/common/feature_switch.h" #include "net/base/filename_util.h" @@ -286,48 +285,6 @@ DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); }; -// Mock that simulates a permissions dialog where the user denies -// permission to install. TODO(skerner): This could be shared with -// extensions tests. Find a common place for this class. -class MockAbortExtensionInstallPrompt : public ExtensionInstallPrompt { - public: - MockAbortExtensionInstallPrompt() : - ExtensionInstallPrompt(NULL) { - } - - // Simulate a user abort on an extension installation. - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* icon, - const ShowDialogCallback& show_dialog_callback) override { - delegate->InstallUIAbort(true); - base::MessageLoopForUI::current()->QuitWhenIdle(); - } - - void OnInstallSuccess(const Extension* extension, SkBitmap* icon) override {} - void OnInstallFailure(const extensions::CrxInstallError& error) override {} -}; - -// Mock that simulates a permissions dialog where the user allows -// installation. -class MockAutoConfirmExtensionInstallPrompt : public ExtensionInstallPrompt { - public: - explicit MockAutoConfirmExtensionInstallPrompt( - content::WebContents* web_contents) - : ExtensionInstallPrompt(web_contents) {} - - // Proceed without confirmation prompt. - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* icon, - const ShowDialogCallback& show_dialog_callback) override { - delegate->InstallUIProceed(); - } - - void OnInstallSuccess(const Extension* extension, SkBitmap* icon) override {} - void OnInstallFailure(const extensions::CrxInstallError& error) override {} -}; - static DownloadManager* DownloadManagerForBrowser(Browser* browser) { return BrowserContext::GetDownloadManager(browser->profile()); } @@ -1058,14 +1015,6 @@ } } - // A mock install prompt that simulates the user allowing an install request. - void SetAllowMockInstallPrompt() { - download_crx_util::SetMockInstallPromptForTesting( - scoped_ptr<ExtensionInstallPrompt>( - new MockAutoConfirmExtensionInstallPrompt( - browser()->tab_strip_model()->GetActiveWebContents()))); - } - // This method: // * Starts a mock download by navigating browser() to a URLRequestMockHTTPJob // mock URL. @@ -1973,15 +1922,11 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, CrxInstallDenysPermissions) { FeatureSwitch::ScopedOverride enable_easy_off_store_install( FeatureSwitch::easy_off_store_install(), true); + extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( + extensions::ScopedTestDialogAutoConfirm::CANCEL); GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); - // Install a mock install UI that simulates a user denying permission to - // finish the install. - download_crx_util::SetMockInstallPromptForTesting( - scoped_ptr<ExtensionInstallPrompt>( - new MockAbortExtensionInstallPrompt())); - scoped_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( browser(), 1, @@ -2013,9 +1958,9 @@ GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); - // Install a mock install UI that simulates a user allowing permission to - // finish the install. - SetAllowMockInstallPrompt(); + // Simulate the user allowing permission to finish the install. + extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); scoped_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( @@ -2046,10 +1991,9 @@ GURL extension_url( URLRequestMockHTTPJob::GetMockUrl("extensions/bad_signature.crx")); - // Install a mock install UI that simulates a user allowing permission to - // finish the install, and dismisses any error message. We check that the - // install failed below. - SetAllowMockInstallPrompt(); + // Simulate the user allowing permission to finish the install. + extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); scoped_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( @@ -2074,9 +2018,9 @@ GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kLargeThemePath)); - // Install a mock install UI that simulates a user allowing permission to - // finish the install. - SetAllowMockInstallPrompt(); + // Simulate the user allowing permission to finish the install. + extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); scoped_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter(
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc index 144613b..d327d161 100644 --- a/chrome/browser/download/download_commands.cc +++ b/chrome/browser/download/download_commands.cc
@@ -4,12 +4,18 @@ #include "chrome/browser/download/download_commands.h" +#include <stdint.h> + +#include "base/base64.h" +#include "base/files/file_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/download/download_crx_util.h" #include "chrome/browser/download/download_extensions.h" #include "chrome/browser/download/download_item_model.h" #include "chrome/browser/download/download_prefs.h" +#include "chrome/browser/image_decoder.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/safe_browsing/download_protection_service.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" @@ -18,8 +24,10 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/google/core/browser/google_util.h" +#include "components/mime_util/mime_util.h" #include "grit/theme_resources.h" #include "net/base/url_util.h" +#include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -28,6 +36,87 @@ #include "chrome/browser/ui/pdf/adobe_reader_info_win.h" #endif +namespace { + +// Maximum size (compressed) of image to be copied to the clipboard. If the +// image exceeds this size, the image is not copied. +const int64_t kMaxImageClipboardSize = 20 * 1024 * 1024; // 20 MB + +class ImageClipboardCopyManager : public ImageDecoder::ImageRequest { + public: + static void Start(const base::FilePath& file_path) { + new ImageClipboardCopyManager(file_path); + } + + private: + explicit ImageClipboardCopyManager(const base::FilePath& file_path) + : file_path_(file_path) { + // Constructor must be called in the UI thread. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + content::BrowserThread::GetBlockingPool()->PostTask( + FROM_HERE, + base::Bind(&ImageClipboardCopyManager::StartDecoding, + base::Unretained(this))); + } + + void StartDecoding() { + DCHECK(content::BrowserThread::GetBlockingPool()-> + RunsTasksOnCurrentThread()); + + // Re-check the filesize since the file may be modified after downloaded. + int64 filesize; + if (!GetFileSize(file_path_, &filesize) || + filesize > kMaxImageClipboardSize) { + OnFailedBeforeDecoding(); + return; + } + + std::string data; + bool ret = base::ReadFileToString(file_path_, &data); + if (!ret || data.empty()) { + OnFailedBeforeDecoding(); + return; + } + + // Note: An image over 128MB (uncompressed) may fail, due to the limitation + // of IPC message size. + ImageDecoder::Start(this, data); + } + + void OnImageDecoded(const SkBitmap& decoded_image) override { + // This method is called on the same thread as constructor (the UI thread). + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + ui::ScopedClipboardWriter scw(ui::CLIPBOARD_TYPE_COPY_PASTE); + scw.Reset(); + + if (!decoded_image.empty() && !decoded_image.isNull()) + scw.WriteImage(decoded_image); + + delete this; + } + + void OnDecodeImageFailed() override { + // This method is called on the same thread as constructor (the UI thread). + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + delete this; + } + + void OnFailedBeforeDecoding() { + // We don't need to cancel the job, since it shouldn't be started here. + + task_runner()->DeleteSoon(FROM_HERE, this); + } + + const base::FilePath file_path_; + + DISALLOW_IMPLICIT_CONSTRUCTORS(ImageClipboardCopyManager); +}; + +} // anonymous namespace + DownloadCommands::DownloadCommands(content::DownloadItem* download_item) : download_item_(download_item) { DCHECK(download_item); @@ -49,6 +138,8 @@ return IDR_DOWNLOAD_NOTIFICATION_MENU_CANCEL; case LEARN_MORE_SCANNING: return IDR_NOTIFICATION_WELCOME_LEARN_MORE; + case COPY_TO_CLIPBOARD: + return IDR_DOWNLOAD_NOTIFICATION_MENU_COPY_TO_CLIPBOARD; case OPEN_WHEN_COMPLETE: case ALWAYS_OPEN_TYPE: case PLATFORM_OPEN: @@ -98,6 +189,9 @@ return download_item_->CanResume() && (download_item_->IsPaused() || download_item_->GetState() != content::DownloadItem::IN_PROGRESS); + case COPY_TO_CLIPBOARD: + return (download_item_->GetState() == content::DownloadItem::COMPLETE && + download_item_->GetReceivedBytes() <= kMaxImageClipboardSize); case DISCARD: case KEEP: case LEARN_MORE_SCANNING: @@ -133,6 +227,7 @@ case KEEP: case LEARN_MORE_SCANNING: case LEARN_MORE_INTERRUPTED: + case COPY_TO_CLIPBOARD: return false; } return false; @@ -213,6 +308,9 @@ case RESUME: download_item_->Resume(); break; + case COPY_TO_CLIPBOARD: + CopyFileAsImageToClipboard(); + break; } } @@ -246,3 +344,28 @@ return IsDownloadPdf(); #endif } + +void DownloadCommands::CopyFileAsImageToClipboard() const { + if (download_item_->GetState() != content::DownloadItem::COMPLETE || + download_item_->GetReceivedBytes() > kMaxImageClipboardSize) { + return; + } + + // TODO(yoshiki): Refine the code by combining the common logic with the + // preview in DownloadItemNotification. + std::string mime = download_item_->GetMimeType(); + if (!mime_util::IsSupportedImageMimeType(mime)) { + base::FilePath::StringType extension_with_dot = + download_item_->GetTargetFilePath().FinalExtension(); + if (extension_with_dot.empty() || + !net::GetWellKnownMimeTypeFromExtension(extension_with_dot.substr(1), + &mime) || + !mime_util::IsSupportedImageMimeType(mime)) { + // It seems a non-image file. + return; + } + } + + base::FilePath file_path = download_item_->GetFullPath(); + ImageClipboardCopyManager::Start(file_path); +}
diff --git a/chrome/browser/download/download_commands.h b/chrome/browser/download/download_commands.h index 1a398868..63f31ec 100644 --- a/chrome/browser/download/download_commands.h +++ b/chrome/browser/download/download_commands.h
@@ -26,6 +26,7 @@ KEEP, // Keep the malicious download. LEARN_MORE_SCANNING, // Show information about download scanning. LEARN_MORE_INTERRUPTED, // Show information about interrupted downloads. + COPY_TO_CLIPBOARD, // Copy the contents to the clipboard. }; // |download_item| must outlive DownloadCommands. @@ -53,6 +54,7 @@ Browser* GetBrowser() const; int GetCommandIconId(Command command) const; GURL GetLearnMoreURLForInterruptedDownload() const; + void CopyFileAsImageToClipboard() const; content::DownloadItem* const download_item_; };
diff --git a/chrome/browser/download/download_shelf_context_menu.cc b/chrome/browser/download/download_shelf_context_menu.cc index ab48362..b541b59 100644 --- a/chrome/browser/download/download_shelf_context_menu.cc +++ b/chrome/browser/download/download_shelf_context_menu.cc
@@ -165,6 +165,10 @@ case DownloadCommands::LEARN_MORE_INTERRUPTED: id = IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED; break; + case DownloadCommands::COPY_TO_CLIPBOARD: + // This command is implemented only for Donwload Notification. + NOTREACHED(); + break; } CHECK(id != -1); return l10n_util::GetStringUTF16(id);
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc index 54f5f1c..afcbabd3 100644 --- a/chrome/browser/download/notification/download_item_notification.cc +++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -158,6 +158,10 @@ content::RecordAction( UserMetricsAction("DownloadNotification.Button_Resume")); break; + case DownloadCommands::COPY_TO_CLIPBOARD: + content::RecordAction( + UserMetricsAction("DownloadNotification.Button_CopyToClipboard")); + break; } } @@ -653,6 +657,8 @@ break; case content::DownloadItem::COMPLETE: actions->push_back(DownloadCommands::SHOW_IN_FOLDER); + if (!notification_->image().IsEmpty()) + actions->push_back(DownloadCommands::COPY_TO_CLIPBOARD); break; case content::DownloadItem::MAX_DOWNLOAD_STATE: NOTREACHED(); @@ -737,6 +743,9 @@ case DownloadCommands::LEARN_MORE_SCANNING: id = IDS_DOWNLOAD_LINK_LEARN_MORE_SCANNING; break; + case DownloadCommands::COPY_TO_CLIPBOARD: + id = IDS_DOWNLOAD_NOTIFICATION_COPY_TO_CLIPBOARD; + break; case DownloadCommands::ALWAYS_OPEN_TYPE: case DownloadCommands::PLATFORM_OPEN: case DownloadCommands::LEARN_MORE_INTERRUPTED:
diff --git a/chrome/browser/extensions/activity_log/activity_database.cc b/chrome/browser/extensions/activity_log/activity_database.cc index 69c1a20..226c658 100644 --- a/chrome/browser/extensions/activity_log/activity_database.cc +++ b/chrome/browser/extensions/activity_log/activity_database.cc
@@ -66,6 +66,10 @@ db_.set_page_size(4096); db_.set_cache_size(32); + // TODO(shess): The current mitigation for http://crbug.com/537742 stores + // state in the meta table, which this database does not use. + db_.set_mmap_disabled(); + if (!db_.Open(db_name)) { LOG(ERROR) << db_.GetErrorMessage(); return LogInitFailure();
diff --git a/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc b/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc index 62b2775..69c0855f2 100644 --- a/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc +++ b/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc
@@ -316,7 +316,8 @@ // Component apps are not granted unless they are whitelisted. { scoped_refptr<Extension> component_extension( - test_util::BuildApp(ExtensionBuilder().SetLocation(Manifest::COMPONENT)) + test_util::BuildApp( + std::move(ExtensionBuilder().SetLocation(Manifest::COMPONENT))) .Build()); TestingConsentProviderDelegate delegate; ConsentProvider provider(&delegate); @@ -327,7 +328,8 @@ // user. { scoped_refptr<Extension> whitelisted_component_extension( - test_util::BuildApp(ExtensionBuilder().SetLocation(Manifest::COMPONENT)) + test_util::BuildApp( + std::move(ExtensionBuilder().SetLocation(Manifest::COMPONENT))) .Build()); TestingConsentProviderDelegate delegate; delegate.SetComponentWhitelist(whitelisted_component_extension->id()); @@ -361,7 +363,7 @@ // instantly without asking for user consent, but with a notification. { scoped_refptr<Extension> auto_launch_kiosk_app( - test_util::BuildApp(ExtensionBuilder().Pass()) + test_util::BuildApp(ExtensionBuilder()) .MergeManifest(DictionaryBuilder() .SetBoolean("kiosk_enabled", true) .SetBoolean("kiosk_only", true)) @@ -390,7 +392,7 @@ // Non-component apps in manual-launch kiosk mode will be granted access after // receiving approval from the user. scoped_refptr<Extension> manual_launch_kiosk_app( - test_util::BuildApp(ExtensionBuilder().Pass()) + test_util::BuildApp(ExtensionBuilder()) .MergeManifest(DictionaryBuilder() .SetBoolean("kiosk_enabled", true) .SetBoolean("kiosk_only", true))
diff --git a/chrome/browser/extensions/crx_installer_browsertest.cc b/chrome/browser/extensions/crx_installer_browsertest.cc index 681d6640..4ff7ce8 100644 --- a/chrome/browser/extensions/crx_installer_browsertest.cc +++ b/chrome/browser/extensions/crx_installer_browsertest.cc
@@ -31,6 +31,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/download_test_observer.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -74,9 +75,10 @@ // MockInstallPrompt. We create the MockInstallPrompt but need to pass // ownership of it to CrxInstaller, so it isn't safe to hang this data on // MockInstallPrompt itself becuase we can't guarantee it's lifetime. -class MockPromptProxy : public base::RefCountedThreadSafe<MockPromptProxy> { +class MockPromptProxy { public: explicit MockPromptProxy(content::WebContents* web_contents); + ~MockPromptProxy(); bool did_succeed() const { return !extension_id_.empty(); } const std::string& extension_id() { return extension_id_; } @@ -84,14 +86,14 @@ const base::string16& error() const { return error_; } void set_extension_id(const std::string& id) { extension_id_ = id; } - void set_confirmation_requested() { confirmation_requested_ = true; } + void set_confirmation_requested(bool requested) { + confirmation_requested_ = requested; + } void set_error(const base::string16& error) { error_ = error; } scoped_ptr<ExtensionInstallPrompt> CreatePrompt(); private: - friend class base::RefCountedThreadSafe<MockPromptProxy>; - virtual ~MockPromptProxy(); // Data used to create a prompt. content::WebContents* web_contents_; @@ -100,6 +102,10 @@ bool confirmation_requested_; std::string extension_id_; base::string16 error_; + + scoped_ptr<ScopedTestDialogAutoConfirm> auto_confirm; + + DISALLOW_COPY_AND_ASSIGN(MockPromptProxy); }; SkBitmap CreateSquareBitmap(int size) { @@ -139,28 +145,28 @@ proxy_(proxy) {} // Overriding some of the ExtensionInstallUI API. - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* bitmap, - const ShowDialogCallback& show_dialog_callback) override { - proxy_->set_confirmation_requested(); - delegate->InstallUIProceed(); - } void OnInstallSuccess(const Extension* extension, SkBitmap* icon) override { proxy_->set_extension_id(extension->id()); + proxy_->set_confirmation_requested(did_call_show_dialog()); base::MessageLoopForUI::current()->QuitWhenIdle(); } void OnInstallFailure(const CrxInstallError& error) override { proxy_->set_error(error.message()); + proxy_->set_confirmation_requested(did_call_show_dialog()); base::MessageLoopForUI::current()->QuitWhenIdle(); } private: - scoped_refptr<MockPromptProxy> proxy_; + MockPromptProxy* proxy_; + + DISALLOW_COPY_AND_ASSIGN(MockInstallPrompt); }; MockPromptProxy::MockPromptProxy(content::WebContents* web_contents) - : web_contents_(web_contents), confirmation_requested_(false) { + : web_contents_(web_contents), + confirmation_requested_(false), + auto_confirm(new ScopedTestDialogAutoConfirm( + ScopedTestDialogAutoConfirm::ACCEPT)) { } MockPromptProxy::~MockPromptProxy() {} @@ -171,10 +177,10 @@ } -scoped_refptr<MockPromptProxy> CreateMockPromptProxyForBrowser( +scoped_ptr<MockPromptProxy> CreateMockPromptProxyForBrowser( Browser* browser) { - return new MockPromptProxy( - browser->tab_strip_model()->GetActiveWebContents()); + return make_scoped_ptr(new MockPromptProxy( + browser->tab_strip_model()->GetActiveWebContents())); } class ManagementPolicyMock : public extensions::ManagementPolicy::Provider { @@ -251,7 +257,7 @@ // data dir) with expected id |id|. void InstallWithPrompt(const char* ext_relpath, const std::string& id, - scoped_refptr<MockPromptProxy> mock_install_prompt) { + MockPromptProxy* mock_install_prompt) { base::FilePath ext_path = test_data_dir_.AppendASCII(ext_relpath); scoped_ptr<WebstoreInstaller::Approval> approval; @@ -272,10 +278,10 @@ bool record_oauth2_grant) { ScopedExperimentalCommandLine scope; - scoped_refptr<MockPromptProxy> mock_prompt = + scoped_ptr<MockPromptProxy> mock_prompt = CreateMockPromptProxyForBrowser(browser()); - InstallWithPrompt("browsertest/scopes", std::string(), mock_prompt); + InstallWithPrompt("browsertest/scopes", std::string(), mock_prompt.get()); scoped_ptr<const PermissionSet> permissions = ExtensionPrefs::Get(browser()->profile()) @@ -328,9 +334,9 @@ browser()->profile()); // Even whitelisted extensions with NPAPI should not prompt. - scoped_refptr<MockPromptProxy> mock_prompt = + scoped_ptr<MockPromptProxy> mock_prompt = CreateMockPromptProxyForBrowser(browser()); - InstallWithPrompt("uitest/plugins", id, mock_prompt); + InstallWithPrompt("uitest/plugins", id, mock_prompt.get()); EXPECT_FALSE(mock_prompt->confirmation_requested()); EXPECT_TRUE(registry->enabled_extensions().GetByID(id)); } @@ -389,7 +395,7 @@ std::string crx_path_string(crx_path.value().begin(), crx_path.value().end()); GURL url = GURL(std::string("file:///").append(crx_path_string)); - scoped_refptr<MockPromptProxy> mock_prompt = + scoped_ptr<MockPromptProxy> mock_prompt = CreateMockPromptProxyForBrowser(browser()); download_crx_util::SetMockInstallPromptForTesting( mock_prompt->CreatePrompt()); @@ -436,7 +442,7 @@ const bool kTestData[] = {false, true}; for (size_t i = 0; i < arraysize(kTestData); ++i) { - scoped_refptr<MockPromptProxy> mock_prompt = + scoped_ptr<MockPromptProxy> mock_prompt = CreateMockPromptProxyForBrowser(browser()); scoped_refptr<CrxInstaller> crx_installer( @@ -560,7 +566,7 @@ #endif IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, NonStrictManifestCheck) { - scoped_refptr<MockPromptProxy> mock_prompt = + scoped_ptr<MockPromptProxy> mock_prompt = CreateMockPromptProxyForBrowser(browser()); // We want to simulate the case where the webstore sends a more recent
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc index f39e1233..ba192579 100644 --- a/chrome/browser/extensions/extension_browsertest.cc +++ b/chrome/browser/extensions/extension_browsertest.cc
@@ -43,6 +43,7 @@ #include "content/public/browser/render_view_host.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" @@ -62,6 +63,7 @@ using extensions::ExtensionRegistry; using extensions::FeatureSwitch; using extensions::Manifest; +using extensions::ScopedTestDialogAutoConfirm; ExtensionBrowserTest::ExtensionBrowserTest() : loaded_(false), @@ -378,41 +380,6 @@ return crx_path; } -// This class is used to simulate an installation abort by the user. -class MockAbortExtensionInstallPrompt : public ExtensionInstallPrompt { - public: - MockAbortExtensionInstallPrompt() : ExtensionInstallPrompt(NULL) { - } - - // Simulate a user abort on an extension installation. - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* icon, - const ShowDialogCallback& show_dialog_callback) override { - delegate->InstallUIAbort(true); - base::MessageLoopForUI::current()->QuitWhenIdle(); - } - - void OnInstallSuccess(const Extension* extension, SkBitmap* icon) override {} - - void OnInstallFailure(const extensions::CrxInstallError& error) override {} -}; - -class MockAutoConfirmExtensionInstallPrompt : public ExtensionInstallPrompt { - public: - explicit MockAutoConfirmExtensionInstallPrompt( - content::WebContents* web_contents) - : ExtensionInstallPrompt(web_contents) {} - - // Proceed without confirmation prompt. - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* bitmap, - const ShowDialogCallback& show_dialog_callback) override { - delegate->InstallUIProceed(); - } -}; - const Extension* ExtensionBrowserTest::UpdateExtensionWaitForIdle( const std::string& id, const base::FilePath& path, @@ -499,15 +466,16 @@ size_t num_before = registry->enabled_extensions().size(); { - scoped_ptr<ExtensionInstallPrompt> install_ui; + scoped_ptr<ScopedTestDialogAutoConfirm> prompt_auto_confirm; if (ui_type == INSTALL_UI_TYPE_CANCEL) { - install_ui.reset(new MockAbortExtensionInstallPrompt()); + prompt_auto_confirm.reset(new ScopedTestDialogAutoConfirm( + ScopedTestDialogAutoConfirm::CANCEL)); } else if (ui_type == INSTALL_UI_TYPE_NORMAL) { - install_ui.reset(new ExtensionInstallPrompt( - browser->tab_strip_model()->GetActiveWebContents())); + prompt_auto_confirm.reset(new ScopedTestDialogAutoConfirm( + ScopedTestDialogAutoConfirm::NONE)); } else if (ui_type == INSTALL_UI_TYPE_AUTO_CONFIRM) { - install_ui.reset(new MockAutoConfirmExtensionInstallPrompt( - browser->tab_strip_model()->GetActiveWebContents())); + prompt_auto_confirm.reset(new ScopedTestDialogAutoConfirm( + ScopedTestDialogAutoConfirm::ACCEPT)); } // TODO(tessamac): Update callers to always pass an unpacked extension @@ -519,6 +487,11 @@ if (crx_path.empty()) return NULL; + scoped_ptr<ExtensionInstallPrompt> install_ui; + if (prompt_auto_confirm) { + install_ui.reset(new ExtensionInstallPrompt( + browser->tab_strip_model()->GetActiveWebContents())); + } scoped_refptr<extensions::CrxInstaller> installer( extensions::CrxInstaller::Create(service, install_ui.Pass())); installer->set_expected_id(id);
diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc index 6567b07..b0504267 100644 --- a/chrome/browser/extensions/extension_install_prompt.cc +++ b/chrome/browser/extensions/extension_install_prompt.cc
@@ -622,7 +622,8 @@ install_ui_(extensions::CreateExtensionInstallUI( ProfileForWebContents(contents))), show_params_(new ExtensionInstallPromptShowParams(contents)), - delegate_(NULL) { + delegate_(NULL), + did_call_show_dialog_(false) { } ExtensionInstallPrompt::ExtensionInstallPrompt(Profile* profile, @@ -633,7 +634,8 @@ install_ui_(extensions::CreateExtensionInstallUI(profile)), show_params_( new ExtensionInstallPromptShowParams(profile, native_window)), - delegate_(NULL) { + delegate_(NULL), + did_call_show_dialog_(false) { } ExtensionInstallPrompt::~ExtensionInstallPrompt() { @@ -827,16 +829,17 @@ } prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_)); - g_last_prompt_type_for_tests = prompt_->type(); - - if (AutoConfirmPrompt(delegate_)) - return; - if (show_params_->WasParentDestroyed()) { delegate_->InstallUIAbort(false); return; } + g_last_prompt_type_for_tests = prompt_->type(); + did_call_show_dialog_ = true; + + if (AutoConfirmPrompt(delegate_)) + return; + if (show_dialog_callback_.is_null()) GetDefaultShowDialogCallback().Run(show_params_.get(), delegate_, prompt_.Pass());
diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h index 75c8488..89463b1 100644 --- a/chrome/browser/extensions/extension_install_prompt.h +++ b/chrome/browser/extensions/extension_install_prompt.h
@@ -322,15 +322,18 @@ // current permissions are used. // // We *MUST* eventually call either Proceed() or Abort() on |delegate|. - virtual void ShowDialog(Delegate* delegate, - const extensions::Extension* extension, - const SkBitmap* icon, - const ShowDialogCallback& show_dialog_callback); - virtual void ShowDialog(Delegate* delegate, - const extensions::Extension* extension, - const SkBitmap* icon, - scoped_ptr<Prompt> prompt, - const ShowDialogCallback& show_dialog_callback); + void ShowDialog(Delegate* delegate, + const extensions::Extension* extension, + const SkBitmap* icon, + const ShowDialogCallback& show_dialog_callback); + void ShowDialog(Delegate* delegate, + const extensions::Extension* extension, + const SkBitmap* icon, + scoped_ptr<Prompt> prompt, + const ShowDialogCallback& show_dialog_callback); + // Declared virtual for testing purposes. + // Note: if all you want to do is automatically confirm or cancel, prefer + // ScopedTestDialogAutoConfirm from extension_dialog_auto_confirm.h virtual void ShowDialog( Delegate* delegate, const extensions::Extension* extension, @@ -346,6 +349,8 @@ // Installation failed. This is declared virtual for testing. virtual void OnInstallFailure(const extensions::CrxInstallError& error); + bool did_call_show_dialog() const { return did_call_show_dialog_; } + protected: friend class extensions::ExtensionWebstorePrivateApiTest; friend class WebstoreStartupInstallUnpackFailureTest; @@ -398,6 +403,9 @@ // Used to show the confirm dialog. ShowDialogCallback show_dialog_callback_; + // Whether or not the |show_dialog_callback_| was called. + bool did_call_show_dialog_; + DISALLOW_COPY_AND_ASSIGN(ExtensionInstallPrompt); };
diff --git a/chrome/browser/extensions/permission_messages_unittest.cc b/chrome/browser/extensions/permission_messages_unittest.cc index c2a9530..3d0a0a6 100644 --- a/chrome/browser/extensions/permission_messages_unittest.cc +++ b/chrome/browser/extensions/permission_messages_unittest.cc
@@ -52,7 +52,7 @@ protected: void CreateAndInstallAppWithPermissions(ListBuilder required_permissions, ListBuilder optional_permissions) { - app_ = test_util::BuildApp(ExtensionBuilder().Pass()) + app_ = test_util::BuildApp(ExtensionBuilder()) .MergeManifest( DictionaryBuilder() .Set("permissions", std::move(required_permissions)) @@ -67,7 +67,7 @@ void CreateAndInstallExtensionWithPermissions( ListBuilder required_permissions, ListBuilder optional_permissions) { - app_ = test_util::BuildExtension(ExtensionBuilder().Pass()) + app_ = test_util::BuildExtension(ExtensionBuilder()) .MergeManifest( DictionaryBuilder() .Set("permissions", std::move(required_permissions))
diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc index 850f4e4..ef4b7bb8 100644 --- a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc +++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
@@ -21,6 +21,7 @@ #include "content/public/test/browser_test_utils.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" +#include "extensions/common/permissions/permission_set.h" #include "url/gurl.h" using content::WebContents; @@ -65,11 +66,13 @@ ~ProgrammableInstallPrompt() override {} - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* icon, - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt, - const ShowDialogCallback& callback) override { + void ShowDialog( + Delegate* delegate, + const Extension* extension, + const SkBitmap* icon, + scoped_ptr<ExtensionInstallPrompt::Prompt> prompt, + scoped_ptr<const extensions::PermissionSet> custom_permissions, + const ShowDialogCallback& callback) override { delegate_ = delegate; }
diff --git a/chrome/browser/media/android/cdm/media_drm_credential_manager.cc b/chrome/browser/media/android/cdm/media_drm_credential_manager.cc index 2805a4b..4a0625d 100644 --- a/chrome/browser/media/android/cdm/media_drm_credential_manager.cc +++ b/chrome/browser/media/android/cdm/media_drm_credential_manager.cc
@@ -51,11 +51,8 @@ reset_credentials_cb_ = reset_credentials_cb; - // First reset the L3 credential. - if (!ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_3)) { - // TODO(qinmin): We should post a task instead. - base::ResetAndReturn(&reset_credentials_cb_).Run(false); - } + // First reset the L3 credentials. + ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_3); } // static @@ -80,9 +77,8 @@ void MediaDrmCredentialManager::OnResetCredentialsCompleted( SecurityLevel security_level, bool success) { if (security_level == media::MediaDrmBridge::SECURITY_LEVEL_3 && success) { - if (ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_1)) - return; - success = false; + ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_1); + return; } base::ResetAndReturn(&reset_credentials_cb_).Run(success); @@ -90,31 +86,28 @@ } // TODO(ddorwin): The key system should be passed in. http://crbug.com/459400 -bool MediaDrmCredentialManager::ResetCredentialsInternal( +void MediaDrmCredentialManager::ResetCredentialsInternal( SecurityLevel security_level) { // Create provision fetcher for the default browser http request context. media::CreateFetcherCB create_fetcher_cb = base::Bind(&content::CreateProvisionFetcher, g_browser_process->system_request_context()); - media_drm_bridge_ = media::MediaDrmBridge::CreateWithoutSessionSupport( - kWidevineKeySystem, create_fetcher_cb); - if (!media_drm_bridge_) - return false; - ResetCredentialsCB reset_credentials_cb = base::Bind(&MediaDrmCredentialManager::OnResetCredentialsCompleted, base::Unretained(this), security_level); - if (!media_drm_bridge_->SetSecurityLevel(security_level)) { - // No need to reset credentials for unsupported |security_level|. + media_drm_bridge_ = media::MediaDrmBridge::CreateWithoutSessionSupport( + kWidevineKeySystem, security_level, create_fetcher_cb); + + // No need to reset credentials for unsupported |security_level|. + if (!media_drm_bridge_) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(reset_credentials_cb, true)); - return true; + return; } media_drm_bridge_->ResetDeviceCredentials(reset_credentials_cb); - return true; } // static
diff --git a/chrome/browser/media/android/cdm/media_drm_credential_manager.h b/chrome/browser/media/android/cdm/media_drm_credential_manager.h index 2764940..86a4d9b 100644 --- a/chrome/browser/media/android/cdm/media_drm_credential_manager.h +++ b/chrome/browser/media/android/cdm/media_drm_credential_manager.h
@@ -14,7 +14,14 @@ #include "media/base/android/media_drm_bridge.h" #include "media/base/android/provision_fetcher.h" -// This class manages the media DRM credentials on Android. +// This class resets the media DRM credentials on Android. +// +// Implementation Note: We create a MediaDrmBridge to reset the credentials. +// If MediaDrmBridge creation failed, it's likely that the key system or +// security level is not supported, hence no credentials need to be reset. +// We treat this as a success. There's a slight chance that MediaDrmBridge +// creation failed due to other reasons, but that should not happen in normal +// cases. class MediaDrmCredentialManager { public: static MediaDrmCredentialManager* GetInstance(); @@ -45,11 +52,9 @@ // reset is completed. void OnResetCredentialsCompleted(SecurityLevel security_level, bool success); - // Resets DRM credentials for a particular |security_level|. Returns false if - // we fail to create the MediaDrmBridge at all, in which case we cannot reset - // the credentials. Otherwise, the result is returned asynchronously in - // OnResetCredentialsCompleted() function. - bool ResetCredentialsInternal(SecurityLevel security_level); + // Resets DRM credentials for a particular |security_level|. The result is + // returned asynchronously in OnResetCredentialsCompleted() function. + void ResetCredentialsInternal(SecurityLevel security_level); // The MediaDrmBridge object used to perform the credential reset. scoped_refptr<media::MediaDrmBridge> media_drm_bridge_;
diff --git a/chrome/browser/predictors/predictor_database.cc b/chrome/browser/predictors/predictor_database.cc index f948c4bd..1d8721a 100644 --- a/chrome/browser/predictors/predictor_database.cc +++ b/chrome/browser/predictors/predictor_database.cc
@@ -70,6 +70,11 @@ autocomplete_table_(new AutocompleteActionPredictorTable()), resource_prefetch_tables_(new ResourcePrefetchPredictorTables()) { db_->set_histogram_tag("Predictor"); + + // TODO(shess): The current mitigation for http://crbug.com/537742 stores + // state in the meta table, which this database does not use. + db_->set_mmap_disabled(); + ResourcePrefetchPredictorConfig config; is_resource_prefetch_predictor_enabled_ = IsSpeculativeResourcePrefetchingEnabled(profile, &config);
diff --git a/chrome/browser/push_messaging/push_messaging_browsertest.cc b/chrome/browser/push_messaging/push_messaging_browsertest.cc index a768787..e7a3708c 100644 --- a/chrome/browser/push_messaging/push_messaging_browsertest.cc +++ b/chrome/browser/push_messaging/push_messaging_browsertest.cc
@@ -335,10 +335,27 @@ ASSERT_EQ("manifest removed", script_result); ASSERT_TRUE(RunScript("subscribePush()", &script_result)); - EXPECT_EQ("AbortError - Registration failed - no sender id provided", + EXPECT_EQ("AbortError - Registration failed - manifest empty or missing", script_result); } +IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeFailureNoSenderId) { + std::string script_result; + + ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); + ASSERT_EQ("ok - service worker registered", script_result); + + RequestAndAcceptPermission(); + + ASSERT_TRUE(RunScript("swapManifestNoSenderId()", &script_result)); + ASSERT_EQ("sender id removed from manifest", script_result); + + ASSERT_TRUE(RunScript("subscribePush()", &script_result)); + EXPECT_EQ( + "AbortError - Registration failed - gcm_sender_id not found in manifest", + script_result); +} + // TODO(johnme): Test subscribing from a worker - see https://crbug.com/437298. IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTestEmptySubscriptionOptions,
diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc index f552005..a8e6fa8 100644 --- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc +++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
@@ -37,7 +37,7 @@ #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h" #include "components/google/core/browser/google_util.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/plugin_service.h" @@ -285,11 +285,9 @@ #endif { BrowserThread::PostTask( - BrowserThread::IO, - FROM_HERE, + BrowserThread::IO, FROM_HERE, base::Bind(content::ServiceWorkerContext::AddExcludedHeadersForFetchEvent, - variations::VariationsHttpHeaderProvider::GetInstance() - ->GetVariationHeaderNames())); + variations::GetVariationHeaderNames())); } ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() { @@ -371,12 +369,10 @@ net::HttpRequestHeaders headers; headers.CopyFrom(request->extra_request_headers()); bool is_off_the_record = io_data->IsOffTheRecord(); - variations::VariationsHttpHeaderProvider::GetInstance()-> - AppendHeaders(request->url(), - is_off_the_record, - !is_off_the_record && - io_data->GetMetricsEnabledStateOnIOThread(), - &headers); + variations::AppendVariationHeaders( + request->url(), is_off_the_record, + !is_off_the_record && io_data->GetMetricsEnabledStateOnIOThread(), + &headers); request->SetExtraRequestHeaders(headers); }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js index 2eaf87b..8766c8f 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js
@@ -11,6 +11,7 @@ goog.provide('AutomationPredicate.Unary'); goog.scope(function() { +var AutomationNode = chrome.automation.AutomationNode; var RoleType = chrome.automation.RoleType; /** @@ -19,13 +20,12 @@ AutomationPredicate = function() {}; /** - * @typedef {function(chrome.automation.AutomationNode) : boolean} + * @typedef {function(!AutomationNode) : boolean} */ AutomationPredicate.Unary; /** - * @typedef {function(chrome.automation.AutomationNode, - * chrome.automation.AutomationNode) : boolean} + * @typedef {function(!AutomationNode, !AutomationNode) : boolean} */ AutomationPredicate.Binary; @@ -57,7 +57,7 @@ AutomationPredicate.table = AutomationPredicate.withRole(RoleType.table); /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.button = function(node) { @@ -65,7 +65,7 @@ }; /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.formField = function(node) { @@ -98,7 +98,7 @@ }; /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.landmark = function(node) { @@ -117,7 +117,7 @@ }; /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.visitedLink = function(node) { @@ -125,7 +125,7 @@ }; /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.focused = function(node) { @@ -133,7 +133,7 @@ }; /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.leaf = function(node) { @@ -149,7 +149,7 @@ }; /** - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.leafWithText = function(node) { @@ -158,9 +158,8 @@ }; /** - * Matches against non-inline textbox 'nodes' which have an equivalent in the - * DOM. - * @param {chrome.automation.AutomationNode} node + * Non-inline textbox nodes which have an equivalent in the DOM. + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.leafDomNode = function(node) { @@ -169,8 +168,20 @@ }; /** - * @param {chrome.automation.AutomationNode} first - * @param {chrome.automation.AutomationNode} second + * Matches against nodes visited during element navigation. An element as + * defined below, are all nodes that are focusable or static text. When used in + * tree walking, it should visit all nodes that tab traversal would as well as + * non-focusable static text. + * @param {!AutomationNode} node + * @return {boolean} + */ +AutomationPredicate.element = function(node) { + return node.role == RoleType.staticText || node.state.focusable; +}; + +/** + * @param {!AutomationNode} first + * @param {!AutomationNode} second * @return {boolean} */ AutomationPredicate.linebreak = function(first, second) { @@ -182,9 +193,19 @@ }; /** + * Matches against a node that should be visited but not considered a leaf. + * @param {!AutomationNode} node + * @return {boolean} + */ +AutomationPredicate.container = function(node) { + return node.state.focusable && + node.role == RoleType.toolbar; +}; + +/** * Leaf nodes that should be ignored while traversing the automation tree. For * example, apply this predicate when moving to the next element. - * @param {chrome.automation.AutomationNode} node + * @param {!AutomationNode} node * @return {boolean} */ AutomationPredicate.shouldIgnoreLeaf = function(node) {
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js index c4251014..9fc7f3a 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js
@@ -31,6 +31,9 @@ * @return {AutomationNode} */ AutomationUtil.findNodePre = function(cur, dir, pred) { + if (!cur) + return null; + if (pred(cur)) return cur; @@ -53,6 +56,9 @@ * @return {AutomationNode} */ AutomationUtil.findNodePost = function(cur, dir, pred) { + if (!cur) + return null; + var child = dir == Dir.BACKWARD ? cur.lastChild : cur.firstChild; while (child) { var ret = AutomationUtil.findNodePost(child, dir, pred); @@ -67,56 +73,50 @@ }; /** - * Find the next node in the given direction that is either an immediate sibling - * or a sibling of an ancestor. - * @param {AutomationNode} cur Node to start search from. - * @param {Dir} dir - * @return {AutomationNode} - */ -AutomationUtil.findNextSubtree = function(cur, dir) { - while (cur) { - var next = dir == Dir.BACKWARD ? - cur.previousSibling : cur.nextSibling; - if (!AutomationUtil.isInSameTree(cur, next)) - return null; - if (next) - return next; - if (!AutomationUtil.isInSameTree(cur, cur.parent)) - return null; - cur = cur.parent; - if (!cur || AutomationUtil.isTraversalRoot(cur)) - return null; - } -}; - -/** * Find the next node in the given direction in depth first order. - * @param {AutomationNode} cur Node to begin the search from. + * @param {!AutomationNode} cur Node to begin the search from. * @param {Dir} dir * @param {AutomationPredicate.Unary} pred A predicate to apply * to a candidate node. + * @param {AutomationTreeWalkerRestriction=} opt_restrictions |leaf|, |root|, + * and |skipInitialSubtree| are valid restrictions used when finding the + * next node. If not supplied, the leaf predicate returns true for nodes + * matched by |pred| or |AutomationPredicate.container|. This is typically + * desirable in most situations. + * If not supplied, the root predicate gets set to + * |AutomationUtil.isTraversalRoot|. * @return {AutomationNode} */ -AutomationUtil.findNextNode = function(cur, dir, pred) { - var next = cur; - do { - if (!(next = AutomationUtil.findNextSubtree(cur, dir))) - return null; - cur = next; - next = AutomationUtil.findNodePre(next, dir, pred); - if (next && AutomationPredicate.shouldIgnoreLeaf(next)) { - cur = next; - next = null; - } - } while (!next); - return next; +AutomationUtil.findNextNode = function(cur, dir, pred, opt_restrictions) { + var restrictions = {}; + opt_restrictions = opt_restrictions || {leaf: undefined, + root: undefined, + visit: undefined, + skipInitialSubtree: false}; + restrictions.leaf = opt_restrictions.leaf || function(node) { + // Treat nodes matched by |pred| as leaves except for containers. + return !AutomationPredicate.container(node) && pred(node); + }; + + restrictions.root = opt_restrictions.root || AutomationUtil.isTraversalRoot; + restrictions.skipInitialSubtree = opt_restrictions.skipInitialSubtree; + + restrictions.visit = function(node) { + if (pred(node) && !AutomationPredicate.shouldIgnoreLeaf(node)) + return true; + if (AutomationPredicate.container(node)) + return true; + }; + + var walker = new AutomationTreeWalker(cur, dir, restrictions); + return walker.next().node; }; /** * Given nodes a_1, ..., a_n starting at |cur| in pre order traversal, apply * |pred| to a_i and a_(i - 1) until |pred| is satisfied. Returns a_(i - 1) or * a_i (depending on opt_options.before) or null if no match was found. - * @param {AutomationNode} cur + * @param {!AutomationNode} cur * @param {Dir} dir * @param {AutomationPredicate.Binary} pred * @param {{filter: (AutomationPredicate.Unary|undefined), @@ -149,7 +149,9 @@ else after = candidate; return satisfied; - }); + }, + {leaf: AutomationPredicate.leaf, skipInitialSubtree: true}); + return opt_options.before ? before : after; }; @@ -258,7 +260,7 @@ case RoleType.toolbar: return node.root.role == RoleType.desktop; case RoleType.rootWebArea: - return !!(node.parent && node.parent.root.role == RoleType.desktop); + return !node.parent || node.parent.root.role == RoleType.desktop; default: return false; }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util_test.extjs index 2458c9a..2b03cfb 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util_test.extjs
@@ -5,6 +5,8 @@ // Include test fixture. GEN_INCLUDE(['../../testing/chromevox_next_e2e_test_base.js']); +GEN_INCLUDE(['../../testing/snippets.js']); + /** * Test fixture for automation_util.js. * @constructor @@ -171,3 +173,22 @@ }.bind(this)); }.bind(this)); }); + +TEST_F('AutomationUtilE2ETest', 'VisitContainer', function() { + this.runWithLoadedTree(toolbarDoc, function(r) { + var pred = function(n) { return n.role != 'rootWebArea'; }; + + var toolbar = AutomationUtil.findNextNode(r, 'forward', pred); + assertEquals('toolbar', toolbar.role); + + var back = AutomationUtil.findNextNode(toolbar, 'forward', pred); + assertEquals('Back', back.name); + assertEquals(toolbar, + AutomationUtil.findNextNode(back, 'backward', pred)); + + var forward = AutomationUtil.findNextNode(back, 'forward', pred); + assertEquals('Forward', forward.name); + assertEquals(back, + AutomationUtil.findNextNode(forward, 'backward', pred)); + }); +});
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js index 5b5a869..1c73451db 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
@@ -219,7 +219,7 @@ break; case Movement.DIRECTIONAL: var pred = unit == Unit.NODE ? - AutomationPredicate.leaf : AutomationPredicate.leafDomNode; + AutomationPredicate.leaf : AutomationPredicate.element; newNode = AutomationUtil.findNextNode( newNode, dir, pred) || this.node_; newIndex = cursors.NODE_INDEX;
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors_test.extjs index bb50767..ced8459f 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors_test.extjs
@@ -277,7 +277,7 @@ this.runWithLoadedTree(this.multiInlineDoc, function(root) { var para = root.firstChild; assertEquals('paragraph', para.role); - var cursor = new cursors.Cursor(para, 0); + var cursor = new cursors.Cursor(para.firstChild, 0); cursor = cursor.move(DOM_NODE, DIRECTIONAL, FORWARD); assertEquals('staticText', cursor.node.role); assertEquals('end', cursor.node.name);
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js index fc3e775..97210ae 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -956,7 +956,7 @@ this.format_(node, formatString, buff); } } else if (token == 'descendants') { - if (AutomationPredicate.leaf(node)) + if (!node || AutomationPredicate.leaf(node)) return; // Construct a range to the leftmost and rightmost leaves.
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker.js index 61c42e5..a6c58dd 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker.js
@@ -8,6 +8,7 @@ goog.provide('AutomationTreeWalker'); goog.provide('AutomationTreeWalkerPhase'); +goog.provide('AutomationTreeWalkerRestriction'); goog.require('constants'); @@ -28,17 +29,54 @@ }; /** + * @typedef {{leaf: (AutomationPredicate.Unary|undefined), + * root: (AutomationPredicate.Unary|undefined), + * visit: (AutomationPredicate.Unary|undefined), + * skipInitialSubtree: (boolean|undefined)}} + */ +var AutomationTreeWalkerRestriction; + +/** + * An AutomationTreeWalker provides an incremental pre order traversal of the + * automation tree starting at a particular node. + * + * Given a flat list of nodes in pre order, the walker moves forward or backward + * a node at a time on each call of |next|. + * + * A caller can visit a subset of this list by supplying restricting + * predicates. There are three such restricting predicates allowed: + * visit: this predicate determines if a given node should be returned when + * moving to a node in the flattened pre-order list. If not, this walker will + * continue to the next (directed) node in the list, looking for a predicate + * match. + * root: this predicate determines if a node should end upward movement in the + * tree. + * leaf: this predicate determines if a node should end downward movement in the + * tree. + * + * Finally, a boolean, |skipInitialSubtree|, makes the first invocation of + * |next| skip the initial node's subtree when finding a match. This is useful + * to establish a known initial state when the initial node may not match any of + * the given predicates. + * + * Given the above definitions, if supplied with a root and leaf predicate that + * always returns false, and a visit predicate that always returns true, the + * walker would visit all nodes in pre order. If a caller does not supply a + * particular predicate, it will default to these "identity" predicates. + * * @param {!chrome.automation.AutomationNode} node - * @param {constants.Dir=} opt_dir Defaults to constants.Dir.FORWARD. + * @param {constants.Dir} dir + * @param {AutomationTreeWalkerRestriction=} + * opt_restrictions * @constructor */ -AutomationTreeWalker = function(node, opt_dir) { +AutomationTreeWalker = function(node, dir, opt_restrictions) { /** @type {chrome.automation.AutomationNode} @private */ this.node_ = node; /** @type {AutomationTreeWalkerPhase} @private */ this.phase_ = AutomationTreeWalkerPhase.INITIAL; /** @const {constants.Dir} @private */ - this.dir_ = opt_dir ? opt_dir : constants.Dir.FORWARD; + this.dir_ = dir; /** @const {!chrome.automation.AutomationNode} @private */ this.initialNode_ = node; /** @@ -47,6 +85,27 @@ * @type {chrome.automation.AutomationNode} @private */ this.backwardAncestor_ = node.parent; + var restrictions = opt_restrictions || {}; + + this.visitPred_ = + restrictions.visit ? restrictions.visit : function() { return true; }; + /** @type {AutomationPredicate.Unary} @private */ + this.leafPred_ = restrictions.leaf ? restrictions.leaf : + AutomationTreeWalker.falsePredicate_; + /** @type {AutomationPredicate.Unary} @private */ + this.rootPred_ = restrictions.root ? restrictions.root : + AutomationTreeWalker.falsePredicate_; + /** @const {boolean} @private */ + this.skipInitialSubtree_ = restrictions.skipInitialSubtree || false; +}; + +/** + * @param {!chrome.automation.AutomationNode} node + * @return {boolean} + * @private + */ +AutomationTreeWalker.falsePredicate_ = function(node) { + return false; }; AutomationTreeWalker.prototype = { @@ -68,10 +127,12 @@ next: function() { if (!this.node_) return this; - if (this.dir_ == constants.Dir.FORWARD) - this.forward_(this.node_); - else - this.backward_(this.node_); + do { + if (this.dir_ == constants.Dir.FORWARD) + this.forward_(this.node_); + else + this.backward_(this.node_); + } while (this.node_ && !this.visitPred_(this.node_)); return this; }, @@ -80,11 +141,14 @@ * @private */ forward_: function(node) { - if (node.firstChild) { + if (!this.leafPred_(node) && node.firstChild) { if (this.phase_ == AutomationTreeWalkerPhase.INITIAL) this.phase_ = AutomationTreeWalkerPhase.DESCENDANT; - this.node_ = node.firstChild; - return; + if (!this.skipInitialSubtree_ || + this.phase != AutomationTreeWalkerPhase.DESCENDANT) { + this.node_ = node.firstChild; + return; + } } var searchNode = node; @@ -97,6 +161,9 @@ this.node_ = searchNode.nextSibling; return; } + if (searchNode.parent && this.rootPred_(searchNode.parent)) + break; + searchNode = searchNode.parent; } this.node_ = null; @@ -110,8 +177,10 @@ if (node.previousSibling) { this.phase_ = AutomationTreeWalkerPhase.OTHER; node = node.previousSibling; - while (node.lastChild) + + while (!this.leafPred_(node) && node.lastChild) node = node.lastChild; + this.node_ = node; return; } @@ -119,6 +188,9 @@ this.phase_ = AutomationTreeWalkerPhase.ANCESTOR; this.backwardAncestor_ = node.parent.parent; } - this.node_ = node.parent; + if (node.parent && this.rootPred_(node.parent)) + this.node_ = null; + else + this.node_ = node.parent; } };
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker_test.extjs index f652036..35835242 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tree_walker_test.extjs
@@ -5,6 +5,8 @@ // Include test fixture. GEN_INCLUDE(['../../testing/chromevox_next_e2e_test_base.js']); +GEN_INCLUDE(['../../testing/snippets.js']); + /** * Test fixture for tree_walker.js. * @constructor @@ -47,13 +49,13 @@ chrome.automation.getDesktop(this.newCallback(function(d) { var resultList = []; this.flattenTree(d, resultList); - var it = new AutomationTreeWalker(d, false); + var it = new AutomationTreeWalker(d, 'forward'); for (var i = 1; i < resultList.length; i++) assertEquals(resultList[i], it.next().node); assertEquals(null, it.next().node); for (var j = 0; j < resultList.length; j++) { - it = new AutomationTreeWalker(resultList[j], false); + it = new AutomationTreeWalker(resultList[j], 'forward'); var start = it.node; var cur = it.next().node; while (cur) { @@ -74,12 +76,13 @@ chrome.automation.getDesktop(this.newCallback(function(d) { var resultList = []; this.flattenTree(d, resultList); - var it = new AutomationTreeWalker(resultList[resultList.length - 1], true); + var it = new AutomationTreeWalker(resultList[resultList.length - 1], 'backward'); for (var i = resultList.length - 2; i >= 0; i--) assertEquals(resultList[i], it.next().node); for (var j = resultList.length - 1; j >= 0; j--) { - it = new AutomationTreeWalker(resultList[j], true); + it = new AutomationTreeWalker( + resultList[j], 'backward'); var start = it.node; var cur = it.next().node; while (cur) { @@ -95,3 +98,80 @@ } }.bind(this))); }); + +TEST_F('AutomationTreeWalkerTest', 'RootLeafRestriction', function() { + this.runWithLoadedTree(function() {/*! + <div role="group" aria-label="1"> + <div role="group" aria-label="2"> + <div role="group" aria-label="3"> + <div role="group" aria-label="4"></div> + </div> + <div role="group" aria-label="5"></div> + </div> + <div role="group" aria-label="6"></div> + </div> + */}, + function(r) { + var node2 = r.firstChild.firstChild; + assertEquals('2', node2.name); + + // Restrict to 2's subtree and consider 3 and 5 leaves. + var leafP = function(n) { return n.name == '3' || n.name == '5'; }; + var rootP = function(n) { return n.name == '2'; }; + + // Track the nodes we've visited. + var visited = ''; + var visit = function(n) { visited += n.name; }; + var restrictions = {leaf: leafP, root: rootP, visit: visit}; + var walker = new AutomationTreeWalker(node2, 'forward', restrictions); + while (walker.next().node) {} + assertEquals('35', visited); + + // And the reverse. + // Note that walking into a root is allowed. + visited = ''; + var node6 = r.lastChild.lastChild; + assertEquals('6', node6.name); + walker = new AutomationTreeWalker(node6, 'backward', restrictions); + while (walker.next().node) {} + assertEquals('53', visited); + + // We should skip node 2's subtree. + walker = new AutomationTreeWalker(node2, 'forward', {skipInitialSubtree: true}); + assertEquals(node6, walker.next().node); + }); +}); + +TEST_F('AutomationTreeWalkerTest', 'LeafPredicateSymmetry', function() { + this.runWithLoadedTree(toolbarDoc, function(r) { + var d = r.root.parent.root; + var forwardWalker = new AutomationTreeWalker(d, 'forward'); + var forwardNodes = []; + + // Get all nodes according to the walker in the forward direction. + do { + forwardNodes.push(forwardWalker.node); + } while (forwardWalker.next().node); + + // Now, verify the walker moving backwards matches the forwards list. + var backwardWalker = new AutomationTreeWalker( + forwardNodes[forwardNodes.length - 1], 'backward'); + + do { + var next = forwardNodes.pop(); + assertEquals(next, backwardWalker.node); + } while (backwardWalker.next().node); + }); +}); + +TEST_F('AutomationTreeWalkerTest', 'RootPredicateEnding', function() { + this.runWithLoadedTree(toolbarDoc, function(r) { + var backwardWalker = new AutomationTreeWalker(r.firstChild, 'backward', + {root: function(node) { return node === r; }}); + assertEquals(null, backwardWalker.next().node); + + var forwardWalker = new AutomationTreeWalker(r.firstChild.lastChild, 'forward', + {root: function(node) { return node === r; }}); + assertEquals(null, forwardWalker.next().node); + }); +});
diff --git a/chrome/browser/resources/chromeos/chromevox/testing/snippets.js b/chrome/browser/resources/chromeos/chromevox/testing/snippets.js new file mode 100644 index 0000000..516a495 --- /dev/null +++ b/chrome/browser/resources/chromeos/chromevox/testing/snippets.js
@@ -0,0 +1,14 @@ +// 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. + +/** + * @fileoverview Contains html snippets shared by multiple tests. + */ + +function toolbarDoc() {/*! + <div tabindex=0 role="toolbar"> + <button>Back</button> + <button>Forward</button> + </div> +*/}
diff --git a/chrome/browser/resources/inline_login/inline_login.js b/chrome/browser/resources/inline_login/inline_login.js index 684216a9..8039849 100644 --- a/chrome/browser/resources/inline_login/inline_login.js +++ b/chrome/browser/resources/inline_login/inline_login.js
@@ -27,6 +27,7 @@ function onAuthReady(e) { $('contents').classList.toggle('loading', false); authReadyFired = true; + chrome.send('metricsHandler:recordAction', ['Signin_SigninPage_Shown']); } function onDropLink(e) {
diff --git a/chrome/browser/resources/local_discovery/local_discovery.js b/chrome/browser/resources/local_discovery/local_discovery.js index 9d437aa..3e2fb1b8 100644 --- a/chrome/browser/resources/local_discovery/local_discovery.js +++ b/chrome/browser/resources/local_discovery/local_discovery.js
@@ -416,6 +416,13 @@ $('register-login-promo').hidden = isUserLoggedIn || isUserSupervisedOrOffTheRecord; } + if (!($('register-login-promo').hidden) || + !($('cloud-devices-login-promo').hidden) || + !($('register-overlay-login-promo').hidden)) { + chrome.send( + 'metricsHandler:recordAction', + ['Signin_Impression_FromDevicesPage']); + } } /**
diff --git a/chrome/browser/resources/print_preview/search/destination_search.js b/chrome/browser/resources/print_preview/search/destination_search.js index 0922bca..f16cb10 100644 --- a/chrome/browser/resources/print_preview/search/destination_search.js +++ b/chrome/browser/resources/print_preview/search/destination_search.js
@@ -148,6 +148,9 @@ if (getIsVisible(this.getChildElement('.cloudprint-promo'))) { this.metrics_.record( print_preview.Metrics.DestinationSearchBucket.SIGNIN_PROMPT); + chrome.send( + 'metricsHandler:recordAction', + ['Signin_Impression_FromCloudPrint']); } if (this.userInfo_.initialized) this.onUsersChanged_(); @@ -179,6 +182,9 @@ if (this.getIsVisible()) { this.metrics_.record( print_preview.Metrics.DestinationSearchBucket.SIGNIN_PROMPT); + chrome.send( + 'metricsHandler:recordAction', + ['Signin_Impression_FromCloudPrint']); } this.reflowLists_(); },
diff --git a/chrome/browser/safe_browsing/srt_fetcher_win.cc b/chrome/browser/safe_browsing/srt_fetcher_win.cc index 9e616be..16408042d 100644 --- a/chrome/browser/safe_browsing/srt_fetcher_win.cc +++ b/chrome/browser/safe_browsing/srt_fetcher_win.cc
@@ -12,6 +12,7 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/metrics/field_trial.h" +#include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/prefs/pref_service.h" #include "base/process/launch.h" @@ -35,7 +36,7 @@ #include "chrome/browser/ui/global_error/global_error_service_factory.h" #include "components/component_updater/pref_names.h" #include "components/rappor/rappor_service.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "content/public/browser/browser_thread.h" #include "net/base/load_flags.h" #include "net/http/http_status_code.h" @@ -230,9 +231,8 @@ ProfileIOData* io_data = ProfileIOData::FromResourceContext( profile_->GetResourceContext()); net::HttpRequestHeaders headers; - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( - url_fetcher_->GetOriginalURL(), - io_data->IsOffTheRecord(), + variations::AppendVariationHeaders( + url_fetcher_->GetOriginalURL(), io_data->IsOffTheRecord(), ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled(), &headers); url_fetcher_->SetExtraRequestHeaders(headers.ToString());
diff --git a/chrome/browser/supervised_user/supervised_user_content_provider_android.cc b/chrome/browser/supervised_user/supervised_user_content_provider_android.cc deleted file mode 100644 index d5881a2..0000000 --- a/chrome/browser/supervised_user/supervised_user_content_provider_android.cc +++ /dev/null
@@ -1,141 +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 "chrome/browser/supervised_user/supervised_user_content_provider_android.h" - -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/supervised_user/supervised_user_interstitial.h" -#include "chrome/browser/supervised_user/supervised_user_service.h" -#include "chrome/browser/supervised_user/supervised_user_service_factory.h" -#include "jni/SupervisedUserContentProvider_jni.h" - -using base::android::JavaRef; -using base::android::JavaParamRef; -using base::android::ScopedJavaGlobalRef; -using base::android::AttachCurrentThread; - -namespace { - -class UrlFilterObserver : public SupervisedUserURLFilter::Observer { - public: - UrlFilterObserver(JNIEnv* env, - const ScopedJavaGlobalRef<jobject>& java_content_provider) - : java_content_provider_(java_content_provider) {} - - virtual ~UrlFilterObserver() {} - - private: - void OnSiteListUpdated() override { - Java_SupervisedUserContentProvider_onSupervisedUserFilterUpdated( - AttachCurrentThread(), java_content_provider_.obj()); - } - ScopedJavaGlobalRef<jobject> java_content_provider_; -}; - -} // namespace - -static jlong CreateSupervisedUserContentProvider( - JNIEnv* env, - const JavaParamRef<jobject>& caller) { - return reinterpret_cast<intptr_t>( - new SupervisedUserContentProvider(env, caller)); -} - -SupervisedUserContentProvider::SupervisedUserContentProvider( - JNIEnv* env, - const JavaParamRef<jobject>& caller) - : profile_(ProfileManager::GetLastUsedProfile()), - java_content_provider_(env, caller), - weak_factory_(this) { - if (profile_->IsSupervised()) { - SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile_); - SupervisedUserURLFilter* url_filter = - supervised_user_service->GetURLFilterForUIThread(); - url_filter->AddObserver(new UrlFilterObserver(env, java_content_provider_)); - } -} - -SupervisedUserContentProvider::~SupervisedUserContentProvider() {} - -void SupervisedUserContentProvider::ShouldProceed( - JNIEnv* env, - const JavaParamRef<jobject>& caller, - const JavaParamRef<jobject>& query_result_jobj, - const JavaParamRef<jstring>& url) { - if (!profile_->IsSupervised()) { - // User isn't supervised - Java_SupervisedUserQueryReply_onQueryComplete(env, query_result_jobj.obj(), - true, nullptr); - return; - } - SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile_); - SupervisedUserURLFilter* url_filter = - supervised_user_service->GetURLFilterForUIThread(); - url_filter->GetFilteringBehaviorForURLWithAsyncChecks( - GURL(base::android::ConvertJavaStringToUTF16(env, url)), - base::Bind(&SupervisedUserContentProvider::OnQueryComplete, - weak_factory_.GetWeakPtr(), - ScopedJavaGlobalRef<jobject>(env, query_result_jobj.obj()))); -} - -void SupervisedUserContentProvider::RequestInsert( - JNIEnv* env, - const JavaParamRef<jobject>& caller, - const JavaParamRef<jobject>& insert_result_jobj, - const JavaParamRef<jstring>& url) { - if (!profile_->IsSupervised()) - return; - SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile_); - supervised_user_service->AddURLAccessRequest( - GURL(base::android::ConvertJavaStringToUTF16(env, url)), - base::Bind(&SupervisedUserContentProvider::OnInsertRequestSendComplete, - weak_factory_.GetWeakPtr(), - ScopedJavaGlobalRef<jobject>(env, insert_result_jobj.obj()))); -} - -void SupervisedUserContentProvider::OnQueryComplete( - ScopedJavaGlobalRef<jobject> query_reply_jobj, - SupervisedUserURLFilter::FilteringBehavior behavior, - SupervisedUserURLFilter::FilteringBehaviorReason reason, - bool /* uncertain */) { - if (behavior != SupervisedUserURLFilter::BLOCK) { - Java_SupervisedUserQueryReply_onQueryComplete( - AttachCurrentThread(), query_reply_jobj.obj(), true, nullptr); - } else { - JNIEnv* env = AttachCurrentThread(); - Java_SupervisedUserQueryReply_onQueryComplete( - env, query_reply_jobj.obj(), false, - base::android::ConvertUTF8ToJavaString( - env, SupervisedUserInterstitial::GetHTMLContents(profile_, reason)) - .obj()); - } -} - -void SupervisedUserContentProvider::SetFilterForTesting(JNIEnv* env, - jobject caller) { - if (!profile_->IsSupervised()) - return; - SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile_); - SupervisedUserURLFilter* url_filter = - supervised_user_service->GetURLFilterForUIThread(); - url_filter->SetDefaultFilteringBehavior(SupervisedUserURLFilter::BLOCK); -} - -void SupervisedUserContentProvider::OnInsertRequestSendComplete( - ScopedJavaGlobalRef<jobject> insert_reply_jobj, - bool sent_ok) { - Java_SupervisedUserInsertReply_onInsertRequestSendComplete( - AttachCurrentThread(), insert_reply_jobj.obj(), sent_ok); -} - -bool SupervisedUserContentProvider::Register(JNIEnv* env) { - return RegisterNativesImpl(env); -}
diff --git a/chrome/browser/supervised_user/supervised_user_content_provider_android.h b/chrome/browser/supervised_user/supervised_user_content_provider_android.h deleted file mode 100644 index d1b6431a..0000000 --- a/chrome/browser/supervised_user/supervised_user_content_provider_android.h +++ /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. - -#ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_CONTENT_PROVIDER_ANDROID_H_ -#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_CONTENT_PROVIDER_ANDROID_H_ - -#include <jni.h> -#include "base/android/scoped_java_ref.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "chrome/browser/supervised_user/supervised_user_url_filter.h" - -class SupervisedUserService; - -class SupervisedUserContentProvider { - public: - SupervisedUserContentProvider( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& caller); - virtual ~SupervisedUserContentProvider(); - - void ShouldProceed( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& caller, - const base::android::JavaParamRef<jobject>& query_result_jobj, - const base::android::JavaParamRef<jstring>& url); - void RequestInsert( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& caller, - const base::android::JavaParamRef<jobject>& insert_result_jobj, - const base::android::JavaParamRef<jstring>& url); - - void SetFilterForTesting(JNIEnv* env, jobject caller); - - static bool Register(JNIEnv* env); - - private: - void OnQueryComplete( - base::android::ScopedJavaGlobalRef<jobject> query_reply_jobj, - SupervisedUserURLFilter::FilteringBehavior behavior, - SupervisedUserURLFilter::FilteringBehaviorReason reason, - bool /* uncertain */); - void OnInsertRequestSendComplete( - base::android::ScopedJavaGlobalRef<jobject> insert_reply_jobj, - bool sent_ok); - Profile* profile_; - base::android::ScopedJavaGlobalRef<jobject> java_content_provider_; - - base::WeakPtrFactory<SupervisedUserContentProvider> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(SupervisedUserContentProvider); -}; - -#endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_CONTENT_PROVIDER_ANDROID_H_
diff --git a/chrome/browser/supervised_user/supervised_user_interstitial.cc b/chrome/browser/supervised_user/supervised_user_interstitial.cc index f53271c..510c783de 100644 --- a/chrome/browser/supervised_user/supervised_user_interstitial.cc +++ b/chrome/browser/supervised_user/supervised_user_interstitial.cc
@@ -195,35 +195,32 @@ return true; } -// static -std::string SupervisedUserInterstitial::GetHTMLContents( - Profile* profile, - SupervisedUserURLFilter::FilteringBehaviorReason reason) { +std::string SupervisedUserInterstitial::GetHTMLContents() { base::DictionaryValue strings; strings.SetString("blockPageTitle", l10n_util::GetStringUTF16(IDS_BLOCK_INTERSTITIAL_TITLE)); SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile); + SupervisedUserServiceFactory::GetForProfile(profile_); bool allow_access_requests = supervised_user_service->AccessRequestsEnabled(); strings.SetBoolean("allowAccessRequests", allow_access_requests); - std::string profile_image_url = profile->GetPrefs()->GetString( + std::string profile_image_url = profile_->GetPrefs()->GetString( prefs::kSupervisedUserCustodianProfileImageURL); strings.SetString("avatarURL1x", BuildAvatarImageUrl(profile_image_url, kAvatarSize1x)); strings.SetString("avatarURL2x", BuildAvatarImageUrl(profile_image_url, kAvatarSize2x)); - std::string profile_image_url2 = profile->GetPrefs()->GetString( + std::string profile_image_url2 = profile_->GetPrefs()->GetString( prefs::kSupervisedUserSecondCustodianProfileImageURL); strings.SetString("secondAvatarURL1x", BuildAvatarImageUrl(profile_image_url2, kAvatarSize1x)); strings.SetString("secondAvatarURL2x", BuildAvatarImageUrl(profile_image_url2, kAvatarSize2x)); - bool is_child_account = profile->IsChild(); + bool is_child_account = profile_->IsChild(); base::string16 custodian = base::UTF8ToUTF16(supervised_user_service->GetCustodianName()); @@ -246,16 +243,15 @@ IDS_BLOCK_INTERSTITIAL_MESSAGE_ACCESS_REQUESTS_DISABLED); } strings.SetString("blockPageMessage", block_message); - strings.SetString( - "blockReasonMessage", - is_child_account ? l10n_util::GetStringUTF16( - SupervisedUserURLFilter::GetBlockMessageID(reason)) - : base::string16()); + strings.SetString("blockReasonMessage", is_child_account + ? l10n_util::GetStringUTF16( + SupervisedUserURLFilter::GetBlockMessageID(reason_)) + : base::string16()); bool show_feedback = false; #if defined(GOOGLE_CHROME_BUILD) - show_feedback = - is_child_account && SupervisedUserURLFilter::ReasonIsAutomatic(reason); + show_feedback = is_child_account && + SupervisedUserURLFilter::ReasonIsAutomatic(reason_); #endif strings.SetBoolean("showFeedbackLink", show_feedback); strings.SetString("feedbackLink", @@ -302,10 +298,6 @@ return webui::GetI18nTemplateHtml(html, &strings); } -std::string SupervisedUserInterstitial::GetHTMLContents() { - return GetHTMLContents(profile_, reason_); -} - void SupervisedUserInterstitial::CommandReceived(const std::string& command) { // For use in histograms. enum Commands {
diff --git a/chrome/browser/supervised_user/supervised_user_interstitial.h b/chrome/browser/supervised_user/supervised_user_interstitial.h index ca28048..bf75f13 100644 --- a/chrome/browser/supervised_user/supervised_user_interstitial.h +++ b/chrome/browser/supervised_user/supervised_user_interstitial.h
@@ -35,10 +35,6 @@ SupervisedUserURLFilter::FilteringBehaviorReason reason, const base::Callback<void(bool)>& callback); - static std::string GetHTMLContents( - Profile* profile, - SupervisedUserURLFilter::FilteringBehaviorReason reason); - private: SupervisedUserInterstitial( content::WebContents* web_contents,
diff --git a/chrome/browser/task_management/providers/child_process_task.cc b/chrome/browser/task_management/providers/child_process_task.cc index bba8799..de5b4e3 100644 --- a/chrome/browser/task_management/providers/child_process_task.cc +++ b/chrome/browser/task_management/providers/child_process_task.cc
@@ -165,7 +165,7 @@ ChildProcessTask::ChildProcessTask(const content::ChildProcessData& data) : Task(GetLocalizedTitle(data.name, data.process_type), - base::UTF16ToASCII(data.name), + base::UTF16ToUTF8(data.name), GetDefaultIcon(), data.handle), process_resources_sampler_(CreateProcessResourcesSampler(data.id)),
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc index 4a00a8d..3b7ef082 100644 --- a/chrome/browser/themes/browser_theme_pack.cc +++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -1114,8 +1114,8 @@ if (it != colors->end()) { frame = it->second; } else { - frame = ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_FRAME); + frame = + ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_FRAME, false); } if (!colors->count(ThemeProperties::COLOR_FRAME)) {
diff --git a/chrome/browser/themes/browser_theme_pack_unittest.cc b/chrome/browser/themes/browser_theme_pack_unittest.cc index 6dbc596..745e73c 100644 --- a/chrome/browser/themes/browser_theme_pack_unittest.cc +++ b/chrome/browser/themes/browser_theme_pack_unittest.cc
@@ -53,8 +53,7 @@ void GenerateDefaultFrameColor(std::map<int, SkColor>* colors, int color, int tint) { (*colors)[color] = HSLShift( - ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_FRAME), + ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_FRAME, false), ThemeProperties::GetDefaultTint(tint)); } @@ -63,11 +62,6 @@ // run the resulting thing through VerifyColorMap(). std::map<int, SkColor> GetDefaultColorMap() { std::map<int, SkColor> colors; - for (int i = ThemeProperties::COLOR_FRAME; - i <= ThemeProperties::COLOR_BUTTON_BACKGROUND; ++i) { - colors[i] = ThemeProperties::GetDefaultColor(i); - } - GenerateDefaultFrameColor(&colors, ThemeProperties::COLOR_FRAME, ThemeProperties::TINT_FRAME); GenerateDefaultFrameColor(&colors, @@ -81,14 +75,21 @@ ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE, ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE); + // For the rest, use default colors. + for (int i = ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE + 1; + i <= ThemeProperties::COLOR_BUTTON_BACKGROUND; ++i) { + colors[i] = ThemeProperties::GetDefaultColor(i, false); + } + return colors; } void VerifyColorMap(const std::map<int, SkColor>& color_map) { for (std::map<int, SkColor>::const_iterator it = color_map.begin(); it != color_map.end(); ++it) { - SkColor color = ThemeProperties::GetDefaultColor(it->first); - theme_pack_->GetColor(it->first, &color); + SkColor color; + if (!theme_pack_->GetColor(it->first, &color)) + color = ThemeProperties::GetDefaultColor(it->first, false); EXPECT_EQ(it->second, color) << "Color id = " << it->first; } }
diff --git a/chrome/browser/themes/theme_properties.cc b/chrome/browser/themes/theme_properties.cc index a4b95d8..3c23550 100644 --- a/chrome/browser/themes/theme_properties.cc +++ b/chrome/browser/themes/theme_properties.cc
@@ -48,6 +48,8 @@ const SkColor kDefaultColorToolbarIncognito[] = { SkColorSetRGB(223, 223, 223), SkColorSetRGB(0x50, 0x50, 0x50)}; #endif // OS_MACOSX +const SkColor kDefaultDetachedBookmarkBarBackground[] = { + SK_ColorWHITE, SkColorSetRGB(0xF1, 0xF1, 0xF1)}; const SkColor kDefaultColorTabText = SK_ColorBLACK; @@ -241,30 +243,26 @@ } // static -SkColor ThemeProperties::GetDefaultColor(int id) { - return GetDefaultColor(id, false); -} - SkColor ThemeProperties::GetDefaultColor(int id, bool otr) { int mode = ui::MaterialDesignController::IsModeMaterial(); switch (id) { // Properties stored in theme pack. case COLOR_FRAME: + if (otr) + return kDefaultColorFrameIncognito[mode]; #if defined(OS_CHROMEOS) return kDefaultColorFrame[mode]; #else return kDefaultColorFrame; #endif // OS_CHROMEOS case COLOR_FRAME_INACTIVE: + if (otr) + return kDefaultColorFrameIncognitoInactive[mode]; #if defined(OS_CHROMEOS) return kDefaultColorFrameInactive[mode]; #else return kDefaultColorFrameInactive; #endif // OS_CHROMEOS - case COLOR_FRAME_INCOGNITO: - return kDefaultColorFrameIncognito[mode]; - case COLOR_FRAME_INCOGNITO_INACTIVE: - return kDefaultColorFrameIncognitoInactive[mode]; #if defined(OS_MACOSX) case COLOR_TOOLBAR: return kDefaultColorToolbar; @@ -308,7 +306,10 @@ case COLOR_CONTROL_BACKGROUND: return kDefaultColorControlBackground; case COLOR_TOOLBAR_SEPARATOR: + case COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR: return kDefaultColorToolbarSeparator[mode]; + case COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND: + return kDefaultDetachedBookmarkBarBackground[mode]; #if defined(OS_MACOSX) case COLOR_TOOLBAR_BUTTON_STROKE: return kDefaultColorToolbarButtonStroke; @@ -321,6 +322,11 @@ case COLOR_TOOLBAR_STROKE_INACTIVE: return kDefaultColorToolbarStrokeInactive; #endif + case COLOR_FRAME_INCOGNITO: + case COLOR_FRAME_INCOGNITO_INACTIVE: + NOTREACHED() << "These values should be queried via their respective " + "non-incognito equivalents and an appropriate |otr| " + "value."; default: return gfx::kPlaceholderColor; }
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h index 8bfc4e8..c48e690 100644 --- a/chrome/browser/themes/theme_properties.h +++ b/chrome/browser/themes/theme_properties.h
@@ -26,6 +26,9 @@ enum OverwritableByUserThemeProperty { COLOR_FRAME, COLOR_FRAME_INACTIVE, + // Instead of using the INCOGNITO variants directly, most code should + // use the original color ID in an incognito-aware context (such as + // GetDefaultColor). COLOR_FRAME_INCOGNITO, COLOR_FRAME_INCOGNITO_INACTIVE, COLOR_TOOLBAR, @@ -86,6 +89,10 @@ // The color of a disabled toolbar button's icon. COLOR_TOOLBAR_BUTTON_ICON_INACTIVE, + // Colors used for the detached (NTP) bookmark bar. + COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND, + COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR, + // The throbber colors for tabs or anything on a toolbar (currently, only // the download shelf). If you're adding a throbber elsewhere, such as in // a dialog or bubble, you likely want @@ -152,10 +159,6 @@ // Returns the default color for the given color |id| COLOR_* enum value. // Returns gfx::kPlaceholderColor if |id| is invalid. - static SkColor GetDefaultColor(int id); - - // As above, but takes incognito status into account. - // TODO(estade): remove the above in favor of this one. static SkColor GetDefaultColor(int id, bool otr); private:
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc index fc33daa..3f5cb63 100644 --- a/chrome/browser/themes/theme_service.cc +++ b/chrome/browser/themes/theme_service.cc
@@ -453,9 +453,19 @@ SkColor ThemeService::GetColor(int id, bool otr) const { DCHECK(CalledOnValidThread()); - // Custom themes always use the original (non-incognito) color. + + // For legacy reasons, |theme_supplier_| requires the incognito variants + // of color IDs. + int theme_supplier_id = id; + if (otr) { + if (id == Properties::COLOR_FRAME) + theme_supplier_id = Properties::COLOR_FRAME_INCOGNITO; + else if (id == Properties::COLOR_FRAME_INACTIVE) + theme_supplier_id = Properties::COLOR_FRAME_INCOGNITO_INACTIVE; + } + SkColor color; - if (theme_supplier_ && theme_supplier_->GetColor(id, &color)) + if (theme_supplier_ && theme_supplier_->GetColor(theme_supplier_id, &color)) return color; // For backward compat with older themes, some newer colors are generated from @@ -468,6 +478,16 @@ // The active color is overridden in Gtk2UI. return SkColorSetA(GetColor(Properties::COLOR_TOOLBAR_BUTTON_ICON, otr), 0x33); + case Properties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND: + if (UsingDefaultTheme()) + break; + return GetColor(ThemeProperties::COLOR_TOOLBAR, otr); + case Properties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR: + if (UsingDefaultTheme()) + break; + // Use 50% of bookmark text color as separator color. + return SkColorSetA(GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT, otr), + 128); case Properties::COLOR_NTP_SECTION_HEADER_TEXT: return IncreaseLightness(GetColor(Properties::COLOR_NTP_TEXT, otr), 0.30); case Properties::COLOR_NTP_SECTION_HEADER_TEXT_HOVER:
diff --git a/chrome/browser/translate/chrome_translate_client.cc b/chrome/browser/translate/chrome_translate_client.cc index cf3a9606..4d4366b 100644 --- a/chrome/browser/translate/chrome_translate_client.cc +++ b/chrome/browser/translate/chrome_translate_client.cc
@@ -151,11 +151,8 @@ } } - std::string accept_languages_str = prefs->GetString(prefs::kAcceptLanguages); - std::vector<std::string> accept_languages_list = base::SplitString( - accept_languages_str, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); *target = - translate::TranslateManager::GetTargetLanguage(accept_languages_list); + translate::TranslateManager::GetTargetLanguage(translate_prefs.get()); } translate::TranslateManager* ChromeTranslateClient::GetTranslateManager() {
diff --git a/chrome/browser/translate/translate_service.cc b/chrome/browser/translate/translate_service.cc index e13f6f9e..93331a68 100644 --- a/chrome/browser/translate/translate_service.cc +++ b/chrome/browser/translate/translate_service.cc
@@ -11,6 +11,7 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "components/translate/core/browser/translate_download_manager.h" @@ -115,10 +116,8 @@ // static std::string TranslateService::GetTargetLanguage(PrefService* prefs) { - std::vector<std::string> accept_languages_list = base::SplitString( - prefs->GetString(prefs::kAcceptLanguages), ",", - base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - return translate::TranslateManager::GetTargetLanguage(accept_languages_list); + return translate::TranslateManager::GetTargetLanguage( + ChromeTranslateClient::CreateTranslatePrefs(prefs).get()); } // static
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 91825ea9..445d3634 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -555,8 +555,8 @@ sources = [ "browser.h", - "cocoa/extensions/browser_action_test_util_mac.mm", - "cocoa/find_bar/find_bar_host_unittest_util_cocoa.mm", + "cocoa/cocoa_test_helper.h", + "cocoa/cocoa_test_helper.mm", "cocoa/run_loop_testing.h", "cocoa/run_loop_testing.mm", "exclusive_access/fullscreen_controller_state_test.cc", @@ -587,6 +587,11 @@ "views/find_bar_host_unittest_util_views.cc", "views/toolbar/browser_action_test_util_views.cc", ] + } else { + sources += [ + "cocoa/extensions/browser_action_test_util_mac.mm", + "cocoa/find_bar/find_bar_host_unittest_util_cocoa.mm", + ] } if (is_android) {
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 358df54d..437b841 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -183,15 +183,18 @@ return; } #endif - AutofillCCInfoBarDelegate::Create( - InfoBarService::FromWebContents(web_contents()), this, callback); + AutofillCCInfoBarDelegate::CreateForLocalSave( + InfoBarService::FromWebContents(web_contents()), callback); } void ChromeAutofillClient::ConfirmSaveCreditCardToCloud( const base::Closure& callback, scoped_ptr<base::DictionaryValue> legal_message) { -// TODO(jdonnelly): Implement save card prompt for OS_ANDROID and OS_IOS. -#if !defined(OS_ANDROID) +// TODO(jdonnelly): Implement save card prompt for OS_IOS. +#if defined(OS_ANDROID) + AutofillCCInfoBarDelegate::CreateForUpload( + InfoBarService::FromWebContents(web_contents()), callback); +#else // Do lazy initialization of SaveCardBubbleControllerImpl. autofill::SaveCardBubbleControllerImpl::CreateForWebContents(web_contents()); autofill::SaveCardBubbleControllerImpl* controller =
diff --git a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc index 251a2e8..57aab03 100644 --- a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
@@ -197,13 +197,13 @@ base::string16 SaveCardBubbleControllerImpl::GetWindowTitle() const { return l10n_util::GetStringUTF16( - is_uploading_ ? IDS_AUTOFILL_SAVE_CARD_BUBBLE_TITLE_TO_CLOUD - : IDS_AUTOFILL_SAVE_CARD_BUBBLE_TITLE_LOCAL); + is_uploading_ ? IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD + : IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL); } base::string16 SaveCardBubbleControllerImpl::GetExplanatoryMessage() const { return is_uploading_ ? l10n_util::GetStringUTF16( - IDS_AUTOFILL_SAVE_CARD_BUBBLE_UPLOAD_EXPLANATION) + IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION) : base::string16(); }
diff --git a/chrome/browser/ui/chrome_style.cc b/chrome/browser/ui/chrome_style.cc index 1165012..9e7ba6d 100644 --- a/chrome/browser/ui/chrome_style.cc +++ b/chrome/browser/ui/chrome_style.cc
@@ -20,7 +20,7 @@ SkColor GetBackgroundColor() { return ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_CONTROL_BACKGROUND); + ThemeProperties::COLOR_CONTROL_BACKGROUND, false); } SkColor GetLinkColor() {
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.mm index 91a78973..e622db0 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.mm
@@ -10,7 +10,6 @@ #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_constants.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h" #import "chrome/browser/ui/cocoa/browser_window_controller.h" -#include "chrome/browser/ui/search/search_ui.h" #include "skia/ext/skia_utils_mac.h" #import "ui/base/cocoa/nsview_additions.h" #include "ui/base/theme_provider.h" @@ -54,8 +53,10 @@ NSRectFill(dirtyRect); // Overlay with a lighter background color. - NSColor* toolbarColor = skia::SkColorToCalibratedNSColor( - chrome::GetDetachedBookmarkBarBackgroundColor(profile)); + const ui::ThemeProvider& tp = + ThemeService::GetThemeProviderForProfile(profile); + NSColor* toolbarColor = + tp.GetNSColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND); CGFloat alpha = morph * [toolbarColor alphaComponent]; [[toolbarColor colorWithAlphaComponent:alpha] set]; NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver); @@ -75,8 +76,8 @@ NSRect strokeRect = [self bounds]; strokeRect.size.height = [self cr_lineWidth]; if (NSIntersectsRect(strokeRect, dirtyRect)) { - NSColor* strokeColor = skia::SkColorToCalibratedNSColor( - chrome::GetDetachedBookmarkBarSeparatorColor(profile)); + NSColor* strokeColor = + tp.GetNSColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR); strokeColor = [[self strokeColor] blendedColorWithFraction:morph ofColor:strokeColor]; strokeColor = [strokeColor colorWithAlphaComponent:0.5];
diff --git a/chrome/browser/ui/cocoa/browser_window_command_handler.mm b/chrome/browser/ui/cocoa/browser_window_command_handler.mm index 3bbdb3b..32de3d18 100644 --- a/chrome/browser/ui/cocoa/browser_window_command_handler.mm +++ b/chrome/browser/ui/cocoa/browser_window_command_handler.mm
@@ -17,6 +17,7 @@ #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" #include "chrome/browser/ui/toolbar/encoding_menu_controller.h" #include "chrome/grit/generated_resources.h" +#include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" #import "ui/base/cocoa/cocoa_base_utils.h" #include "ui/base/l10n/l10n_util.h" @@ -179,6 +180,8 @@ [AppController updateSigninItem:item shouldShow:enable currentProfile:original_profile]; + content::RecordAction( + base::UserMetricsAction("Signin_Impression_FromMenu")); break; } case IDC_BOOKMARK_PAGE: {
diff --git a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.h b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.h index 747d9eb..d1e0ee9 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.h +++ b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.h
@@ -96,6 +96,7 @@ @property(nonatomic, readonly) NSView* appInstalledShortcutLink; @property(nonatomic, readonly) NSView* manageShortcutLink; @property(nonatomic, readonly) NSView* promoContainer; +@property(nonatomic, readonly) NSView* iconImage; @property(nonatomic) BOOL pageActionPreviewShowing; // Initialize the window. It will be shown by the BubbleManager.
diff --git a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm index 49752ee1..48ff3bb5 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm
@@ -140,6 +140,7 @@ @synthesize appInstalledShortcutLink = appInstalledShortcutLink_; @synthesize manageShortcutLink = manageShortcutLink_; @synthesize promoContainer = promoContainer_; +@synthesize iconImage = iconImage_; @synthesize pageActionPreviewShowing = pageActionPreviewShowing_; - (id)initWithParentWindow:(NSWindow*)parentWindow @@ -362,7 +363,12 @@ - (int)calculateWindowHeight { // Adjust the window height to reflect the sum height of all messages // and vertical padding. - int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin; + // If there's few enough messages, the icon area may be larger than the + // messages. + int contentColumnHeight = + 2 * extension_installed_bubble::kOuterVerticalMargin; + int iconColumnHeight = 2 * extension_installed_bubble::kOuterVerticalMargin + + NSHeight([iconImage_ frame]); // If type is bundle, list the extensions that were installed and those that // failed. @@ -377,13 +383,13 @@ itemsView:failedItemsView_ state:BundleInstaller::Item::STATE_FAILED]; - newWindowHeight += installedListHeight + failedListHeight; + contentColumnHeight += installedListHeight + failedListHeight; // Put some space between the lists if both are present. if (installedListHeight > 0 && failedListHeight > 0) - newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; + contentColumnHeight += extension_installed_bubble::kInnerVerticalMargin; - return newWindowHeight; + return std::max(contentColumnHeight, iconColumnHeight); } CGFloat syncPromoHeight = 0; @@ -420,7 +426,7 @@ IDS_EXTENSION_INSTALLED_HEADING, extension_name)]; [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:heading_]; - newWindowHeight += NSHeight([heading_ frame]); + contentColumnHeight += NSHeight([heading_ frame]); if (installedBubble_->options() & ExtensionInstalledBubble::HOW_TO_USE) { [howToUse_ setStringValue:base::SysUTF16ToNSString( @@ -430,7 +436,7 @@ setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:howToUse_]; - newWindowHeight += NSHeight([howToUse_ frame]) + + contentColumnHeight += NSHeight([howToUse_ frame]) + extension_installed_bubble::kInnerVerticalMargin; } @@ -439,8 +445,8 @@ if (type_ == extension_installed_bubble::kApp) { [howToManage_ setHidden:YES]; [appShortcutLink_ setHidden:NO]; - newWindowHeight += 2 * extension_installed_bubble::kInnerVerticalMargin; - newWindowHeight += NSHeight([appShortcutLink_ frame]); + contentColumnHeight += 2 * extension_installed_bubble::kInnerVerticalMargin; + contentColumnHeight += NSHeight([appShortcutLink_ frame]); } else if (installedBubble_->options() & ExtensionInstalledBubble::HOW_TO_MANAGE) { // Second part of extension installed message. @@ -448,7 +454,7 @@ setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:howToManage_]; - newWindowHeight += NSHeight([howToManage_ frame]) + + contentColumnHeight += NSHeight([howToManage_ frame]) + extension_installed_bubble::kInnerVerticalMargin; } else { [howToManage_ setHidden:YES]; @@ -456,9 +462,14 @@ // Sync sign-in promo, if any. if (syncPromoHeight > 0) { - newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; - newWindowHeight += syncPromoHeight; - newWindowHeight -= extension_installed_bubble::kOuterVerticalMargin; + // The sync promo goes at the bottom of the window and includes its own + // bottom margin. Thus, we subtract off the one of the outer margins, and + // apply it to both the icon area and content area. + int syncPromoDelta = extension_installed_bubble::kInnerVerticalMargin + + syncPromoHeight - + extension_installed_bubble::kOuterVerticalMargin; + contentColumnHeight += syncPromoDelta; + iconColumnHeight += syncPromoDelta; } if (installedBubble_->options() & ExtensionInstalledBubble::SHOW_KEYBINDING) { @@ -469,11 +480,11 @@ setTextColor:skia::SkColorToCalibratedNSColor( chrome_style::GetLinkColor())]; [GTMUILocalizerAndLayoutTweaker sizeToFitView:manageShortcutLink_]; - newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; - newWindowHeight += NSHeight([manageShortcutLink_ frame]); + contentColumnHeight += extension_installed_bubble::kInnerVerticalMargin; + contentColumnHeight += NSHeight([manageShortcutLink_ frame]); } - return newWindowHeight; + return std::max(contentColumnHeight, iconColumnHeight); } - (NSInteger)addExtensionList:(NSTextField*)headingMsg @@ -560,8 +571,15 @@ if (installedBubble_->options() & ExtensionInstalledBubble::SHOW_KEYBINDING) adjustView(manageShortcutLink_, &nextY); - if (installedBubble_->options() & ExtensionInstalledBubble::SIGN_IN_PROMO) + if (installedBubble_->options() & ExtensionInstalledBubble::SIGN_IN_PROMO) { + // The sync promo goes at the bottom of the bubble, but that might be + // different than directly below the previous content if the icon is larger + // than the messages. Workaround by just always setting nextY to be at the + // bottom. + nextY = NSHeight([promoContainer_ frame]) + + extension_installed_bubble::kInnerVerticalMargin; adjustView(promoContainer_, &nextY); + } } - (void)updateAnchorPosition {
diff --git a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm index 9585003..fedcb39d 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm
@@ -201,6 +201,7 @@ NSRect howToUseFrame = [[controller howToUse] frame]; NSRect howToManageFrame = [[controller howToManage] frame]; NSRect syncPromoFrame = [[controller promoContainer] frame]; + NSRect iconFrame = [[controller iconImage] frame]; // We don't want to just test the bounds of these frames, because that results // in a change detector test (and just duplicates the logic in the class). @@ -209,6 +210,7 @@ EXPECT_FALSE(NSIsEmptyRect(howToUseFrame)); EXPECT_FALSE(NSIsEmptyRect(howToManageFrame)); EXPECT_FALSE(NSIsEmptyRect(syncPromoFrame)); + EXPECT_FALSE(NSIsEmptyRect(iconFrame)); // Check 2: The overall layout of the bubble should be: // [ How to Use ] @@ -221,6 +223,12 @@ EXPECT_FALSE(NSIntersectsRect(howToManageFrame, syncPromoFrame)); EXPECT_GT(NSMinY(howToManageFrame), NSMinY(syncPromoFrame)); + EXPECT_FALSE(NSIntersectsRect(iconFrame, syncPromoFrame)); + EXPECT_GT(NSMinY(iconFrame), NSMinY(syncPromoFrame)); + + EXPECT_GT(NSMinY(iconFrame), 0); + EXPECT_EQ(NSMinY(syncPromoFrame), 0); + [controller close]; } @@ -242,6 +250,7 @@ NSRect howToUseFrame = [[controller howToUse] frame]; NSRect manageShortcutFrame = [[controller manageShortcutLink] frame]; NSRect syncPromoFrame = [[controller promoContainer] frame]; + NSRect iconFrame = [[controller iconImage] frame]; // Same checks as previous tests - layout should be: // [ How to Use ] @@ -250,6 +259,7 @@ EXPECT_FALSE(NSIsEmptyRect(howToUseFrame)); EXPECT_FALSE(NSIsEmptyRect(manageShortcutFrame)); EXPECT_FALSE(NSIsEmptyRect(syncPromoFrame)); + EXPECT_FALSE(NSIsEmptyRect(iconFrame)); EXPECT_FALSE(NSIntersectsRect(howToUseFrame, manageShortcutFrame)); EXPECT_GT(NSMinY(howToUseFrame), NSMinY(manageShortcutFrame)); @@ -257,6 +267,12 @@ EXPECT_FALSE(NSIntersectsRect(manageShortcutFrame, syncPromoFrame)); EXPECT_GT(NSMinY(manageShortcutFrame), NSMinY(syncPromoFrame)); + EXPECT_FALSE(NSIntersectsRect(iconFrame, syncPromoFrame)); + EXPECT_GT(NSMinY(iconFrame), NSMinY(syncPromoFrame)); + + EXPECT_GT(NSMinY(iconFrame), 0); + EXPECT_EQ(NSMinY(syncPromoFrame), 0); + [controller close]; } @@ -284,16 +300,20 @@ NSRect howToUseFrame = [[controller howToUse] frame]; NSRect howToManageFrame = [[controller howToManage] frame]; + NSRect iconFrame = [[controller iconImage] frame]; // Same checks as previous tests - layout should be: // [ How to Use ] // [ Manage Shortcut ] EXPECT_FALSE(NSIsEmptyRect(howToUseFrame)); EXPECT_FALSE(NSIsEmptyRect(howToManageFrame)); + EXPECT_FALSE(NSIsEmptyRect(iconFrame)); EXPECT_FALSE(NSIntersectsRect(howToUseFrame, howToManageFrame)); EXPECT_GT(NSMinY(howToUseFrame), NSMinY(howToManageFrame)); + EXPECT_GT(NSMinY(iconFrame), 0); + // The page action preview should be visible. EXPECT_TRUE([controller pageActionPreviewShowing]); EXPECT_EQ(1, locationBar->PageActionVisibleCount());
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc index 4a4fb55..5964f0e3 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -96,19 +96,6 @@ } // namespace -// ContentSettingTitleAndLinkModel --------------------------------------------- - -ContentSettingTitleAndLinkModel::ContentSettingTitleAndLinkModel( - Delegate* delegate, - WebContents* web_contents, - Profile* profile) - : ContentSettingBubbleModel(web_contents, profile), - delegate_(delegate) { -} - -ContentSettingTitleAndLinkModel::~ContentSettingTitleAndLinkModel() { -} - // ContentSettingSimpleBubbleModel --------------------------------------------- ContentSettingSimpleBubbleModel::ContentSettingSimpleBubbleModel( @@ -116,7 +103,7 @@ WebContents* web_contents, Profile* profile, ContentSettingsType content_type) - : ContentSettingTitleAndLinkModel(delegate, web_contents, profile), + : ContentSettingBubbleModel(delegate, web_contents, profile), content_type_(content_type) { // Notifications do not have a bubble. DCHECK_NE(content_type, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); @@ -573,7 +560,7 @@ Delegate* delegate, WebContents* web_contents, Profile* profile) - : ContentSettingTitleAndLinkModel(delegate, web_contents, profile), + : ContentSettingBubbleModel(delegate, web_contents, profile), selected_item_(0), state_(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED) { // TODO(msramek): The media bubble has three states - mic only, camera only, @@ -1280,10 +1267,12 @@ } ContentSettingBubbleModel::ContentSettingBubbleModel( + Delegate* delegate, WebContents* web_contents, Profile* profile) : web_contents_(web_contents), profile_(profile), + delegate_(delegate), setting_is_managed_(false) { registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, content::Source<WebContents>(web_contents));
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.h b/chrome/browser/ui/content_settings/content_setting_bubble_model.h index 2e71dec..496b4f1 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.h +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
@@ -33,17 +33,16 @@ // The hierarchy of bubble models: // // ContentSettingsBubbleModel - base class -// ContentSettingsTitleAndLinkModel - manages title and link -// ContentSettingMediaStreamBubbleModel - media (camera and mic) -// ContentSettingSimpleBubbleModel - single content setting -// ContentSettingMixedScriptBubbleModel - mixed script -// ContentSettingRPHBubbleModel - protocol handlers -// ContentSettingMidiSysExBubbleModel - midi sysex -// ContentSettingDomainListBubbleModel - domain list (geolocation) -// ContentSettingSingleRadioGroup - radio group -// ContentSettingCookiesBubbleModel - cookies -// ContentSettingPluginBubbleModel - plugins -// ContentSettingPopupBubbleModel - popups +// ContentSettingMediaStreamBubbleModel - media (camera and mic) +// ContentSettingSimpleBubbleModel - single content setting +// ContentSettingMixedScriptBubbleModel - mixed script +// ContentSettingRPHBubbleModel - protocol handlers +// ContentSettingMidiSysExBubbleModel - midi sysex +// ContentSettingDomainListBubbleModel - domain list (geolocation) +// ContentSettingSingleRadioGroup - radio group +// ContentSettingCookiesBubbleModel - cookies +// ContentSettingPluginBubbleModel - plugins +// ContentSettingPopupBubbleModel - popups // Forward declaration necessary for downcasts. class ContentSettingSimpleBubbleModel; @@ -161,11 +160,13 @@ protected: ContentSettingBubbleModel( + Delegate* delegate, content::WebContents* web_contents, Profile* profile); content::WebContents* web_contents() const { return web_contents_; } Profile* profile() const { return profile_; } + Delegate* delegate() const { return delegate_; } void set_title(const std::string& title) { bubble_content_.title = title; } void add_list_item(const ListItem& item) { @@ -206,8 +207,12 @@ } private: + virtual void SetTitle() = 0; + virtual void SetManageLink() = 0; + content::WebContents* web_contents_; Profile* profile_; + Delegate* delegate_; BubbleContent bubble_content_; // A registrar for listening for WEB_CONTENTS_DESTROYED notifications. content::NotificationRegistrar registrar_; @@ -218,27 +223,8 @@ DISALLOW_COPY_AND_ASSIGN(ContentSettingBubbleModel); }; -// TODO(msramek): This is the only subclass of ContentSettingBubbleModel, and -// as such it serves no purpose. Merge the two classes. -class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel { - public: - ContentSettingTitleAndLinkModel(Delegate* delegate, - content::WebContents* web_contents, - Profile* profile); - ~ContentSettingTitleAndLinkModel() override; - Delegate* delegate() const { return delegate_; } - - private: - virtual void SetTitle() = 0; - virtual void SetManageLink() = 0; - - Delegate* delegate_; - - DISALLOW_COPY_AND_ASSIGN(ContentSettingTitleAndLinkModel); -}; - // A generic bubble used for a single content setting. -class ContentSettingSimpleBubbleModel : public ContentSettingTitleAndLinkModel { +class ContentSettingSimpleBubbleModel : public ContentSettingBubbleModel { public: ContentSettingSimpleBubbleModel(Delegate* delegate, content::WebContents* web_contents, @@ -251,7 +237,7 @@ ContentSettingSimpleBubbleModel* AsSimpleBubbleModel() override; private: - // ContentSettingTitleAndLinkModel implementation. + // ContentSettingBubbleModel implementation. void SetTitle() override; void SetManageLink() override; void OnManageLinkClicked() override; @@ -289,8 +275,7 @@ }; // The model of the content settings bubble for media settings. -class ContentSettingMediaStreamBubbleModel - : public ContentSettingTitleAndLinkModel { +class ContentSettingMediaStreamBubbleModel : public ContentSettingBubbleModel { public: ContentSettingMediaStreamBubbleModel(Delegate* delegate, content::WebContents* web_contents, @@ -300,8 +285,6 @@ // ContentSettingBubbleModel: ContentSettingMediaStreamBubbleModel* AsMediaStreamBubbleModel() override; - - // ContentSettingTitleAndLinkModel: void OnManageLinkClicked() override; private: @@ -310,7 +293,7 @@ bool MicrophoneAccessed() const; bool CameraAccessed() const; - // ContentSettingTitleAndLinkModel: + // ContentSettingBubbleModel: void SetTitle() override; void SetManageLink() override;
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble.cc b/chrome/browser/ui/extensions/extension_installed_bubble.cc index 7f0365dc..b914d77 100644 --- a/chrome/browser/ui/extensions/extension_installed_bubble.cc +++ b/chrome/browser/ui/extensions/extension_installed_bubble.cc
@@ -79,13 +79,12 @@ void OnExtensionLoaded(content::BrowserContext* browser_context, const extensions::Extension* extension) override { if (extension == bubble_->extension()) { - bubble_->Initialize(); // PostTask to ourself to allow all EXTENSION_LOADED Observers to run. // Only then can we be sure that a BrowserAction or PageAction has had // views created which we can inspect for the purpose of previewing of // pointing to them. base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&ExtensionInstalledBubbleObserver::Show, + FROM_HERE, base::Bind(&ExtensionInstalledBubbleObserver::Initialize, weak_factory_.GetWeakPtr())); } } @@ -100,6 +99,12 @@ } } + void Initialize() { + DCHECK(bubble_); + bubble_->Initialize(); + Show(); + } + // Called internally via PostTask to show the bubble. void Show() { DCHECK(bubble_); @@ -192,15 +197,6 @@ type_(GENERIC), options_(NONE), anchor_position_(ANCHOR_APP_MENU) { - if (!extensions::OmniboxInfo::GetKeyword(extension).empty()) - type_ = OMNIBOX_KEYWORD; - else if (extensions::ActionInfo::GetBrowserActionInfo(extension)) - type_ = BROWSER_ACTION; - else if (extensions::ActionInfo::GetPageActionInfo(extension) && - extensions::ActionInfo::IsVerboseInstallMessage(extension)) - type_ = PAGE_ACTION; - else - type_ = GENERIC; } ExtensionInstalledBubble::~ExtensionInstalledBubble() {} @@ -245,6 +241,21 @@ } void ExtensionInstalledBubble::Initialize() { + bool extension_action_redesign_on = + extensions::FeatureSwitch::extension_action_redesign()->IsEnabled(); + + if (extensions::ActionInfo::GetBrowserActionInfo(extension_)) { + type_ = BROWSER_ACTION; + } else if (extensions::ActionInfo::GetPageActionInfo(extension_) && + (extensions::ActionInfo::IsVerboseInstallMessage(extension_) || + extension_action_redesign_on)) { + type_ = PAGE_ACTION; + } else if (!extensions::OmniboxInfo::GetKeyword(extension_).empty()) { + type_ = OMNIBOX_KEYWORD; + } else { + type_ = GENERIC; + } + action_command_ = GetCommand(extension_->id(), browser_->profile(), type_); if (extensions::sync_helper::IsSyncable(extension_) && SyncPromoUI::ShouldShowSyncPromo(browser_->profile())) @@ -264,8 +275,7 @@ options_ |= HOW_TO_MANAGE; } - if (type_ == BROWSER_ACTION || - extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) { + if (type_ == BROWSER_ACTION || extension_action_redesign_on) { // If the toolbar redesign is enabled, all bubbles for extensions point // to their toolbar action. anchor_position_ = ANCHOR_BROWSER_ACTION;
diff --git a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc index 8f10530..5b52870 100644 --- a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc +++ b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
@@ -323,19 +323,14 @@ // Values used as the new luminance and saturation values in the inactive tab // text color. -const double kDarkInactiveLuminance = 0.85; -const double kLightInactiveLuminance = 0.15; -const double kHeavyInactiveSaturation = 0.7; -const double kLightInactiveSaturation = 0.3; +const double kInactiveLuminance = 0.15; +const double kInactiveSaturation = 0.3; // TODO(erg): ThemeService has a whole interface just for reading default // constants. Figure out what to do with that more long term; for now, just // copy the constants themselves here. // // Default tints. -const color_utils::HSL kDefaultTintButtons = { -1, -1, -1 }; -const color_utils::HSL kDefaultTintFrame = { -1, -1, -1 }; -const color_utils::HSL kDefaultTintFrameInactive = { -1, -1, 0.75f }; const color_utils::HSL kDefaultTintFrameIncognito = { -1, 0.2f, 0.35f }; const color_utils::HSL kDefaultTintFrameIncognitoInactive = { -1, 0.3f, 0.6f }; const color_utils::HSL kDefaultTintBackgroundTab = { -1, 0.5, 0.75 }; @@ -401,27 +396,6 @@ } } -// Copied Default blah sections from ThemeService. -color_utils::HSL GetDefaultTint(int id) { - switch (id) { - case ThemeProperties::TINT_FRAME: - return kDefaultTintFrame; - case ThemeProperties::TINT_FRAME_INACTIVE: - return kDefaultTintFrameInactive; - case ThemeProperties::TINT_FRAME_INCOGNITO: - return kDefaultTintFrameIncognito; - case ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE: - return kDefaultTintFrameIncognitoInactive; - case ThemeProperties::TINT_BUTTONS: - return kDefaultTintButtons; - case ThemeProperties::TINT_BACKGROUND_TAB: - return kDefaultTintBackgroundTab; - default: - color_utils::HSL result = {-1, -1, -1}; - return result; - } -} - // Returns a gfx::FontRenderParams corresponding to GTK's configuration. gfx::FontRenderParams GetGtkFontRenderParams() { GtkSettings* gtk_settings = gtk_settings_get_default(); @@ -942,18 +916,12 @@ // background tab color, with the lightness and saturation moved in the // opposite direction. (We don't touch the hue, since there should be subtle // hints of the color in the text.) - color_utils::HSL inactive_tab_text_hsl = ColorToTint( - ThemeProperties::TINT_BACKGROUND_TAB, - theme->GetSystemColor(ui::NativeTheme::kColorId_WindowBackground)); - if (inactive_tab_text_hsl.l < 0.5) - inactive_tab_text_hsl.l = kDarkInactiveLuminance; - else - inactive_tab_text_hsl.l = kLightInactiveLuminance; - - if (inactive_tab_text_hsl.s < 0.5) - inactive_tab_text_hsl.s = kHeavyInactiveSaturation; - else - inactive_tab_text_hsl.s = kLightInactiveSaturation; + color_utils::HSL inactive_tab_text_hsl; + color_utils::SkColorToHSL( + theme->GetSystemColor(ui::NativeTheme::kColorId_WindowBackground), + &inactive_tab_text_hsl); + inactive_tab_text_hsl.s = kInactiveLuminance; + inactive_tab_text_hsl.l = kInactiveSaturation; colors_[ThemeProperties::COLOR_BACKGROUND_TAB_TEXT] = color_utils::HSLToSkColor(inactive_tab_text_hsl, 255); @@ -1041,13 +1009,13 @@ temp_color = color_utils::HSLShift( frame_color, - GetDefaultTint(ThemeProperties::TINT_FRAME_INCOGNITO)); + kDefaultTintFrameIncognito); theme->GetChromeStyleColor("incognito-frame-color", &temp_color); colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] = temp_color; temp_color = color_utils::HSLShift( frame_color, - GetDefaultTint(ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE)); + kDefaultTintFrameIncognitoInactive); theme->GetChromeStyleColor("incognito-inactive-frame-color", &temp_color); colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] = temp_color; #else @@ -1081,20 +1049,6 @@ return frame_color; } -color_utils::HSL Gtk2UI::ColorToTint(int id, SkColor color) { - color_utils::HSL default_tint = GetDefaultTint(id); - color_utils::HSL hsl; - color_utils::SkColorToHSL(color, &hsl); - - if (default_tint.s != -1) - hsl.s = default_tint.s; - - if (default_tint.l != -1) - hsl.l = default_tint.l; - - return hsl; -} - gfx::Image Gtk2UI::GenerateGtkThemeImage(int id) const { gfx::ImageSkiaSource* source = NULL; @@ -1306,7 +1260,7 @@ SkBitmap Gtk2UI::GenerateTabImage(int base_id) const { const SkBitmap* base_image = GetThemeImageNamed(base_id).ToSkBitmap(); SkBitmap bg_tint = SkBitmapOperations::CreateHSLShiftedBitmap( - *base_image, GetDefaultTint(ThemeProperties::TINT_BACKGROUND_TAB)); + *base_image, kDefaultTintBackgroundTab); return SkBitmapOperations::CreateTiledBitmap( bg_tint, 0, 0, bg_tint.width(), bg_tint.height()); }
diff --git a/chrome/browser/ui/passwords/manage_passwords_view_utils.cc b/chrome/browser/ui/passwords/manage_passwords_view_utils.cc index 01a4cdeb..dffc0057 100644 --- a/chrome/browser/ui/passwords/manage_passwords_view_utils.cc +++ b/chrome/browser/ui/passwords/manage_passwords_view_utils.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include <algorithm> + #include "base/strings/utf_string_conversions.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc index 144943de..0b0660c5 100644 --- a/chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc
@@ -7,6 +7,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/grit/generated_resources.h" +#include "grit/components_strings.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/range/range.h"
diff --git a/chrome/browser/ui/search/search_ui.cc b/chrome/browser/ui/search/search_ui.cc deleted file mode 100644 index db1f5f6..0000000 --- a/chrome/browser/ui/search/search_ui.cc +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright (c) 2012 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/ui/search/search_ui.h" - -#include "chrome/browser/themes/theme_properties.h" -#include "chrome/browser/themes/theme_service.h" -#include "chrome/browser/themes/theme_service_factory.h" -#include "ui/base/resource/material_design/material_design_controller.h" - -namespace chrome { - -SkColor GetDetachedBookmarkBarBackgroundColor(Profile* profile) { - if (ThemeServiceFactory::GetForProfile(profile)->UsingDefaultTheme()) { - return ui::MaterialDesignController::IsModeMaterial() - ? SK_ColorWHITE - : SkColorSetARGB(0xFF, 0xF1, 0xF1, 0xF1); - } - - return ThemeService::GetThemeProviderForProfile(profile) - .GetColor(ThemeProperties::COLOR_TOOLBAR); -} - -SkColor GetDetachedBookmarkBarSeparatorColor(Profile* profile) { - if (ThemeServiceFactory::GetForProfile(profile)->UsingDefaultTheme()) { - return ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_TOOLBAR_SEPARATOR); - } - - // Use 50% of bookmark text color as separator color. - return SkColorSetA(ThemeService::GetThemeProviderForProfile(profile) - .GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT), - 128); -} - -} // namespace chrome
diff --git a/chrome/browser/ui/search/search_ui.h b/chrome/browser/ui/search/search_ui.h deleted file mode 100644 index f6b3ed2b..0000000 --- a/chrome/browser/ui/search/search_ui.h +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright (c) 2012 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_UI_SEARCH_SEARCH_UI_H_ -#define CHROME_BROWSER_UI_SEARCH_SEARCH_UI_H_ - -#include "third_party/skia/include/core/SkColor.h" - -class Profile; - -namespace chrome { - -// Returns the color to use to draw the detached bookmark bar background. -SkColor GetDetachedBookmarkBarBackgroundColor(Profile* profile); - -// Returns the color to use to draw the detached bookmark bar separator. -SkColor GetDetachedBookmarkBarSeparatorColor(Profile* profile); - -} // namespace chrome - -#endif // CHROME_BROWSER_UI_SEARCH_SEARCH_UI_H_
diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc index e25a56b..648172be 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
@@ -40,6 +40,7 @@ #include "components/signin/core/browser/signin_manager.h" #include "components/signin/core/browser/signin_metrics.h" #include "components/sync_driver/sync_prefs.h" +#include "content/public/browser/user_metrics.h" #include "net/base/url_util.h" #include "net/url_request/url_request_context_getter.h" #include "ui/base/l10n/l10n_util.h" @@ -185,12 +186,16 @@ void OneClickSigninSyncStarter::SigninDialogDelegate::OnCancelSignin() { SetUserChoiceHistogram(SIGNIN_CHOICE_CANCEL); + content::RecordAction( + base::UserMetricsAction("Signin_EnterpriseAccountPrompt_Cancel")); if (sync_starter_ != NULL) sync_starter_->CancelSigninAndDelete(); } void OneClickSigninSyncStarter::SigninDialogDelegate::OnContinueSignin() { SetUserChoiceHistogram(SIGNIN_CHOICE_CONTINUE); + content::RecordAction( + base::UserMetricsAction("Signin_EnterpriseAccountPrompt_ImportData")); if (sync_starter_ != NULL) sync_starter_->LoadPolicyWithCachedCredentials(); @@ -198,6 +203,8 @@ void OneClickSigninSyncStarter::SigninDialogDelegate::OnSigninWithNewProfile() { SetUserChoiceHistogram(SIGNIN_CHOICE_NEW_PROFILE); + content::RecordAction( + base::UserMetricsAction("Signin_EnterpriseAccountPrompt_DontImportData")); if (sync_starter_ != NULL) sync_starter_->CreateNewSignedInProfile(); @@ -230,6 +237,9 @@ CancelSigninAndDelete(); return; } + + content::RecordAction( + base::UserMetricsAction("Signin_Show_EnterpriseAccountPrompt")); TabDialogs::FromWebContents(web_contents)->ShowProfileSigninConfirmation( browser_, profile_, @@ -356,6 +366,8 @@ SigninManager* signin = SigninManagerFactory::GetForProfile(profile_); if (confirmation_required_ == CONFIRM_UNTRUSTED_SIGNIN) { browser_ = EnsureBrowser(browser_, profile_, desktop_type_); + content::RecordAction( + base::UserMetricsAction("Signin_Show_UntrustedSigninPrompt")); // Display a confirmation dialog to the user. browser_->window()->ShowOneClickSigninBubble( BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG, @@ -373,6 +385,7 @@ void OneClickSigninSyncStarter::UntrustedSigninConfirmed( StartSyncMode response) { if (response == UNDO_SYNC) { + content::RecordAction(base::UserMetricsAction("Signin_Undo_Signin")); CancelSigninAndDelete(); // This statement frees this object. } else { // If the user clicked the "Advanced" link in the confirmation dialog, then @@ -396,8 +409,12 @@ void OneClickSigninSyncStarter::OnSyncConfirmationUIClosed( bool configure_sync_first) { if (configure_sync_first) { + content::RecordAction( + base::UserMetricsAction("Signin_Signin_WithAdvancedSyncSettings")); chrome::ShowSettingsSubPage(browser_, chrome::kSyncSetupSubPage); } else { + content::RecordAction( + base::UserMetricsAction("Signin_Signin_WithDefaultSyncSettings")); ProfileSyncService* profile_sync_service = GetProfileSyncService(); if (profile_sync_service) profile_sync_service->SetSyncSetupCompleted(); @@ -438,6 +455,7 @@ signin::GetAccessPointForPromoURL(current_url_)); signin_metrics::LogSigninReason( signin::GetSigninReasonForPromoURL(current_url_)); + content::RecordAction(base::UserMetricsAction("Signin_Signin_Succeed")); } void OneClickSigninSyncStarter::AccountAddedToCookie(
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc index b441079..d552ade 100644 --- a/chrome/browser/ui/toolbar/app_menu_model.cc +++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -954,6 +954,8 @@ SetIcon(GetIndexOfCommandId(error->MenuItemCommandID()), error->MenuItemIcon()); menu_items_added = true; + content::RecordAction( + base::UserMetricsAction("Signin_Impression_FromMenu")); } } return menu_items_added;
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc index c14e4d6e..abb770e 100644 --- a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
@@ -192,12 +192,12 @@ // Create accept button. save_button_ = new views::BlueButton( - this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_BUBBLE_ACCEPT)); + this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT)); save_button_->SetIsDefault(true); // Create cancel button. cancel_button_ = new views::LabelButton( - this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_BUBBLE_DENY)); + this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_DENY)); cancel_button_->SetStyle(views::Button::STYLE_BUTTON); if (kIsOkButtonOnLeftSide) {
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc index 389b745..d1b3259 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -261,6 +261,8 @@ new BubbleSyncPromoView(delegate_.get(), IDS_BOOKMARK_SYNC_PROMO_LINK, IDS_BOOKMARK_SYNC_PROMO_MESSAGE); layout->AddView(sync_promo_view_); + content::RecordAction( + base::UserMetricsAction("Signin_Impression_FromBookmarkBubble")); } AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index 4d6dfe51..205d6adb 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <string> +#include "base/metrics/user_metrics_action.h" #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -25,6 +26,7 @@ #include "chrome/grit/generated_resources.h" #include "components/bubble/bubble_controller.h" #include "components/bubble/bubble_ui.h" +#include "content/public/browser/user_metrics.h" #include "extensions/common/extension.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -58,6 +60,55 @@ return label; } +class HeadingAndCloseButtonView : public views::View { + public: + HeadingAndCloseButtonView(views::Label* heading, views::LabelButton* close) + : heading_(heading), close_(close) { + AddChildView(heading_); + AddChildView(close_); + } + ~HeadingAndCloseButtonView() override {} + + void Layout() override { + gfx::Size close_size = close_->GetPreferredSize(); + gfx::Size view_size = size(); + + // Close button is in the upper right and always gets its full desired size. + close_->SetBounds(view_size.width() - close_size.width(), + 0, + close_size.width(), + close_size.height()); + // The heading takes up the remaining room (modulo padding). + heading_->SetBounds( + 0, + 0, + view_size.width() - close_size.width() - + views::kUnrelatedControlHorizontalSpacing, + view_size.height()); + } + + gfx::Size GetPreferredSize() const override { + gfx::Size heading_size = heading_->GetPreferredSize(); + gfx::Size close_size = close_->GetPreferredSize(); + return gfx::Size(kRightColumnWidth, + std::max(heading_size.height(), close_size.height())); + } + + int GetHeightForWidth(int width) const override { + gfx::Size close_size = close_->GetPreferredSize(); + int heading_width = width - views::kUnrelatedControlHorizontalSpacing - + close_size.width(); + return std::max(heading_->GetHeightForWidth(heading_width), + close_size.height()); + } + + private: + views::Label* heading_; + views::LabelButton* close_; + + DISALLOW_COPY_AND_ASSIGN(HeadingAndCloseButtonView); +}; + } // namespace ExtensionInstalledBubbleView::ExtensionInstalledBubbleView( @@ -277,15 +328,8 @@ close_ = views::BubbleFrameView::CreateCloseButton(this); - views::View* heading_and_close = new views::View(); - views::BoxLayout* heading_and_close_layout = - new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, - views::kUnrelatedControlHorizontalSpacing); - heading_and_close_layout->set_cross_axis_alignment( - views::BoxLayout::CROSS_AXIS_ALIGNMENT_START); - heading_and_close->SetLayoutManager(heading_and_close_layout); - heading_and_close->AddChildView(heading); - heading_and_close->AddChildView(close_); + HeadingAndCloseButtonView* heading_and_close = + new HeadingAndCloseButtonView(heading, close_); layout->AddView(heading_and_close); layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); @@ -382,6 +426,8 @@ delegate_view_->InitLayout(*bubble_); views::BubbleDelegateView::CreateBubble(delegate_view_)->Show(); + content::RecordAction( + base::UserMetricsAction("Signin_Impression_FromExtensionInstallBubble")); } void ExtensionInstalledBubbleUi::Close() {
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 adb429ea..57297eea 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
@@ -120,17 +120,12 @@ } SkColor BrowserNonClientFrameView::GetFrameColor() const { - const bool incognito = browser_view_->IsOffTheRecord(); - ThemeProperties::OverwritableByUserThemeProperty color_id; - if (ShouldPaintAsActive()) { - color_id = incognito ? ThemeProperties::COLOR_FRAME_INCOGNITO - : ThemeProperties::COLOR_FRAME; - } else { - color_id = incognito ? ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE - : ThemeProperties::COLOR_FRAME_INACTIVE; - } + ThemeProperties::OverwritableByUserThemeProperty color_id = + ShouldPaintAsActive() ? ThemeProperties::COLOR_FRAME + : ThemeProperties::COLOR_FRAME_INACTIVE; return ShouldPaintAsThemed() ? GetThemeProvider()->GetColor(color_id) - : ThemeProperties::GetDefaultColor(color_id); + : ThemeProperties::GetDefaultColor( + color_id, browser_view_->IsOffTheRecord()); } gfx::ImageSkia* BrowserNonClientFrameView::GetFrameImage() const {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 7723860..9bc227c 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -38,6 +38,7 @@ #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/signin/chrome_signin_helper.h" #include "chrome/browser/themes/theme_properties.h" +#include "chrome/browser/themes/theme_service.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/ui/bookmarks/bookmark_bar_constants.h" #include "chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h" @@ -50,7 +51,6 @@ #include "chrome/browser/ui/browser_window_state.h" #include "chrome/browser/ui/search/search_delegate.h" #include "chrome/browser/ui/search/search_model.h" -#include "chrome/browser/ui/search/search_ui.h" #include "chrome/browser/ui/sync/bubble_sync_promo_delegate.h" #include "chrome/browser/ui/tabs/tab_menu_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -214,11 +214,14 @@ BookmarkBarView* view, Profile* profile) { // Paint background for detached state; if animating, this is fade in/out. - canvas->DrawColor(chrome::GetDetachedBookmarkBarBackgroundColor(profile)); + const ui::ThemeProvider& tp = + ThemeService::GetThemeProviderForProfile(profile); + canvas->DrawColor( + tp.GetColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND)); // Draw the separators above and below bookmark bar; // if animating, these are fading in/out. SkColor separator_color = - chrome::GetDetachedBookmarkBarSeparatorColor(profile); + tp.GetColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR); if (ui::MaterialDesignController::IsModeMaterial()) { BrowserView::Paint1pxHorizontalLine(
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 71f69fab..35cf422 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
@@ -455,9 +455,11 @@ int y = client_bounds.y(); const bool normal_mode = browser_view()->IsTabStripVisible(); const ui::ThemeProvider* tp = GetThemeProvider(); - const SkColor toolbar_color = normal_mode ? - tp->GetColor(ThemeProperties::COLOR_TOOLBAR) : - ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR); + const SkColor toolbar_color = + normal_mode + ? tp->GetColor(ThemeProperties::COLOR_TOOLBAR) + : ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR, + browser_view()->IsOffTheRecord()); const gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); if (!normal_mode) {
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 1ced4ca8..d443540 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -743,9 +743,11 @@ const bool normal_mode = browser_view()->IsTabStripVisible(); const bool md = ui::MaterialDesignController::IsModeMaterial(); const ui::ThemeProvider* tp = GetThemeProvider(); - const SkColor toolbar_color = normal_mode ? - tp->GetColor(ThemeProperties::COLOR_TOOLBAR) : - ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR); + const SkColor toolbar_color = + normal_mode + ? tp->GetColor(ThemeProperties::COLOR_TOOLBAR) + : ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR, + browser_view()->IsOffTheRecord()); const gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); int img_y_offset = 0;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc index 02664b0..d1bc606 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -478,51 +478,11 @@ // ToolbarView, views::View overrides: gfx::Size ToolbarView::GetPreferredSize() const { - gfx::Size size(location_bar_->GetPreferredSize()); - if (is_display_mode_normal()) { - const int element_padding = GetLayoutConstant(TOOLBAR_ELEMENT_PADDING); - const int browser_actions_width = - browser_actions_->GetPreferredSize().width(); - const int right_padding = - GetLayoutConstant(TOOLBAR_LOCATION_BAR_RIGHT_PADDING); - const int content_width = - GetLayoutInsets(TOOLBAR).width() + - back_->GetPreferredSize().width() + element_padding + - forward_->GetPreferredSize().width() + element_padding + - reload_->GetPreferredSize().width() + - (show_home_button_.GetValue() - ? element_padding + home_->GetPreferredSize().width() - : 0) + - GetLayoutConstant(TOOLBAR_STANDARD_SPACING) + - (browser_actions_width > 0 ? browser_actions_width : right_padding) + - app_menu_button_->GetPreferredSize().width(); - size.Enlarge(content_width, 0); - } - return SizeForContentSize(size); + return GetSizeInternal(&View::GetPreferredSize); } gfx::Size ToolbarView::GetMinimumSize() const { - gfx::Size size(location_bar_->GetMinimumSize()); - if (is_display_mode_normal()) { - const int element_padding = GetLayoutConstant(TOOLBAR_ELEMENT_PADDING); - const int browser_actions_width = - browser_actions_->GetMinimumSize().width(); - const int right_padding = - GetLayoutConstant(TOOLBAR_LOCATION_BAR_RIGHT_PADDING); - const int content_width = - GetLayoutInsets(TOOLBAR).width() + - back_->GetMinimumSize().width() + element_padding + - forward_->GetMinimumSize().width() + element_padding + - reload_->GetMinimumSize().width() + - (show_home_button_.GetValue() - ? element_padding + home_->GetMinimumSize().width() - : 0) + - GetLayoutConstant(TOOLBAR_STANDARD_SPACING) + - (browser_actions_width > 0 ? browser_actions_width : right_padding) + - app_menu_button_->GetMinimumSize().width(); - size.Enlarge(content_width, 0); - } - return SizeForContentSize(size); + return GetSizeInternal(&View::GetMinimumSize); } void ToolbarView::Layout() { @@ -732,6 +692,31 @@ 0 : kAdditionalPopupTopSpacingNonGlass); } +gfx::Size ToolbarView::GetSizeInternal( + gfx::Size (View::*get_size)() const) const { + gfx::Size size((location_bar_->*get_size)()); + if (is_display_mode_normal()) { + const int element_padding = GetLayoutConstant(TOOLBAR_ELEMENT_PADDING); + const int browser_actions_width = + (browser_actions_->*get_size)().width(); + const int right_padding = + GetLayoutConstant(TOOLBAR_LOCATION_BAR_RIGHT_PADDING); + const int content_width = + GetLayoutInsets(TOOLBAR).width() + + (back_->*get_size)().width() + element_padding + + (forward_->*get_size)().width() + element_padding + + (reload_->*get_size)().width() + + (show_home_button_.GetValue() + ? element_padding + (home_->*get_size)().width() + : 0) + + GetLayoutConstant(TOOLBAR_STANDARD_SPACING) + + (browser_actions_width > 0 ? browser_actions_width : right_padding) + + (app_menu_button_->*get_size)().width(); + size.Enlarge(content_width, 0); + } + return SizeForContentSize(size); +} + gfx::Size ToolbarView::SizeForContentSize(gfx::Size size) const { if (is_display_mode_normal()) { // For Material Design the size of the toolbar is computed using the size
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.h b/chrome/browser/ui/views/toolbar/toolbar_view.h index edf6015..f3d67de0 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_view.h
@@ -173,6 +173,12 @@ // Returns the number of pixels above the location bar in non-normal display. int PopupTopSpacing() const; + // Used to avoid duplicating the near-identical logic of + // ToolbarView::GetPreferredSize() and ToolbarView::GetMinimumSize(). These + // two functions call through to GetSizeInternal(), passing themselves as the + // function pointer |View::*get_size|. + gfx::Size GetSizeInternal(gfx::Size (View::*get_size)() const) const; + // Given toolbar contents of size |size|, returns the total toolbar size. gfx::Size SizeForContentSize(gfx::Size size) const;
diff --git a/chrome/browser/ui/webui/app_launcher_login_handler.cc b/chrome/browser/ui/webui/app_launcher_login_handler.cc index 460ec652..0391c99 100644 --- a/chrome/browser/ui/webui/app_launcher_login_handler.cc +++ b/chrome/browser/ui/webui/app_launcher_login_handler.cc
@@ -34,6 +34,7 @@ #include "components/signin/core/browser/signin_manager.h" #include "components/web_resource/promo_resource_service.h" #include "content/public/browser/host_zoom_map.h" +#include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/common/page_zoom.h" @@ -210,6 +211,12 @@ l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); sub_header = l10n_util::GetStringFUTF16( IDS_SYNC_PROMO_NOT_SIGNED_IN_STATUS_SUB_HEADER, signed_in_link); + + content::RecordAction( + web_ui()->GetWebContents()->GetURL().spec() == + chrome::kChromeUIAppsURL + ? base::UserMetricsAction("Signin_Impression_FromAppsPageLink") + : base::UserMetricsAction("Signin_Impression_FromNTP")); // Record that the user was shown the promo. RecordInHistogram(NTP_SIGN_IN_PROMO_VIEWED); }
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc index 4bf13876..c74bbf6 100644 --- a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc +++ b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
@@ -114,21 +114,6 @@ ResizeWebContents(web_contents, gfx::Size(400, 400)); } -class MockAutoConfirmExtensionInstallPrompt : public ExtensionInstallPrompt { - public: - explicit MockAutoConfirmExtensionInstallPrompt( - content::WebContents* web_contents) - : ExtensionInstallPrompt(web_contents) {} - - // Proceed without confirmation prompt. - void ShowDialog(Delegate* delegate, - const Extension* extension, - const SkBitmap* icon, - const ShowDialogCallback& show_dialog_callback) override { - delegate->InstallUIProceed(); - } -}; - const Extension* ExtensionSettingsUIBrowserTest::InstallUnpackedExtension( const base::FilePath& path) { if (path.empty()) @@ -161,9 +146,11 @@ service->set_show_extensions_prompts(false); size_t num_before = registry->enabled_extensions().size(); { - scoped_ptr<ExtensionInstallPrompt> install_ui; - install_ui.reset(new MockAutoConfirmExtensionInstallPrompt( - browser()->tab_strip_model()->GetActiveWebContents())); + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); + scoped_ptr<ExtensionInstallPrompt> install_ui( + new ExtensionInstallPrompt( + browser()->tab_strip_model()->GetActiveWebContents())); base::FilePath crx_path = path; DCHECK(crx_path.Extension() == FILE_PATH_LITERAL(".crx"));
diff --git a/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc index 768db1f..c33173f 100644 --- a/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc +++ b/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc
@@ -115,7 +115,7 @@ scoped_ptr<extensions::ExtensionRegistry> registry = make_scoped_ptr(new extensions::ExtensionRegistry(nullptr)); scoped_refptr<extensions::Extension> app = - extensions::test_util::BuildApp(extensions::ExtensionBuilder().Pass()) + extensions::test_util::BuildApp(extensions::ExtensionBuilder()) .MergeManifest( extensions::DictionaryBuilder().Set("name", "test app name")) .SetID(id)
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc index 89b171c3..a4df00df 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -19,6 +19,7 @@ #include "components/metrics/metrics_pref_names.h" #include "components/signin/core/common/signin_pref_names.h" #include "content/public/browser/storage_partition.h" +#include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "google_apis/gaia/gaia_urls.h" @@ -59,6 +60,85 @@ } } +void InlineLoginHandler::RecordSigninUserActionForAccessPoint( + signin_metrics::AccessPoint access_point) { + switch (access_point) { + case signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromStartPage")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_NTP_LINK: + content::RecordAction(base::UserMetricsAction("Signin_Signin_FromNTP")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_MENU: + content::RecordAction(base::UserMetricsAction("Signin_Signin_FromMenu")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromSettings")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_SUPERVISED_USER: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromSupervisedUser")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromExtensionInstallBubble")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromExtensions")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_APPS_PAGE_LINK: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromAppsPageLink")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromBookmarkBubble")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromBookmarkManager")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromAvatarBubbleSignin")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromUserManager")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_DEVICES_PAGE: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromDevicesPage")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_CLOUD_PRINT: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromCloudPrint")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_CONTENT_AREA: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromContentArea")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_SIGNIN_PROMO: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromSigninPromo")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_RECENT_TABS: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromRecentTabs")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_UNSPECIFIED: + content::RecordAction( + base::UserMetricsAction("Signin_Signin_FromUnspecifiedAccessPoint")); + break; + case signin_metrics::AccessPoint::ACCESS_POINT_MAX: + NOTREACHED(); + break; + } +} + void InlineLoginHandler::ContinueHandleInitializeMessage() { base::DictionaryValue params; @@ -72,6 +152,8 @@ signin_metrics::AccessPoint access_point = signin::GetAccessPointForPromoURL(current_url); signin_metrics::LogSigninAccessPointStarted(access_point); + RecordSigninUserActionForAccessPoint(access_point); + content::RecordAction(base::UserMetricsAction("Signin_SigninPage_Loading")); params.SetString("continueUrl", signin::GetLandingURL(access_point).spec());
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.h b/chrome/browser/ui/webui/signin/inline_login_handler.h index 4ff7a85..440ee557 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler.h +++ b/chrome/browser/ui/webui/signin/inline_login_handler.h
@@ -8,6 +8,10 @@ #include "base/memory/weak_ptr.h" #include "content/public/browser/web_ui_message_handler.h" +namespace signin_metrics { +enum class AccessPoint; +} + // The base class handler for the inline login WebUI. class InlineLoginHandler : public content::WebUIMessageHandler { public: @@ -27,6 +31,10 @@ }; private: + // Record correspond sign in user action for an access point. + void RecordSigninUserActionForAccessPoint( + signin_metrics::AccessPoint access_point); + // JS callback to prepare for starting auth. void HandleInitializeMessage(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc index 350905e..60ebf5d8 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -10,6 +10,7 @@ #include "base/callback_helpers.h" #include "base/location.h" #include "base/metrics/histogram.h" +#include "base/metrics/user_metrics_action.h" #include "base/prefs/pref_service.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" @@ -52,6 +53,7 @@ #include "components/signin/core/common/profile_management_switches.h" #include "components/signin/core/common/signin_pref_names.h" #include "content/public/browser/storage_partition.h" +#include "content/public/browser/user_metrics.h" #include "content/public/browser/web_ui.h" #include "google_apis/gaia/gaia_auth_fetcher.h" #include "google_apis/gaia/gaia_auth_util.h" @@ -147,6 +149,8 @@ const std::string& last_email, const std::string& email, Callback callback) { + content::RecordAction( + base::UserMetricsAction("Signin_Show_ImportDataPrompt")); TabModalConfirmDialog::Create( new ConfirmEmailDialogDelegate(contents, last_email, email, callback), contents); @@ -399,6 +403,8 @@ profile_, chrome::GetActiveDesktop()); switch (action) { case InlineSigninHelper::CREATE_NEW_USER: + content::RecordAction( + base::UserMetricsAction("Signin_ImportDataPrompt_DontImport")); if (handler_) { handler_->SyncStarterCallback( OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); @@ -407,10 +413,14 @@ std::string(chrome::kCreateProfileSubPage)); break; case InlineSigninHelper::START_SYNC: + content::RecordAction( + base::UserMetricsAction("Signin_ImportDataPrompt_ImportData")); CreateSyncStarter(browser, web_contents, current_url_, GURL(), refresh_token, start_mode, confirmation_required); break; case InlineSigninHelper::CLOSE: + content::RecordAction( + base::UserMetricsAction("Signin_ImportDataPrompt_Cancel")); if (handler_) { handler_->SyncStarterCallback( OneClickSigninSyncStarter::SYNC_SETUP_FAILURE);
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc index 6a2afdef..0894088 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_tab_helper.h" +#include "chrome/browser/ui/webui/metrics_handler.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" @@ -101,6 +102,8 @@ #else web_ui->AddMessageHandler(new InlineLoginHandlerImpl()); #endif + web_ui->AddMessageHandler(new MetricsHandler()); + content::WebContents* contents = web_ui->GetWebContents(); // Required for intercepting extension function calls when the page is loaded // in a bubble (not a full tab, thus tab helpers are not registered
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index d8c21a9b..971ee9f 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp
@@ -567,7 +567,6 @@ '../components/components.gyp:signin_core_browser_java', '../components/components.gyp:variations_java', '../components/components.gyp:web_contents_delegate_android_java', - '../components/components.gyp:web_restriction_java', '../components/components_strings.gyp:components_strings', '../content/content.gyp:content_java', '../media/media.gyp:media_java',
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 2dbcc499..7de8592 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi
@@ -1452,13 +1452,15 @@ 'browser/enhanced_bookmarks/enhanced_bookmark_model_factory.cc', 'browser/enhanced_bookmarks/enhanced_bookmark_model_factory.h', ], - 'chrome_browser_bookmark_android_sources': [ + 'chrome_browser_offline_pages_sources': [ 'browser/android/offline_pages/offline_page_bridge.cc', 'browser/android/offline_pages/offline_page_bridge.h', 'browser/android/offline_pages/offline_page_mhtml_archiver.cc', 'browser/android/offline_pages/offline_page_mhtml_archiver.h', 'browser/android/offline_pages/offline_page_model_factory.cc', 'browser/android/offline_pages/offline_page_model_factory.h', + 'browser/android/offline_pages/offline_page_utils.cc', + 'browser/android/offline_pages/offline_page_utils.h', ], 'chrome_browser_browser_process_sources': [ 'browser/browser_process.cc', @@ -1892,7 +1894,6 @@ 'android/java/src/org/chromium/chrome/browser/signin/SigninManager.java', 'android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java', 'android/java/src/org/chromium/chrome/browser/spellchecker/SpellCheckerSessionBridge.java', - 'android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java', 'android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java', 'android/java/src/org/chromium/chrome/browser/tab/Tab.java', 'android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java', @@ -2862,8 +2863,6 @@ 'browser/supervised_user/supervised_user_bookmarks_handler.h', 'browser/supervised_user/supervised_user_constants.cc', 'browser/supervised_user/supervised_user_constants.h', - 'browser/supervised_user/supervised_user_content_provider_android.cc', - 'browser/supervised_user/supervised_user_content_provider_android.h', 'browser/supervised_user/supervised_user_interstitial.cc', 'browser/supervised_user/supervised_user_interstitial.h', 'browser/supervised_user/supervised_user_navigation_observer.cc', @@ -3195,7 +3194,7 @@ # transitively via the common target because the proto sources need to # be generated before code in this target can start building. '../components/components.gyp:variations', - '../components/components.gyp:variations_http_provider', + '../components/components.gyp:variations_net', '../components/components.gyp:variations_service', '../components/components.gyp:webdata_common', '../components/components.gyp:webdata_services', @@ -3754,7 +3753,7 @@ ], 'sources': [ '<@(chrome_browser_android_java_ui_sources)', - '<@(chrome_browser_bookmark_android_sources)', + '<@(chrome_browser_offline_pages_sources)', '<@(chrome_browser_sync_android_java_ui_sources)', '<@(chrome_browser_supervised_user_android_java_ui_sources)', '<@(chrome_browser_ssl_android_java_ui_sources)',
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index ff74e432..d75c5b8 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi
@@ -1132,7 +1132,7 @@ # transitively via the common target because the proto sources need to # be generated before code in this target can start building. '../components/components.gyp:variations', - '../components/components.gyp:variations_http_provider', + '../components/components.gyp:variations_net', '../components/components.gyp:wallpaper', '../components/components.gyp:wifi_sync', '../components/components_strings.gyp:components_strings',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index ee79611..0e9f510 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -1692,8 +1692,6 @@ 'browser/ui/search/instant_controller.h', 'browser/ui/search/search_delegate.cc', 'browser/ui/search/search_delegate.h', - 'browser/ui/search/search_ui.cc', - 'browser/ui/search/search_ui.h', 'browser/ui/search_engines/search_engine_tab_helper_delegate.cc', 'browser/ui/search_engines/search_engine_tab_helper_delegate.h', 'browser/ui/settings_window_manager.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 3228b89..e3a7546 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -256,197 +256,6 @@ 'browser/ui/bookmarks/bookmark_ui_utils_desktop_unittest.cc', 'browser/ui/bookmarks/recently_used_folders_combo_model_unittest.cc', 'browser/ui/chrome_select_file_policy_unittest.cc', - # It is safe to list */cocoa/* files in the "common" file list - # without an explicit exclusion since gyp is smart enough to - # exclude them from non-Mac builds. - 'browser/ui/cocoa/accelerators_cocoa_unittest.mm', - 'browser/ui/cocoa/animatable_image_unittest.mm', - 'browser/ui/cocoa/animatable_view_unittest.mm', - 'browser/ui/cocoa/app_menu/app_menu_button_cell_unittest.mm', - 'browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm', - 'browser/ui/cocoa/app_menu/menu_tracked_root_view_unittest.mm', - 'browser/ui/cocoa/applescript/apple_event_util_unittest.mm', - 'browser/ui/cocoa/applescript/bookmark_applescript_utils_unittest.h', - 'browser/ui/cocoa/applescript/bookmark_applescript_utils_unittest.mm', - 'browser/ui/cocoa/applescript/bookmark_folder_applescript_unittest.mm', - 'browser/ui/cocoa/applescript/bookmark_item_applescript_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_bubble_controller_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_details_container_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_main_container_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_notification_container_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_notification_controller_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_pop_up_button_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_section_container_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_section_view_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_suggestion_container_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_textfield_unittest.mm', - 'browser/ui/cocoa/autofill/autofill_tooltip_controller_unittest.mm', - 'browser/ui/cocoa/autofill/down_arrow_popup_menu_cell_unittest.mm', - 'browser/ui/cocoa/autofill/layout_view_unittest.mm', - 'browser/ui/cocoa/autofill/password_generation_popup_view_cocoa_unittest.mm', - 'browser/ui/cocoa/autofill/save_card_bubble_view_unittest.mm', - 'browser/ui/cocoa/autofill/simple_grid_layout_unittest.mm', - 'browser/ui/cocoa/background_gradient_view_unittest.mm', - 'browser/ui/cocoa/base_bubble_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_bridge_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_button_cell_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_view_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_window_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_unittest_helper.h', - 'browser/ui/cocoa/bookmarks/bookmark_bar_unittest_helper.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_button_cell_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_button_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_folder_target_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm', - 'browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell_unittest.mm', - 'browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm', - 'browser/ui/cocoa/browser/zoom_bubble_controller_unittest.mm', - 'browser/ui/cocoa/browser_window_cocoa_unittest.mm', - 'browser/ui/cocoa/browser_window_controller_unittest.mm', - 'browser/ui/cocoa/browser_window_layout_unittest.mm', - 'browser/ui/cocoa/bubble_view_unittest.mm', - 'browser/ui/cocoa/chrome_browser_window_unittest.mm', - 'browser/ui/cocoa/clickhold_button_cell_unittest.mm', - 'browser/ui/cocoa/cocoa_profile_test.h', - 'browser/ui/cocoa/cocoa_profile_test.mm', - 'browser/ui/cocoa/cocoa_test_helper.h', - 'browser/ui/cocoa/cocoa_test_helper.mm', - 'browser/ui/cocoa/confirm_bubble_controller_unittest.mm', - 'browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm', - 'browser/ui/cocoa/constrained_window/constrained_window_alert_unittest.mm', - 'browser/ui/cocoa/constrained_window/constrained_window_button_unittest.mm', - 'browser/ui/cocoa/constrained_window/constrained_window_custom_window_unittest.mm', - 'browser/ui/cocoa/constrained_window/constrained_window_sheet_controller_unittest.mm', - 'browser/ui/cocoa/content_settings/collected_cookies_mac_unittest.mm', - 'browser/ui/cocoa/content_settings/cookie_details_unittest.mm', - 'browser/ui/cocoa/content_settings/cookie_details_view_controller_unittest.mm', - 'browser/ui/cocoa/custom_frame_view_unittest.mm', - 'browser/ui/cocoa/download/download_item_button_unittest.mm', - 'browser/ui/cocoa/download/download_item_cell_unittest.mm', - 'browser/ui/cocoa/download/download_item_controller_unittest.mm', - 'browser/ui/cocoa/download/download_shelf_controller_unittest.mm', - 'browser/ui/cocoa/download/download_shelf_mac_unittest.mm', - 'browser/ui/cocoa/download/download_shelf_view_cocoa_unittest.mm', - 'browser/ui/cocoa/download/download_util_mac_unittest.mm', - 'browser/ui/cocoa/draggable_button_unittest.mm', - 'browser/ui/cocoa/exclusive_access_bubble_window_controller_unittest.mm', - 'browser/ui/cocoa/extensions/browser_actions_container_view_unittest.mm', - 'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h', - 'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm', - 'browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm', - 'browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm', - 'browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm', - 'browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac_unittest.mm', - 'browser/ui/cocoa/find_bar/find_bar_bridge_unittest.mm', - 'browser/ui/cocoa/find_bar/find_bar_cocoa_controller_unittest.mm', - 'browser/ui/cocoa/find_bar/find_bar_text_field_cell_unittest.mm', - 'browser/ui/cocoa/find_bar/find_bar_text_field_unittest.mm', - 'browser/ui/cocoa/find_bar/find_bar_view_unittest.mm', - 'browser/ui/cocoa/find_pasteboard_unittest.mm', - 'browser/ui/cocoa/first_run_bubble_controller_unittest.mm', - 'browser/ui/cocoa/floating_bar_backing_view_unittest.mm', - 'browser/ui/cocoa/framed_browser_window_unittest.mm', - 'browser/ui/cocoa/fullscreen_window_unittest.mm', - 'browser/ui/cocoa/gradient_button_cell_unittest.mm', - 'browser/ui/cocoa/history_menu_bridge_unittest.mm', - 'browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm', - 'browser/ui/cocoa/history_overlay_controller_unittest.mm', - 'browser/ui/cocoa/hover_close_button_unittest.mm', - 'browser/ui/cocoa/hung_renderer_controller_unittest.mm', - 'browser/ui/cocoa/image_button_cell_unittest.mm', - 'browser/ui/cocoa/info_bubble_view_unittest.mm', - 'browser/ui/cocoa/info_bubble_window_unittest.mm', - 'browser/ui/cocoa/infobars/confirm_infobar_controller_unittest.mm', - 'browser/ui/cocoa/infobars/infobar_container_controller_unittest.mm', - 'browser/ui/cocoa/infobars/infobar_gradient_view_unittest.mm', - 'browser/ui/cocoa/infobars/mock_confirm_infobar_delegate.cc', - 'browser/ui/cocoa/infobars/mock_confirm_infobar_delegate.h', - 'browser/ui/cocoa/infobars/translate_infobar_unittest.mm', - 'browser/ui/cocoa/location_bar/autocomplete_text_field_cell_unittest.mm', - 'browser/ui/cocoa/location_bar/autocomplete_text_field_editor_unittest.mm', - 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm', - 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest_helper.mm', - 'browser/ui/cocoa/location_bar/ev_bubble_decoration_unittest.mm', - 'browser/ui/cocoa/location_bar/image_decoration_unittest.mm', - 'browser/ui/cocoa/location_bar/keyword_hint_decoration_unittest.mm', - 'browser/ui/cocoa/location_bar/manage_passwords_decoration_unittest.mm', - 'browser/ui/cocoa/location_bar/selected_keyword_decoration_unittest.mm', - 'browser/ui/cocoa/location_bar/zoom_decoration_unittest.mm', - 'browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm', - 'browser/ui/cocoa/menu_button_unittest.mm', - 'browser/ui/cocoa/nsmenuitem_additions_unittest.mm', - 'browser/ui/cocoa/omnibox/omnibox_popup_cell_unittest.mm', - 'browser/ui/cocoa/omnibox/omnibox_popup_matrix_unittest.mm', - 'browser/ui/cocoa/omnibox/omnibox_popup_separator_view_unittest.mm', - 'browser/ui/cocoa/omnibox/omnibox_popup_view_mac_unittest.mm', - 'browser/ui/cocoa/omnibox/omnibox_view_mac_unittest.mm', - 'browser/ui/cocoa/one_click_signin_bubble_controller_unittest.mm', - 'browser/ui/cocoa/panels/panel_cocoa_unittest.mm', - 'browser/ui/cocoa/passwords/account_chooser_view_controller_unittest.mm', - 'browser/ui/cocoa/passwords/base_passwords_controller_test.h', - 'browser/ui/cocoa/passwords/base_passwords_controller_test.mm', - 'browser/ui/cocoa/passwords/confirmation_password_saved_view_controller_unittest.mm', - 'browser/ui/cocoa/passwords/credential_item_view_unittest.mm', - 'browser/ui/cocoa/passwords/manage_passwords_view_controller_unittest.mm', - 'browser/ui/cocoa/passwords/passwords_bubble_cocoa_unittest.mm', - 'browser/ui/cocoa/passwords/passwords_bubble_controller_unittest.mm', - 'browser/ui/cocoa/passwords/passwords_list_view_controller_unittest.mm', - 'browser/ui/cocoa/passwords/save_pending_password_view_controller_unittest.mm', - 'browser/ui/cocoa/passwords/update_pending_password_view_controller_unittest.mm', - 'browser/ui/cocoa/profiles/avatar_button_controller_unittest.mm', - 'browser/ui/cocoa/profiles/avatar_button_unittest.mm', - 'browser/ui/cocoa/profiles/avatar_icon_controller_unittest.mm', - 'browser/ui/cocoa/profiles/avatar_label_button_unittest.mm', - 'browser/ui/cocoa/profiles/avatar_menu_bubble_controller_unittest.mm', - 'browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm', - 'browser/ui/cocoa/profiles/profile_menu_controller_unittest.mm', - 'browser/ui/cocoa/profiles/user_manager_mac_unittest.mm', - 'browser/ui/cocoa/run_loop_testing_unittest.mm', - 'browser/ui/cocoa/screen_capture_notification_ui_cocoa_unittest.mm', - 'browser/ui/cocoa/spinner_view_unittest.mm', - 'browser/ui/cocoa/sprite_view_unittest.mm', - 'browser/ui/cocoa/status_bubble_mac_unittest.mm', - 'browser/ui/cocoa/status_icons/status_icon_mac_unittest.mm', - 'browser/ui/cocoa/styled_text_field_cell_unittest.mm', - 'browser/ui/cocoa/styled_text_field_test_helper.h', - 'browser/ui/cocoa/styled_text_field_test_helper.mm', - 'browser/ui/cocoa/styled_text_field_unittest.mm', - 'browser/ui/cocoa/tab_contents/sad_tab_controller_unittest.mm', - 'browser/ui/cocoa/tab_contents/sad_tab_view_cocoa_unittest.mm', - 'browser/ui/cocoa/table_row_nsimage_cache_unittest.mm', - 'browser/ui/cocoa/tabs/media_indicator_button_cocoa_unittest.mm', - 'browser/ui/cocoa/tabs/tab_controller_unittest.mm', - 'browser/ui/cocoa/tabs/tab_strip_controller_unittest.mm', - 'browser/ui/cocoa/tabs/tab_strip_view_unittest.mm', - 'browser/ui/cocoa/tabs/tab_view_unittest.mm', - 'browser/ui/cocoa/task_manager_mac_unittest.mm', - 'browser/ui/cocoa/toolbar/app_toolbar_button_cell_unittest.mm', - 'browser/ui/cocoa/toolbar/reload_button_unittest.mm', - 'browser/ui/cocoa/toolbar/toolbar_button_unittest.mm', - 'browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm', - 'browser/ui/cocoa/toolbar/toolbar_view_unittest.mm', - 'browser/ui/cocoa/translate/translate_bubble_controller_unittest.mm', - 'browser/ui/cocoa/validation_message_bubble_controller_unittest.mm', - 'browser/ui/cocoa/vertical_gradient_view_unittest.mm', - 'browser/ui/cocoa/view_resizer_pong.h', - 'browser/ui/cocoa/view_resizer_pong.mm', - 'browser/ui/cocoa/web_dialog_window_controller_unittest.mm', - 'browser/ui/cocoa/website_settings/permission_bubble_controller_unittest.mm', - 'browser/ui/cocoa/website_settings/permission_selector_button_unittest.mm', - 'browser/ui/cocoa/website_settings/website_settings_bubble_controller_unittest.mm', - 'browser/ui/cocoa/window_size_autosaver_unittest.mm', 'browser/ui/find_bar/find_backend_unittest.cc', 'browser/ui/login/login_prompt_unittest.cc', 'browser/ui/passwords/manage_passwords_state_unittest.cc', @@ -1341,6 +1150,197 @@ 'browser/profiles/profile_list_desktop_unittest.cc', 'browser/shell_integration_linux_unittest.cc', ], + # Tests corresponding to the files in chrome_browser_ui_cocoa_sources. + # Built on Mac, except when mac_views_browser==1. + 'chrome_unit_tests_cocoa_sources': [ + 'browser/ui/cocoa/accelerators_cocoa_unittest.mm', + 'browser/ui/cocoa/animatable_image_unittest.mm', + 'browser/ui/cocoa/animatable_view_unittest.mm', + 'browser/ui/cocoa/app_menu/app_menu_button_cell_unittest.mm', + 'browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm', + 'browser/ui/cocoa/app_menu/menu_tracked_root_view_unittest.mm', + 'browser/ui/cocoa/applescript/apple_event_util_unittest.mm', + 'browser/ui/cocoa/applescript/bookmark_applescript_utils_unittest.h', + 'browser/ui/cocoa/applescript/bookmark_applescript_utils_unittest.mm', + 'browser/ui/cocoa/applescript/bookmark_folder_applescript_unittest.mm', + 'browser/ui/cocoa/applescript/bookmark_item_applescript_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_bubble_controller_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_details_container_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_main_container_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_notification_container_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_notification_controller_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_pop_up_button_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_section_container_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_section_view_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_suggestion_container_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_textfield_unittest.mm', + 'browser/ui/cocoa/autofill/autofill_tooltip_controller_unittest.mm', + 'browser/ui/cocoa/autofill/down_arrow_popup_menu_cell_unittest.mm', + 'browser/ui/cocoa/autofill/layout_view_unittest.mm', + 'browser/ui/cocoa/autofill/new_credit_card_bubble_cocoa_unittest.mm', + 'browser/ui/cocoa/autofill/password_generation_popup_view_cocoa_unittest.mm', + 'browser/ui/cocoa/autofill/save_card_bubble_view_unittest.mm', + 'browser/ui/cocoa/autofill/simple_grid_layout_unittest.mm', + 'browser/ui/cocoa/background_gradient_view_unittest.mm', + 'browser/ui/cocoa/base_bubble_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_bridge_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_button_cell_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_view_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_folder_window_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_unittest_helper.h', + 'browser/ui/cocoa/bookmarks/bookmark_bar_unittest_helper.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_button_cell_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_button_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_folder_target_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm', + 'browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell_unittest.mm', + 'browser/ui/cocoa/browser_window_cocoa_unittest.mm', + 'browser/ui/cocoa/browser_window_controller_unittest.mm', + 'browser/ui/cocoa/browser_window_layout_unittest.mm', + 'browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm', + 'browser/ui/cocoa/browser/zoom_bubble_controller_unittest.mm', + 'browser/ui/cocoa/bubble_view_unittest.mm', + 'browser/ui/cocoa/chrome_browser_window_unittest.mm', + 'browser/ui/cocoa/clickhold_button_cell_unittest.mm', + 'browser/ui/cocoa/cocoa_profile_test.h', + 'browser/ui/cocoa/cocoa_profile_test.mm', + 'browser/ui/cocoa/confirm_bubble_controller_unittest.mm', + 'browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm', + 'browser/ui/cocoa/constrained_window/constrained_window_alert_unittest.mm', + 'browser/ui/cocoa/constrained_window/constrained_window_button_unittest.mm', + 'browser/ui/cocoa/constrained_window/constrained_window_custom_window_unittest.mm', + 'browser/ui/cocoa/constrained_window/constrained_window_sheet_controller_unittest.mm', + 'browser/ui/cocoa/content_settings/collected_cookies_mac_unittest.mm', + 'browser/ui/cocoa/content_settings/cookie_details_unittest.mm', + 'browser/ui/cocoa/content_settings/cookie_details_view_controller_unittest.mm', + 'browser/ui/cocoa/custom_frame_view_unittest.mm', + 'browser/ui/cocoa/download/download_item_button_unittest.mm', + 'browser/ui/cocoa/download/download_item_cell_unittest.mm', + 'browser/ui/cocoa/download/download_item_controller_unittest.mm', + 'browser/ui/cocoa/download/download_shelf_controller_unittest.mm', + 'browser/ui/cocoa/download/download_shelf_mac_unittest.mm', + 'browser/ui/cocoa/download/download_shelf_view_cocoa_unittest.mm', + 'browser/ui/cocoa/download/download_util_mac_unittest.mm', + 'browser/ui/cocoa/draggable_button_unittest.mm', + 'browser/ui/cocoa/exclusive_access_bubble_window_controller_unittest.mm', + 'browser/ui/cocoa/extensions/browser_actions_container_view_unittest.mm', + 'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h', + 'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm', + 'browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm', + 'browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm', + 'browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm', + 'browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac_unittest.mm', + 'browser/ui/cocoa/find_bar/find_bar_bridge_unittest.mm', + 'browser/ui/cocoa/find_bar/find_bar_cocoa_controller_unittest.mm', + 'browser/ui/cocoa/find_bar/find_bar_text_field_cell_unittest.mm', + 'browser/ui/cocoa/find_bar/find_bar_text_field_unittest.mm', + 'browser/ui/cocoa/find_bar/find_bar_view_unittest.mm', + 'browser/ui/cocoa/find_pasteboard_unittest.mm', + 'browser/ui/cocoa/first_run_bubble_controller_unittest.mm', + 'browser/ui/cocoa/floating_bar_backing_view_unittest.mm', + 'browser/ui/cocoa/framed_browser_window_unittest.mm', + 'browser/ui/cocoa/fullscreen_window_unittest.mm', + 'browser/ui/cocoa/gradient_button_cell_unittest.mm', + 'browser/ui/cocoa/history_menu_bridge_unittest.mm', + 'browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm', + 'browser/ui/cocoa/history_overlay_controller_unittest.mm', + 'browser/ui/cocoa/hover_close_button_unittest.mm', + 'browser/ui/cocoa/hung_renderer_controller_unittest.mm', + 'browser/ui/cocoa/image_button_cell_unittest.mm', + 'browser/ui/cocoa/info_bubble_view_unittest.mm', + 'browser/ui/cocoa/info_bubble_window_unittest.mm', + 'browser/ui/cocoa/infobars/confirm_infobar_controller_unittest.mm', + 'browser/ui/cocoa/infobars/infobar_container_controller_unittest.mm', + 'browser/ui/cocoa/infobars/infobar_gradient_view_unittest.mm', + 'browser/ui/cocoa/infobars/mock_confirm_infobar_delegate.cc', + 'browser/ui/cocoa/infobars/mock_confirm_infobar_delegate.h', + 'browser/ui/cocoa/infobars/translate_infobar_unittest.mm', + 'browser/ui/cocoa/location_bar/autocomplete_text_field_cell_unittest.mm', + 'browser/ui/cocoa/location_bar/autocomplete_text_field_editor_unittest.mm', + 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest_helper.mm', + 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm', + 'browser/ui/cocoa/location_bar/ev_bubble_decoration_unittest.mm', + 'browser/ui/cocoa/location_bar/image_decoration_unittest.mm', + 'browser/ui/cocoa/location_bar/keyword_hint_decoration_unittest.mm', + 'browser/ui/cocoa/location_bar/manage_passwords_decoration_unittest.mm', + 'browser/ui/cocoa/location_bar/selected_keyword_decoration_unittest.mm', + 'browser/ui/cocoa/location_bar/zoom_decoration_unittest.mm', + 'browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm', + 'browser/ui/cocoa/menu_button_unittest.mm', + 'browser/ui/cocoa/nsmenuitem_additions_unittest.mm', + 'browser/ui/cocoa/omnibox/omnibox_popup_cell_unittest.mm', + 'browser/ui/cocoa/omnibox/omnibox_popup_matrix_unittest.mm', + 'browser/ui/cocoa/omnibox/omnibox_popup_separator_view_unittest.mm', + 'browser/ui/cocoa/omnibox/omnibox_popup_view_mac_unittest.mm', + 'browser/ui/cocoa/omnibox/omnibox_view_mac_unittest.mm', + 'browser/ui/cocoa/one_click_signin_bubble_controller_unittest.mm', + 'browser/ui/cocoa/panels/panel_cocoa_unittest.mm', + 'browser/ui/cocoa/passwords/account_chooser_view_controller_unittest.mm', + 'browser/ui/cocoa/passwords/base_passwords_controller_test.h', + 'browser/ui/cocoa/passwords/base_passwords_controller_test.mm', + 'browser/ui/cocoa/passwords/confirmation_password_saved_view_controller_unittest.mm', + 'browser/ui/cocoa/passwords/credential_item_view_unittest.mm', + 'browser/ui/cocoa/passwords/manage_passwords_view_controller_unittest.mm', + 'browser/ui/cocoa/passwords/passwords_bubble_cocoa_unittest.mm', + 'browser/ui/cocoa/passwords/passwords_bubble_controller_unittest.mm', + 'browser/ui/cocoa/passwords/passwords_list_view_controller_unittest.mm', + 'browser/ui/cocoa/passwords/save_pending_password_view_controller_unittest.mm', + 'browser/ui/cocoa/passwords/update_pending_password_view_controller_unittest.mm', + 'browser/ui/cocoa/profiles/avatar_button_controller_unittest.mm', + 'browser/ui/cocoa/profiles/avatar_button_unittest.mm', + 'browser/ui/cocoa/profiles/avatar_icon_controller_unittest.mm', + 'browser/ui/cocoa/profiles/avatar_label_button_unittest.mm', + 'browser/ui/cocoa/profiles/avatar_menu_bubble_controller_unittest.mm', + 'browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm', + 'browser/ui/cocoa/profiles/profile_menu_controller_unittest.mm', + 'browser/ui/cocoa/profiles/user_manager_mac_unittest.mm', + 'browser/ui/cocoa/run_loop_testing_unittest.mm', + 'browser/ui/cocoa/screen_capture_notification_ui_cocoa_unittest.mm', + 'browser/ui/cocoa/spinner_view_unittest.mm', + 'browser/ui/cocoa/sprite_view_unittest.mm', + 'browser/ui/cocoa/status_bubble_mac_unittest.mm', + 'browser/ui/cocoa/status_icons/status_icon_mac_unittest.mm', + 'browser/ui/cocoa/styled_text_field_cell_unittest.mm', + 'browser/ui/cocoa/styled_text_field_test_helper.h', + 'browser/ui/cocoa/styled_text_field_test_helper.mm', + 'browser/ui/cocoa/styled_text_field_unittest.mm', + 'browser/ui/cocoa/tab_contents/sad_tab_controller_unittest.mm', + 'browser/ui/cocoa/tab_contents/sad_tab_view_cocoa_unittest.mm', + 'browser/ui/cocoa/table_row_nsimage_cache_unittest.mm', + 'browser/ui/cocoa/tabs/media_indicator_button_cocoa_unittest.mm', + 'browser/ui/cocoa/tabs/tab_controller_unittest.mm', + 'browser/ui/cocoa/tabs/tab_strip_controller_unittest.mm', + 'browser/ui/cocoa/tabs/tab_strip_view_unittest.mm', + 'browser/ui/cocoa/tabs/tab_view_unittest.mm', + 'browser/ui/cocoa/task_manager_mac_unittest.mm', + 'browser/ui/cocoa/toolbar/app_toolbar_button_cell_unittest.mm', + 'browser/ui/cocoa/toolbar/reload_button_unittest.mm', + 'browser/ui/cocoa/toolbar/toolbar_button_unittest.mm', + 'browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm', + 'browser/ui/cocoa/toolbar/toolbar_view_unittest.mm', + 'browser/ui/cocoa/translate/translate_bubble_controller_unittest.mm', + 'browser/ui/cocoa/validation_message_bubble_controller_unittest.mm', + 'browser/ui/cocoa/vertical_gradient_view_unittest.mm', + 'browser/ui/cocoa/view_resizer_pong.h', + 'browser/ui/cocoa/view_resizer_pong.mm', + 'browser/ui/cocoa/web_dialog_window_controller_unittest.mm', + 'browser/ui/cocoa/website_settings/permission_bubble_controller_unittest.mm', + 'browser/ui/cocoa/website_settings/permission_selector_button_unittest.mm', + 'browser/ui/cocoa/website_settings/website_settings_bubble_controller_unittest.mm', + 'browser/ui/cocoa/window_size_autosaver_unittest.mm', + ], # Cross-platform views unit tests ready for toolkit-views on Mac. # TODO(tapted): Enable toolkit-views unit_tests on Mac when their # respective implementations are linked in. http://crbug.com/412234. @@ -1530,7 +1530,6 @@ 'browser/ui/browser_iterator_unittest.cc', 'browser/ui/browser_unittest.cc', 'browser/ui/chrome_bubble_manager_unittest.cc', - 'browser/ui/cocoa/autofill/new_credit_card_bubble_cocoa_unittest.mm', 'browser/ui/content_settings/content_setting_bubble_model_unittest.cc', 'browser/ui/content_settings/content_setting_image_model_unittest.cc', 'browser/ui/exclusive_access/fullscreen_controller_state_unittest.cc', @@ -1650,6 +1649,9 @@ # Sources for Offline pages. For now only for Android. 'chrome_unit_tests_offline_pages_sources': [ 'browser/android/offline_pages/offline_page_mhtml_archiver_unittest.cc', + 'browser/android/offline_pages/offline_page_utils_unittest.cc', + 'browser/android/offline_pages/test_offline_page_model_builder.cc', + 'browser/android/offline_pages/test_offline_page_model_builder.h', ], }, 'targets': [ @@ -1681,6 +1683,7 @@ '../components/components.gyp:invalidation_impl', '../components/components.gyp:invalidation_test_support', '../components/components.gyp:metrics_test_support', + '../components/components.gyp:offline_pages_test_support', '../components/components.gyp:omnibox_test_support', '../components/components.gyp:password_manager_core_browser_test_support', '../components/components.gyp:pref_registry_test_support', @@ -1775,6 +1778,8 @@ 'browser/sync/profile_sync_test_util.cc', 'browser/sync/profile_sync_test_util.h', 'browser/ui/browser.h', + 'browser/ui/cocoa/cocoa_test_helper.h', + 'browser/ui/cocoa/cocoa_test_helper.mm', 'browser/ui/cocoa/extensions/browser_action_test_util_mac.mm', 'browser/ui/cocoa/find_bar/find_bar_host_unittest_util_cocoa.mm', 'browser/ui/cocoa/run_loop_testing.h', @@ -2105,9 +2110,19 @@ 'app/chrome_crash_reporter_client_mac.mm', 'app/chrome_main_mac.mm', ], - 'sources!': [ - 'browser/ui/views/toolbar/browser_action_test_util_views.cc', - ] + 'conditions': [ + ['mac_views_browser==1', { + 'sources!': [ + 'browser/ui/cocoa/extensions/browser_action_test_util_mac.mm', + 'browser/ui/cocoa/find_bar/find_bar_host_unittest_util_cocoa.mm', + ], + }, { + 'sources!': [ + 'browser/ui/views/find_bar_host_unittest_util_views.cc', + 'browser/ui/views/toolbar/browser_action_test_util_views.cc', + ], + }], + ], }], ['chromeos==1', { 'dependencies': [ @@ -2314,7 +2329,7 @@ ], 'dependencies': [ '../testing/android/native_test.gyp:native_test_native_code', - '../components/components.gyp:gcm_driver', + '../components/components.gyp:offline_pages', ], }, { # Not Android. 'sources': [ '<@(chrome_unit_tests_non_android_sources)' ], @@ -2603,6 +2618,13 @@ 'renderer/spellchecker/spellcheck_provider_hunspell_unittest.cc', 'tools/convert_dict/convert_dict_unittest.cc', ], + 'conditions': [ + ['mac_views_browser==1', { + # TODO(tapted): Add chrome_unit_tests_views_non_mac_sources here. + }, { + 'sources': [ '<@(chrome_unit_tests_cocoa_sources)' ], + }], + ], # TODO(mark): We really want this for all non-static library targets, # but when we tried to pull it up to the common.gypi level, it broke # other things like the ui and startup tests. *shrug*
diff --git a/chrome/common/extensions/api/common_extension_api_unittest.cc b/chrome/common/extensions/api/common_extension_api_unittest.cc index d306d80..47d89e6 100644 --- a/chrome/common/extensions/api/common_extension_api_unittest.cc +++ b/chrome/common/extensions/api/common_extension_api_unittest.cc
@@ -807,7 +807,7 @@ scoped_ptr<ExtensionAPI> extension_api( ExtensionAPI::CreateWithDefaultConfiguration()); scoped_refptr<Extension> extension = - BuildExtension(ExtensionBuilder().Pass()).Build(); + BuildExtension(ExtensionBuilder()).Build(); for (size_t i = 0; i < arraysize(kTests); ++i) { EXPECT_EQ(kTests[i].expect_success, @@ -826,10 +826,10 @@ ExtensionAPI::CreateWithDefaultConfiguration()); scoped_refptr<Extension> extension = - BuildExtension(ExtensionBuilder().Pass()) - .MergeManifest(DictionaryBuilder().Set("browser_action", - DictionaryBuilder().Pass())) - .Build(); + BuildExtension(ExtensionBuilder()) + .MergeManifest(DictionaryBuilder().Set("browser_action", + DictionaryBuilder().Pass())) + .Build(); EXPECT_TRUE(extension_api->IsAvailable("browserAction", extension.get(),
diff --git a/chrome/installer/mini_installer/exit_code.h b/chrome/installer/mini_installer/exit_code.h index 0235a57..aaf56f6 100644 --- a/chrome/installer/mini_installer/exit_code.h +++ b/chrome/installer/mini_installer/exit_code.h
@@ -16,9 +16,9 @@ // collisions with setup.exe's installer::InstallStatus enum since the two are // surfaced similarly by Google Update. GENERIC_INITIALIZATION_FAILURE = 101, - DEPRECATED_UNPACKING_FAILURE = 102, - DEPRECATED_SETUP_FAILURE = 103, - NO_PREVIOUS_SETUP_PATH = 104, + // DEPRECATED_UNPACKING_FAILURE = 102, + // DEPRECATED_SETUP_FAILURE = 103, + // NO_PREVIOUS_SETUP_PATH = 104, COMMAND_STRING_OVERFLOW = 105, COULD_NOT_CREATE_PROCESS = 106, WAIT_FOR_PROCESS_FAILED = 107, @@ -27,8 +27,8 @@ UNABLE_TO_FIND_REGISTRY_KEY = 110, PATCH_NOT_FOR_INSTALLED_VERSION = 111, UNABLE_TO_EXTRACT_CHROME_ARCHIVE = 112, - UNABLE_TO_EXTRACT_SETUP_B7 = 113, - UNABLE_TO_EXTRACT_SETUP_BN = 114, + UNABLE_TO_EXTRACT_SETUP_BL = 113, + // UNABLE_TO_EXTRACT_SETUP_BN = 114, UNABLE_TO_EXTRACT_SETUP_EXE = 115, UNABLE_TO_EXTRACT_SETUP = 116, UNABLE_TO_SET_DIRECTORY_ACL = 117,
diff --git a/chrome/installer/mini_installer/mini_installer.cc b/chrome/installer/mini_installer/mini_installer.cc index 5f42ae9..000ff3c 100644 --- a/chrome/installer/mini_installer/mini_installer.cc +++ b/chrome/installer/mini_installer/mini_installer.cc
@@ -293,11 +293,8 @@ Context* ctx = reinterpret_cast<Context*>(context); PEResource resource(name, type, module); - if ((!resource.IsValid()) || - (resource.Size() < 1) || - (resource.Size() > kMaxResourceSize)) { + if (!resource.IsValid() || resource.Size() < 1) return FALSE; - } PathString full_path; if (!full_path.assign(ctx->base_path) || @@ -426,62 +423,38 @@ // setup.exe wasn't sent as 'B7', lets see if it was sent as 'BL' // (compressed setup). if (!::EnumResourceNames(module, kLZCResourceType, OnResourceFound, - reinterpret_cast<LONG_PTR>(&context)) && - ::GetLastError() != ERROR_RESOURCE_TYPE_NOT_FOUND) { - return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_B7, ::GetLastError()); + reinterpret_cast<LONG_PTR>(&context))) { + return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_BL, ::GetLastError()); + } + if (setup_path->length() == 0) { + // Neither setup_patch.packed.7z nor setup.ex_ was found. + return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP); } - if (setup_path->length() > 0) { - // Uncompress LZ compressed resource. Setup is packed with 'MSCF' - // as opposed to old DOS way of 'SZDD'. Hence we don't use LZCopy. - bool success = mini_installer::Expand(setup_path->get(), - setup_dest_path.get()); - ::DeleteFile(setup_path->get()); - if (success) { - if (!setup_path->assign(setup_dest_path.get())) { - ::DeleteFile(setup_dest_path.get()); - exit_code = ProcessExitResult(PATH_STRING_OVERFLOW); - } - } else { - exit_code = ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_EXE); + // Uncompress LZ compressed resource. Setup is packed with 'MSCF' + // as opposed to old DOS way of 'SZDD'. Hence we don't use LZCopy. + bool success = + mini_installer::Expand(setup_path->get(), setup_dest_path.get()); + ::DeleteFile(setup_path->get()); + if (success) { + if (!setup_path->assign(setup_dest_path.get())) { + ::DeleteFile(setup_dest_path.get()); + exit_code = ProcessExitResult(PATH_STRING_OVERFLOW); } + } else { + exit_code = ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_EXE); + } #if defined(COMPONENT_BUILD) + if (exit_code.IsSuccess()) { // Extract the (uncompressed) modules required by setup.exe. if (!::EnumResourceNames(module, kBinResourceType, WriteResourceToDirectory, reinterpret_cast<LONG_PTR>(base_path))) { return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP, ::GetLastError()); } + } #endif - return exit_code; - } - - // setup.exe still not found. So finally check if it was sent as 'BN' - // (uncompressed setup). - // TODO(tommi): We don't need BN anymore so let's remove it (and remove - // it from create_installer_archive.py). - if (!::EnumResourceNames(module, kBinResourceType, OnResourceFound, - reinterpret_cast<LONG_PTR>(&context)) && - ::GetLastError() != ERROR_RESOURCE_TYPE_NOT_FOUND) { - return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_BN, ::GetLastError()); - } - - if (setup_path->length() > 0) { - if (setup_path->comparei(setup_dest_path.get()) != 0) { - if (!::MoveFileEx(setup_path->get(), setup_dest_path.get(), - MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING)) { - ::DeleteFile(setup_path->get()); - setup_path->clear(); - } else if (!setup_path->assign(setup_dest_path.get())) { - ::DeleteFile(setup_dest_path.get()); - } - } - } - - if (setup_path->length() == 0) - exit_code = ProcessExitResult(UNABLE_TO_EXTRACT_SETUP); - return exit_code; } @@ -574,7 +547,7 @@ if (TOKEN_OWNER* owner = reinterpret_cast<TOKEN_OWNER*>(::LocalAlloc(LPTR, size))) { if (::GetTokenInformation(token, TokenOwner, owner, size, &size)) - result = ::ConvertSidToStringSid(owner->Owner, sid); + result = !!::ConvertSidToStringSid(owner->Owner, sid); ::LocalFree(owner); } } @@ -605,7 +578,7 @@ L"(A;OIIOCI;GA;;;CO)" // Owner: Full control. L"(A;;FA;;;") && sddl.append(sid) && sddl.append(L")"); if (result) { - result = ::ConvertStringSecurityDescriptorToSecurityDescriptor( + result = !!::ConvertStringSecurityDescriptorToSecurityDescriptor( sddl.get(), SDDL_REVISION_1, sd, NULL); }
diff --git a/chrome/installer/mini_installer/mini_installer_constants.cc b/chrome/installer/mini_installer/mini_installer_constants.cc index f17d448d..e21e433 100644 --- a/chrome/installer/mini_installer/mini_installer_constants.cc +++ b/chrome/installer/mini_installer/mini_installer_constants.cc
@@ -70,7 +70,4 @@ const wchar_t kCleanupRegistryKey[] = L"Software\\Chromium"; #endif -// One gigabyte is the biggest resource size that it can handle. -const size_t kMaxResourceSize = 1024*1024*1024; - } // namespace mini_installer
diff --git a/chrome/installer/mini_installer/mini_installer_constants.h b/chrome/installer/mini_installer/mini_installer_constants.h index 860f07d3..bd80c696 100644 --- a/chrome/installer/mini_installer/mini_installer_constants.h +++ b/chrome/installer/mini_installer/mini_installer_constants.h
@@ -43,8 +43,6 @@ extern const wchar_t kClientStateKeyBase[]; extern const wchar_t kCleanupRegistryKey[]; -extern const size_t kMaxResourceSize; - } // namespace mini_installer #endif // CHROME_INSTALLER_MINI_INSTALLER_MINI_INSTALLER_CONSTANTS_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 3cbbe1e2..9cdb921 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1634,6 +1634,7 @@ "//chrome") deps += [ ":unit_tests_java", + "//components/offline_pages:test_support", "//v8:v8_external_startup_data_assets", ] deps -= [ "//third_party/libaddressinput" ] @@ -1945,6 +1946,15 @@ "//third_party/ocmock", ] + if (mac_views_browser) { + # TODO(tapted): Add chrome_unit_tests_views_non_mac_sources. + } else { + sources += rebase_path( + chrome_tests_unit_gypi_values.chrome_unit_tests_cocoa_sources, + ".", + "//chrome") + } + # TODO(mark): We really want this for all non-static library targets, # but when we tried to pull it up to the common.gypi level, it broke # other things like the ui and startup tests. *shrug*
diff --git a/chrome/test/data/push_messaging/manifest_no_sender_id.json b/chrome/test/data/push_messaging/manifest_no_sender_id.json new file mode 100644 index 0000000..600e5f1 --- /dev/null +++ b/chrome/test/data/push_messaging/manifest_no_sender_id.json
@@ -0,0 +1,3 @@ +{ + "name": "test" +}
diff --git a/chrome/test/data/push_messaging/push_test.js b/chrome/test/data/push_messaging/push_test.js index eb709c8..c1fe6aa 100644 --- a/chrome/test/data/push_messaging/push_test.js +++ b/chrome/test/data/push_messaging/push_test.js
@@ -96,6 +96,16 @@ } } +function swapManifestNoSenderId() { + var element = document.querySelector('link[rel="manifest"]'); + if (element) { + element.href = 'manifest_no_sender_id.json'; + sendResultToTest('sender id removed from manifest'); + } else { + sendResultToTest('unable to find manifest element'); + } +} + function subscribePush() { navigator.serviceWorker.ready.then(function(swRegistration) { return swRegistration.pushManager.subscribe(pushSubscriptionOptions)
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn index 62a69d1..edef316 100644 --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn
@@ -34,10 +34,14 @@ "//components/search_engines", "//components/strings", "//components/url_formatter", + "//content/public/child", "//content/public/common", "//content/public/utility", + "//courgette:courgette_lib", "//media", + "//net:net_with_v8", "//skia", + "//sql", "//third_party/libxml", ] @@ -124,5 +128,10 @@ if (safe_browsing_mode == 1) { sources += rebase_path(gypi_values.chrome_utility_safe_browsing_sources, ".", "..") + deps += [ "//third_party/zlib" ] + } + + if (enable_pdf) { + deps += [ "//pdf" ] } }
diff --git a/components/autofill.gypi b/components/autofill.gypi index a15cd11..5d07ed2b8 100644 --- a/components/autofill.gypi +++ b/components/autofill.gypi
@@ -96,7 +96,7 @@ 'signin_core_browser', 'signin_core_common', 'sync_driver', - 'variations_http_provider', + 'variations_net', 'webdata_common', ], 'sources': [
diff --git a/components/autofill/core/browser/autofill_cc_infobar_delegate.cc b/components/autofill/core/browser/autofill_cc_infobar_delegate.cc index ed2dc0c..c885143 100644 --- a/components/autofill/core/browser/autofill_cc_infobar_delegate.cc +++ b/components/autofill/core/browser/autofill_cc_infobar_delegate.cc
@@ -5,7 +5,6 @@ #include "components/autofill/core/browser/autofill_cc_infobar_delegate.h" #include "base/logging.h" -#include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/core/browser/credit_card.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/common/autofill_constants.h" @@ -20,20 +19,28 @@ namespace autofill { // static -void AutofillCCInfoBarDelegate::Create( +void AutofillCCInfoBarDelegate::CreateForLocalSave( infobars::InfoBarManager* infobar_manager, - AutofillClient* autofill_client, const base::Closure& save_card_callback) { infobar_manager->AddInfoBar( infobar_manager->CreateConfirmInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( - new AutofillCCInfoBarDelegate(autofill_client, save_card_callback)))); + new AutofillCCInfoBarDelegate(false, save_card_callback)))); +} + +// static +void AutofillCCInfoBarDelegate::CreateForUpload( + infobars::InfoBarManager* infobar_manager, + const base::Closure& save_card_callback) { + infobar_manager->AddInfoBar( + infobar_manager->CreateConfirmInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( + new AutofillCCInfoBarDelegate(true, save_card_callback)))); } AutofillCCInfoBarDelegate::AutofillCCInfoBarDelegate( - AutofillClient* autofill_client, + bool upload, const base::Closure& save_card_callback) : ConfirmInfoBarDelegate(), - autofill_client_(autofill_client), + upload_(upload), save_card_callback_(save_card_callback), had_user_interaction_(false) { AutofillMetrics::LogCreditCardInfoBarMetric(AutofillMetrics::INFOBAR_SHOWN); @@ -82,13 +89,16 @@ } base::string16 AutofillCCInfoBarDelegate::GetMessageText() const { - return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_INFOBAR_TEXT); + return l10n_util::GetStringUTF16( + upload_ ? IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD + : IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL); } base::string16 AutofillCCInfoBarDelegate::GetButtonLabel( InfoBarButton button) const { - return l10n_util::GetStringUTF16((button == BUTTON_OK) ? - IDS_AUTOFILL_CC_INFOBAR_ACCEPT : IDS_AUTOFILL_CC_INFOBAR_DENY); + return l10n_util::GetStringUTF16(button == BUTTON_OK + ? IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT + : IDS_AUTOFILL_SAVE_CARD_PROMPT_DENY); } bool AutofillCCInfoBarDelegate::Accept() {
diff --git a/components/autofill/core/browser/autofill_cc_infobar_delegate.h b/components/autofill/core/browser/autofill_cc_infobar_delegate.h index 33e40f8..7283d9c6 100644 --- a/components/autofill/core/browser/autofill_cc_infobar_delegate.h +++ b/components/autofill/core/browser/autofill_cc_infobar_delegate.h
@@ -20,29 +20,27 @@ namespace autofill { -class AutofillClient; - // An InfoBar delegate that enables the user to allow or deny storing credit // card information gathered from a form submission. class AutofillCCInfoBarDelegate : public ConfirmInfoBarDelegate { public: // Creates an autofill credit card infobar and delegate and adds the infobar - // to |infobar_manager|. The |autofill_client| must outlive the infobar. - static void Create(infobars::InfoBarManager* infobar_manager, - AutofillClient* autofill_client, - const base::Closure& save_card_callback); + // to |infobar_manager|. + static void CreateForLocalSave(infobars::InfoBarManager* infobar_manager, + const base::Closure& save_card_callback); + static void CreateForUpload(infobars::InfoBarManager* infobar_manager, + const base::Closure& save_card_callback); #if defined(UNIT_TEST) static scoped_ptr<ConfirmInfoBarDelegate> Create( - AutofillClient* autofill_client, const base::Closure& save_card_callback) { return scoped_ptr<ConfirmInfoBarDelegate>( - new AutofillCCInfoBarDelegate(autofill_client, save_card_callback)); + new AutofillCCInfoBarDelegate(false, save_card_callback)); } #endif private: - AutofillCCInfoBarDelegate(AutofillClient* autofill_client, + AutofillCCInfoBarDelegate(bool upload, const base::Closure& save_card_callback); ~AutofillCCInfoBarDelegate() override; @@ -61,8 +59,7 @@ base::string16 GetLinkText() const override; GURL GetLinkURL() const override; - // Performs navigation to handle any link click. Guaranteed to outlive us. - AutofillClient* const autofill_client_; + bool upload_; // The callback to save credit card if the user accepts the infobar. base::Closure save_card_callback_;
diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc index 59578fec..0b92381 100644 --- a/components/autofill/core/browser/autofill_download_manager.cc +++ b/components/autofill/core/browser/autofill_download_manager.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/location.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/rand_util.h" @@ -20,7 +21,7 @@ #include "components/autofill/core/common/autofill_pref_names.h" #include "components/compression/compression_utils.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "net/base/load_flags.h" #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" @@ -205,7 +206,7 @@ // Add Chrome experiment state and GZIP encoding to the request headers. net::HttpRequestHeaders headers; headers.SetHeaderIfMissing("content-encoding", "gzip"); - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( + variations::AppendVariationHeaders( fetcher->GetOriginalURL(), driver_->IsOffTheRecord(), false, &headers); fetcher->SetExtraRequestHeaders(headers.ToString()); fetcher->Start();
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index 6cdf1a6..352723d 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -168,45 +168,27 @@ Use password for: </message> - <!-- Autofill infobar --> - <message name="IDS_AUTOFILL_CC_INFOBAR_ACCEPT" desc="Text to show for the Autofill credit card request infobar accept button."> + <!-- Autofill save credit card bubble or infobar prompt --> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT" desc="Text to show for the Autofill save credit card prompt accept button. The prompt can be either a bubble or an infobar."> Save </message> - <message name="IDS_AUTOFILL_CC_INFOBAR_DENY" desc="Text to show for the Autofill credit card request infobar deny button."> - Don't save - </message> - <if expr="_google_chrome"> - <message name="IDS_AUTOFILL_CC_INFOBAR_TEXT" desc="Text to show in the Autofill credit card request infobar."> - Do you want Chrome to save this credit card information for completing web forms? - </message> - </if> - <if expr="not _google_chrome"> - <message name="IDS_AUTOFILL_CC_INFOBAR_TEXT" desc="Text to show in the Autofill credit card request infobar."> - Do you want Chromium to save this credit card information for completing web forms? - </message> - </if> - - <!-- Autofill save credit card bubble --> - <message name="IDS_AUTOFILL_SAVE_CARD_BUBBLE_ACCEPT" desc="Text to show for the Autofill save credit card bubble accept button."> - Save - </message> - <message name="IDS_AUTOFILL_SAVE_CARD_BUBBLE_DENY" desc="Text to show for the Autofill save credit card bubble deny button."> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_DENY" desc="Text to show for the Autofill save credit card prompt deny button. The prompt can be either a bubble or an infobar."> No thanks </message> <if expr="_google_chrome"> - <message name="IDS_AUTOFILL_SAVE_CARD_BUBBLE_TITLE_LOCAL" desc="Title text for the Autofill save card bubble when the card is to be saved locally."> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL" desc="Title text for the Autofill save card prompt when the card is to be saved locally. The prompt can be either a bubble or an infobar."> Do you want Chrome to save this card? </message> </if> <if expr="not _google_chrome"> - <message name="IDS_AUTOFILL_SAVE_CARD_BUBBLE_TITLE_LOCAL" desc="Title text for the Autofill save card bubble when the card is to be saved locally."> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL" desc="Title text for the Autofill save card prompt when the card is to be saved locally. The prompt can be either a bubble or an infobar."> Do you want Chromium to save this card? </message> </if> - <message name="IDS_AUTOFILL_SAVE_CARD_BUBBLE_TITLE_TO_CLOUD" desc="Title text for the Autofill save card bubble when the card is to be saved by uploading it to Google Payments."> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD" desc="Title text for the Autofill save card prompt when the card is to be saved by uploading it to Google Payments. The prompt can be either a bubble or an infobar."> Do you want Google to save this card? </message> - <message name="IDS_AUTOFILL_SAVE_CARD_BUBBLE_UPLOAD_EXPLANATION" desc="Explanation of the effect of the Autofill save card bubble when the card is to be saved by uploading it to Google Payments."> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION" desc="Explanation of the effect of the Autofill save card prompt when the card is to be saved by uploading it to Google Payments. The prompt can be either a bubble or an infobar."> Pay quickly on sites and apps across devices using cards you have saved with Google. </message>
diff --git a/components/components.gyp b/components/components.gyp index c83d0aa..a4b3169 100644 --- a/components/components.gyp +++ b/components/components.gyp
@@ -101,7 +101,6 @@ 'version_info.gypi', 'version_ui.gypi', 'web_resource.gypi', - 'web_restriction.gypi', 'webdata.gypi', 'webdata_services.gypi', ],
diff --git a/components/components_tests.gyp b/components/components_tests.gyp index d17b4341..df387a3 100644 --- a/components/components_tests.gyp +++ b/components/components_tests.gyp
@@ -798,11 +798,12 @@ 'variations/entropy_provider_unittest.cc', 'variations/experiment_labels_unittest.cc', 'variations/metrics_util_unittest.cc', - 'variations/net/variations_http_header_provider_unittest.cc', + 'variations/net/variations_http_headers_unittest.cc', 'variations/service/ui_string_overrider_unittest.cc', 'variations/service/variations_service_unittest.cc', 'variations/study_filtering_unittest.cc', 'variations/variations_associated_data_unittest.cc', + 'variations/variations_http_header_provider_unittest.cc', 'variations/variations_request_scheduler_mobile_unittest.cc', 'variations/variations_request_scheduler_unittest.cc', 'variations/variations_seed_processor_unittest.cc', @@ -1090,7 +1091,7 @@ 'components.gyp:user_prefs_tracked', 'components.gyp:user_prefs_tracked_test_support', 'components.gyp:variations', - 'components.gyp:variations_http_provider', + 'components.gyp:variations_net', 'components.gyp:variations_service', 'components.gyp:version_info', 'components.gyp:web_resource', @@ -1628,7 +1629,6 @@ 'components.gyp:invalidation_java', 'components.gyp:policy_java', 'components.gyp:policy_java_test_support', - 'components.gyp:web_restriction_java', '../base/base.gyp:base_java', '../base/base.gyp:base_java_test_support', '../testing/android/junit/junit_test.gyp:junit_test_support', @@ -1637,8 +1637,7 @@ 'main_class': 'org.chromium.testing.local.JunitTestMain', 'src_paths': [ 'invalidation/impl/android/junit/', - 'policy/android/junit/', - 'web_restriction/junit/' + 'policy/android/junit/' ], }, 'includes': [ '../build/host_jar.gypi' ],
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java index 568c4a4..2944da07 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java
@@ -7,7 +7,6 @@ import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.SmallTest; -import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.net.test.FailurePhase; @@ -256,7 +255,6 @@ } } - @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"Cronet"}) public void testNoWriteAfterSyncCancel() throws Exception { @@ -265,7 +263,6 @@ TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener(); String data = "MyBigFunkyData"; - int dataLength = data.length(); int repeatCount = 10000; String mockUrl = MockUrlRequestJobFactory.getMockUrlForData(data, repeatCount);
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java index 0e11cd4c..af922e9 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java
@@ -221,13 +221,12 @@ checkExceptionsAreThrown(urlConnection); } - @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"Cronet"}) @CompareDefaultWithCronet public void testBadScheme() throws Exception { try { - URL url = new URL("flying://goat"); + new URL("flying://goat"); fail(); } catch (MalformedURLException e) { // Expected. @@ -503,7 +502,6 @@ } @SuppressFBWarnings({ - "DLS_DEAD_LOCAL_STORE", "RANGE_ARRAY_OFFSET", "RANGE_ARRAY_LENGTH" }) @@ -512,7 +510,6 @@ @CompareDefaultWithCronet public void testInputStreamBatchReadBoundaryConditions() throws Exception { String testInputString = "this is a very important header"; - byte[] testInputBytes = testInputString.getBytes(); URL url = new URL(NativeTestServer.getEchoHeaderURL("foo")); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
diff --git a/components/feedback.gypi b/components/feedback.gypi index d51592c..4c25308 100644 --- a/components/feedback.gypi +++ b/components/feedback.gypi
@@ -14,7 +14,7 @@ '../third_party/zlib/google/zip.gyp:zip', 'keyed_service_core', 'feedback_proto', - 'components.gyp:variations_http_provider', + 'components.gyp:variations_net', ], 'include_dirs': [ '..',
diff --git a/components/feedback/feedback_uploader_chrome.cc b/components/feedback/feedback_uploader_chrome.cc index aea651f4..fa9951b2 100644 --- a/components/feedback/feedback_uploader_chrome.cc +++ b/components/feedback/feedback_uploader_chrome.cc
@@ -14,7 +14,7 @@ #include "components/feedback/feedback_report.h" #include "components/feedback/feedback_switches.h" #include "components/feedback/feedback_uploader_delegate.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "net/base/load_flags.h" @@ -57,7 +57,7 @@ // Tell feedback server about the variation state of this install. net::HttpRequestHeaders headers; - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( + variations::AppendVariationHeaders( fetcher->GetOriginalURL(), context_->IsOffTheRecord(), false, &headers); fetcher->SetExtraRequestHeaders(headers.ToString());
diff --git a/components/feedback/feedback_uploader_chrome_unittest.cc b/components/feedback/feedback_uploader_chrome_unittest.cc index 810c040d..342e896 100644 --- a/components/feedback/feedback_uploader_chrome_unittest.cc +++ b/components/feedback/feedback_uploader_chrome_unittest.cc
@@ -4,10 +4,12 @@ #include "components/feedback/feedback_uploader_chrome.h" +#include <string> + #include "base/message_loop/message_loop.h" #include "base/metrics/field_trial.h" -#include "components/variations/net/variations_http_header_provider.h" #include "components/variations/variations_associated_data.h" +#include "components/variations/variations_http_header_provider.h" #include "content/public/test/test_browser_context.h" #include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/url_fetcher_delegate.h"
diff --git a/components/keyed_service.gypi b/components/keyed_service.gypi index 43434121..26bfc05 100644 --- a/components/keyed_service.gypi +++ b/components/keyed_service.gypi
@@ -98,8 +98,6 @@ '..', ], 'sources': [ - 'keyed_service/ios/browser_state_context_converter.cc', - 'keyed_service/ios/browser_state_context_converter.h', 'keyed_service/ios/browser_state_dependency_manager.cc', 'keyed_service/ios/browser_state_dependency_manager.h', 'keyed_service/ios/browser_state_keyed_service_factory.cc',
diff --git a/components/keyed_service/core/dependency_manager.cc b/components/keyed_service/core/dependency_manager.cc index 59cc867..4f35244 100644 --- a/components/keyed_service/core/dependency_manager.cc +++ b/components/keyed_service/core/dependency_manager.cc
@@ -44,8 +44,7 @@ for (const auto& dependency_node : construction_order) { KeyedServiceBaseFactory* factory = static_cast<KeyedServiceBaseFactory*>(dependency_node); - base::SupportsUserData* typed_context = factory->GetTypedContext(context); - factory->RegisterPrefsIfNecessaryForContext(typed_context, pref_registry); + factory->RegisterPrefsIfNecessaryForContext(context, pref_registry); } } @@ -67,12 +66,11 @@ for (const auto& dependency_node : construction_order) { KeyedServiceBaseFactory* factory = static_cast<KeyedServiceBaseFactory*>(dependency_node); - base::SupportsUserData* typed_context = factory->GetTypedContext(context); if (is_testing_context && factory->ServiceIsNULLWhileTesting() && - !factory->HasTestingFactory(typed_context)) { - factory->SetEmptyTestingFactory(typed_context); + !factory->HasTestingFactory(context)) { + factory->SetEmptyTestingFactory(context); } else if (factory->ServiceIsCreatedWithContext()) { - factory->CreateServiceNow(typed_context); + factory->CreateServiceNow(context); } } } @@ -91,8 +89,7 @@ for (const auto& dependency_node : destruction_order) { KeyedServiceBaseFactory* factory = static_cast<KeyedServiceBaseFactory*>(dependency_node); - base::SupportsUserData* typed_context = factory->GetTypedContext(context); - factory->ContextShutdown(typed_context); + factory->ContextShutdown(context); } #ifndef NDEBUG @@ -103,8 +100,7 @@ for (const auto& dependency_node : destruction_order) { KeyedServiceBaseFactory* factory = static_cast<KeyedServiceBaseFactory*>(dependency_node); - base::SupportsUserData* typed_context = factory->GetTypedContext(context); - factory->ContextDestroyed(typed_context); + factory->ContextDestroyed(context); } }
diff --git a/components/keyed_service/core/keyed_service_base_factory.cc b/components/keyed_service/core/keyed_service_base_factory.cc index 20ef210..3833d68 100644 --- a/components/keyed_service/core/keyed_service_base_factory.cc +++ b/components/keyed_service/core/keyed_service_base_factory.cc
@@ -72,8 +72,7 @@ user_prefs::PrefRegistrySyncable* KeyedServiceBaseFactory::GetAssociatedPrefRegistry( base::SupportsUserData* context) const { - PrefService* prefs = - user_prefs::UserPrefs::Get(GetContextForDependencyManager(context)); + PrefService* prefs = user_prefs::UserPrefs::Get(context); user_prefs::PrefRegistrySyncable* registry = static_cast<user_prefs::PrefRegistrySyncable*>( prefs->DeprecatedGetPrefRegistry()); @@ -84,14 +83,12 @@ void KeyedServiceBaseFactory::AssertContextWasntDestroyed( base::SupportsUserData* context) const { DCHECK(CalledOnValidThread()); - context = GetContextForDependencyManager(context); dependency_manager_->AssertContextWasntDestroyed(context); } void KeyedServiceBaseFactory::MarkContextLiveForTesting( base::SupportsUserData* context) { DCHECK(CalledOnValidThread()); - context = GetContextForDependencyManager(context); dependency_manager_->MarkContextLiveForTesting(context); } #endif @@ -122,15 +119,3 @@ DCHECK(!ArePreferencesSetOn(context)); registered_preferences_.insert(context); } - -#if defined(OS_IOS) -base::SupportsUserData* KeyedServiceBaseFactory::GetTypedContext( - base::SupportsUserData* context) const { - return context; -} - -base::SupportsUserData* KeyedServiceBaseFactory::GetContextForDependencyManager( - base::SupportsUserData* context) const { - return context; -} -#endif // defined(OS_IOS)
diff --git a/components/keyed_service/core/keyed_service_base_factory.h b/components/keyed_service/core/keyed_service_base_factory.h index a9ea21fe..9e41dcf9 100644 --- a/components/keyed_service/core/keyed_service_base_factory.h +++ b/components/keyed_service/core/keyed_service_base_factory.h
@@ -114,55 +114,6 @@ // Mark context has having preferences registered. void MarkPreferencesSetOn(base::SupportsUserData* context); - // The iOS code downstream used BrowserContextKeyedServiceFactories. The code - // is currently ported to use BrowserStateKeyedServiceFactories instead but - // has to support mixed dependencies to ease the migration — which can then - // be done incrementally. This means that on iOS the DependencyManager can - // reference both type of factories and the context need to be converted to - // the correct typed context. - // - // GetTypedContext()/GetContextForDependencyManager() are there to supports - // the mixed dependencies. On all platform except iOS they are pass-through - // and returns the original object. On iOS, they convert the context to resp. - // web::BrowserState/content::BrowserContext casted as base::SupportsUserData. - // - // TODO(ios): migration is tracked by http://crbug.com/478763 and those two - // methods (and their *Internal implementation) must be removed once migration - // is complete. - - // Returns the correctly typed context for the KeyedServiceFactory (either a - // content::BrowserContext for BrowserContextKeyedServiceFactory or a - // web::BrowserState for a BrowserStateKeyedServiceFactory) when using mixed - // dependency (iOS). Simple pass-through on all other platforms. - // - // TODO(ios): remove this method and its call-sites once iOS only uses - // BrowserStateKeyedServiceFactories, http://crbug.com/478763 -#if defined(OS_IOS) - virtual base::SupportsUserData* GetTypedContext( - base::SupportsUserData* context) const; -#else - base::SupportsUserData* GetTypedContext( - base::SupportsUserData* context) const { - return context; - } -#endif // defined(OS_IOS) - - // Returns the content::BrowserContext associated to |context| for interaction - // with the DependencyManager when using mixed dependency (iOS). Simple pass- - // through on all other platforms. - // - // TODO(ios): remove this method and its call-sites once iOS only uses - // BrowserStateKeyedServiceFactories, http://crbug.com/478763 -#if defined(OS_IOS) - virtual base::SupportsUserData* GetContextForDependencyManager( - base::SupportsUserData* context) const; -#else - base::SupportsUserData* GetContextForDependencyManager( - base::SupportsUserData* context) const { - return context; - } -#endif // defined(OS_IOS) - private: friend class DependencyManager;
diff --git a/components/keyed_service/ios/BUILD.gn b/components/keyed_service/ios/BUILD.gn index 2413c845..2e5638d 100644 --- a/components/keyed_service/ios/BUILD.gn +++ b/components/keyed_service/ios/BUILD.gn
@@ -4,8 +4,6 @@ source_set("ios") { sources = [ - "browser_state_context_converter.cc", - "browser_state_context_converter.h", "browser_state_dependency_manager.cc", "browser_state_dependency_manager.h", "browser_state_keyed_service_factory.cc",
diff --git a/components/keyed_service/ios/browser_state_keyed_service_factory.cc b/components/keyed_service/ios/browser_state_keyed_service_factory.cc index 4588feba..0d46bbd6 100644 --- a/components/keyed_service/ios/browser_state_keyed_service_factory.cc +++ b/components/keyed_service/ios/browser_state_keyed_service_factory.cc
@@ -6,7 +6,6 @@ #include "base/logging.h" #include "components/keyed_service/core/keyed_service.h" -#include "components/keyed_service/ios/browser_state_context_converter.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "ios/web/public/browser_state.h" @@ -28,7 +27,7 @@ BrowserStateKeyedServiceFactory::BrowserStateKeyedServiceFactory( const char* name, - /*BrowserState*/DependencyManager* manager) + BrowserStateDependencyManager* manager) : KeyedServiceFactory(name, manager) { } @@ -85,35 +84,6 @@ return static_cast<web::BrowserState*>(context)->IsOffTheRecord(); } -#if defined(OS_IOS) -base::SupportsUserData* BrowserStateKeyedServiceFactory::GetTypedContext( - base::SupportsUserData* context) const { - if (context) { - BrowserStateContextConverter* context_converter = - BrowserStateContextConverter::GetInstance(); - if (context_converter) { - context = context_converter->GetBrowserStateForContext(context); - DCHECK(context); - } - } - return context; -} - -base::SupportsUserData* -BrowserStateKeyedServiceFactory::GetContextForDependencyManager( - base::SupportsUserData* context) const { - if (context) { - BrowserStateContextConverter* context_converter = - BrowserStateContextConverter::GetInstance(); - if (context_converter) { - context = context_converter->GetBrowserContextForContext(context); - DCHECK(context); - } - } - return context; -} -#endif // defined(OS_IOS) - base::SupportsUserData* BrowserStateKeyedServiceFactory::GetContextToUse( base::SupportsUserData* context) const { return GetBrowserStateToUse(static_cast<web::BrowserState*>(context));
diff --git a/components/keyed_service/ios/browser_state_keyed_service_factory.h b/components/keyed_service/ios/browser_state_keyed_service_factory.h index 10628758..a3fb2b61 100644 --- a/components/keyed_service/ios/browser_state_keyed_service_factory.h +++ b/components/keyed_service/ios/browser_state_keyed_service_factory.h
@@ -58,7 +58,7 @@ // BrowserStateDependencyManager::GetInstance()) { // } BrowserStateKeyedServiceFactory(const char* name, - /*BrowserState*/DependencyManager* manager); + BrowserStateDependencyManager* manager); ~BrowserStateKeyedServiceFactory() override; // Common implementation that maps |context| to some service object. Deals @@ -121,12 +121,6 @@ bool IsOffTheRecord(base::SupportsUserData* context) const final; // KeyedServiceBaseFactory: -#if defined(OS_IOS) - base::SupportsUserData* GetTypedContext( - base::SupportsUserData* context) const override; - base::SupportsUserData* GetContextForDependencyManager( - base::SupportsUserData* context) const override; -#endif // defined(OS_IOS) base::SupportsUserData* GetContextToUse( base::SupportsUserData* context) const final; bool ServiceIsCreatedWithContext() const final;
diff --git a/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.cc b/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.cc index 3de6b2f..a1cb827 100644 --- a/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.cc +++ b/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.cc
@@ -6,7 +6,6 @@ #include "base/logging.h" #include "components/keyed_service/core/refcounted_keyed_service.h" -#include "components/keyed_service/ios/browser_state_context_converter.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "ios/web/public/browser_state.h" @@ -32,7 +31,7 @@ RefcountedBrowserStateKeyedServiceFactory:: RefcountedBrowserStateKeyedServiceFactory( const char* name, - /*BrowserState*/DependencyManager* manager) + BrowserStateDependencyManager* manager) : RefcountedKeyedServiceFactory(name, manager) { } @@ -94,36 +93,6 @@ return static_cast<web::BrowserState*>(context)->IsOffTheRecord(); } -#if defined(OS_IOS) -base::SupportsUserData* -RefcountedBrowserStateKeyedServiceFactory::GetTypedContext( - base::SupportsUserData* context) const { - if (context) { - BrowserStateContextConverter* context_converter = - BrowserStateContextConverter::GetInstance(); - if (context_converter) { - context = context_converter->GetBrowserStateForContext(context); - DCHECK(context); - } - } - return context; -} - -base::SupportsUserData* -RefcountedBrowserStateKeyedServiceFactory::GetContextForDependencyManager( - base::SupportsUserData* context) const { - if (context) { - BrowserStateContextConverter* context_converter = - BrowserStateContextConverter::GetInstance(); - if (context_converter) { - context = context_converter->GetBrowserContextForContext(context); - DCHECK(context); - } - } - return context; -} -#endif // defined(OS_IOS) - base::SupportsUserData* RefcountedBrowserStateKeyedServiceFactory::GetContextToUse( base::SupportsUserData* context) const {
diff --git a/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.h b/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.h index e5fe8477..9ae5ae1 100644 --- a/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.h +++ b/components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.h
@@ -62,7 +62,7 @@ // } RefcountedBrowserStateKeyedServiceFactory( const char* name, - /*BrowserState*/DependencyManager* manager); + BrowserStateDependencyManager* manager); ~RefcountedBrowserStateKeyedServiceFactory() override; // Common implementation that maps |context| to some service object. Deals @@ -126,12 +126,6 @@ bool IsOffTheRecord(base::SupportsUserData* context) const final; // KeyedServiceBaseFactory: -#if defined(OS_IOS) - base::SupportsUserData* GetTypedContext( - base::SupportsUserData* context) const override; - base::SupportsUserData* GetContextForDependencyManager( - base::SupportsUserData* context) const override; -#endif // defined(OS_IOS) base::SupportsUserData* GetContextToUse( base::SupportsUserData* context) const final; bool ServiceIsCreatedWithContext() const final;
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index 55aa9f1..f84deaf 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -242,15 +242,6 @@ } // namespace - -SyntheticTrialGroup::SyntheticTrialGroup(uint32 trial, uint32 group) { - id.name = trial; - id.group = group; -} - -SyntheticTrialGroup::~SyntheticTrialGroup() { -} - // static MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = MetricsService::CLEANLY_SHUTDOWN; @@ -1025,19 +1016,19 @@ } void MetricsService::AddSyntheticTrialObserver( - SyntheticTrialObserver* observer) { + variations::SyntheticTrialObserver* observer) { synthetic_trial_observer_list_.AddObserver(observer); if (!synthetic_trial_groups_.empty()) observer->OnSyntheticTrialsChanged(synthetic_trial_groups_); } void MetricsService::RemoveSyntheticTrialObserver( - SyntheticTrialObserver* observer) { + variations::SyntheticTrialObserver* observer) { synthetic_trial_observer_list_.RemoveObserver(observer); } void MetricsService::RegisterSyntheticFieldTrial( - const SyntheticTrialGroup& trial) { + const variations::SyntheticTrialGroup& trial) { for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) { if (synthetic_trial_groups_[i].id.name == trial.id.name) { if (synthetic_trial_groups_[i].id.group != trial.id.group) { @@ -1049,7 +1040,7 @@ } } - SyntheticTrialGroup trial_group = trial; + variations::SyntheticTrialGroup trial_group = trial; trial_group.start_time = base::TimeTicks::Now(); synthetic_trial_groups_.push_back(trial_group); NotifySyntheticTrialObservers(); @@ -1072,7 +1063,8 @@ } void MetricsService::NotifySyntheticTrialObservers() { - FOR_EACH_OBSERVER(SyntheticTrialObserver, synthetic_trial_observer_list_, + FOR_EACH_OBSERVER(variations::SyntheticTrialObserver, + synthetic_trial_observer_list_, OnSyntheticTrialsChanged(synthetic_trial_groups_)); }
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h index 2345083..0939c139 100644 --- a/components/metrics/metrics_service.h +++ b/components/metrics/metrics_service.h
@@ -28,7 +28,7 @@ #include "components/metrics/metrics_log_manager.h" #include "components/metrics/metrics_provider.h" #include "components/metrics/net/network_metrics_provider.h" -#include "components/variations/active_field_trials.h" +#include "components/variations/synthetic_trials.h" class PrefService; class PrefRegistrySimple; @@ -55,39 +55,6 @@ class MetricsServiceClient; class MetricsStateManager; -// A Field Trial and its selected group, which represent a particular -// Chrome configuration state. For example, the trial name could map to -// a preference name, and the group name could map to a preference value. -struct SyntheticTrialGroup { - public: - ~SyntheticTrialGroup(); - - variations::ActiveGroupId id; - base::TimeTicks start_time; - - private: - // Synthetic field trial users: - friend class MetricsServiceAccessor; - friend class MetricsService; - FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, RegisterSyntheticTrial); - - // This constructor is private specifically so as to control which code is - // able to access it. New code that wishes to use it should be added as a - // friend class. - SyntheticTrialGroup(uint32 trial, uint32 group); -}; - -// Interface class to observe changes to synthetic trials in MetricsService. -class SyntheticTrialObserver { - public: - // Called when the list of synthetic field trial groups has changed. - virtual void OnSyntheticTrialsChanged( - const std::vector<SyntheticTrialGroup>& groups) = 0; - - protected: - virtual ~SyntheticTrialObserver() {} -}; - // See metrics_service.cc for a detailed description. class MetricsService : public base::HistogramFlattener { public: @@ -216,26 +183,17 @@ // This value should be true when process has completed shutdown. static bool UmaMetricsProperlyShutdown(); - // Registers a field trial name and group to be used to annotate a UMA report - // with a particular Chrome configuration state. A UMA report will be - // annotated with this trial group if and only if all events in the report - // were created after the trial is registered. Only one group name may be - // registered at a time for a given trial_name. Only the last group name that - // is registered for a given trial name will be recorded. The values passed - // in must not correspond to any real field trial in the code. - // To use this method, SyntheticTrialGroup should friend your class. - void RegisterSyntheticFieldTrial(const SyntheticTrialGroup& trial_group); - // Public accessor that returns the list of synthetic field trials. It must // only be used for testing. void GetCurrentSyntheticFieldTrialsForTesting( std::vector<variations::ActiveGroupId>* synthetic_trials); // Adds an observer to be notified when the synthetic trials list changes. - void AddSyntheticTrialObserver(SyntheticTrialObserver* observer); + void AddSyntheticTrialObserver(variations::SyntheticTrialObserver* observer); // Removes an existing observer of synthetic trials list changes. - void RemoveSyntheticTrialObserver(SyntheticTrialObserver* observer); + void RemoveSyntheticTrialObserver( + variations::SyntheticTrialObserver* observer); // Register the specified |provider| to provide additional metrics into the // UMA log. Should be called during MetricsService initialization only. @@ -258,6 +216,8 @@ MetricsLogManager* log_manager() { return &log_manager_; } private: + friend class MetricsServiceAccessor; + // The MetricsService has a lifecycle that is stored as a state. // See metrics_service.cc for description of this lifecycle. enum State { @@ -281,7 +241,17 @@ UNSET }; - typedef std::vector<SyntheticTrialGroup> SyntheticTrialGroups; + typedef std::vector<variations::SyntheticTrialGroup> SyntheticTrialGroups; + + // Registers a field trial name and group to be used to annotate a UMA report + // with a particular Chrome configuration state. A UMA report will be + // annotated with this trial group if and only if all events in the report + // were created after the trial is registered. Only one group name may be + // registered at a time for a given trial_name. Only the last group name that + // is registered for a given trial name will be recorded. The values passed + // in must not correspond to any real field trial in the code. + void RegisterSyntheticFieldTrial( + const variations::SyntheticTrialGroup& trial_group); // Calls into the client to initialize some system profile metrics. void StartInitTask(); @@ -489,7 +459,8 @@ SyntheticTrialGroups synthetic_trial_groups_; // List of observers of |synthetic_trial_groups_| changes. - base::ObserverList<SyntheticTrialObserver> synthetic_trial_observer_list_; + base::ObserverList<variations::SyntheticTrialObserver> + synthetic_trial_observer_list_; // Execution phase the browser is in. static ExecutionPhase execution_phase_;
diff --git a/components/metrics/metrics_service_accessor.cc b/components/metrics/metrics_service_accessor.cc index 864dbe5..ce301c9bb 100644 --- a/components/metrics/metrics_service_accessor.cc +++ b/components/metrics/metrics_service_accessor.cc
@@ -62,7 +62,7 @@ if (!metrics_service) return false; - SyntheticTrialGroup trial_group(trial_name_hash, group_name_hash); + variations::SyntheticTrialGroup trial_group(trial_name_hash, group_name_hash); metrics_service->RegisterSyntheticFieldTrial(trial_group); return true; }
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc index b306c9b..e3de5ae 100644 --- a/components/metrics/metrics_service_unittest.cc +++ b/components/metrics/metrics_service_unittest.cc
@@ -315,10 +315,12 @@ MetricsService service(GetMetricsStateManager(), &client, GetLocalState()); // Add two synthetic trials and confirm that they show up in the list. - SyntheticTrialGroup trial1(HashName("TestTrial1"), HashName("Group1")); + variations::SyntheticTrialGroup trial1(HashName("TestTrial1"), + HashName("Group1")); service.RegisterSyntheticFieldTrial(trial1); - SyntheticTrialGroup trial2(HashName("TestTrial2"), HashName("Group2")); + variations::SyntheticTrialGroup trial2(HashName("TestTrial2"), + HashName("Group2")); service.RegisterSyntheticFieldTrial(trial2); // Ensure that time has advanced by at least a tick before proceeding. WaitUntilTimeChanges(base::TimeTicks::Now()); @@ -345,14 +347,16 @@ WaitUntilTimeChanges(begin_log_time); // Change the group for the first trial after the log started. - SyntheticTrialGroup trial3(HashName("TestTrial1"), HashName("Group2")); + variations::SyntheticTrialGroup trial3(HashName("TestTrial1"), + HashName("Group2")); service.RegisterSyntheticFieldTrial(trial3); service.GetSyntheticFieldTrialsOlderThan(begin_log_time, &synthetic_trials); EXPECT_EQ(1U, synthetic_trials.size()); EXPECT_TRUE(HasSyntheticTrial(synthetic_trials, "TestTrial2", "Group2")); // Add a new trial after the log started and confirm that it doesn't show up. - SyntheticTrialGroup trial4(HashName("TestTrial3"), HashName("Group3")); + variations::SyntheticTrialGroup trial4(HashName("TestTrial3"), + HashName("Group3")); service.RegisterSyntheticFieldTrial(trial4); service.GetSyntheticFieldTrialsOlderThan(begin_log_time, &synthetic_trials); EXPECT_EQ(1U, synthetic_trials.size());
diff --git a/components/offline_pages/offline_page_test_archiver.cc b/components/offline_pages/offline_page_test_archiver.cc index 6dfe954..e26467c 100644 --- a/components/offline_pages/offline_page_test_archiver.cc +++ b/components/offline_pages/offline_page_test_archiver.cc
@@ -43,7 +43,13 @@ void OfflinePageTestArchiver::CompleteCreateArchive() { DCHECK(!callback_.is_null()); base::FilePath archive_path; - ASSERT_TRUE(base::CreateTemporaryFileInDir(archives_dir_, &archive_path)); + if (filename_.empty()) { + ASSERT_TRUE(base::CreateTemporaryFileInDir(archives_dir_, &archive_path)); + } else { + archive_path = archives_dir_.Append(filename_); + // This step ensures the file is created and closed immediately. + base::File file(archive_path, base::File::FLAG_OPEN_ALWAYS); + } observer_->SetLastPathCreatedByArchiver(archive_path); task_runner_->PostTask(FROM_HERE, base::Bind(callback_, this, result_, url_, archive_path, size_to_report_));
diff --git a/components/offline_pages/offline_page_test_archiver.h b/components/offline_pages/offline_page_test_archiver.h index 7375c186..a8a9383 100644 --- a/components/offline_pages/offline_page_test_archiver.h +++ b/components/offline_pages/offline_page_test_archiver.h
@@ -22,6 +22,8 @@ // for an actual web contents. class OfflinePageTestArchiver : public OfflinePageArchiver { public: + // TODO(fgorski): Try refactoring the observer out and replace it with a + // callback, or completely remove the call to |SetLastPathCreatedByArchiver|. class Observer { public: virtual ~Observer() {} @@ -47,8 +49,13 @@ // When set to true, |CompleteCreateArchive| should be called explicitly for // the process to finish. + // TODO(fgorski): See if we can move this to the constructor. void set_delayed(bool delayed) { delayed_ = delayed; } + // Allows to explicitly specify a file name for the tests. + // TODO(fgorski): See if we can move this to the constructor. + void set_filename(const base::FilePath& filename) { filename_ = filename; } + bool create_archive_called() const { return create_archive_called_; } private: @@ -56,6 +63,7 @@ Observer* observer_; GURL url_; base::FilePath archives_dir_; + base::FilePath filename_; ArchiverResult result_; int64 size_to_report_; bool create_archive_called_;
diff --git a/components/offline_pages/offline_page_test_store.cc b/components/offline_pages/offline_page_test_store.cc index 755191c..8c8ea94 100644 --- a/components/offline_pages/offline_page_test_store.cc +++ b/components/offline_pages/offline_page_test_store.cc
@@ -41,7 +41,8 @@ bool result = scenario_ != TestScenario::WRITE_FAILED; if (result) offline_pages_[offline_page.bookmark_id] = offline_page; - task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); + if (!callback.is_null()) + task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); } void OfflinePageTestStore::RemoveOfflinePages(
diff --git a/components/omnibox.gypi b/components/omnibox.gypi index 8b2841d..dcb0536 100644 --- a/components/omnibox.gypi +++ b/components/omnibox.gypi
@@ -37,7 +37,7 @@ 'search_engines', 'toolbar', 'url_formatter/url_formatter.gyp:url_formatter', - 'variations_http_provider', + 'variations_net', ], 'export_dependent_settings': [ 'component_metrics_proto',
diff --git a/components/omnibox/browser/in_memory_url_index_types.cc b/components/omnibox/browser/in_memory_url_index_types.cc index 1a658a43..6215e41e 100644 --- a/components/omnibox/browser/in_memory_url_index_types.cc +++ b/components/omnibox/browser/in_memory_url_index_types.cc
@@ -44,21 +44,25 @@ return m1.offset < m2.offset; } -TermMatches SortAndDeoverlapMatches(const TermMatches& matches) { - if (matches.empty()) - return matches; - TermMatches sorted_matches = matches; +TermMatches SortMatches(const TermMatches& matches) { + TermMatches sorted_matches(matches); std::sort(sorted_matches.begin(), sorted_matches.end(), MatchOffsetLess); - TermMatches clean_matches; - TermMatch last_match; - for (TermMatches::const_iterator iter = sorted_matches.begin(); - iter != sorted_matches.end(); ++iter) { - if (iter->offset >= last_match.offset + last_match.length) { - last_match = *iter; - clean_matches.push_back(last_match); - } - } - return clean_matches; + return sorted_matches; +} + +// Assumes |sorted_matches| is already sorted. +TermMatches DeoverlapMatches(const TermMatches& sorted_matches) { + TermMatches out; + std::copy_if( + sorted_matches.begin(), sorted_matches.end(), std::back_inserter(out), + [&out](const TermMatch& match) { + return out.empty() || + match.offset >= (out.back().offset + out.back().length); }); + return out; +} + +TermMatches SortAndDeoverlapMatches(const TermMatches& matches) { + return DeoverlapMatches(SortMatches(matches)); } std::vector<size_t> OffsetsFromTermMatches(const TermMatches& matches) {
diff --git a/components/omnibox/browser/in_memory_url_index_types.h b/components/omnibox/browser/in_memory_url_index_types.h index f35fd9e..2ef6b76db 100644 --- a/components/omnibox/browser/in_memory_url_index_types.h +++ b/components/omnibox/browser/in_memory_url_index_types.h
@@ -44,6 +44,13 @@ const base::string16& cleaned_string, int term_num); +// Sorts |matches| by offset and returns the result. +TermMatches SortMatches(const TermMatches& matches); + +// Removes overlapping substring matches from |matches| and returns the +// cleaned up matches. Assumes |matches| is already sorted. +TermMatches DeoverlapMatches(const TermMatches& sorted_matches); + // Sorts and removes overlapping substring matches from |matches| and // returns the cleaned up matches. TermMatches SortAndDeoverlapMatches(const TermMatches& matches);
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 50dc320..8d6f8017 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -481,6 +481,11 @@ return value; } +bool OmniboxFieldTrial::HQPAllowDupMatchesForScoring() { + return variations::GetVariationParamValue( + kBundledExperimentFieldTrialName, + kHQPAllowDupMatchesForScoringRule) == "true"; +} const char OmniboxFieldTrial::kBundledExperimentFieldTrialName[] = "OmniboxBundledExperimentV1"; @@ -520,6 +525,8 @@ "KeywordRequiresPrefixMatch"; const char OmniboxFieldTrial::kKeywordScoreForSufficientlyCompleteMatchRule[] = "KeywordScoreForSufficientlyCompleteMatch"; +const char OmniboxFieldTrial::kHQPAllowDupMatchesForScoringRule[] = + "HQPAllowDupMatchesForScoring"; const char OmniboxFieldTrial::kHUPNewScoringEnabledParam[] = "HUPExperimentalScoringEnabled";
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 2dcc254..f7ed8de2 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -352,6 +352,16 @@ static int KeywordScoreForSufficientlyCompleteMatch(); // --------------------------------------------------------- + // For the HQPAllowDupMatchesForScoring experiment that's part of the + // bundled omnibox field trial. + + // Returns true if HistoryQuick provider should allow overlapping term hits + // to count when scoring and only remove overlaps/duplicates later (which + // is necessary for highlighting). Returns false if the experiment isn't + // active. + static bool HQPAllowDupMatchesForScoring(); + + // --------------------------------------------------------- // Exposed publicly for the sake of unittests. static const char kBundledExperimentFieldTrialName[]; // Rule names used by the bundled experiment. @@ -378,6 +388,7 @@ static const char kKeywordRequiresRegistryRule[]; static const char kKeywordRequiresPrefixMatchRule[]; static const char kKeywordScoreForSufficientlyCompleteMatchRule[]; + static const char kHQPAllowDupMatchesForScoringRule[]; // Parameter names used by the HUP new scoring experiments. static const char kHUPNewScoringEnabledParam[];
diff --git a/components/omnibox/browser/scored_history_match.cc b/components/omnibox/browser/scored_history_match.cc index b7d1640e..7b1f1976 100644 --- a/components/omnibox/browser/scored_history_match.cc +++ b/components/omnibox/browser/scored_history_match.cc
@@ -188,14 +188,15 @@ ++term_num; } - // Sort matches by offset and eliminate any which overlap. - // TODO(mpearson): Investigate whether this has any meaningful - // effect on scoring. (It's necessary at some point: removing - // overlaps and sorting is needed to decide what to highlight in the - // suggestion string. But this sort and de-overlap doesn't have to - // be done before scoring.) - url_matches = SortAndDeoverlapMatches(url_matches); - title_matches = SortAndDeoverlapMatches(title_matches); + // Sort matches by offset, which is needed for GetTopicalityScore() to + // function correctly. + if (OmniboxFieldTrial::HQPAllowDupMatchesForScoring()) { + url_matches = SortMatches(url_matches); + title_matches = SortMatches(title_matches); + } else { + url_matches = SortAndDeoverlapMatches(url_matches); + title_matches = SortAndDeoverlapMatches(title_matches); + } // We can inline autocomplete a match if: // 1) there is only one search term @@ -318,6 +319,13 @@ raw_score = std::max(raw_score, hup_like_score); } + // If we haven't yet removed overlaps / duplicates in the matches variables, + // do so now. + if (OmniboxFieldTrial::HQPAllowDupMatchesForScoring()) { + url_matches = DeoverlapMatches(url_matches); + title_matches = DeoverlapMatches(title_matches); + } + // Now that we're done processing this entry, correct the offsets of the // matches in |url_matches| so they point to offsets in the original URL // spec, not the cleaned-up URL string that we used for matching.
diff --git a/components/omnibox/browser/scored_history_match.h b/components/omnibox/browser/scored_history_match.h index d6a3fb9..f31da59f 100644 --- a/components/omnibox/browser/scored_history_match.h +++ b/components/omnibox/browser/scored_history_match.h
@@ -118,7 +118,8 @@ // the page's title and where they are (e.g., at word boundaries). Revises // url_matches and title_matches in the process so they only reflect matches // used for scoring. (For instance, some mid-word matches are not given - // credit in scoring.) + // credit in scoring.) Requires that |url_matches| and |title_matches| are + // sorted. float GetTopicalityScore(const int num_terms, const base::string16& cleaned_up_url, const WordStarts& terms_to_word_starts_offsets,
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc index c3c9a25..b26910c 100644 --- a/components/omnibox/browser/search_provider.cc +++ b/components/omnibox/browser/search_provider.cc
@@ -33,7 +33,7 @@ #include "components/search_engines/template_url_prepopulate_data.h" #include "components/search_engines/template_url_service.h" #include "components/url_formatter/url_formatter.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "grit/components_strings.h" #include "net/base/escape.h" #include "net/base/load_flags.h" @@ -891,7 +891,7 @@ fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES); // Add Chrome experiment state to the request headers. net::HttpRequestHeaders headers; - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( + variations::AppendVariationHeaders( fetcher->GetOriginalURL(), client()->IsOffTheRecord(), false, &headers); fetcher->SetExtraRequestHeaders(headers.ToString()); fetcher->Start();
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index 9b9dcfc0..a12a1b4 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -30,7 +30,7 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/search_engines/template_url_service.h" #include "components/url_formatter/url_formatter.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "net/base/escape.h" #include "net/base/load_flags.h" #include "net/http/http_request_headers.h" @@ -326,9 +326,9 @@ fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES); // Add Chrome experiment state to the request headers. net::HttpRequestHeaders headers; - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( - fetcher_->GetOriginalURL(), client()->IsOffTheRecord(), false, - &headers); + variations::AppendVariationHeaders(fetcher_->GetOriginalURL(), + client()->IsOffTheRecord(), false, + &headers); fetcher_->SetExtraRequestHeaders(headers.ToString()); fetcher_->Start(); LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_SENT);
diff --git a/components/password_manager_strings.grdp b/components/password_manager_strings.grdp index 5291c67..341c919b 100644 --- a/components/password_manager_strings.grdp +++ b/components/password_manager_strings.grdp
@@ -4,5 +4,8 @@ <message name="IDS_PASSWORD_MANAGER_EMPTY_LOGIN" desc="A placeholder for the 'Manage Passwords' bubble's empty username label"> (No username) </message> + <message name="IDS_PASSWORD_MANAGER_SMART_LOCK" desc="The brand name of the password manager for the title of the save password bubble when a user is signed in."> + Google Smart Lock + </message> </grit-part>
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json index 4a40b4f..8c4717d 100644 --- a/components/search_engines/prepopulated_engines.json +++ b/components/search_engines/prepopulated_engines.json
@@ -30,7 +30,7 @@ // Increment this if you change the data in ways that mean users with // existing data should get a new version. - "kCurrentDataVersion": 86 + "kCurrentDataVersion": 87 }, // The following engines are included in country lists and are added to the @@ -80,6 +80,7 @@ "keyword": "baidu.com", "favicon_url": "http://www.baidu.com/favicon.ico", "search_url": "http://www.baidu.com/#ie={inputEncoding}&wd={searchTerms}", + "suggest_url": "http://suggestion.baidu.com/su?wd={searchTerms}&action=opensearch&ie={inputEncoding}", "type": "SEARCH_ENGINE_BAIDU", "id": 21 },
diff --git a/components/ssl_errors/error_classification.cc b/components/ssl_errors/error_classification.cc index a98aeb5..e1cc6d6 100644 --- a/components/ssl_errors/error_classification.cc +++ b/components/ssl_errors/error_classification.cc
@@ -15,6 +15,7 @@ #include "components/ssl_errors/error_info.h" #include "components/url_formatter/url_formatter.h" #include "net/base/net_util.h" +#include "net/base/network_change_notifier.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/cert/x509_cert_types.h" #include "net/cert/x509_certificate.h"
diff --git a/components/suggestions.gypi b/components/suggestions.gypi index 7be7e725..efffdef 100644 --- a/components/suggestions.gypi +++ b/components/suggestions.gypi
@@ -20,7 +20,7 @@ 'components.gyp:keyed_service_core', 'components.gyp:pref_registry', 'components.gyp:variations', - 'components.gyp:variations_http_provider', + 'components.gyp:variations_net', ], 'sources': [ 'suggestions/blacklist_store.cc',
diff --git a/components/suggestions/suggestions_service.cc b/components/suggestions/suggestions_service.cc index d85194d..4382fde 100644 --- a/components/suggestions/suggestions_service.cc +++ b/components/suggestions/suggestions_service.cc
@@ -20,7 +20,7 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/suggestions/blacklist_store.h" #include "components/suggestions/suggestions_store.h" -#include "components/variations/net/variations_http_header_provider.h" +#include "components/variations/net/variations_http_headers.h" #include "net/base/escape.h" #include "net/base/load_flags.h" #include "net/base/net_errors.h" @@ -272,8 +272,8 @@ request->SetRequestContext(url_request_context_); // Add Chrome experiment state to the request headers. net::HttpRequestHeaders headers; - variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( - request->GetOriginalURL(), false, false, &headers); + variations::AppendVariationHeaders(request->GetOriginalURL(), false, false, + &headers); request->SetExtraRequestHeaders(headers.ToString()); return request; }
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc index caafc03..0768223 100644 --- a/components/translate/core/browser/translate_manager.cc +++ b/components/translate/core/browser/translate_manager.cc
@@ -143,12 +143,10 @@ return; } - // Get the accepted languages list. - std::vector<std::string> accept_languages_list = base::SplitString( - prefs->GetString(accept_languages_pref_name_), ",", - base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); + scoped_ptr<TranslatePrefs> translate_prefs( + translate_client_->GetTranslatePrefs()); - std::string target_lang = GetTargetLanguage(accept_languages_list); + std::string target_lang = GetTargetLanguage(translate_prefs.get()); std::string language_code = TranslateDownloadManager::GetLanguageCode(page_lang); @@ -170,9 +168,6 @@ return; } - scoped_ptr<TranslatePrefs> translate_prefs( - translate_client_->GetTranslatePrefs()); - TranslateAcceptLanguages* accept_languages = translate_client_->GetTranslateAcceptLanguages(); // Don't translate any user black-listed languages. @@ -360,8 +355,7 @@ } // static -std::string TranslateManager::GetTargetLanguage( - const std::vector<std::string>& accept_languages_list) { +std::string TranslateManager::GetTargetLanguage(const TranslatePrefs* prefs) { std::string ui_lang = TranslateDownloadManager::GetLanguageCode( TranslateDownloadManager::GetInstance()->application_locale()); translate::ToTranslateLanguageSynonym(&ui_lang); @@ -370,11 +364,11 @@ return ui_lang; // Will translate to the first supported language on the Accepted Language - // list or not at all if no such candidate exists - std::vector<std::string>::const_iterator iter; - for (iter = accept_languages_list.begin(); - iter != accept_languages_list.end(); ++iter) { - std::string lang_code = TranslateDownloadManager::GetLanguageCode(*iter); + // list or not at all if no such candidate exists. + std::vector<std::string> accept_languages_list; + prefs->GetLanguageList(&accept_languages_list); + for (const auto& lang : accept_languages_list) { + std::string lang_code = TranslateDownloadManager::GetLanguageCode(lang); if (TranslateDownloadManager::IsSupportedLanguage(lang_code)) return lang_code; }
diff --git a/components/translate/core/browser/translate_manager.h b/components/translate/core/browser/translate_manager.h index 346e8312..c099002 100644 --- a/components/translate/core/browser/translate_manager.h +++ b/components/translate/core/browser/translate_manager.h
@@ -54,8 +54,7 @@ // the UI language // the accept-language list // If no language is found then an empty string is returned. - static std::string GetTargetLanguage( - const std::vector<std::string>& accept_languages_list); + static std::string GetTargetLanguage(const TranslatePrefs* prefs); // Returns the language to automatically translate to. |original_language| is // the webpage's original language.
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc index 0bd0dbe..77c5d03 100644 --- a/components/translate/core/browser/translate_manager_unittest.cc +++ b/components/translate/core/browser/translate_manager_unittest.cc
@@ -4,60 +4,91 @@ #include "components/translate/core/browser/translate_manager.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/pref_registry/testing_pref_service_syncable.h" #include "components/translate/core/browser/translate_download_manager.h" +#include "components/translate/core/browser/translate_prefs.h" #include "testing/gtest/include/gtest/gtest.h" namespace translate { +namespace { + +#if defined(OS_CHROMEOS) +const char kLanguagePreferredLanguages[] = + "settings.language.preferred_languages"; +#else +const char* kLanguagePreferredLanguages = nullptr; +#endif +const char kAcceptLanguages[] = "intl.accept_languages"; + +class TranslateManagerTest : public testing::Test { + protected: + TranslateManagerTest() + : translate_prefs_(&prefs_, + kAcceptLanguages, + kLanguagePreferredLanguages), + manager_(TranslateDownloadManager::GetInstance()) {} + + void SetUp() override { + // Ensure we're not requesting a server-side translate language list. + TranslateLanguageList::DisableUpdate(); + prefs_.registry()->RegisterStringPref(kAcceptLanguages, std::string()); +#if defined(OS_CHROMEOS) + prefs_.registry()->RegisterStringPref(kLanguagePreferredLanguages, + std::string()); +#endif + TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); + manager_->ResetForTesting(); + } + user_prefs::TestingPrefServiceSyncable prefs_; + TranslatePrefs translate_prefs_; + TranslateDownloadManager* manager_; + + void TearDown() override { manager_->ResetForTesting(); } +}; + +} // namespace + // Target language comes from application locale if the locale's language // is supported. -TEST(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { - std::vector<std::string> accept_language_list; - - // Ensure we're not requesting a server-side translate language list. - TranslateLanguageList::DisableUpdate(); - +TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { // Ensure the locale is set to a supported language. ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); - TranslateDownloadManager* manager = TranslateDownloadManager::GetInstance(); - manager->ResetForTesting(); - manager->set_application_locale("en"); - EXPECT_EQ("en", TranslateManager::GetTargetLanguage(accept_language_list)); + manager_->set_application_locale("en"); + EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); // Try a second supported language. ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("de")); - manager->set_application_locale("de"); - EXPECT_EQ("de", TranslateManager::GetTargetLanguage(accept_language_list)); + manager_->set_application_locale("de"); + EXPECT_EQ("de", TranslateManager::GetTargetLanguage(&translate_prefs_)); } // If the application locale's language is not supported, the target language // falls back to the first supported language in |accept_languages_list|. If // none of the languages in |accept_language_list| is supported, the target // language is empty. -TEST(TranslateManagerTest, GetTargetLanguageAcceptLangFallback) { +TEST_F(TranslateManagerTest, GetTargetLanguageAcceptLangFallback) { std::vector<std::string> accept_language_list; - // Ensure we're not requesting a server-side translate language list. - TranslateLanguageList::DisableUpdate(); - // Ensure locale is set to a not-supported language. ASSERT_FALSE(TranslateDownloadManager::IsSupportedLanguage("xy")); - TranslateDownloadManager* manager = TranslateDownloadManager::GetInstance(); - manager->ResetForTesting(); - manager->set_application_locale("xy"); + manager_->set_application_locale("xy"); // Default return is empty string. - EXPECT_EQ("", TranslateManager::GetTargetLanguage(accept_language_list)); + EXPECT_EQ("", TranslateManager::GetTargetLanguage(&translate_prefs_)); // Unsupported languages still result in the empty string. - ASSERT_FALSE(TranslateDownloadManager::IsSupportedLanguage("xy")); - accept_language_list.push_back("xy"); - EXPECT_EQ("", TranslateManager::GetTargetLanguage(accept_language_list)); + ASSERT_FALSE(TranslateDownloadManager::IsSupportedLanguage("zy")); + accept_language_list.push_back("zy"); + translate_prefs_.UpdateLanguageList(accept_language_list); + EXPECT_EQ("", TranslateManager::GetTargetLanguage(&translate_prefs_)); // First supported language is the fallback language. ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); accept_language_list.push_back("en"); - EXPECT_EQ("en", TranslateManager::GetTargetLanguage(accept_language_list)); + translate_prefs_.UpdateLanguageList(accept_language_list); + EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); } } // namespace translate
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc index d02dddeb..78105ba 100644 --- a/components/translate/core/browser/translate_prefs.cc +++ b/components/translate/core/browser/translate_prefs.cc
@@ -358,7 +358,8 @@ prefs_->ClearPref(kPrefTranslateTooOftenDeniedForLanguage); } -void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { +void TranslatePrefs::GetLanguageList( + std::vector<std::string>* languages) const { DCHECK(languages); DCHECK(languages->empty());
diff --git a/components/translate/core/browser/translate_prefs.h b/components/translate/core/browser/translate_prefs.h index 0cbed022..5e9be62 100644 --- a/components/translate/core/browser/translate_prefs.h +++ b/components/translate/core/browser/translate_prefs.h
@@ -132,7 +132,7 @@ void ResetDenialState(); // Gets the language list of the language settings. - void GetLanguageList(std::vector<std::string>* languages); + void GetLanguageList(std::vector<std::string>* languages) const; // Updates the language list of the language settings. void UpdateLanguageList(const std::vector<std::string>& languages);
diff --git a/components/variations.gypi b/components/variations.gypi index 9649110d0..157f68c 100644 --- a/components/variations.gypi +++ b/components/variations.gypi
@@ -50,10 +50,14 @@ 'variations/proto/variations_seed.proto', 'variations/study_filtering.cc', 'variations/study_filtering.h', + "variations/synthetic_trials.cc", + "variations/synthetic_trials.h", 'variations/variations_associated_data.cc', 'variations/variations_associated_data.h', 'variations/variations_experiment_util.cc', 'variations/variations_experiment_util.h', + 'variations/variations_http_header_provider.cc', + 'variations/variations_http_header_provider.h', 'variations/variations_request_scheduler.cc', 'variations/variations_request_scheduler.h', 'variations/variations_request_scheduler_mobile.cc', @@ -119,7 +123,7 @@ }, { # GN version: //components/variations/net:net - 'target_name': 'variations_http_provider', + 'target_name': 'variations_net', 'type': 'static_library', 'include_dirs': [ '..', @@ -136,8 +140,8 @@ 'components.gyp:metrics', ], 'sources': [ - 'variations/net/variations_http_header_provider.cc', - 'variations/net/variations_http_header_provider.h', + 'variations/net/variations_http_headers.cc', + 'variations/net/variations_http_headers.h', ], }, ],
diff --git a/components/variations/BUILD.gn b/components/variations/BUILD.gn index a65148a..c490cabe 100644 --- a/components/variations/BUILD.gn +++ b/components/variations/BUILD.gn
@@ -34,10 +34,14 @@ "proto/variations_seed.proto", "study_filtering.cc", "study_filtering.h", + "synthetic_trials.cc", + "synthetic_trials.h", "variations_associated_data.cc", "variations_associated_data.h", "variations_experiment_util.cc", "variations_experiment_util.h", + "variations_http_header_provider.cc", + "variations_http_header_provider.h", "variations_request_scheduler.cc", "variations_request_scheduler.h", "variations_seed_processor.cc", @@ -96,9 +100,10 @@ "entropy_provider_unittest.cc", "experiment_labels_unittest.cc", "metrics_util_unittest.cc", - "net/variations_http_header_provider_unittest.cc", + "net/variations_http_headers_unittest.cc", "study_filtering_unittest.cc", "variations_associated_data_unittest.cc", + "variations_http_header_provider_unittest.cc", "variations_request_scheduler_unittest.cc", "variations_seed_processor_unittest.cc", "variations_seed_simulator_unittest.cc",
diff --git a/components/variations/net/BUILD.gn b/components/variations/net/BUILD.gn index 05110465..c037d46f 100644 --- a/components/variations/net/BUILD.gn +++ b/components/variations/net/BUILD.gn
@@ -4,8 +4,8 @@ source_set("net") { sources = [ - "variations_http_header_provider.cc", - "variations_http_header_provider.h", + "variations_http_headers.cc", + "variations_http_headers.h", ] public_deps = [
diff --git a/components/variations/net/variations_http_header_provider_unittest.cc b/components/variations/net/variations_http_header_provider_unittest.cc deleted file mode 100644 index 2cb5c815..0000000 --- a/components/variations/net/variations_http_header_provider_unittest.cc +++ /dev/null
@@ -1,238 +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 "components/variations/net/variations_http_header_provider.h" - -#include <string> - -#include "base/base64.h" -#include "base/message_loop/message_loop.h" -#include "base/metrics/field_trial.h" -#include "base/run_loop.h" -#include "components/variations/entropy_provider.h" -#include "components/variations/proto/client_variations.pb.h" -#include "components/variations/variations_associated_data.h" -#include "net/http/http_request_headers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -namespace variations { - -namespace { - -// Decodes the variations header and extracts the variation ids. -bool ExtractVariationIds(const std::string& variations, - std::set<VariationID>* variation_ids, - std::set<VariationID>* trigger_ids) { - std::string serialized_proto; - if (!base::Base64Decode(variations, &serialized_proto)) - return false; - ClientVariations proto; - if (!proto.ParseFromString(serialized_proto)) return false; - for (int i = 0; i < proto.variation_id_size(); ++i) - variation_ids->insert(proto.variation_id(i)); - for (int i = 0; i < proto.trigger_variation_id_size(); ++i) - trigger_ids->insert(proto.trigger_variation_id(i)); - return true; -} - -scoped_refptr<base::FieldTrial> CreateTrialAndAssociateId( - const std::string& trial_name, - const std::string& default_group_name, - IDCollectionKey key, - VariationID id) { - scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::CreateFieldTrial(trial_name, default_group_name)); - - AssociateGoogleVariationID(key, trial->trial_name(), trial->group_name(), id); - - return trial; -} - -} // namespace - -class VariationsHttpHeaderProviderTest : public ::testing::Test { - public: - VariationsHttpHeaderProviderTest() {} - - ~VariationsHttpHeaderProviderTest() override {} - - void TearDown() override { testing::ClearAllVariationIDs(); } -}; - -TEST_F(VariationsHttpHeaderProviderTest, ShouldAppendHeaders) { - struct { - const char* url; - bool should_append_headers; - } cases[] = { - {"http://google.com", true}, - {"http://www.google.com", true}, - {"http://m.google.com", true}, - {"http://google.ca", true}, - {"https://google.ca", true}, - {"http://google.co.uk", true}, - {"http://google.co.uk:8080/", true}, - {"http://www.google.co.uk:8080/", true}, - {"http://google", false}, - - {"http://youtube.com", true}, - {"http://www.youtube.com", true}, - {"http://www.youtube.ca", true}, - {"http://www.youtube.co.uk:8080/", true}, - {"https://www.youtube.com", true}, - {"http://youtube", false}, - - {"http://www.yahoo.com", false}, - - {"http://ad.doubleclick.net", true}, - {"https://a.b.c.doubleclick.net", true}, - {"https://a.b.c.doubleclick.net:8081", true}, - {"http://www.doubleclick.com", true}, - {"http://www.doubleclick.org", false}, - {"http://www.doubleclick.net.com", false}, - {"https://www.doubleclick.net.com", false}, - - {"http://ad.googlesyndication.com", true}, - {"https://a.b.c.googlesyndication.com", true}, - {"https://a.b.c.googlesyndication.com:8080", true}, - {"http://www.doubleclick.edu", false}, - {"http://www.googlesyndication.com.edu", false}, - {"https://www.googlesyndication.com.com", false}, - - {"http://www.googleadservices.com", true}, - {"http://www.googleadservices.com:8080", true}, - {"https://www.googleadservices.com", true}, - {"https://www.internal.googleadservices.com", true}, - {"https://www2.googleadservices.com", true}, - {"https://www.googleadservices.org", false}, - {"https://www.googleadservices.com.co.uk", false}, - - {"http://WWW.ANDROID.COM", true}, - {"http://www.android.com", true}, - {"http://www.doubleclick.com", true}, - {"http://www.doubleclick.net", true}, - {"http://www.ggpht.com", true}, - {"http://www.googleadservices.com", true}, - {"http://www.googleapis.com", true}, - {"http://www.googlesyndication.com", true}, - {"http://www.googleusercontent.com", true}, - {"http://www.googlevideo.com", true}, - {"http://ssl.gstatic.com", true}, - {"http://www.gstatic.com", true}, - {"http://www.ytimg.com", true}, - {"http://wwwytimg.com", false}, - {"http://ytimg.com", false}, - - {"http://www.android.org", false}, - {"http://www.doubleclick.org", false}, - {"http://www.doubleclick.net", true}, - {"http://www.ggpht.org", false}, - {"http://www.googleadservices.org", false}, - {"http://www.googleapis.org", false}, - {"http://www.googlesyndication.org", false}, - {"http://www.googleusercontent.org", false}, - {"http://www.googlevideo.org", false}, - {"http://ssl.gstatic.org", false}, - {"http://www.gstatic.org", false}, - {"http://www.ytimg.org", false}, - - {"http://a.b.android.com", true}, - {"http://a.b.doubleclick.com", true}, - {"http://a.b.doubleclick.net", true}, - {"http://a.b.ggpht.com", true}, - {"http://a.b.googleadservices.com", true}, - {"http://a.b.googleapis.com", true}, - {"http://a.b.googlesyndication.com", true}, - {"http://a.b.googleusercontent.com", true}, - {"http://a.b.googlevideo.com", true}, - {"http://ssl.gstatic.com", true}, - {"http://a.b.gstatic.com", true}, - {"http://a.b.ytimg.com", true}, - }; - - for (size_t i = 0; i < arraysize(cases); ++i) { - const GURL url(cases[i].url); - EXPECT_EQ(cases[i].should_append_headers, - VariationsHttpHeaderProvider::ShouldAppendHeaders(url)) - << url; - } -} - -TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid) { - base::MessageLoop loop; - VariationsHttpHeaderProvider provider; - GURL url("http://www.google.com"); - net::HttpRequestHeaders headers; - std::string variations; - - // Valid experiment ids. - EXPECT_TRUE(provider.SetDefaultVariationIds("12,456,t789")); - provider.InitVariationIDsCacheIfNeeded(); - provider.AppendHeaders(url, false, false, &headers); - EXPECT_TRUE(headers.HasHeader("X-Client-Data")); - headers.GetHeader("X-Client-Data", &variations); - std::set<VariationID> variation_ids; - std::set<VariationID> trigger_ids; - ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids)); - EXPECT_TRUE(variation_ids.find(12) != variation_ids.end()); - EXPECT_TRUE(variation_ids.find(456) != variation_ids.end()); - EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end()); - EXPECT_FALSE(variation_ids.find(789) != variation_ids.end()); -} - -TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid) { - base::MessageLoop loop; - VariationsHttpHeaderProvider provider; - GURL url("http://www.google.com"); - net::HttpRequestHeaders headers; - - // Invalid experiment ids. - EXPECT_FALSE(provider.SetDefaultVariationIds("abcd12,456")); - provider.InitVariationIDsCacheIfNeeded(); - provider.AppendHeaders(url, false, false, &headers); - EXPECT_FALSE(headers.HasHeader("X-Client-Data")); - - // Invalid trigger experiment id - EXPECT_FALSE(provider.SetDefaultVariationIds("12,tabc456")); - provider.InitVariationIDsCacheIfNeeded(); - provider.AppendHeaders(url, false, false, &headers); - EXPECT_FALSE(headers.HasHeader("X-Client-Data")); -} - -TEST_F(VariationsHttpHeaderProviderTest, OnFieldTrialGroupFinalized) { - base::MessageLoop loop; - base::FieldTrialList field_trial_list( - new metrics::SHA1EntropyProvider("test")); - VariationsHttpHeaderProvider provider; - provider.InitVariationIDsCacheIfNeeded(); - - const std::string default_name = "default"; - scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId( - "t1", default_name, GOOGLE_WEB_PROPERTIES, 123)); - - ASSERT_EQ(default_name, trial_1->group_name()); - - scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId( - "t2", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER, 456)); - - ASSERT_EQ(default_name, trial_2->group_name()); - - // Run the message loop to make sure OnFieldTrialGroupFinalized is called for - // the two field trials. - base::RunLoop().RunUntilIdle(); - - GURL url("http://www.google.com"); - net::HttpRequestHeaders headers; - provider.AppendHeaders(url, false, false, &headers); - std::string variations; - headers.GetHeader("X-Client-Data", &variations); - - std::set<VariationID> variation_ids; - std::set<VariationID> trigger_ids; - ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids)); - EXPECT_TRUE(variation_ids.find(123) != variation_ids.end()); - EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end()); -} - -} // namespace variations
diff --git a/components/variations/net/variations_http_headers.cc b/components/variations/net/variations_http_headers.cc new file mode 100644 index 0000000..632a0e0 --- /dev/null +++ b/components/variations/net/variations_http_headers.cc
@@ -0,0 +1,98 @@ +// 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/variations/net/variations_http_headers.h" + +#include "base/strings/string_util.h" +#include "components/google/core/browser/google_util.h" +#include "components/variations/variations_http_header_provider.h" +#include "net/http/http_request_headers.h" +#include "url/gurl.h" + +namespace variations { + +namespace { + +const char* kSuffixesToSetHeadersFor[] = { + ".android.com", + ".doubleclick.com", + ".doubleclick.net", + ".ggpht.com", + ".googleadservices.com", + ".googleapis.com", + ".googlesyndication.com", + ".googleusercontent.com", + ".googlevideo.com", + ".gstatic.com", + ".ytimg.com", +}; + +const char kChromeUMAEnabled[] = "X-Chrome-UMA-Enabled"; +const char kClientData[] = "X-Client-Data"; + +} // namespace + +void AppendVariationHeaders(const GURL& url, + bool incognito, + bool uma_enabled, + net::HttpRequestHeaders* headers) { + // Note the criteria for attaching client experiment headers: + // 1. We only transmit to Google owned domains which can evaluate experiments. + // 1a. These include hosts which have a standard postfix such as: + // *.doubleclick.net or *.googlesyndication.com or + // exactly www.googleadservices.com or + // international TLD domains *.google.<TLD> or *.youtube.<TLD>. + // 2. Only transmit for non-Incognito profiles. + // 3. For the X-Chrome-UMA-Enabled bit, only set it if UMA is in fact enabled + // for this install of Chrome. + // 4. For the X-Client-Data header, only include non-empty variation IDs. + if (incognito || !internal::ShouldAppendVariationHeaders(url)) + return; + + if (uma_enabled) + headers->SetHeaderIfMissing(kChromeUMAEnabled, "1"); + + const std::string variation_ids_header = + VariationsHttpHeaderProvider::GetInstance()->GetClientDataHeader(); + if (!variation_ids_header.empty()) { + // Note that prior to M33 this header was named X-Chrome-Variations. + headers->SetHeaderIfMissing(kClientData, variation_ids_header); + } +} + +std::set<std::string> GetVariationHeaderNames() { + std::set<std::string> headers; + headers.insert(kChromeUMAEnabled); + headers.insert(kClientData); + return headers; +} + +namespace internal { + +// static +bool ShouldAppendVariationHeaders(const GURL& url) { + if (google_util::IsGoogleDomainUrl(url, google_util::ALLOW_SUBDOMAIN, + google_util::ALLOW_NON_STANDARD_PORTS)) { + return true; + } + + if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) + return false; + + // Some domains don't have international TLD extensions, so testing for them + // is very straight forward. + const std::string host = url.host(); + for (size_t i = 0; i < arraysize(kSuffixesToSetHeadersFor); ++i) { + if (base::EndsWith(host, kSuffixesToSetHeadersFor[i], + base::CompareCase::INSENSITIVE_ASCII)) + return true; + } + + return google_util::IsYoutubeDomainUrl(url, google_util::ALLOW_SUBDOMAIN, + google_util::ALLOW_NON_STANDARD_PORTS); +} + +} // namespace internal + +} // namespace variations
diff --git a/components/variations/net/variations_http_headers.h b/components/variations/net/variations_http_headers.h new file mode 100644 index 0000000..d6280e5 --- /dev/null +++ b/components/variations/net/variations_http_headers.h
@@ -0,0 +1,41 @@ +// 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_VARIATIONS_NET_VARIATIONS_HTTP_HEADERS_H_ +#define COMPONENTS_VARIATIONS_NET_VARIATIONS_HTTP_HEADERS_H_ + +#include <set> +#include <string> + +namespace net { +class HttpRequestHeaders; +} + +class GURL; + +namespace variations { + +// Adds Chrome experiment and metrics state as custom headers to |headers|. +// Some headers may not be set given the |incognito| mode or whether +// the user has |uma_enabled|. Also, we never transmit headers to non-Google +// sites, which is checked based on the destination |url|. +void AppendVariationHeaders(const GURL& url, + bool incognito, + bool uma_enabled, + net::HttpRequestHeaders* headers); + +// Returns the HTTP header names which are added by AppendVariationHeaders(). +std::set<std::string> GetVariationHeaderNames(); + +namespace internal { + +// Checks whether variation headers should be appended to requests to the +// specified |url|. Returns true for google.<TLD> and youtube.<TLD> URLs. +bool ShouldAppendVariationHeaders(const GURL& url); + +} // namespace internal + +} // namespace variations + +#endif // COMPONENTS_VARIATIONS_NET_VARIATIONS_HTTP_HEADERS_H_
diff --git a/components/variations/net/variations_http_headers_unittest.cc b/components/variations/net/variations_http_headers_unittest.cc new file mode 100644 index 0000000..0f04c44 --- /dev/null +++ b/components/variations/net/variations_http_headers_unittest.cc
@@ -0,0 +1,111 @@ +// 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 "components/variations/net/variations_http_headers.h" + +#include "base/macros.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace variations { + +TEST(VariationsHttpHeadersTest, ShouldAppendHeaders) { + struct { + const char* url; + bool should_append_headers; + } cases[] = { + {"http://google.com", true}, + {"http://www.google.com", true}, + {"http://m.google.com", true}, + {"http://google.ca", true}, + {"https://google.ca", true}, + {"http://google.co.uk", true}, + {"http://google.co.uk:8080/", true}, + {"http://www.google.co.uk:8080/", true}, + {"http://google", false}, + + {"http://youtube.com", true}, + {"http://www.youtube.com", true}, + {"http://www.youtube.ca", true}, + {"http://www.youtube.co.uk:8080/", true}, + {"https://www.youtube.com", true}, + {"http://youtube", false}, + + {"http://www.yahoo.com", false}, + + {"http://ad.doubleclick.net", true}, + {"https://a.b.c.doubleclick.net", true}, + {"https://a.b.c.doubleclick.net:8081", true}, + {"http://www.doubleclick.com", true}, + {"http://www.doubleclick.org", false}, + {"http://www.doubleclick.net.com", false}, + {"https://www.doubleclick.net.com", false}, + + {"http://ad.googlesyndication.com", true}, + {"https://a.b.c.googlesyndication.com", true}, + {"https://a.b.c.googlesyndication.com:8080", true}, + {"http://www.doubleclick.edu", false}, + {"http://www.googlesyndication.com.edu", false}, + {"https://www.googlesyndication.com.com", false}, + + {"http://www.googleadservices.com", true}, + {"http://www.googleadservices.com:8080", true}, + {"https://www.googleadservices.com", true}, + {"https://www.internal.googleadservices.com", true}, + {"https://www2.googleadservices.com", true}, + {"https://www.googleadservices.org", false}, + {"https://www.googleadservices.com.co.uk", false}, + + {"http://WWW.ANDROID.COM", true}, + {"http://www.android.com", true}, + {"http://www.doubleclick.com", true}, + {"http://www.doubleclick.net", true}, + {"http://www.ggpht.com", true}, + {"http://www.googleadservices.com", true}, + {"http://www.googleapis.com", true}, + {"http://www.googlesyndication.com", true}, + {"http://www.googleusercontent.com", true}, + {"http://www.googlevideo.com", true}, + {"http://ssl.gstatic.com", true}, + {"http://www.gstatic.com", true}, + {"http://www.ytimg.com", true}, + {"http://wwwytimg.com", false}, + {"http://ytimg.com", false}, + + {"http://www.android.org", false}, + {"http://www.doubleclick.org", false}, + {"http://www.doubleclick.net", true}, + {"http://www.ggpht.org", false}, + {"http://www.googleadservices.org", false}, + {"http://www.googleapis.org", false}, + {"http://www.googlesyndication.org", false}, + {"http://www.googleusercontent.org", false}, + {"http://www.googlevideo.org", false}, + {"http://ssl.gstatic.org", false}, + {"http://www.gstatic.org", false}, + {"http://www.ytimg.org", false}, + + {"http://a.b.android.com", true}, + {"http://a.b.doubleclick.com", true}, + {"http://a.b.doubleclick.net", true}, + {"http://a.b.ggpht.com", true}, + {"http://a.b.googleadservices.com", true}, + {"http://a.b.googleapis.com", true}, + {"http://a.b.googlesyndication.com", true}, + {"http://a.b.googleusercontent.com", true}, + {"http://a.b.googlevideo.com", true}, + {"http://ssl.gstatic.com", true}, + {"http://a.b.gstatic.com", true}, + {"http://a.b.ytimg.com", true}, + }; + + for (size_t i = 0; i < arraysize(cases); ++i) { + const GURL url(cases[i].url); + EXPECT_EQ(cases[i].should_append_headers, + internal::ShouldAppendVariationHeaders(url)) + << url; + } +} + +} // namespace variations
diff --git a/components/variations/synthetic_trials.cc b/components/variations/synthetic_trials.cc new file mode 100644 index 0000000..228ca44 --- /dev/null +++ b/components/variations/synthetic_trials.cc
@@ -0,0 +1,16 @@ +// 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/variations/synthetic_trials.h" + +namespace variations { + +SyntheticTrialGroup::SyntheticTrialGroup(uint32_t trial, uint32_t group) { + id.name = trial; + id.group = group; +} + +SyntheticTrialGroup::~SyntheticTrialGroup() {} + +} // namespace variations
diff --git a/components/variations/synthetic_trials.h b/components/variations/synthetic_trials.h new file mode 100644 index 0000000..b5b42403 --- /dev/null +++ b/components/variations/synthetic_trials.h
@@ -0,0 +1,41 @@ +// 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_VARIATIONS_SYNTHETIC_TRIALS_H_ +#define COMPONENTS_VARIATIONS_SYNTHETIC_TRIALS_H_ + +#include <vector> + +#include "base/compiler_specific.h" +#include "base/time/time.h" +#include "components/variations/active_field_trials.h" + +namespace variations { + +// A Field Trial and its selected group, which represent a particular +// Chrome configuration state. For example, the trial name could map to +// a preference name, and the group name could map to a preference value. +struct SyntheticTrialGroup { + public: + SyntheticTrialGroup(uint32_t trial, uint32_t group); + ~SyntheticTrialGroup(); + + ActiveGroupId id; + base::TimeTicks start_time; +}; + +// Interface class to observe changes to synthetic trials in MetricsService. +class SyntheticTrialObserver { + public: + // Called when the list of synthetic field trial groups has changed. + virtual void OnSyntheticTrialsChanged( + const std::vector<SyntheticTrialGroup>& groups) = 0; + + protected: + virtual ~SyntheticTrialObserver() {} +}; + +} // namespace variations + +#endif // COMPONENTS_VARIATIONS_SYNTHETIC_TRIALS_H_
diff --git a/components/variations/net/variations_http_header_provider.cc b/components/variations/variations_http_header_provider.cc similarity index 63% rename from components/variations/net/variations_http_header_provider.cc rename to components/variations/variations_http_header_provider.cc index 6754cef..316fe52 100644 --- a/components/variations/net/variations_http_header_provider.cc +++ b/components/variations/variations_http_header_provider.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 "components/variations/net/variations_http_header_provider.h" +#include "components/variations/variations_http_header_provider.h" #include <set> #include <string> @@ -14,60 +14,16 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" -#include "components/google/core/browser/google_util.h" #include "components/variations/proto/client_variations.pb.h" -#include "net/base/registry_controlled_domains/registry_controlled_domain.h" -#include "net/http/http_request_headers.h" -#include "url/gurl.h" namespace variations { -namespace { - -const char* kSuffixesToSetHeadersFor[] = { - ".android.com", - ".doubleclick.com", - ".doubleclick.net", - ".ggpht.com", - ".googleadservices.com", - ".googleapis.com", - ".googlesyndication.com", - ".googleusercontent.com", - ".googlevideo.com", - ".gstatic.com", - ".ytimg.com", -}; - -const char kChromeUMAEnabled[] = "X-Chrome-UMA-Enabled"; -const char kClientData[] = "X-Client-Data"; - -} // namespace - +// static VariationsHttpHeaderProvider* VariationsHttpHeaderProvider::GetInstance() { return base::Singleton<VariationsHttpHeaderProvider>::get(); } -void VariationsHttpHeaderProvider::AppendHeaders( - const GURL& url, - bool incognito, - bool uma_enabled, - net::HttpRequestHeaders* headers) { - // Note the criteria for attaching client experiment headers: - // 1. We only transmit to Google owned domains which can evaluate experiments. - // 1a. These include hosts which have a standard postfix such as: - // *.doubleclick.net or *.googlesyndication.com or - // exactly www.googleadservices.com or - // international TLD domains *.google.<TLD> or *.youtube.<TLD>. - // 2. Only transmit for non-Incognito profiles. - // 3. For the X-Chrome-UMA-Enabled bit, only set it if UMA is in fact enabled - // for this install of Chrome. - // 4. For the X-Client-Data header, only include non-empty variation IDs. - if (incognito || !ShouldAppendHeaders(url)) - return; - - if (uma_enabled) - headers->SetHeaderIfMissing(kChromeUMAEnabled, "1"); - +std::string VariationsHttpHeaderProvider::GetClientDataHeader() { // Lazily initialize the header, if not already done, before attempting to // transmit it. InitVariationIDsCacheIfNeeded(); @@ -77,11 +33,7 @@ base::AutoLock scoped_lock(lock_); variation_ids_header_copy = variation_ids_header_; } - - if (!variation_ids_header_copy.empty()) { - // Note that prior to M33 this header was named X-Chrome-Variations. - headers->SetHeaderIfMissing(kClientData, variation_ids_header_copy); - } + return variation_ids_header_copy; } bool VariationsHttpHeaderProvider::SetDefaultVariationIds( @@ -98,7 +50,7 @@ bool trigger_id = base::StartsWith(entry, "t", base::CompareCase::SENSITIVE); // Remove the "t" prefix if it's there. - base::StringPiece trimmed_entry = trigger_id ? entry.substr(1) : entry; + base::StringPiece trimmed_entry = trigger_id ? entry.substr(1) : entry; int variation_id = 0; if (!base::StringToInt(trimmed_entry, &variation_id)) { @@ -114,14 +66,6 @@ return true; } -std::set<std::string> VariationsHttpHeaderProvider::GetVariationHeaderNames() - const { - std::set<std::string> headers; - headers.insert(kChromeUMAEnabled); - headers.insert(kClientData); - return headers; -} - void VariationsHttpHeaderProvider::ResetForTesting() { base::AutoLock scoped_lock(lock_); @@ -132,11 +76,9 @@ } VariationsHttpHeaderProvider::VariationsHttpHeaderProvider() - : variation_ids_cache_initialized_(false) { -} + : variation_ids_cache_initialized_(false) {} -VariationsHttpHeaderProvider::~VariationsHttpHeaderProvider() { -} +VariationsHttpHeaderProvider::~VariationsHttpHeaderProvider() {} void VariationsHttpHeaderProvider::OnFieldTrialGroupFinalized( const std::string& trial_name, @@ -158,11 +100,11 @@ } void VariationsHttpHeaderProvider::OnSyntheticTrialsChanged( - const std::vector<metrics::SyntheticTrialGroup>& groups) { + const std::vector<SyntheticTrialGroup>& groups) { base::AutoLock scoped_lock(lock_); synthetic_variation_ids_set_.clear(); - for (const metrics::SyntheticTrialGroup& group : groups) { + for (const SyntheticTrialGroup& group : groups) { const VariationID id = GetGoogleVariationIDFromHashes(GOOGLE_WEB_PROPERTIES, group.id); if (id != EMPTY_ID) @@ -188,15 +130,13 @@ for (base::FieldTrial::ActiveGroups::const_iterator it = initial_groups.begin(); it != initial_groups.end(); ++it) { - const VariationID id = - GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, it->trial_name, - it->group_name); + const VariationID id = GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, + it->trial_name, it->group_name); if (id != EMPTY_ID) variation_ids_set_.insert(id); - const VariationID trigger_id = - GetGoogleVariationID(GOOGLE_WEB_PROPERTIES_TRIGGER, it->trial_name, - it->group_name); + const VariationID trigger_id = GetGoogleVariationID( + GOOGLE_WEB_PROPERTIES_TRIGGER, it->trial_name, it->group_name); if (trigger_id != EMPTY_ID) variation_trigger_ids_set_.insert(trigger_id); } @@ -204,10 +144,8 @@ UMA_HISTOGRAM_CUSTOM_COUNTS( "Variations.HeaderConstructionTime", - (base::TimeTicks::Now() - before_time).InMicroseconds(), - 0, - base::TimeDelta::FromSeconds(1).InMicroseconds(), - 50); + (base::TimeTicks::Now() - before_time).InMicroseconds(), 0, + base::TimeDelta::FromSeconds(1).InMicroseconds(), 50); variation_ids_cache_initialized_ = true; } @@ -265,27 +203,4 @@ variation_ids_header_ = hashed; } -// static -bool VariationsHttpHeaderProvider::ShouldAppendHeaders(const GURL& url) { - if (google_util::IsGoogleDomainUrl(url, google_util::ALLOW_SUBDOMAIN, - google_util::ALLOW_NON_STANDARD_PORTS)) { - return true; - } - - if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) - return false; - - // Some domains don't have international TLD extensions, so testing for them - // is very straight forward. - const std::string host = url.host(); - for (size_t i = 0; i < arraysize(kSuffixesToSetHeadersFor); ++i) { - if (base::EndsWith(host, kSuffixesToSetHeadersFor[i], - base::CompareCase::INSENSITIVE_ASCII)) - return true; - } - - return google_util::IsYoutubeDomainUrl(url, google_util::ALLOW_SUBDOMAIN, - google_util::ALLOW_NON_STANDARD_PORTS); -} - } // namespace variations
diff --git a/components/variations/net/variations_http_header_provider.h b/components/variations/variations_http_header_provider.h similarity index 70% rename from components/variations/net/variations_http_header_provider.h rename to components/variations/variations_http_header_provider.h index 21f8659..18ff19d 100644 --- a/components/variations/net/variations_http_header_provider.h +++ b/components/variations/variations_http_header_provider.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 COMPONENTS_VARIATIONS_NET_VARIATIONS_HTTP_HEADER_PROVIDER_H_ -#define COMPONENTS_VARIATIONS_NET_VARIATIONS_HTTP_HEADER_PROVIDER_H_ +#ifndef COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_ +#define COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_ #include <set> #include <string> @@ -13,21 +13,12 @@ #include "base/gtest_prod_util.h" #include "base/metrics/field_trial.h" #include "base/synchronization/lock.h" -#include "components/metrics/metrics_service.h" +#include "components/variations/synthetic_trials.h" #include "components/variations/variations_associated_data.h" -namespace content { -class ResourceContext; -} - -namespace net { -class HttpRequestHeaders; -} - -class GURL; - namespace base { -template <typename T> struct DefaultSingletonTraits; +template <typename T> +struct DefaultSingletonTraits; } namespace variations { @@ -36,18 +27,13 @@ // transmitted in custom HTTP request headers. // This class is a thread-safe singleton. class VariationsHttpHeaderProvider : public base::FieldTrialList::Observer, - public metrics::SyntheticTrialObserver { + public SyntheticTrialObserver { public: static VariationsHttpHeaderProvider* GetInstance(); - // Adds Chrome experiment and metrics state as custom headers to |headers|. - // Some headers may not be set given the |incognito| mode or whether - // the user has |uma_enabled|. Also, we never transmit headers to non-Google - // sites, which is checked based on the destination |url|. - void AppendHeaders(const GURL& url, - bool incognito, - bool uma_enabled, - net::HttpRequestHeaders* headers); + // Returns the value of the client data header, computing and caching it if + // necessary. + std::string GetClientDataHeader(); // Sets *additional* variation ids and trigger variation ids to be encoded in // the X-Client-Data request header. This is intended for development use to @@ -56,9 +42,6 @@ // with "t" it will be treated as a trigger experiment id. bool SetDefaultVariationIds(const std::string& variation_ids); - // Returns the HTTP header names which are added in this class. - std::set<std::string> GetVariationHeaderNames() const; - // Resets any cached state for tests. void ResetForTesting(); @@ -66,8 +49,6 @@ friend struct base::DefaultSingletonTraits<VariationsHttpHeaderProvider>; FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest, - ShouldAppendHeaders); - FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid); FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid); @@ -85,7 +66,7 @@ // metrics::SyntheticTrialObserver: void OnSyntheticTrialsChanged( - const std::vector<metrics::SyntheticTrialGroup>& groups) override; + const std::vector<SyntheticTrialGroup>& groups) override; // Prepares the variation IDs cache with initial values if not already done. // This method also registers the caller with the FieldTrialList to receive @@ -97,10 +78,6 @@ // held. void UpdateVariationIDsHeaderValue(); - // Checks whether variation headers should be appended to requests to the - // specified |url|. Returns true for google.<TLD> and youtube.<TLD> URLs. - static bool ShouldAppendHeaders(const GURL& url); - // Guards |variation_ids_cache_initialized_|, |variation_ids_set_| and // |variation_ids_header_|. base::Lock lock_; @@ -127,4 +104,4 @@ } // namespace variations -#endif // COMPONENTS_VARIATIONS_NET_VARIATIONS_HTTP_HEADER_PROVIDER_H_ +#endif // COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_
diff --git a/components/variations/variations_http_header_provider_unittest.cc b/components/variations/variations_http_header_provider_unittest.cc new file mode 100644 index 0000000..22d5173 --- /dev/null +++ b/components/variations/variations_http_header_provider_unittest.cc
@@ -0,0 +1,126 @@ +// 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 "components/variations/variations_http_header_provider.h" + +#include <string> + +#include "base/base64.h" +#include "base/message_loop/message_loop.h" +#include "base/metrics/field_trial.h" +#include "base/run_loop.h" +#include "components/variations/entropy_provider.h" +#include "components/variations/proto/client_variations.pb.h" +#include "components/variations/variations_associated_data.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace variations { + +namespace { + +// Decodes the variations header and extracts the variation ids. +bool ExtractVariationIds(const std::string& variations, + std::set<VariationID>* variation_ids, + std::set<VariationID>* trigger_ids) { + std::string serialized_proto; + if (!base::Base64Decode(variations, &serialized_proto)) + return false; + ClientVariations proto; + if (!proto.ParseFromString(serialized_proto)) + return false; + for (int i = 0; i < proto.variation_id_size(); ++i) + variation_ids->insert(proto.variation_id(i)); + for (int i = 0; i < proto.trigger_variation_id_size(); ++i) + trigger_ids->insert(proto.trigger_variation_id(i)); + return true; +} + +scoped_refptr<base::FieldTrial> CreateTrialAndAssociateId( + const std::string& trial_name, + const std::string& default_group_name, + IDCollectionKey key, + VariationID id) { + scoped_refptr<base::FieldTrial> trial( + base::FieldTrialList::CreateFieldTrial(trial_name, default_group_name)); + + AssociateGoogleVariationID(key, trial->trial_name(), trial->group_name(), id); + + return trial; +} + +} // namespace + +class VariationsHttpHeaderProviderTest : public ::testing::Test { + public: + VariationsHttpHeaderProviderTest() {} + + ~VariationsHttpHeaderProviderTest() override {} + + void TearDown() override { testing::ClearAllVariationIDs(); } +}; + +TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid) { + base::MessageLoop loop; + VariationsHttpHeaderProvider provider; + + // Valid experiment ids. + EXPECT_TRUE(provider.SetDefaultVariationIds("12,456,t789")); + provider.InitVariationIDsCacheIfNeeded(); + std::string variations = provider.GetClientDataHeader(); + EXPECT_FALSE(variations.empty()); + std::set<VariationID> variation_ids; + std::set<VariationID> trigger_ids; + ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids)); + EXPECT_TRUE(variation_ids.find(12) != variation_ids.end()); + EXPECT_TRUE(variation_ids.find(456) != variation_ids.end()); + EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end()); + EXPECT_FALSE(variation_ids.find(789) != variation_ids.end()); +} + +TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid) { + base::MessageLoop loop; + VariationsHttpHeaderProvider provider; + + // Invalid experiment ids. + EXPECT_FALSE(provider.SetDefaultVariationIds("abcd12,456")); + provider.InitVariationIDsCacheIfNeeded(); + EXPECT_TRUE(provider.GetClientDataHeader().empty()); + + // Invalid trigger experiment id + EXPECT_FALSE(provider.SetDefaultVariationIds("12,tabc456")); + provider.InitVariationIDsCacheIfNeeded(); + EXPECT_TRUE(provider.GetClientDataHeader().empty()); +} + +TEST_F(VariationsHttpHeaderProviderTest, OnFieldTrialGroupFinalized) { + base::MessageLoop loop; + base::FieldTrialList field_trial_list(nullptr); + VariationsHttpHeaderProvider provider; + provider.InitVariationIDsCacheIfNeeded(); + + const std::string default_name = "default"; + scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId( + "t1", default_name, GOOGLE_WEB_PROPERTIES, 123)); + + ASSERT_EQ(default_name, trial_1->group_name()); + + scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId( + "t2", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER, 456)); + + ASSERT_EQ(default_name, trial_2->group_name()); + + // Run the message loop to make sure OnFieldTrialGroupFinalized is called for + // the two field trials. + base::RunLoop().RunUntilIdle(); + + std::string variations = provider.GetClientDataHeader(); + + std::set<VariationID> variation_ids; + std::set<VariationID> trigger_ids; + ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids)); + EXPECT_TRUE(variation_ids.find(123) != variation_ids.end()); + EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end()); +} + +} // namespace variations
diff --git a/components/web_restriction.gypi b/components/web_restriction.gypi deleted file mode 100644 index 01aa9bde..0000000 --- a/components/web_restriction.gypi +++ /dev/null
@@ -1,23 +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. - -{ - 'conditions': [ - ['OS == "android"', { - 'targets': [ - { - # GN: //components/web_restriction:web_restriction_java - 'target_name': 'web_restriction_java', - 'type': 'none', - 'variables': { - 'java_in_dir': 'web_restriction/java', - }, - 'dependencies': [ - '../base/base.gyp:base', - ], - 'includes': [ '../build/java.gypi' ], - }, - ], - }]] -}
diff --git a/components/web_restriction/BUILD.gn b/components/web_restriction/BUILD.gn deleted file mode 100644 index b6974db..0000000 --- a/components/web_restriction/BUILD.gn +++ /dev/null
@@ -1,20 +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. - -import("//build/config/android/rules.gni") - -# GYP: components.gyp:web_restriction_java -android_library("web_restriction_java") { - java_files = [ "java/src/org/chromium/components/webrestriction/WebRestrictionsContentProvider.java" ] -} - -# GYP: //components/components_test.gyp:components_junit_tests -junit_binary("components_web_restrictions_junit_tests") { - java_files = [ "junit/src/org/chromium/components/webrestriction/WebRestrictionsContentProviderTest.java" ] - deps = [ - ":web_restriction_java", - "//base:base_java", - "//third_party/junit:hamcrest", - ] -}
diff --git a/components/web_restriction/OWNERS b/components/web_restriction/OWNERS deleted file mode 100644 index b9540e11..0000000 --- a/components/web_restriction/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -aberent@chromium.org -bauerb@chromium.org \ No newline at end of file
diff --git a/components/web_restriction/java/src/org/chromium/components/webrestriction/WebRestrictionsContentProvider.java b/components/web_restriction/java/src/org/chromium/components/webrestriction/WebRestrictionsContentProvider.java deleted file mode 100644 index e549de6a..0000000 --- a/components/web_restriction/java/src/org/chromium/components/webrestriction/WebRestrictionsContentProvider.java +++ /dev/null
@@ -1,178 +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. - -package org.chromium.components.webrestriction; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.UriMatcher; -import android.content.pm.ProviderInfo; -import android.database.AbstractCursor; -import android.database.Cursor; -import android.net.Uri; -import android.util.Pair; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Abstract content provider for providing web restrictions, i.e. for providing a filter for URLs so - * that they can be blocked or permitted, and a means of requesting permission for new URLs. It - * provides two (virtual) tables; an 'authorized' table listing the the status of every URL, and a - * 'requested' table containing the requests for access to new URLs. The 'authorized' table is read - * only and the 'requested' table is write only. - */ -public abstract class WebRestrictionsContentProvider extends ContentProvider { - public static final int BLOCKED = 0; - public static final int PROCEED = 1; - private static final int WEB_RESTRICTIONS = 1; - private static final int AUTHORIZED = 2; - private static final int REQUESTED = 3; - - private final Pattern mSelectionPattern; - private UriMatcher mContentUriMatcher; - private Uri mContentUri; - - protected WebRestrictionsContentProvider() { - // Pattern to extract the URL from the selection. - // Matches patterns of the form "url = '<url>'" with arbitrary spacing around the "=" etc. - mSelectionPattern = Pattern.compile("\\s*url\\s*=\\s*'([^']*)'"); - } - - @Override - public boolean onCreate() { - return true; - } - - @Override - public void attachInfo(Context context, ProviderInfo info) { - super.attachInfo(context, info); - mContentUri = new Uri.Builder().scheme("content").authority(info.authority).build(); - mContentUriMatcher = new UriMatcher(WEB_RESTRICTIONS); - mContentUriMatcher.addURI(info.authority, "authorized", AUTHORIZED); - mContentUriMatcher.addURI(info.authority, "requested", REQUESTED); - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - // Check that this is the a query on the 'authorized' table - // TODO(aberent): Provide useful queries on the 'requested' table. - if (mContentUriMatcher.match(uri) != AUTHORIZED) return null; - // If the selection is of the right form get the url we are querying. - Matcher matcher = mSelectionPattern.matcher(selection); - if (!matcher.find()) return null; - final String url = matcher.group(1); - final Pair<Boolean, String> result = shouldProceed(url); - - return new AbstractCursor() { - - @Override - public int getCount() { - return 1; - } - - @Override - public String[] getColumnNames() { - return new String[] {"Should Proceed", "Error message"}; - } - - @Override - public String getString(int column) { - if (column == 1) return result.second; - return null; - } - - @Override - public short getShort(int column) { - return 0; - } - - @Override - public int getInt(int column) { - if (column == 0) return result.first ? PROCEED : BLOCKED; - return 0; - } - - @Override - public long getLong(int column) { - return 0; - } - - @Override - public float getFloat(int column) { - return 0; - } - - @Override - public double getDouble(int column) { - return 0; - } - - @Override - public boolean isNull(int column) { - return false; - } - }; - } - - @Override - public String getType(Uri uri) { - // Abused to return whether we can insert - if (mContentUriMatcher.match(uri) != REQUESTED) return null; - return canInsert() ? "text/plain" : null; - } - - @Override - public Uri insert(Uri uri, ContentValues values) { - if (mContentUriMatcher.match(uri) != REQUESTED) return null; - String url = values.getAsString("url"); - if (requestInsert(url)) { - // TODO(aberent): If we ever make the 'requested' table readable then we might want to - // change this to a more conventional content URI (with a row number). - return uri.buildUpon().appendPath(url).build(); - } else { - return null; - } - } - - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - return 0; - } - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - return 0; - } - - /** - * @param url the URL that is wanted. - * @return a pair containing the Result and the HTML Error Message. result is true if safe to - * proceed, false otherwise. error message is only meaningful if result is false, a null - * error message means use application default. - */ - protected abstract Pair<Boolean, String> shouldProceed(final String url); - - /** - * @return whether the content provider allows insertions. - */ - protected abstract boolean canInsert(); - - /** - * Start a request that a URL should be permitted - * - * @param url the URL that is wanted. - */ - protected abstract boolean requestInsert(final String url); - - /** - * Call to tell observers that the filter has changed. - */ - protected void onFilterChanged() { - getContext().getContentResolver().notifyChange( - mContentUri.buildUpon().appendPath("authorized").build(), null); - } -}
diff --git a/components/web_restriction/junit/src/org/chromium/components/webrestriction/WebRestrictionsContentProviderTest.java b/components/web_restriction/junit/src/org/chromium/components/webrestriction/WebRestrictionsContentProviderTest.java deleted file mode 100644 index 0da6bd8..0000000 --- a/components/web_restriction/junit/src/org/chromium/components/webrestriction/WebRestrictionsContentProviderTest.java +++ /dev/null
@@ -1,121 +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. - -package org.chromium.components.webrestriction; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.pm.ProviderInfo; -import android.database.Cursor; -import android.net.Uri; -import android.util.Pair; - -import org.chromium.testing.local.LocalRobolectricTestRunner; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowContentResolver; - -/** - * Tests of WebRestrictionsContentProvider. - */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class WebRestrictionsContentProviderTest { - private static final String AUTHORITY = "org.chromium.browser.DummyProvider"; - - private WebRestrictionsContentProvider mContentProvider; - private ContentResolver mContentResolver; - private Uri mUri; - - @Before - public void setUp() { - // The test needs a concrete version of the test class, but mocks the additional members as - // necessary. - mContentProvider = Mockito.spy(new WebRestrictionsContentProvider() { - @Override - protected Pair<Boolean, String> shouldProceed(String url) { - return null; - } - - @Override - protected boolean canInsert() { - return false; - } - - @Override - protected boolean requestInsert(String url) { - return false; - } - }); - mContentProvider.onCreate(); - ShadowContentResolver.registerProvider(AUTHORITY, mContentProvider); - ProviderInfo info = new ProviderInfo(); - info.authority = AUTHORITY; - mContentProvider.attachInfo(null, info); - mContentResolver = Robolectric.application.getContentResolver(); - mUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY) - .build(); - } - - @Test - public void testQuery() { - when(mContentProvider.shouldProceed(anyString())) - .thenReturn(new Pair<Boolean, String>(false, "Error Message")); - Cursor cursor = mContentResolver.query(mUri.buildUpon().appendPath("authorized").build(), - null, "url = 'dummy'", null, null); - verify(mContentProvider).shouldProceed("dummy"); - assertThat(cursor, is(not(nullValue()))); - assertThat(cursor.getInt(0), is(WebRestrictionsContentProvider.BLOCKED)); - assertThat(cursor.getString(1), is("Error Message")); - when(mContentProvider.shouldProceed(anyString())) - .thenReturn(new Pair<Boolean, String>(true, null)); - cursor = mContentResolver.query(mUri.buildUpon().appendPath("authorized").build(), null, - "url = 'dummy'", null, null); - assertThat(cursor, is(not(nullValue()))); - assertThat(cursor.getInt(0), is(WebRestrictionsContentProvider.PROCEED)); - } - - @Test - public void testInsert() { - ContentValues values = new ContentValues(); - values.put("url", "dummy2"); - when(mContentProvider.requestInsert(anyString())).thenReturn(false); - assertThat( - mContentResolver.insert(mUri.buildUpon().appendPath("requested").build(), values), - is(nullValue())); - verify(mContentProvider).requestInsert("dummy2"); - values.put("url", "dummy3"); - when(mContentProvider.requestInsert(anyString())).thenReturn(true); - assertThat( - mContentResolver.insert(mUri.buildUpon().appendPath("requested").build(), values), - is(not(nullValue()))); - verify(mContentProvider).requestInsert("dummy3"); - } - - @Test - public void testGetType() { - assertThat(mContentResolver.getType(mUri.buildUpon().appendPath("junk").build()), - is(nullValue())); - when(mContentProvider.canInsert()).thenReturn(false); - assertThat(mContentResolver.getType(mUri.buildUpon().appendPath("requested").build()), - is(nullValue())); - when(mContentProvider.canInsert()).thenReturn(true); - assertThat(mContentResolver.getType(mUri.buildUpon().appendPath("requested").build()), - is(not(nullValue()))); - } -}
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index 08fe609..e9b8579 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -315,6 +315,18 @@ return base::string16(); } + // In accordance with ARIA, some elements use their contents as an + // accessibility name, so some elements will have the same name as their + // child. While most platforms expect this, it causes Android to speak the + // name twice. So in this case we should remove the name from the parent. + if (GetRole() == ui::AX_ROLE_LIST_ITEM && + GetIntAttribute(ui::AX_ATTR_NAME_FROM) == ui::AX_NAME_FROM_CONTENTS) { + // This is an approximation of "PlatformChildCount() > 0" because we can't + // call PlatformChildCount from here. + if (InternalChildCount() > 0 && !HasOnlyStaticTextChildren()) + return base::string16(); + } + // We can only expose one accessible name on Android, // not 2 or 3 like on Windows or Mac.
diff --git a/content/browser/appcache/appcache_storage_impl_unittest.cc b/content/browser/appcache/appcache_storage_impl_unittest.cc index d673053..c7266954 100644 --- a/content/browser/appcache/appcache_storage_impl_unittest.cc +++ b/content/browser/appcache/appcache_storage_impl_unittest.cc
@@ -391,8 +391,7 @@ // Test harness -------------------------------------------------- - AppCacheStorageImplTest() { - } + AppCacheStorageImplTest() { request_delegate_.set_quit_on_complete(false); } template <class Method> void RunTestOnIOThread(Method method) { @@ -1765,7 +1764,7 @@ AppCacheHost* host2 = backend_->GetHost(2); GURL manifest_url = MockHttpServer::GetMockUrl("manifest"); request_ = service()->request_context()->CreateRequest( - manifest_url, net::DEFAULT_PRIORITY, NULL); + manifest_url, net::DEFAULT_PRIORITY, &request_delegate_); AppCacheInterceptor::SetExtraRequestInfo( request_.get(), service_.get(), backend_->process_id(), host2->host_id(), @@ -1891,6 +1890,7 @@ scoped_ptr<MockServiceObserver> observer_; MockAppCacheFrontend frontend_; scoped_ptr<AppCacheBackendImpl> backend_; + net::TestDelegate request_delegate_; scoped_ptr<net::URLRequest> request_; };
diff --git a/content/browser/dom_storage/dom_storage_database.cc b/content/browser/dom_storage/dom_storage_database.cc index 1e0166f..b19dffa 100644 --- a/content/browser/dom_storage/dom_storage_database.cc +++ b/content/browser/dom_storage/dom_storage_database.cc
@@ -151,6 +151,10 @@ db_.reset(new sql::Connection()); db_->set_histogram_tag("DOMStorageDatabase"); + // TODO(shess): The current mitigation for http://crbug.com/537742 stores + // state in the meta table, which this database does not use. + db_->set_mmap_disabled(); + if (file_path_.empty()) { // This code path should only be triggered by unit tests. if (!db_->OpenInMemory()) {
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index ae742bc..c87425a 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc
@@ -1102,7 +1102,7 @@ FrameTreeNode* main_frame_tree_node = static_cast<RenderFrameHostImpl*>(web_contents()->GetMainFrame()) ->frame_tree_node(); - EnqueueFrame(FrameTreeNode::kFrameTreeNodeInvalidID, // No container. + EnqueueFrame(FrameTreeNode::kFrameTreeNodeInvalidId, // No container. main_frame_tree_node->frame_tree_node_id(), main_frame_tree_node->current_url()); }
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc index 1933290a..f857d54 100644 --- a/content/browser/frame_host/frame_tree.cc +++ b/content/browser/frame_host/frame_tree.cc
@@ -194,7 +194,7 @@ } } -RenderFrameHostImpl* FrameTree::AddFrame( +bool FrameTree::AddFrame( FrameTreeNode* parent, int process_id, int new_routing_id, @@ -202,23 +202,28 @@ const std::string& frame_name, blink::WebSandboxFlags sandbox_flags, const blink::WebFrameOwnerProperties& frame_owner_properties) { + CHECK_NE(new_routing_id, MSG_ROUTING_NONE); + // A child frame always starts with an initial empty document, which means // it is in the same SiteInstance as the parent frame. Ensure that the process // which requested a child frame to be added is the same as the process of the // parent node. - // We return nullptr if this is not the case, which can happen in a race if an - // old RFH sends a CreateChildFrame message as we're swapping to a new RFH. if (parent->current_frame_host()->GetProcess()->GetID() != process_id) - return nullptr; + return false; - scoped_ptr<FrameTreeNode> node(new FrameTreeNode( - this, parent->navigator(), render_frame_delegate_, render_view_delegate_, - render_widget_delegate_, manager_delegate_, scope, frame_name, - sandbox_flags, frame_owner_properties)); - FrameTreeNode* node_ptr = node.get(); // AddChild is what creates the RenderFrameHost. - parent->AddChild(node.Pass(), process_id, new_routing_id); - return node_ptr->current_frame_host(); + FrameTreeNode* added_node = parent->AddChild( + make_scoped_ptr(new FrameTreeNode( + this, parent->navigator(), render_frame_delegate_, + render_view_delegate_, render_widget_delegate_, manager_delegate_, + scope, frame_name, sandbox_flags, frame_owner_properties)), + process_id, new_routing_id); + + // Now that the new node is part of the FrameTree and has a RenderFrameHost, + // we can announce the creation of the initial RenderFrame which already + // exists in the renderer process. + added_node->current_frame_host()->SetRenderFrameCreated(true); + return true; } void FrameTree::RemoveFrame(FrameTreeNode* child) {
diff --git a/content/browser/frame_host/frame_tree.h b/content/browser/frame_host/frame_tree.h index 945b04d..ee101c9c 100644 --- a/content/browser/frame_host/frame_tree.h +++ b/content/browser/frame_host/frame_tree.h
@@ -73,19 +73,20 @@ // it safe to remove children during the callback. void ForEach(const base::Callback<bool(FrameTreeNode*)>& on_node) const; - // Frame tree manipulation routines. - // |process_id| is required to disambiguate |new_routing_id|, and it must - // match the process of the |parent| node. Otherwise this method returns - // nullptr. Passing MSG_ROUTING_NONE for |new_routing_id| will allocate a new - // routing ID for the new frame. - RenderFrameHostImpl* AddFrame( - FrameTreeNode* parent, - int process_id, - int new_routing_id, - blink::WebTreeScopeType scope, - const std::string& frame_name, - blink::WebSandboxFlags sandbox_flags, - const blink::WebFrameOwnerProperties& frame_owner_properties); + // Adds a new child frame to the frame tree. |process_id| is required to + // disambiguate |new_routing_id|, and it must match the process of the + // |parent| node. Otherwise no child is added and this method returns false. + bool AddFrame(FrameTreeNode* parent, + int process_id, + int new_routing_id, + blink::WebTreeScopeType scope, + const std::string& frame_name, + blink::WebSandboxFlags sandbox_flags, + const blink::WebFrameOwnerProperties& frame_owner_properties); + + // Removes a frame from the frame tree. |child|, its children, and objects + // owned by their RenderFrameHostManagers are immediately deleted. The root + // node cannot be removed this way. void RemoveFrame(FrameTreeNode* child); // This method walks the entire frame tree and creates a RenderFrameProxyHost
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index 212aefa..9290bdf7 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc
@@ -102,6 +102,7 @@ } FrameTreeNode::~FrameTreeNode() { + children_.clear(); frame_tree_->FrameRemoved(this); FOR_EACH_OBSERVER(Observer, observers_, OnFrameTreeNodeDestroyed(this)); @@ -123,9 +124,9 @@ return frame_tree_->root() == this; } -void FrameTreeNode::AddChild(scoped_ptr<FrameTreeNode> child, - int process_id, - int frame_routing_id) { +FrameTreeNode* FrameTreeNode::AddChild(scoped_ptr<FrameTreeNode> child, + int process_id, + int frame_routing_id) { // Child frame must always be created in the same process as the parent. CHECK_EQ(process_id, render_manager_.current_host()->GetProcess()->GetID()); child->set_parent(this); @@ -147,6 +148,7 @@ render_manager_.CreateProxiesForChildFrame(child.get()); children_.push_back(child.Pass()); + return children_.back().get(); } void FrameTreeNode::RemoveChild(FrameTreeNode* child) {
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h index d678c9a5..e69ddfae 100644 --- a/content/browser/frame_host/frame_tree_node.h +++ b/content/browser/frame_host/frame_tree_node.h
@@ -43,7 +43,7 @@ virtual ~Observer() {} }; - static const int kFrameTreeNodeInvalidID = -1; + static const int kFrameTreeNodeInvalidId = -1; // Returns the FrameTreeNode with the given global |frame_tree_node_id|, // regardless of which FrameTree it is in. @@ -67,9 +67,9 @@ bool IsMainFrame() const; - void AddChild(scoped_ptr<FrameTreeNode> child, - int process_id, - int frame_routing_id); + FrameTreeNode* AddChild(scoped_ptr<FrameTreeNode> child, + int process_id, + int frame_routing_id); void RemoveChild(FrameTreeNode* child); // Clears process specific-state in this node to prepare for a new process.
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc index abc16c9..2a8bb676 100644 --- a/content/browser/frame_host/frame_tree_unittest.cc +++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -123,6 +123,8 @@ // - Add a series of nodes and verify tree structure. // - Remove a series of nodes and verify tree structure. TEST_F(FrameTreeTest, Shape) { + main_test_rfh()->InitializeRenderFrameIfNeeded(); + // Use the FrameTree of the WebContents so that it has all the delegates it // needs. We may want to consider a test version of this. FrameTree* frame_tree = contents()->GetFrameTree(); @@ -135,8 +137,8 @@ // Do not navigate each frame separately, since that will clutter the test // itself. Instead, leave them in "not live" state, which is indicated by the // * after the frame id, since this test cares about the shape, not the - // frame liveliness. - EXPECT_EQ("2*: []", GetTreeState(frame_tree)); + // frame liveness. + EXPECT_EQ("2: []", GetTreeState(frame_tree)); // Simulate attaching a series of frames to build the frame tree. frame_tree->AddFrame(root, process_id, 14, blink::WebTreeScopeType::Document, @@ -163,9 +165,9 @@ blink::WebFrameOwnerProperties()); EXPECT_EQ( - "2*: [14*: [244*: [], 245*: []], " - "15*: [255* 'no children node': []], " - "16*: []]", + "2: [14: [244: [], 245: []], " + "15: [255 'no children node': []], " + "16: []]", GetTreeState(frame_tree)); FrameTreeNode* child_16 = root->child_at(2); @@ -210,38 +212,38 @@ // Now that's it's fully built, verify the tree structure is as expected. EXPECT_EQ( - "2*: [14*: [244*: [], 245*: []], " - "15*: [255* 'no children node': []], " - "16*: [264*: [], 265*: [], 266*: [], " - "267* 'node with deep subtree': " - "[365*: [455*: [555*: [655*: []]]]], 268*: []]]", + "2: [14: [244: [], 245: []], " + "15: [255 'no children node': []], " + "16: [264: [], 265: [], 266: [], " + "267 'node with deep subtree': " + "[365: [455: [555: [655: []]]]], 268: []]]", GetTreeState(frame_tree)); FrameTreeNode* child_555 = child_267->child_at(0)->child_at(0)->child_at(0); frame_tree->RemoveFrame(child_555); EXPECT_EQ( - "2*: [14*: [244*: [], 245*: []], " - "15*: [255* 'no children node': []], " - "16*: [264*: [], 265*: [], 266*: [], " - "267* 'node with deep subtree': " - "[365*: [455*: []]], 268*: []]]", + "2: [14: [244: [], 245: []], " + "15: [255 'no children node': []], " + "16: [264: [], 265: [], 266: [], " + "267 'node with deep subtree': " + "[365: [455: []]], 268: []]]", GetTreeState(frame_tree)); frame_tree->RemoveFrame(child_16->child_at(1)); EXPECT_EQ( - "2*: [14*: [244*: [], 245*: []], " - "15*: [255* 'no children node': []], " - "16*: [264*: [], 266*: [], " - "267* 'node with deep subtree': " - "[365*: [455*: []]], 268*: []]]", + "2: [14: [244: [], 245: []], " + "15: [255 'no children node': []], " + "16: [264: [], 266: [], " + "267 'node with deep subtree': " + "[365: [455: []]], 268: []]]", GetTreeState(frame_tree)); frame_tree->RemoveFrame(root->child_at(1)); EXPECT_EQ( - "2*: [14*: [244*: [], 245*: []], " - "16*: [264*: [], 266*: [], " - "267* 'node with deep subtree': " - "[365*: [455*: []]], 268*: []]]", + "2: [14: [244: [], 245: []], " + "16: [264: [], 266: [], " + "267 'node with deep subtree': " + "[365: [455: []]], 268: []]]", GetTreeState(frame_tree)); }
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index 5f38228..cb4f1d0 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -2044,8 +2044,9 @@ // Prereq: add a subframe with an initial auto-subframe navigation. main_test_rfh()->OnCreateChildFrame( - MSG_ROUTING_NONE, blink::WebTreeScopeType::Document, std::string(), - blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); + process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, + std::string(), blink::WebSandboxFlags::None, + blink::WebFrameOwnerProperties()); RenderFrameHostImpl* subframe = contents()->GetFrameTree()->root()->child_at(0)->current_frame_host(); const GURL subframe_url("http://foo1/subframe"); @@ -2124,8 +2125,9 @@ // Add a subframe and navigate it. main_test_rfh()->OnCreateChildFrame( - MSG_ROUTING_NONE, blink::WebTreeScopeType::Document, std::string(), - blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); + process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, + std::string(), blink::WebSandboxFlags::None, + blink::WebFrameOwnerProperties()); RenderFrameHostImpl* subframe = contents()->GetFrameTree()->root()->child_at(0)->current_frame_host(); const GURL url2("http://foo/2"); @@ -2169,8 +2171,9 @@ // Add a second subframe and navigate. main_test_rfh()->OnCreateChildFrame( - MSG_ROUTING_NONE, blink::WebTreeScopeType::Document, std::string(), - blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); + process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, + std::string(), blink::WebSandboxFlags::None, + blink::WebFrameOwnerProperties()); RenderFrameHostImpl* subframe2 = contents()->GetFrameTree()->root()->child_at(1)->current_frame_host(); const GURL url3("http://foo/3"); @@ -2213,7 +2216,7 @@ } // Add a nested subframe and navigate. - subframe->OnCreateChildFrame(MSG_ROUTING_NONE, + subframe->OnCreateChildFrame(process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, std::string(), blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); @@ -2279,8 +2282,9 @@ // Prereq: add a subframe with an initial auto-subframe navigation. main_test_rfh()->OnCreateChildFrame( - MSG_ROUTING_NONE, blink::WebTreeScopeType::Document, std::string(), - blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); + process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, + std::string(), blink::WebSandboxFlags::None, + blink::WebFrameOwnerProperties()); RenderFrameHostImpl* subframe = contents()->GetFrameTree()->root()->child_at(0)->current_frame_host(); const GURL subframe_url("http://foo1/subframe"); @@ -3712,8 +3716,9 @@ // Add and navigate a subframe that would normally count as in-page. main_test_rfh()->OnCreateChildFrame( - MSG_ROUTING_NONE, blink::WebTreeScopeType::Document, std::string(), - blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); + process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, + std::string(), blink::WebSandboxFlags::None, + blink::WebFrameOwnerProperties()); RenderFrameHostImpl* subframe = contents()->GetFrameTree()->root()->child_at(0)->current_frame_host(); const GURL subframe_url("http://www.google.com/#"); @@ -3878,8 +3883,9 @@ // Send a subframe update from the first page, as if one had just // automatically loaded. Auto subframes don't increment the page ID. main_test_rfh()->OnCreateChildFrame( - MSG_ROUTING_NONE, blink::WebTreeScopeType::Document, std::string(), - blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); + process()->GetNextRoutingID(), blink::WebTreeScopeType::Document, + std::string(), blink::WebSandboxFlags::None, + blink::WebFrameOwnerProperties()); RenderFrameHostImpl* subframe = contents()->GetFrameTree()->root()->child_at(0)->current_frame_host(); const GURL url1_sub("http://foo/subframe");
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 7dd70f7..7803372 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -799,18 +799,13 @@ // RenderFrame corresponding to this host sent an IPC message to create a // frame and it is delivered after this host is swapped out. // Ignore such messages, as we know this RenderFrameHost is going away. - if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) + if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT || + frame_tree_node_->current_frame_host() != this) return; - RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( - frame_tree_node_, GetProcess()->GetID(), new_routing_id, scope, - frame_name, sandbox_flags, frame_owner_properties); - if (!new_frame) - return; - - // We know that the RenderFrame has been created in this case, immediately - // after the CreateChildFrame IPC was sent. - new_frame->SetRenderFrameCreated(true); + frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id, + scope, frame_name, sandbox_flags, + frame_owner_properties); } void RenderFrameHostImpl::OnDetach() {
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc index 8359226..249b779 100644 --- a/content/browser/frame_host/render_frame_host_manager.cc +++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -315,7 +315,7 @@ bool RenderFrameHostManager::ForInnerDelegate() { return delegate_->GetOuterDelegateFrameTreeNodeId() != - FrameTreeNode::kFrameTreeNodeInvalidID; + FrameTreeNode::kFrameTreeNodeInvalidId; } RenderWidgetHostImpl* @@ -1568,8 +1568,8 @@ // Don't swap processes for extensions embedded in DevTools. See // https://crbug.com/564216. if (rfh->GetSiteInstance()->GetSiteURL().SchemeIs(kChromeDevToolsScheme)) { - CHECK(!dest_url.SchemeIs(url::kHttpScheme) && - !dest_url.SchemeIs(url::kHttpsScheme)); + // TODO(nick): https://crbug.com/570483 Check to see if |dest_url| is a + // devtools extension, and swap processes if not. return false; } @@ -2149,6 +2149,9 @@ bool is_main_frame = frame_tree_node_->IsMainFrame(); + // While the old frame is still current, remove its children from the tree. + frame_tree_node_->ResetForNewProcess(); + // Swap in the pending or speculative frame and make it active. Also ensure // the FrameTree stays in sync. scoped_ptr<RenderFrameHostImpl> old_render_frame_host; @@ -2163,9 +2166,6 @@ SetRenderFrameHost(speculative_render_frame_host_.Pass()); } - // Remove the children of the old frame from the tree. - frame_tree_node_->ResetForNewProcess(); - // The process will no longer try to exit, so we can decrement the count. render_frame_host_->GetProcess()->RemovePendingView();
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h index 9690fe4..f141527f 100644 --- a/content/browser/frame_host/render_frame_host_manager.h +++ b/content/browser/frame_host/render_frame_host_manager.h
@@ -166,7 +166,7 @@ // If the delegate is an inner WebContents, this method returns the // FrameTreeNode ID of the frame in the outer WebContents which hosts - // the inner WebContents. Returns FrameTreeNode::kFrameTreeNodeInvalidID + // the inner WebContents. Returns FrameTreeNode::kFrameTreeNodeInvalidId // if the delegate does not have an outer WebContents. virtual int GetOuterDelegateFrameTreeNodeId() = 0;
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index a85a6497..443c3e6e 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -2487,6 +2487,7 @@ // set separately in a second pass, since their opener routing IDs won't be // available during the first pass of CreateOpenerProxies. TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { + contents()->NavigateAndCommit(GURL("http://tab1.com")); FrameTree* tree1 = contents()->GetFrameTree(); FrameTreeNode* root1 = tree1->root(); int process_id = root1->current_frame_host()->GetProcess()->GetID(); @@ -2499,6 +2500,7 @@ scoped_ptr<TestWebContents> tab2( TestWebContents::Create(browser_context(), nullptr)); + tab2->NavigateAndCommit(GURL("http://tab2.com")); FrameTree* tree2 = tab2->GetFrameTree(); FrameTreeNode* root2 = tree2->root(); process_id = root2->current_frame_host()->GetProcess()->GetID(); @@ -2516,6 +2518,7 @@ scoped_ptr<TestWebContents> tab4( TestWebContents::Create(browser_context(), nullptr)); + tab4->NavigateAndCommit(GURL("http://tab4.com")); FrameTree* tree4 = tab4->GetFrameTree(); FrameTreeNode* root4 = tree4->root(); process_id = root4->current_frame_host()->GetProcess()->GetID();
diff --git a/content/browser/media/webrtc_media_recorder_browsertest.cc b/content/browser/media/webrtc_media_recorder_browsertest.cc index 33f6abe6..48d1547 100644 --- a/content/browser/media/webrtc_media_recorder_browsertest.cc +++ b/content/browser/media/webrtc_media_recorder_browsertest.cc
@@ -68,27 +68,11 @@ MakeTypicalCall("testStartWithTimeSlice();", kMediaRecorderHtmlFile); } -IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, MediaRecorderStartEvent) { - MakeTypicalCall("testStartAndStartEventTriggered();", kMediaRecorderHtmlFile); -} - -IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, - MediaRecorderStopEvent) { - MakeTypicalCall("testStartStopAndStopEventTriggered();", - kMediaRecorderHtmlFile); -} - IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, MediaRecorderResume) { MakeTypicalCall("testResumeAndRecorderState();", kMediaRecorderHtmlFile); } IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, - MediaRecorderResumeEvent) { - MakeTypicalCall("testResumeAndResumeEventTriggered();", - kMediaRecorderHtmlFile); -} - -IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, MediaRecorderNoResumeWhenRecorderInactive) { MakeTypicalCall("testNoResumeWhileRecorderInactive();", kMediaRecorderHtmlFile); @@ -110,18 +94,14 @@ } IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, - MediaRecorderPauseEvent) { - MakeTypicalCall("testPauseAndPauseEventTriggered();", kMediaRecorderHtmlFile); + MediaRecorderPausePreventsDataavailableFromBeingFired) { + MakeTypicalCall("testPausePreventsDataavailableFromBeingFired();", + kMediaRecorderHtmlFile); } IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, - MediaRecorderPauseAndNoDataAvailable) { - MakeTypicalCall("testPauseAndNoDataAvailable();", kMediaRecorderHtmlFile); -} - -IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcMediaRecorderTest, - MediaRecorderNoPauseWhenRecorderInactive) { - MakeTypicalCall("testNoPauseWhileRecorderInactive();", + MediaRecorderIllegalPauseThrowsDOMError) { + MakeTypicalCall("testIllegalPauseThrowsDOMError();", kMediaRecorderHtmlFile); }
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index 74a079b..33d113b7 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -69,7 +69,6 @@ namespace { -const unsigned int kMaxUiSwapBuffers = 1U; const unsigned int kMaxDisplaySwapBuffers = 1U; // Used to override capabilities_.adjust_deadline_for_parent to false @@ -142,8 +141,7 @@ OutputSurface::OnSwapBuffersComplete(); } - void OnUpdateVSyncParameters(base::TimeTicks timebase, - base::TimeDelta interval) override { + void OnVSync(base::TimeTicks timebase, base::TimeDelta interval) override { CommitVSyncParameters(timebase, interval); } @@ -155,6 +153,36 @@ scoped_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; }; +class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, + public CompositorImpl::VSyncObserver { + public: + ExternalBeginFrameSource(CompositorImpl* compositor) + : compositor_(compositor) { + compositor_->AddObserver(this); + } + + ~ExternalBeginFrameSource() override { + compositor_->RemoveObserver(this); + } + + // cc::BeginFrameSourceBase implementation: + void OnNeedsBeginFramesChange( + bool needs_begin_frames) override { + compositor_->OnNeedsBeginFramesChange(needs_begin_frames); + } + + // CompositorImpl::VSyncObserver implementation: + void OnVSync(base::TimeTicks frame_time, + base::TimeDelta vsync_period) override { + CallOnBeginFrame(cc::BeginFrameArgs::Create( + BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks::Now(), vsync_period, + cc::BeginFrameArgs::NORMAL)); + } + + private: + CompositorImpl* compositor_; +}; + static bool g_initialized = false; bool g_use_surface_manager = false; @@ -237,15 +265,11 @@ surface_id_(0), client_(client), root_window_(root_window), - did_post_swapbuffers_(false), - ignore_schedule_composite_(false), - needs_composite_(false), needs_animate_(false), - will_composite_immediately_(false), - composite_on_vsync_trigger_(DO_NOT_COMPOSITE), pending_swapbuffers_(0U), num_successive_context_creation_failures_(0), output_surface_request_pending_(false), + needs_begin_frames_(false), weak_factory_(this) { DCHECK(client); DCHECK(root_window); @@ -260,111 +284,6 @@ SetSurface(NULL); } -void CompositorImpl::PostComposite(CompositingTrigger trigger) { - DCHECK(host_->visible()); - DCHECK(needs_composite_); - DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY); - - if (will_composite_immediately_ || - (trigger == COMPOSITE_EVENTUALLY && WillComposite())) { - // We will already composite soon enough. - DCHECK(WillComposite()); - return; - } - - if (DidCompositeThisFrame()) { - DCHECK(!WillCompositeThisFrame()); - if (composite_on_vsync_trigger_ != COMPOSITE_IMMEDIATELY) { - composite_on_vsync_trigger_ = trigger; - root_window_->RequestVSyncUpdate(); - } - DCHECK(WillComposite()); - return; - } - - base::TimeDelta delay; - if (trigger == COMPOSITE_IMMEDIATELY) { - will_composite_immediately_ = true; - composite_on_vsync_trigger_ = DO_NOT_COMPOSITE; - } else { - DCHECK(!WillComposite()); - const base::TimeDelta estimated_composite_time = vsync_period_ / 4; - const base::TimeTicks now = base::TimeTicks::Now(); - - if (!last_vsync_.is_null() && (now - last_vsync_) < vsync_period_) { - base::TimeTicks next_composite = - last_vsync_ + vsync_period_ - estimated_composite_time; - if (next_composite < now) { - // It's too late, we will reschedule composite as needed on the next - // vsync. - composite_on_vsync_trigger_ = COMPOSITE_EVENTUALLY; - root_window_->RequestVSyncUpdate(); - DCHECK(WillComposite()); - return; - } - - delay = next_composite - now; - } - } - TRACE_EVENT2("cc,benchmark", "CompositorImpl::PostComposite", - "trigger", trigger, - "delay", delay.InMillisecondsF()); - - DCHECK(composite_on_vsync_trigger_ == DO_NOT_COMPOSITE); - if (current_composite_task_) - current_composite_task_->Cancel(); - - // Unretained because we cancel the task on shutdown. - current_composite_task_.reset(new base::CancelableClosure( - base::Bind(&CompositorImpl::Composite, base::Unretained(this), trigger))); - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, current_composite_task_->callback(), delay); -} - -void CompositorImpl::Composite(CompositingTrigger trigger) { - if (trigger == COMPOSITE_IMMEDIATELY) - will_composite_immediately_ = false; - - DCHECK(host_->visible()); - DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY); - DCHECK(needs_composite_); - DCHECK(!DidCompositeThisFrame()); - - DCHECK_LE(pending_swapbuffers_, kMaxUiSwapBuffers); - // Swap Ack accounting is unreliable if the OutputSurface was lost. - // In that case still attempt to composite, which will cause creation of a - // new OutputSurface and reset pending_swapbuffers_. - if (pending_swapbuffers_ == kMaxUiSwapBuffers && - !host_->output_surface_lost()) { - TRACE_EVENT0("compositor", "CompositorImpl_SwapLimit"); - return; - } - - // Reset state before Layout+Composite since that might create more - // requests to Composite that we need to respect. - needs_composite_ = false; - - // Only allow compositing once per vsync. - current_composite_task_->Cancel(); - DCHECK(DidCompositeThisFrame() && !WillComposite()); - - const base::TimeTicks frame_time = base::TimeTicks::Now(); - if (needs_animate_) { - base::AutoReset<bool> auto_reset_ignore_schedule( - &ignore_schedule_composite_, true); - needs_animate_ = false; - root_window_->Animate(frame_time); - } - - did_post_swapbuffers_ = false; - host_->Composite(frame_time); - if (did_post_swapbuffers_) - pending_swapbuffers_++; - - // Need to track vsync to avoid compositing more than once per frame. - root_window_->RequestVSyncUpdate(); -} - ui::UIResourceProvider& CompositorImpl::GetUIResourceProvider() { return *this; } @@ -425,27 +344,20 @@ void CompositorImpl::CreateLayerTreeHost() { DCHECK(!host_); - DCHECK(!WillCompositeThisFrame()); - - // Just in case, since we immediately hide the LTH in this function, - // and we do not want to end up with a pending Composite task when the - // host is hidden. - base::AutoReset<bool> auto_reset_ignore_schedule(&ignore_schedule_composite_, - true); cc::LayerTreeSettings settings; settings.renderer_settings.refresh_rate = 60.0; settings.renderer_settings.allow_antialiasing = false; settings.renderer_settings.highp_threshold_min = 2048; settings.use_zero_copy = true; + settings.use_external_begin_frame_source = true; base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); settings.initial_debug_state.SetRecordRenderingStats( command_line->HasSwitch(cc::switches::kEnableGpuBenchmarking)); if (command_line->HasSwitch(cc::switches::kDisableCompositorPropertyTrees)) settings.use_property_trees = false; - // TODO(enne): Update this this compositor to use the scheduler. - settings.single_thread_proxy_scheduler = false; + settings.single_thread_proxy_scheduler = true; settings.use_compositor_animation_timelines = !command_line->HasSwitch( switches::kDisableAndroidCompositorAnimationTimelines); @@ -457,6 +369,7 @@ params.task_graph_runner = g_task_graph_runner.Pointer(); params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); params.settings = &settings; + params.external_begin_frame_source.reset(new ExternalBeginFrameSource(this)); host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); DCHECK(!host_->visible()); host_->SetRootLayer(root_layer_); @@ -474,39 +387,16 @@ TRACE_EVENT1("cc", "CompositorImpl::SetVisible", "visible", visible); if (!visible) { DCHECK(host_->visible()); - // Look for any layers that were attached to the root for readback - // and are waiting for Composite() to happen. - bool readback_pending = false; - for (size_t i = 0; i < root_layer_->children().size(); ++i) { - if (root_layer_->children()[i]->HasCopyRequest()) { - readback_pending = true; - break; - } - } - if (readback_pending) { - base::AutoReset<bool> auto_reset_ignore_schedule( - &ignore_schedule_composite_, true); - host_->Composite(base::TimeTicks::Now()); - } - if (WillComposite()) - CancelComposite(); host_->SetVisible(false); if (!host_->output_surface_lost()) host_->ReleaseOutputSurface(); pending_swapbuffers_ = 0; - needs_composite_ = false; - composite_on_vsync_trigger_ = DO_NOT_COMPOSITE; establish_gpu_channel_timeout_.Stop(); display_client_.reset(); - if (current_composite_task_) { - current_composite_task_->Cancel(); - current_composite_task_.reset(); - } } else { host_->SetVisible(true); if (output_surface_request_pending_) RequestNewOutputSurface(); - SetNeedsComposite(); } } @@ -537,10 +427,7 @@ void CompositorImpl::SetNeedsComposite() { if (!host_->visible()) return; - DCHECK(!needs_composite_ || WillComposite()); - - needs_composite_ = true; - PostComposite(COMPOSITE_IMMEDIATELY); + host_->SetNeedsAnimate(); } static scoped_ptr<WebGraphicsContext3DCommandBufferImpl> @@ -574,9 +461,11 @@ } void CompositorImpl::UpdateLayerTreeHost() { - base::AutoReset<bool> auto_reset_ignore_schedule(&ignore_schedule_composite_, - true); client_->UpdateLayerTreeHost(); + if (needs_animate_) { + needs_animate_ = false; + root_window_->Animate(base::TimeTicks::Now()); + } } void CompositorImpl::OnGpuChannelEstablished() { @@ -706,44 +595,15 @@ return gpu_capabilities_.texture_format_etc1_npot; } -void CompositorImpl::ScheduleComposite() { - if (ignore_schedule_composite_ || !host_->visible()) - return; - - DCHECK(!needs_composite_ || WillComposite()); - needs_composite_ = true; - // We currently expect layer tree invalidations at most once per frame - // during normal operation and therefore try to composite immediately - // to minimize latency. - PostComposite(COMPOSITE_IMMEDIATELY); -} - -void CompositorImpl::ScheduleAnimation() { - needs_animate_ = true; - - if (!host_->visible()) - return; - - if (needs_composite_) { - DCHECK(WillComposite()); - return; - } - - TRACE_EVENT0("cc", "CompositorImpl::ScheduleAnimation"); - needs_composite_ = true; - PostComposite(COMPOSITE_EVENTUALLY); -} - void CompositorImpl::DidPostSwapBuffers() { TRACE_EVENT0("compositor", "CompositorImpl::DidPostSwapBuffers"); - did_post_swapbuffers_ = true; + pending_swapbuffers_++; } void CompositorImpl::DidCompleteSwapBuffers() { TRACE_EVENT0("compositor", "CompositorImpl::DidCompleteSwapBuffers"); DCHECK_GT(pending_swapbuffers_, 0U); - if (pending_swapbuffers_-- == kMaxUiSwapBuffers && needs_composite_) - PostComposite(COMPOSITE_IMMEDIATELY); + pending_swapbuffers_--; client_->OnSwapBuffersCompleted(pending_swapbuffers_); } @@ -752,7 +612,8 @@ // This really gets called only once from // SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() when the // context was lost. - ScheduleComposite(); + if (host_->visible()) + host_->SetNeedsCommit(); client_->OnSwapBuffersCompleted(0); } @@ -771,28 +632,19 @@ void CompositorImpl::OnVSync(base::TimeTicks frame_time, base::TimeDelta vsync_period) { - vsync_period_ = vsync_period; - last_vsync_ = frame_time; - - if (WillCompositeThisFrame()) { - // We somehow missed the last vsync interval, so reschedule for deadline. - // We cannot schedule immediately, or will get us out-of-phase with new - // renderer frames. - CancelComposite(); - composite_on_vsync_trigger_ = COMPOSITE_EVENTUALLY; - } else { - current_composite_task_.reset(); - } - - DCHECK(!DidCompositeThisFrame() && !WillCompositeThisFrame()); - if (composite_on_vsync_trigger_ != DO_NOT_COMPOSITE) { - CompositingTrigger trigger = composite_on_vsync_trigger_; - composite_on_vsync_trigger_ = DO_NOT_COMPOSITE; - PostComposite(trigger); - } - FOR_EACH_OBSERVER(VSyncObserver, observer_list_, - OnUpdateVSyncParameters(frame_time, vsync_period)); + OnVSync(frame_time, vsync_period)); + if (needs_begin_frames_) + root_window_->RequestVSyncUpdate(); +} + +void CompositorImpl::OnNeedsBeginFramesChange(bool needs_begin_frames) { + if (needs_begin_frames_ == needs_begin_frames) + return; + + needs_begin_frames_ = needs_begin_frames; + if (needs_begin_frames_) + root_window_->RequestVSyncUpdate(); } void CompositorImpl::SetNeedsAnimate() {
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h index 7dc3837..65be041 100644 --- a/content/browser/renderer_host/compositor_impl_android.h +++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -48,8 +48,8 @@ public: class VSyncObserver { public: - virtual void OnUpdateVSyncParameters(base::TimeTicks timebase, - base::TimeDelta interval) = 0; + virtual void OnVSync(base::TimeTicks timebase, + base::TimeDelta interval) = 0; }; CompositorImpl(CompositorClient* client, gfx::NativeWindow root_window); @@ -64,6 +64,7 @@ void AddObserver(VSyncObserver* observer); void RemoveObserver(VSyncObserver* observer); + void OnNeedsBeginFramesChange(bool needs_begin_frames); // ui::ResourceProvider implementation. cc::UIResourceId CreateUIResource(cc::UIResourceClient* client) override; @@ -106,8 +107,6 @@ override {} // LayerTreeHostSingleThreadClient implementation. - void ScheduleComposite() override; - void ScheduleAnimation() override; void DidPostSwapBuffers() override; void DidAbortSwapBuffers() override; @@ -118,38 +117,8 @@ void OnVSync(base::TimeTicks frame_time, base::TimeDelta vsync_period) override; void SetNeedsAnimate() override; - void SetVisible(bool visible); - - enum CompositingTrigger { - DO_NOT_COMPOSITE, - COMPOSITE_IMMEDIATELY, - COMPOSITE_EVENTUALLY, - }; - void PostComposite(CompositingTrigger trigger); - void Composite(CompositingTrigger trigger); void CreateOutputSurface(); - - bool WillCompositeThisFrame() const { - return current_composite_task_ && - !current_composite_task_->callback().is_null(); - } - bool DidCompositeThisFrame() const { - return current_composite_task_ && - current_composite_task_->callback().is_null(); - } - bool WillComposite() const { - return WillCompositeThisFrame() || - composite_on_vsync_trigger_ != DO_NOT_COMPOSITE; - } - void CancelComposite() { - DCHECK(WillComposite()); - if (WillCompositeThisFrame()) - current_composite_task_->Cancel(); - current_composite_task_.reset(); - composite_on_vsync_trigger_ = DO_NOT_COMPOSITE; - will_composite_immediately_ = false; - } void CreateLayerTreeHost(); void OnGpuChannelEstablished(); @@ -177,39 +146,15 @@ gfx::NativeWindow root_window_; - // Used locally to track whether a call to LTH::Composite() did result in - // a posted SwapBuffers(). - bool did_post_swapbuffers_; - - // Used locally to inhibit ScheduleComposite() during - // UpdateLayerTreeHost(). - bool ignore_schedule_composite_; - - // Whether we need to composite in general because of any invalidation or - // explicit request. - bool needs_composite_; - // Whether we need to update animations on the next composite. bool needs_animate_; - // Whether we posted a task and are about to composite. - bool will_composite_immediately_; - - // How we should schedule Composite during the next vsync. - CompositingTrigger composite_on_vsync_trigger_; - - // The Composite operation scheduled for the current vsync interval. - scoped_ptr<base::CancelableClosure> current_composite_task_; - // The number of SwapBuffer calls that have not returned and ACK'd from // the GPU thread. unsigned int pending_swapbuffers_; size_t num_successive_context_creation_failures_; - base::TimeDelta vsync_period_; - base::TimeTicks last_vsync_; - base::OneShotTimer establish_gpu_channel_timeout_; // Whether there is an OutputSurface request pending from the current @@ -220,6 +165,7 @@ gpu::Capabilities gpu_capabilities_; + bool needs_begin_frames_; base::ObserverList<VSyncObserver, true> observer_list_; base::WeakPtrFactory<CompositorImpl> weak_factory_;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index ebb9308..366b9595 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -319,7 +319,7 @@ WebContentsImpl::WebContentsTreeNode::WebContentsTreeNode() : outer_web_contents_(nullptr), outer_contents_frame_tree_node_id_( - FrameTreeNode::kFrameTreeNodeInvalidID) { + FrameTreeNode::kFrameTreeNodeInvalidId) { } WebContentsImpl::WebContentsTreeNode::~WebContentsTreeNode() { @@ -4630,7 +4630,7 @@ if (node_ && node_->outer_web_contents()) return node_->outer_contents_frame_tree_node_id(); - return FrameTreeNode::kFrameTreeNodeInvalidID; + return FrameTreeNode::kFrameTreeNodeInvalidId; } RenderFrameHostManager* WebContentsImpl::GetRenderManager() const {
diff --git a/content/child/child_process.cc b/content/child/child_process.cc index 01675b3..db6964dc 100644 --- a/content/child/child_process.cc +++ b/content/child/child_process.cc
@@ -123,7 +123,7 @@ #if defined(OS_ANDROID) LOG(ERROR) << label << " waiting for GDB."; // Wait 24 hours for a debugger to be attached to the current process. - base::debug::WaitForDebugger(24 * 60 * 60, false); + base::debug::WaitForDebugger(24 * 60 * 60, true); #else // TODO(playmobil): In the long term, overriding this flag doesn't seem // right, either use our own flag or open a dialog we can use.
diff --git a/content/common/gpu/client/gl_helper_unittest.cc b/content/common/gpu/client/gl_helper_unittest.cc index 971866f1..782ff79 100644 --- a/content/common/gpu/client/gl_helper_unittest.cc +++ b/content/common/gpu/client/gl_helper_unittest.cc
@@ -1790,40 +1790,44 @@ } } -// Flaky. http://crbug.com/562114 -TEST_F(GLHelperPixelTest, DISABLED_YUVReadbackTest) { - int sizes[] = {2, 4, 14}; - for (int flip = 0; flip <= 1; flip++) { - for (int use_mrt = 0; use_mrt <= 1; use_mrt++) { - for (unsigned int x = 0; x < arraysize(sizes); x++) { - for (unsigned int y = 0; y < arraysize(sizes); y++) { - for (unsigned int ox = x; ox < arraysize(sizes); ox++) { - for (unsigned int oy = y; oy < arraysize(sizes); oy++) { - // If output is a subsection of the destination frame, (letterbox) - // then try different variations of where the subsection goes. - for (Margin xm = x < ox ? MarginLeft : MarginRight; - xm <= MarginRight; - xm = NextMargin(xm)) { - for (Margin ym = y < oy ? MarginLeft : MarginRight; - ym <= MarginRight; - ym = NextMargin(ym)) { - for (int pattern = 0; pattern < 3; pattern++) { - TestYUVReadback(sizes[x], - sizes[y], - sizes[ox], - sizes[oy], - compute_margin(sizes[x], sizes[ox], xm), - compute_margin(sizes[y], sizes[oy], ym), - pattern, - flip == 1, - use_mrt == 1, - content::GLHelper::SCALER_QUALITY_GOOD); - if (HasFailure()) { - return; - } - } - } - } +class GLHelperPixelYuvReadback : + public GLHelperPixelTest, + public ::testing::WithParamInterface< + std::tr1::tuple<bool, bool, unsigned int, unsigned int>> {}; + +int kYUVReadBackSizes[] = {2, 4, 14}; + +TEST_P(GLHelperPixelYuvReadback, Test) { + bool flip = std::tr1::get<0>(GetParam()); + bool use_mrt = std::tr1::get<1>(GetParam()); + unsigned int x = std::tr1::get<2>(GetParam()); + unsigned int y = std::tr1::get<3>(GetParam()); + + for (unsigned int ox = x; ox < arraysize(kYUVReadBackSizes); ox++) { + for (unsigned int oy = y; oy < arraysize(kYUVReadBackSizes); oy++) { + // If output is a subsection of the destination frame, (letterbox) + // then try different variations of where the subsection goes. + for (Margin xm = x < ox ? MarginLeft : MarginRight; + xm <= MarginRight; + xm = NextMargin(xm)) { + for (Margin ym = y < oy ? MarginLeft : MarginRight; + ym <= MarginRight; + ym = NextMargin(ym)) { + for (int pattern = 0; pattern < 3; pattern++) { + TestYUVReadback(kYUVReadBackSizes[x], + kYUVReadBackSizes[y], + kYUVReadBackSizes[ox], + kYUVReadBackSizes[oy], + compute_margin(kYUVReadBackSizes[x], + kYUVReadBackSizes[ox], xm), + compute_margin(kYUVReadBackSizes[y], + kYUVReadBackSizes[oy], ym), + pattern, + flip, + use_mrt, + content::GLHelper::SCALER_QUALITY_GOOD); + if (HasFailure()) { + return; } } } @@ -1832,6 +1836,17 @@ } } +// First argument is intentionally empty. +INSTANTIATE_TEST_CASE_P( + , + GLHelperPixelYuvReadback, + ::testing::Combine( + ::testing::Bool(), + ::testing::Bool(), + ::testing::Range<unsigned int>(0, arraysize(kYUVReadBackSizes)), + ::testing::Range<unsigned int>(0, arraysize(kYUVReadBackSizes)))); + + // Per pixel tests, all sizes are small so that we can print // out the generated bitmaps. TEST_F(GLHelperPixelTest, ScaleTest) {
diff --git a/content/common/gpu/image_transport_surface_overlay_mac.h b/content/common/gpu/image_transport_surface_overlay_mac.h index a84df2a..66ce211 100644 --- a/content/common/gpu/image_transport_surface_overlay_mac.h +++ b/content/common/gpu/image_transport_surface_overlay_mac.h
@@ -52,7 +52,10 @@ const gfx::RectF& contents_rect, float opacity, unsigned background_color, - const gfx::SizeF& bounds_size, + unsigned edge_aa_mask, + const gfx::RectF& bounds_rect, + bool is_clipped, + const gfx::RectF& clip_rect, const gfx::Transform& transform) override; bool IsSurfaceless() const override;
diff --git a/content/common/gpu/image_transport_surface_overlay_mac.mm b/content/common/gpu/image_transport_surface_overlay_mac.mm index 40d0df5..9b31d4e 100644 --- a/content/common/gpu/image_transport_surface_overlay_mac.mm +++ b/content/common/gpu/image_transport_surface_overlay_mac.mm
@@ -760,7 +760,10 @@ const gfx::RectF& contents_rect, float opacity, unsigned background_color, - const gfx::SizeF& bounds_size, + unsigned edge_aa_mask, + const gfx::RectF& bounds_rect, + bool is_clipped, + const gfx::RectF& clip_rect, const gfx::Transform& transform) { // Extract the IOSurface, if this layer is not just a solid color. int io_surface_id = 0; @@ -784,7 +787,7 @@ pending_overlay_planes_.push_back(OverlayPlane::CreateWithTransform( next_ca_layer_z_order_++, io_surface_id, io_surface, contents_rect, - opacity, srgb_background_color, bounds_size, transform)); + opacity, srgb_background_color, bounds_rect.size(), transform)); return true; }
diff --git a/content/common/gpu/media/android_video_decode_accelerator.cc b/content/common/gpu/media/android_video_decode_accelerator.cc index fa0a03e..131e73f 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.cc +++ b/content/common/gpu/media/android_video_decode_accelerator.cc
@@ -85,6 +85,10 @@ return base::TimeDelta::FromMicroseconds(0); } +static inline const base::TimeDelta IdleTimerTimeOut() { + return base::TimeDelta::FromSeconds(1); +} + AndroidVideoDecodeAccelerator::AndroidVideoDecodeAccelerator( const base::WeakPtr<gpu::gles2::GLES2Decoder> decoder, const base::Callback<bool(void)>& make_context_current) @@ -182,18 +186,20 @@ return; } - QueueInput(); + bool did_work = QueueInput(); while (DequeueOutput()) - ; + did_work = true; + + ManageTimer(did_work); } -void AndroidVideoDecodeAccelerator::QueueInput() { +bool AndroidVideoDecodeAccelerator::QueueInput() { DCHECK(thread_checker_.CalledOnValidThread()); TRACE_EVENT0("media", "AVDA::QueueInput"); if (bitstreams_notified_in_advance_.size() > kMaxBitstreamsNotifiedInAdvance) - return; + return false; if (pending_bitstream_buffers_.empty()) - return; + return false; int input_buf_index = 0; media::MediaCodecStatus status = @@ -201,7 +207,7 @@ if (status != media::MEDIA_CODEC_OK) { DCHECK(status == media::MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER || status == media::MEDIA_CODEC_ERROR); - return; + return false; } base::Time queued_time = pending_bitstream_buffers_.front().second; @@ -215,13 +221,13 @@ if (bitstream_buffer.id() == -1) { media_codec_->QueueEOS(input_buf_index); - return; + return true; } scoped_ptr<base::SharedMemory> shm( new base::SharedMemory(bitstream_buffer.handle(), true)); RETURN_ON_FAILURE(this, shm->Map(bitstream_buffer.size()), - "Failed to SharedMemory::Map()", UNREADABLE_INPUT); + "Failed to SharedMemory::Map()", UNREADABLE_INPUT, false); const base::TimeDelta presentation_timestamp = bitstream_buffer.presentation_timestamp(); @@ -257,7 +263,8 @@ << " status:" << status; RETURN_ON_FAILURE(this, status == media::MEDIA_CODEC_OK, - "Failed to QueueInputBuffer: " << status, PLATFORM_FAILURE); + "Failed to QueueInputBuffer: " << status, PLATFORM_FAILURE, + false); // We should call NotifyEndOfBitstreamBuffer(), when no more decoded output // will be returned from the bitstream buffer. However, MediaCodec API is @@ -272,6 +279,8 @@ weak_this_factory_.GetWeakPtr(), bitstream_buffer.id())); bitstreams_notified_in_advance_.push_back(bitstream_buffer.id()); + + return true; } bool AndroidVideoDecodeAccelerator::DequeueOutput() { @@ -526,10 +535,7 @@ if (!media_codec_) return false; - io_timer_.Start(FROM_HERE, - DecodePollDelay(), - this, - &AndroidVideoDecodeAccelerator::DoIOTask); + ManageTimer(true); return true; } @@ -646,6 +652,26 @@ client_->NotifyError(error); } +void AndroidVideoDecodeAccelerator::ManageTimer(bool did_work) { + bool should_be_running = true; + + base::TimeTicks now = base::TimeTicks::Now(); + if (!did_work) { + // Make sure that we have done work recently enough, else stop the timer. + if (now - most_recent_work_ > IdleTimerTimeOut()) + should_be_running = false; + } else { + most_recent_work_ = now; + } + + if (should_be_running && !io_timer_.IsRunning()) { + io_timer_.Start(FROM_HERE, DecodePollDelay(), this, + &AndroidVideoDecodeAccelerator::DoIOTask); + } else if (!should_be_running && io_timer_.IsRunning()) { + io_timer_.Stop(); + } +} + // static bool AndroidVideoDecodeAccelerator::UseDeferredRenderingStrategy() { #if defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
diff --git a/content/common/gpu/media/android_video_decode_accelerator.h b/content/common/gpu/media/android_video_decode_accelerator.h index 3bfb18e..1eefb6e 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.h +++ b/content/common/gpu/media/android_video_decode_accelerator.h
@@ -132,7 +132,8 @@ // Feeds input data to |media_codec_|. This checks // |pending_bitstream_buffers_| and queues a buffer to |media_codec_|. - void QueueInput(); + // Returns true if any input was processed. + bool QueueInput(); // Dequeues output from |media_codec_| and feeds the decoded frame to the // client. Returns a hint about whether calling again might produce @@ -161,6 +162,11 @@ // Notifies about decoding errors. void NotifyError(media::VideoDecodeAccelerator::Error error); + // Start or stop our work-polling timer based on whether we did any work, and + // how long it has been since we've done work. Calling this with true will + // start the timer. Calling it with false may stop the timer. + void ManageTimer(bool did_work); + // Return true if and only if we should use deferred rendering. static bool UseDeferredRenderingStrategy(); @@ -234,6 +240,9 @@ // Backing strategy that we'll use to connect PictureBuffers to frames. scoped_ptr<BackingStrategy> strategy_; + // Time at which we last did useful work on io_timer_. + base::TimeTicks most_recent_work_; + // WeakPtrFactory for posting tasks back to |this|. base::WeakPtrFactory<AndroidVideoDecodeAccelerator> weak_this_factory_;
diff --git a/content/common/sandbox_init_win.cc b/content/common/sandbox_init_win.cc index e1c07c9..78c1fef 100644 --- a/content/common/sandbox_init_win.cc +++ b/content/common/sandbox_init_win.cc
@@ -47,9 +47,9 @@ base::ProcessId target_process_id, base::SharedMemoryHandle* target_handle) { HANDLE duped_handle; - if (!BrokerDuplicateHandle(source_handle.GetHandle(), target_process_id, - &duped_handle, - FILE_GENERIC_READ | FILE_GENERIC_WRITE, 0)) { + if (!BrokerDuplicateHandle( + source_handle.GetHandle(), target_process_id, &duped_handle, + FILE_MAP_READ | FILE_MAP_WRITE | SECTION_QUERY, 0)) { return false; }
diff --git a/content/gpu/in_process_gpu_thread.cc b/content/gpu/in_process_gpu_thread.cc index 10d0702e..4fa71bfb 100644 --- a/content/gpu/in_process_gpu_thread.cc +++ b/content/gpu/in_process_gpu_thread.cc
@@ -10,6 +10,10 @@ #include "content/gpu/gpu_process.h" #include "gpu/command_buffer/service/sync_point_manager.h" +#if defined(OS_ANDROID) +#include "base/android/jni_android.h" +#endif + namespace content { InProcessGpuThread::InProcessGpuThread( @@ -34,6 +38,14 @@ } void InProcessGpuThread::Init() { + // Call AttachCurrentThreadWithName, before any other AttachCurrentThread() + // calls. The latter causes Java VM to assign Thread-??? to the thread name. + // Please note calls to AttachCurrentThreadWithName after AttachCurrentThread + // will not change the thread name kept in Java VM. +#if defined(OS_ANDROID) + base::android::AttachCurrentThreadWithName(thread_name()); +#endif + gpu_process_ = new GpuProcess(); // The process object takes ownership of the thread object, so do not
diff --git a/content/public/common/push_messaging_status.cc b/content/public/common/push_messaging_status.cc index a0aa99e..b955bfc 100644 --- a/content/public/common/push_messaging_status.cc +++ b/content/public/common/push_messaging_status.cc
@@ -29,7 +29,7 @@ return "Registration failed - push service error"; case PUSH_REGISTRATION_STATUS_NO_SENDER_ID: - return "Registration failed - no sender id provided"; + return "Registration failed - gcm_sender_id not found in manifest"; case PUSH_REGISTRATION_STATUS_STORAGE_ERROR: return "Registration failed - storage error"; @@ -47,6 +47,9 @@ case PUSH_REGISTRATION_STATUS_PUBLIC_KEY_UNAVAILABLE: return "Registration failed - could not retrieve the public key"; + + case PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING: + return "Registration failed - manifest empty or missing"; } NOTREACHED(); return "";
diff --git a/content/public/common/push_messaging_status.h b/content/public/common/push_messaging_status.h index 191c28e..2fd887fd 100644 --- a/content/public/common/push_messaging_status.h +++ b/content/public/common/push_messaging_status.h
@@ -52,13 +52,17 @@ // Registration failed because the public key could not be retrieved. PUSH_REGISTRATION_STATUS_PUBLIC_KEY_UNAVAILABLE = 11, + // Registration failed because the manifest could not be retrieved or was + // empty. + PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING = 12, + // NOTE: Do not renumber these as that would confuse interpretation of // previously logged data. When making changes, also update the enum list // in tools/metrics/histograms/histograms.xml to keep it in sync, and // update PUSH_REGISTRATION_STATUS_LAST below. PUSH_REGISTRATION_STATUS_LAST = - PUSH_REGISTRATION_STATUS_PUBLIC_KEY_UNAVAILABLE + PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING }; // Push unregistration success/error codes for internal use & reporting in UMA.
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc index 3c4321d..1c7368db 100644 --- a/content/renderer/gpu/gpu_benchmarking_extension.cc +++ b/content/renderer/gpu/gpu_benchmarking_extension.cc
@@ -104,6 +104,7 @@ PNGSerializer serializer; picture->serialize(&file, &serializer); + file.fsync(); } private:
diff --git a/content/renderer/in_process_renderer_thread.cc b/content/renderer/in_process_renderer_thread.cc index 8b4b333b..94a41e6 100644 --- a/content/renderer/in_process_renderer_thread.cc +++ b/content/renderer/in_process_renderer_thread.cc
@@ -8,6 +8,10 @@ #include "content/renderer/render_process_impl.h" #include "content/renderer/render_thread_impl.h" +#if defined(OS_ANDROID) +#include "base/android/jni_android.h" +#endif + namespace content { InProcessRendererThread::InProcessRendererThread( @@ -20,6 +24,13 @@ } void InProcessRendererThread::Init() { + // Call AttachCurrentThreadWithName, before any other AttachCurrentThread() + // calls. The latter causes Java VM to assign Thread-??? to the thread name. + // Please note calls to AttachCurrentThreadWithName after AttachCurrentThread + // will not change the thread name kept in Java VM. +#if defined(OS_ANDROID) + base::android::AttachCurrentThreadWithName(thread_name()); +#endif render_process_.reset(new RenderProcessImpl()); RenderThreadImpl::Create(params_); }
diff --git a/content/renderer/push_messaging/push_messaging_dispatcher.cc b/content/renderer/push_messaging/push_messaging_dispatcher.cc index ff2b53c..d1070432 100644 --- a/content/renderer/push_messaging/push_messaging_dispatcher.cc +++ b/content/renderer/push_messaging/push_messaging_dispatcher.cc
@@ -62,6 +62,12 @@ service_worker_registration) ->registration_id(); + if (manifest.IsEmpty()) { + OnSubscribeFromDocumentError( + request_id, PUSH_REGISTRATION_STATUS_MANIFEST_EMPTY_OR_MISSING); + return; + } + std::string sender_id = manifest.gcm_sender_id.is_null() ? std::string()
diff --git a/content/test/data/accessibility/aria/aria-dropeffect-expected-android.txt b/content/test/data/accessibility/aria/aria-dropeffect-expected-android.txt index 3901b6e..14dd2e23 100644 --- a/content/test/data/accessibility/aria/aria-dropeffect-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-dropeffect-expected-android.txt
@@ -1,23 +1,23 @@ android.webkit.WebView focusable focused scrollable ++android.widget.ListView collection hierarchical item_count=7 row_count=7 -++++android.view.View collection_item name='copy' +++++android.view.View collection_item ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='copy' -++++android.view.View collection_item name='move' item_index=1 row_index=1 +++++android.view.View collection_item item_index=1 row_index=1 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='move' -++++android.view.View collection_item name='link' item_index=2 row_index=2 +++++android.view.View collection_item item_index=2 row_index=2 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='link' -++++android.view.View collection_item name='execute' item_index=3 row_index=3 +++++android.view.View collection_item item_index=3 row_index=3 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='execute' -++++android.view.View collection_item name='popup' item_index=4 row_index=4 +++++android.view.View collection_item item_index=4 row_index=4 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='popup' -++++android.view.View collection_item name='none(default)' item_index=5 row_index=5 +++++android.view.View collection_item item_index=5 row_index=5 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='none(default)' -++++android.view.View collection_item name='link' item_index=6 row_index=6 +++++android.view.View collection_item item_index=6 row_index=6 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='link'
diff --git a/content/test/data/accessibility/aria/aria-grabbed-expected-android.txt b/content/test/data/accessibility/aria/aria-grabbed-expected-android.txt index 2fcec20..e8e59d7 100644 --- a/content/test/data/accessibility/aria/aria-grabbed-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-grabbed-expected-android.txt
@@ -1,14 +1,14 @@ android.webkit.WebView focusable focused scrollable ++android.widget.ListView collection hierarchical item_count=3 row_count=3 -++++android.view.View collection_item name='grabbed-true blue' +++++android.view.View collection_item ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='grabbed-true ' ++++++android.widget.Image clickable name='blue' -++++android.view.View collection_item name='grabbed-false blue' item_index=1 row_index=1 +++++android.view.View collection_item item_index=1 row_index=1 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='grabbed-false ' ++++++android.widget.Image clickable name='blue' -++++android.view.View collection_item name='grabbed-undefined blue' item_index=2 row_index=2 +++++android.view.View collection_item item_index=2 row_index=2 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='grabbed-undefined ' ++++++android.widget.Image clickable name='blue'
diff --git a/content/test/data/accessibility/html/li-expected-android.txt b/content/test/data/accessibility/html/li-expected-android.txt index e7a4dcea..f10034a 100644 --- a/content/test/data/accessibility/html/li-expected-android.txt +++ b/content/test/data/accessibility/html/li-expected-android.txt
@@ -1,11 +1,11 @@ android.webkit.WebView focusable focused scrollable ++android.widget.ListView collection hierarchical item_count=3 row_count=3 -++++android.view.View collection_item name='Item 1' +++++android.view.View collection_item ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='Item 1' -++++android.view.View collection_item name='Item 2' item_index=1 row_index=1 +++++android.view.View collection_item item_index=1 row_index=1 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='Item 2' -++++android.view.View collection_item name='Item 3' item_index=2 row_index=2 +++++android.view.View collection_item item_index=2 row_index=2 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='Item 3'
diff --git a/content/test/data/accessibility/html/list-expected-android.txt b/content/test/data/accessibility/html/list-expected-android.txt index 01bc3c6..0889b59 100644 --- a/content/test/data/accessibility/html/list-expected-android.txt +++ b/content/test/data/accessibility/html/list-expected-android.txt
@@ -1,12 +1,12 @@ android.webkit.WebView focusable focused scrollable ++android.widget.ListView collection hierarchical item_count=3 row_count=3 -++++android.view.View collection_item name='tic' +++++android.view.View collection_item ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='tic' -++++android.view.View collection_item name='tac' item_index=1 row_index=1 +++++android.view.View collection_item item_index=1 row_index=1 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='tac' -++++android.view.View collection_item name='toe' item_index=2 row_index=2 +++++android.view.View collection_item item_index=2 row_index=2 ++++++android.view.View clickable name='•' ++++++android.view.View clickable name='toe' ++android.widget.ListView collection hierarchical item_count=3 row_count=3
diff --git a/content/test/data/accessibility/html/ol-expected-android.txt b/content/test/data/accessibility/html/ol-expected-android.txt index a7bc83a1..5008b056 100644 --- a/content/test/data/accessibility/html/ol-expected-android.txt +++ b/content/test/data/accessibility/html/ol-expected-android.txt
@@ -1,21 +1,21 @@ android.webkit.WebView focusable focused scrollable ++android.widget.ListView collection hierarchical item_count=3 row_count=3 -++++android.view.View collection_item name='Chrome' +++++android.view.View collection_item ++++++android.view.View clickable name='1' ++++++android.view.View clickable name='Chrome' -++++android.view.View collection_item name='Safari' item_index=1 row_index=1 +++++android.view.View collection_item item_index=1 row_index=1 ++++++android.view.View clickable name='2' ++++++android.view.View clickable name='Safari' -++++android.view.View collection_item name='IE' item_index=2 row_index=2 +++++android.view.View collection_item item_index=2 row_index=2 ++++++android.view.View clickable name='3' ++++++android.view.View clickable name='IE' ++android.widget.ListView collection hierarchical item_count=3 row_count=3 -++++android.view.View collection_item name='Android' +++++android.view.View collection_item ++++++android.view.View clickable name='10' ++++++android.view.View clickable name='Android' -++++android.view.View collection_item name='Mac' item_index=1 row_index=1 +++++android.view.View collection_item item_index=1 row_index=1 ++++++android.view.View clickable name='11' ++++++android.view.View clickable name='Mac' -++++android.view.View collection_item name='Windows' item_index=2 row_index=2 +++++android.view.View collection_item item_index=2 row_index=2 ++++++android.view.View clickable name='12' ++++++android.view.View clickable name='Windows'
diff --git a/content/test/data/media/mediarecorder_test.html b/content/test/data/media/mediarecorder_test.html index f75b68ec..7ffda98 100644 --- a/content/test/data/media/mediarecorder_test.html +++ b/content/test/data/media/mediarecorder_test.html
@@ -13,12 +13,23 @@ 'use strict'; -// This test must be run with experimental GetUserMedia flag on. - const DEFAULT_CONSTRAINTS= {audio:true, video:true}; const DEFAULT_RECORDER_MIME_TYPE = 'video/vp8'; const DEFAULT_TIME_SLICE = 100; +// Function assert_throws inspired from Blink's +// LayoutTests/resources/testharness.js + +function assertThrows(func, description) { + try { + func.call(this); + failTest('Error:' + func + description + " did not throw!"); + } catch (e) { + console.log(e); + reportTestSuccess(); + } +} + function createAndStartMediaRecorder(stream, mimeType, slice) { return new Promise(function(resolve, reject) { document.getElementById("video").src = URL.createObjectURL(stream); @@ -43,34 +54,30 @@ }); } +// Tests that the MediaRecorder's start() function will cause the |state| to be +// 'recording' and that a 'start' event is fired. function testStartAndRecorderState() { - navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) - .then(function(stream) { - return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); - }) - .then(function(recorder) { - assertEquals('recording', recorder.state); - }) - .catch(function(err) { - return failTest(err.toString()); - }) - .then(function() { - reportTestSuccess(); - }); -} - -function testStartStopAndRecorderState() { var theRecorder; + var startEventReceived = false; navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) .then(function(stream) { - return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); + return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); }) .then(function(recorder) { theRecorder = recorder; - theRecorder.stop(); + theRecorder.onstart = function(event) { + startEventReceived = true; + assertEquals('recording', theRecorder.state); + }; }) .then(function() { - assertEquals('inactive', theRecorder.state); + theRecorder.start(); + }) + .then(function() { + return waitFor('Make sure the start event was received', + function() { + return startEventReceived == true; + }); }) .catch(function(err) { return failTest(err.toString()); @@ -80,6 +87,39 @@ }); } +// Tests that the MediaRecorder's stop() function will effectively cause the +// |state| to be 'inactive' and that a 'stop' event is fired. +function testStartStopAndRecorderState() { + var theRecorder; + var stopEventReceived = false; + navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) + .then(function(stream) { + return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); + }) + .then(function(recorder) { + recorder.onstop = function(event) { + stopEventReceived = true; + assertEquals('inactive', theRecorder.state); + }; + recorder.stop(); + }) + .then(function() { + return waitFor('Make sure the stop event was received', + function() { + return stopEventReceived == true; + }); + }) + .catch(function(err) { + return failTest(err.toString()); + }) + .then(function() { + reportTestSuccess(); + }); +} + +// Tests that when MediaRecorder's start() functioo is called, some data is +// made available by media recorder via dataavailable events, containing non +// empty blob data. function testStartAndDataAvailable() { var videoSize = 0; var emptyBlobs = 0; @@ -116,6 +156,8 @@ }); } +// Tests that when MediaRecorder's start(timeSlice) is called, some data +// available events are fired containing non empty blob data. function testStartWithTimeSlice() { var videoSize = 0; var emptyBlobs = 0; @@ -152,89 +194,11 @@ }); } -function testStartAndStartEventTriggered() { - var theRecorder; - var startEventReceived = false; - navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) - .then(function(stream) { - return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); - }) - .then(function(recorder) { - theRecorder = recorder; - theRecorder.onstart = function(event) { - startEventReceived = true; - }; - }) - .then(function() { - theRecorder.start(); - }) - .then(function() { - return waitFor('Make sure the start event was received', - function() { - return startEventReceived == true; - }); - }) - .catch(function(err) { - return failTest(err.toString()); - }) - .then(function() { - reportTestSuccess(); - }); -} -function testStartStopAndStopEventTriggered() { - var theRecorder; - var stopEventReceived = false; - navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) - .then(function(stream) { - return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); - }) - .then(function(recorder) { - recorder.onstop = function(event) { - stopEventReceived = true; - }; - recorder.stop(); - }) - .then(function() { - return waitFor('Make sure the stop event was received', - function() { - return stopEventReceived == true; - }); - }) - .catch(function(err) { - return failTest(err.toString()); - }) - .then(function() { - reportTestSuccess(); - }); -} - +// Tests that when a MediaRecorder's resume() is called, the |state| is +// 'recording' and a 'resume' event is fired. function testResumeAndRecorderState() { var theRecorder; - navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) - .then(function(stream) { - return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); - }) - .then(function(recorder) { - theRecorder = recorder; - theRecorder.pause(); - }) - .then(function() { - theRecorder.resume(); - }) - .then(function() { - assertEquals('recording', theRecorder.state); - }) - .catch(function(err) { - return failTest(err.toString()); - }) - .then(function() { - reportTestSuccess(); - }); -} - -function testResumeAndResumeEventTriggered() { - var theRecorder; var resumeEventReceived = false; navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) .then(function(stream) { @@ -247,6 +211,7 @@ .then(function() { theRecorder.onresume = function(event) { resumeEventReceived = true; + assertEquals('recording', theRecorder.state); } theRecorder.resume(); }) @@ -264,6 +229,7 @@ }); } +// Tests that is it not possible to resume an inactive MediaRecorder. function testNoResumeWhileRecorderInactive() { navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) .then(function(stream) { @@ -280,6 +246,7 @@ }); } +// Tests that MediaRecorder sends data blobs when resume() is called. function testResumeAndDataAvailable() { var theRecorder; var videoSize = 0; @@ -324,18 +291,28 @@ }); } +// Tests that when paused the recorder will transition |state| to |paused| and +// then trigger a |pause| event. function testPauseAndRecorderState() { var theRecorder; + var pauseEventReceived = false; navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) .then(function(stream) { return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); }) .then(function(recorder) { theRecorder = recorder; + theRecorder.onpause = function(event) { + pauseEventReceived = true; + assertEquals('paused', theRecorder.state); + } theRecorder.pause(); }) .then(function() { - assertEquals('paused', theRecorder.state); + return waitFor('Making sure the pause event has been received', + function() { + return pauseEventReceived == true; + }); }) .catch(function(err) { return failTest(err.toString()); @@ -345,6 +322,8 @@ }); } +// Tests that is is possible to stop a paused MediaRecorder and that the |state| +// becomes 'inactive'. function testPauseStopAndRecorderState() { var theRecorder; navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) @@ -369,33 +348,9 @@ }); } -function testPauseAndPauseEventTriggered() { - var pauseEventReceived = false; - navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) - .then(function(stream) { - return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); - }) - .then(function(recorder) { - recorder.onpause = function(event) { - pauseEventReceived = true; - } - recorder.pause(); - }) - .then(function() { - return waitFor('Making sure the pause event has been received', - function() { - return pauseEventReceived == true; - }); - }) - .catch(function(err) { - return failTest(err.toString()); - }) - .then(function() { - reportTestSuccess(); - }); -} - -function testPauseAndNoDataAvailable() { +// Tests that no dataavailable event is fired after MediaRecorder's pause() +// function is called. +function testPausePreventsDataavailableFromBeingFired() { var theRecorder; var videoSize = 0; var emptyBlobs = 0; @@ -423,19 +378,16 @@ }); } -function testNoPauseWhileRecorderInactive() { +// Tests that MediaRecorder's pause() throws an exception if 'state' is not +// 'recording'. +function testIllegalPauseThrowsDOMError() { navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) .then(function(stream) { return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); }) .then(function(recorder) { - recorder.pause(); - }) - .then(function() { - return failTest('Recorder paused recording from inactive state.'); - }) - .catch(function(err) { - reportTestSuccess(); + assertThrows(function() {recorder.pause()}, 'Calling pause() in' + + ' inactive state should cause a DOM error'); }); }
diff --git a/content/test/data/media/mediarecorder_test_utils.js b/content/test/data/media/mediarecorder_test_utils.js index ddf12da6..400b19e 100644 --- a/content/test/data/media/mediarecorder_test_utils.js +++ b/content/test/data/media/mediarecorder_test_utils.js
@@ -4,17 +4,6 @@ 'use strict'; -function getTimeStampDeltas(timeStamps) { - var old_time_stamp = 0; - var delta_time = []; - timeStamps.forEach(function(timeStamp) { - delta_time.push(timeStamp - old_time_stamp); - old_time_stamp = timeStamp; - }); - delta_time.shift(); - return delta_time; -} - // This function will be used only when we need to wait for data gathering. function waitDuration(duration) { return new Promise(function(resolve, reject) {
diff --git a/content/test/web_contents_observer_sanity_checker.cc b/content/test/web_contents_observer_sanity_checker.cc index 187f518..79bf062 100644 --- a/content/test/web_contents_observer_sanity_checker.cc +++ b/content/test/web_contents_observer_sanity_checker.cc
@@ -22,6 +22,12 @@ const char kWebContentsObserverSanityCheckerKey[] = "WebContentsObserverSanityChecker"; +GlobalRoutingID GetRoutingPair(RenderFrameHost* host) { + if (!host) + return GlobalRoutingID(0, 0); + return GlobalRoutingID(host->GetProcess()->GetID(), host->GetRoutingID()); +} + } // namespace // static @@ -35,9 +41,7 @@ void WebContentsObserverSanityChecker::RenderFrameCreated( RenderFrameHost* render_frame_host) { CHECK(!web_contents_destroyed_); - std::pair<int, int> routing_pair = - std::make_pair(render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID()); + GlobalRoutingID routing_pair = GetRoutingPair(render_frame_host); bool frame_exists = !live_routes_.insert(routing_pair).second; deleted_routes_.erase(routing_pair); @@ -55,19 +59,24 @@ << "RenderFrameCreated called on for a RenderFrameHost that thinks it is " "not alive."; - // Any child frame must be in the same BrowsingInstance as its parent. + EnsureStableParentValue(render_frame_host); + CHECK(!HasAnyChildren(render_frame_host)); if (render_frame_host->GetParent()) { - CHECK(render_frame_host->GetSiteInstance()->IsRelatedSiteInstance( - render_frame_host->GetParent()->GetSiteInstance())); + // It should also be a current host. + GlobalRoutingID parent_routing_pair = + GetRoutingPair(render_frame_host->GetParent()); + + CHECK(current_hosts_.count(parent_routing_pair)) + << "RenderFrameCreated called for a RenderFrameHost whose parent was " + << "not a current RenderFrameHost. Only the current frame should be " + << "spawning children."; } } void WebContentsObserverSanityChecker::RenderFrameDeleted( RenderFrameHost* render_frame_host) { CHECK(!web_contents_destroyed_); - std::pair<int, int> routing_pair = - std::make_pair(render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID()); + GlobalRoutingID routing_pair = GetRoutingPair(render_frame_host); bool was_live = !!live_routes_.erase(routing_pair); bool was_dead_already = !deleted_routes_.insert(routing_pair).second; @@ -75,16 +84,16 @@ CHECK(false) << "RenderFrameDeleted called more than once for routing pair " << Format(render_frame_host); } else if (!was_live) { -// TODO(nick): Clients can easily ignore an unrecognized object, but it -// would be useful from a finding-bugs perspective if we could enable this -// check. -#if 0 CHECK(false) << "RenderFrameDeleted called for routing pair " << Format(render_frame_host) << " for which RenderFrameCreated was never called"; -#endif } + EnsureStableParentValue(render_frame_host); + CHECK(!HasAnyChildren(render_frame_host)); + if (render_frame_host->GetParent()) + AssertRenderFrameExists(render_frame_host->GetParent()); + // All players should have been paused by this point. for (const auto& id : active_media_players_) CHECK_NE(id.first, render_frame_host); @@ -102,26 +111,35 @@ CHECK_NE(new_host, old_host); if (old_host) { - std::pair<int, int> routing_pair = - std::make_pair(old_host->GetProcess()->GetID(), - old_host->GetRoutingID()); + EnsureStableParentValue(old_host); + CHECK_EQ(old_host->GetParent(), new_host->GetParent()); + GlobalRoutingID routing_pair = GetRoutingPair(old_host); bool old_did_exist = !!current_hosts_.erase(routing_pair); if (!old_did_exist) { CHECK(false) << "RenderFrameHostChanged called with old host that did not exist:" << Format(old_host); } + CHECK(!HasAnyChildren(old_host)) + << "All children should be detached before a parent is detached."; } - std::pair<int, int> routing_pair = - std::make_pair(new_host->GetProcess()->GetID(), - new_host->GetRoutingID()); + EnsureStableParentValue(new_host); + if (new_host->GetParent()) { + AssertRenderFrameExists(new_host->GetParent()); + CHECK(current_hosts_.count(GetRoutingPair(new_host->GetParent()))) + << "Parent of frame being committed must be current."; + } + + GlobalRoutingID routing_pair = GetRoutingPair(new_host); bool host_exists = !current_hosts_.insert(routing_pair).second; if (host_exists) { CHECK(false) << "RenderFrameHostChanged called more than once for routing pair:" << Format(new_host); } + CHECK(!HasAnyChildren(new_host)) + << "A frame should not have children before it is committed."; } void WebContentsObserverSanityChecker::FrameDeleted( @@ -129,6 +147,18 @@ // A frame can be deleted before RenderFrame in the renderer process is // created, so there is not much that can be enforced here. CHECK(!web_contents_destroyed_); + + EnsureStableParentValue(render_frame_host); + + CHECK(!HasAnyChildren(render_frame_host)) + << "All children should be deleted before a frame is detached."; + + GlobalRoutingID routing_pair = GetRoutingPair(render_frame_host); + CHECK(current_hosts_.erase(routing_pair)) + << "FrameDeleted called with a non-current RenderFrameHost."; + + if (render_frame_host->GetParent()) + AssertRenderFrameExists(render_frame_host->GetParent()); } void WebContentsObserverSanityChecker::DidStartNavigation( @@ -304,9 +334,6 @@ WebContentsObserverSanityChecker::WebContentsObserverSanityChecker( WebContents* web_contents) : WebContentsObserver(web_contents), web_contents_destroyed_(false) { - // Prime the pump with the initial objects. - // TODO(nasko): Investigate why this is needed. - RenderViewCreated(web_contents->GetRenderViewHost()); } WebContentsObserverSanityChecker::~WebContentsObserverSanityChecker() { @@ -316,9 +343,7 @@ void WebContentsObserverSanityChecker::AssertRenderFrameExists( RenderFrameHost* render_frame_host) { CHECK(!web_contents_destroyed_); - std::pair<int, int> routing_pair = - std::make_pair(render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID()); + GlobalRoutingID routing_pair = GetRoutingPair(render_frame_host); bool render_frame_created_happened = live_routes_.count(routing_pair) != 0; bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0; @@ -351,4 +376,33 @@ return it != ongoing_navigations_.end(); } +void WebContentsObserverSanityChecker::EnsureStableParentValue( + RenderFrameHost* render_frame_host) { + GlobalRoutingID routing_pair = GetRoutingPair(render_frame_host); + GlobalRoutingID parent_routing_pair = + GetRoutingPair(render_frame_host->GetParent()); + + auto it = parent_ids_.find(routing_pair); + if (it == parent_ids_.end()) { + parent_ids_.insert(std::make_pair(routing_pair, parent_routing_pair)); + } else { + GlobalRoutingID former_parent_routing_pair = it->second; + CHECK(former_parent_routing_pair == parent_routing_pair) + << "RFH's parent value changed over time! That is really not good!"; + } +} + +bool WebContentsObserverSanityChecker::HasAnyChildren(RenderFrameHost* parent) { + GlobalRoutingID parent_routing_pair = GetRoutingPair(parent); + for (auto& entry : parent_ids_) { + if (entry.second == parent_routing_pair) { + if (live_routes_.count(entry.first)) + return true; + if (current_hosts_.count(entry.first)) + return true; + } + } + return false; +} + } // namespace content
diff --git a/content/test/web_contents_observer_sanity_checker.h b/content/test/web_contents_observer_sanity_checker.h index 273a2c4..e7810a8 100644 --- a/content/test/web_contents_observer_sanity_checker.h +++ b/content/test/web_contents_observer_sanity_checker.h
@@ -9,6 +9,7 @@ #include <string> #include "base/supports_user_data.h" +#include "content/browser/loader/global_routing_id.h" #include "content/public/browser/web_contents_observer.h" namespace content { @@ -97,13 +98,19 @@ bool NavigationIsOngoing(NavigationHandle* navigation_handle); - std::set<std::pair<int, int>> current_hosts_; - std::set<std::pair<int, int>> live_routes_; - std::set<std::pair<int, int>> deleted_routes_; + void EnsureStableParentValue(RenderFrameHost* render_frame_host); + bool HasAnyChildren(RenderFrameHost* render_frame_host); + + std::set<GlobalRoutingID> current_hosts_; + std::set<GlobalRoutingID> live_routes_; + std::set<GlobalRoutingID> deleted_routes_; std::set<NavigationHandle*> ongoing_navigations_; std::vector<MediaPlayerId> active_media_players_; + // Remembers parents to make sure RenderFrameHost::GetParent() never changes. + std::map<GlobalRoutingID, GlobalRoutingID> parent_ids_; + bool web_contents_destroyed_; DISALLOW_COPY_AND_ASSIGN(WebContentsObserverSanityChecker);
diff --git a/extensions/browser/api/cast_channel/cast_socket.cc b/extensions/browser/api/cast_channel/cast_socket.cc index bf9035ff..f6a5b48 100644 --- a/extensions/browser/api/cast_channel/cast_socket.cc +++ b/extensions/browser/api/cast_channel/cast_socket.cc
@@ -11,6 +11,7 @@ #include "base/callback_helpers.h" #include "base/format_macros.h" #include "base/lazy_instance.h" +#include "base/message_loop/message_loop.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h"
diff --git a/extensions/common/extension_builder.cc b/extensions/common/extension_builder.cc index f993e94..b573128 100644 --- a/extensions/common/extension_builder.cc +++ b/extensions/common/extension_builder.cc
@@ -4,6 +4,8 @@ #include "extensions/common/extension_builder.h" +#include <utility> + #include "extensions/common/extension.h" namespace extensions { @@ -14,6 +16,22 @@ } ExtensionBuilder::~ExtensionBuilder() {} +ExtensionBuilder::ExtensionBuilder(ExtensionBuilder&& other) + : path_(std::move(other.path_)), + location_(other.location_), + manifest_(std::move(other.manifest_)), + flags_(other.flags_), + id_(std::move(other.id_)) {} + +ExtensionBuilder& ExtensionBuilder::operator=(ExtensionBuilder&& other) { + path_ = std::move(other.path_); + location_ = other.location_; + manifest_ = std::move(other.manifest_); + flags_ = other.flags_; + id_ = std::move(other.id_); + return *this; +} + scoped_refptr<Extension> ExtensionBuilder::Build() { std::string error; scoped_refptr<Extension> extension = Extension::Create(
diff --git a/extensions/common/extension_builder.h b/extensions/common/extension_builder.h index 4b40178..96c81d2 100644 --- a/extensions/common/extension_builder.h +++ b/extensions/common/extension_builder.h
@@ -24,14 +24,14 @@ ExtensionBuilder(); ~ExtensionBuilder(); + // Move constructor and operator=. + ExtensionBuilder(ExtensionBuilder&& other); + ExtensionBuilder& operator=(ExtensionBuilder&& other); + // Can only be called once, after which it's invalid to use the builder. // CHECKs that the extension was created successfully. scoped_refptr<Extension> Build(); - // Workaround to allow you to pass rvalue ExtensionBuilders by reference to - // other functions, e.g. UseBuilder(ExtensionBuilder().Pass()) - ExtensionBuilder& Pass() { return *this; } - // Defaults to FilePath(). ExtensionBuilder& SetPath(const base::FilePath& path); @@ -58,6 +58,8 @@ scoped_ptr<base::DictionaryValue> manifest_; int flags_; std::string id_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionBuilder); }; } // namespace extensions
diff --git a/extensions/common/test_util.cc b/extensions/common/test_util.cc index 9a9312a..eb857fd 100644 --- a/extensions/common/test_util.cc +++ b/extensions/common/test_util.cc
@@ -13,16 +13,16 @@ namespace extensions { namespace test_util { -ExtensionBuilder& BuildExtension(ExtensionBuilder& builder) { - return builder - .SetManifest(DictionaryBuilder() - .Set("name", "Test extension") - .Set("version", "1.0") - .Set("manifest_version", 2)); +ExtensionBuilder BuildExtension(ExtensionBuilder builder) { + builder.SetManifest(DictionaryBuilder() + .Set("name", "Test extension") + .Set("version", "1.0") + .Set("manifest_version", 2)); + return builder; } -ExtensionBuilder& BuildApp(ExtensionBuilder& builder) { - return builder.SetManifest( +ExtensionBuilder BuildApp(ExtensionBuilder builder) { + builder.SetManifest( DictionaryBuilder() .Set("name", "Test extension") .Set("version", "1.0") @@ -33,6 +33,7 @@ extensions::DictionaryBuilder().Set( "scripts", std::move(extensions::ListBuilder().Append( "background.js")))))); + return builder; } scoped_refptr<Extension> CreateEmptyExtension() {
diff --git a/extensions/common/test_util.h b/extensions/common/test_util.h index 0f02ac0..7220399 100644 --- a/extensions/common/test_util.h +++ b/extensions/common/test_util.h
@@ -16,10 +16,10 @@ namespace test_util { // Adds an extension manifest to a builder. -ExtensionBuilder& BuildExtension(ExtensionBuilder& builder); +ExtensionBuilder BuildExtension(ExtensionBuilder builder); // Adds an app manifest to a builder. -ExtensionBuilder& BuildApp(ExtensionBuilder& builder); +ExtensionBuilder BuildApp(ExtensionBuilder builder); // Creates an extension instance that can be attached to an ExtensionFunction // before running it.
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt index f5949b97..0475c66 100644 --- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt +++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt
@@ -8,7 +8,7 @@ Version - Last Modified Date: November 7, 2015 + Last Modified Date: December 16, 2015 Dependencies @@ -29,7 +29,11 @@ New Tokens - None + Accepted by the <edge_aa_mask> parameter of glScheduleCALayerCHROMIUM: + GL_CA_LAYER_EDGE_LEFT_CHROMIUM 0x01 + GL_CA_LAYER_EDGE_RIGHT_CHROMIUM 0x02 + GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM 0x04 + GL_CA_LAYER_EDGE_TOP_CHROMIUM 0x08 New Procedures and Functions @@ -39,7 +43,10 @@ const GLfloat* contents_rect, GLfloat opacity, GLuint background_color, - const GLfloat* bounds_size, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, const GLfloat* transform); Set the CALayer parameters to be presented at the time of the next call to @@ -53,8 +60,13 @@ <opacity> specifies the opacity of the CALayer. <background_color> specifies the background color of the CALayer, as a 32-bit ARGB value. - <bounds_size> contains two values indicating the width and height of the - layer in pixels. + <edge_aa_mask> is a bitfield specifying which of the edges of the layer are + to have anti-aliasing. + <bounds_rect> contains four values indicating the x, y, width, and height of + the layer in pixels. + <is_clipped> indicates if the layer should be clipped. + <clip_rect> contains four values indicating the x, y, width, and height of + the rectangle to clip the layer to, if it is to be clipped. <transform> contains sixteen values indicating the row major order 4x4 transformation matrix to apply to the CALayer. @@ -65,3 +77,9 @@ New State None. + +Revision History + + 12/16/2015 Add clipping and edge anti-aliasing. + 11/7/2015 Initial checkin +
diff --git a/gpu/GLES2/gl2extchromium.h b/gpu/GLES2/gl2extchromium.h index 51af9dc..201d529 100644 --- a/gpu/GLES2/gl2extchromium.h +++ b/gpu/GLES2/gl2extchromium.h
@@ -809,13 +809,34 @@ #ifndef GL_CHROMIUM_schedule_ca_layer #define GL_CHROMIUM_schedule_ca_layer 1 + +#ifndef GL_CA_LAYER_EDGE_LEFT_CHROMIUM +#define GL_CA_LAYER_EDGE_LEFT_CHROMIUM 0x1 +#endif + +#ifndef GL_CA_LAYER_EDGE_RIGHT_CHROMIUM +#define GL_CA_LAYER_EDGE_RIGHT_CHROMIUM 0x2 +#endif + +#ifndef GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM +#define GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM 0x4 +#endif + +#ifndef GL_CA_LAYER_EDGE_TOP_CHROMIUM +#define GL_CA_LAYER_EDGE_TOP_CHROMIUM 0x8 +#endif + #ifdef GL_GLEXT_PROTOTYPES GL_APICALL void GL_APIENTRY glScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, GLuint background_color, - const GLfloat* bounds_size, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform); #endif typedef void(GL_APIENTRYP PFNGLSCHEDULECALAYERCHROMIUMPROC)( @@ -823,7 +844,11 @@ const GLfloat* contents_rect, GLfloat opacity, GLuint background_color, - const GLfloat* bounds_size, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform); #endif /* GL_CHROMIUM_schedule_ca_layer */
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 41f7188..1cab6c8a 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -4312,7 +4312,9 @@ 'impl_func': False, 'client_test': False, 'cmd_args': 'GLuint contents_texture_id, GLfloat opacity, ' - 'GLuint background_color, GLuint shm_id, GLuint shm_offset', + 'GLuint background_color, GLuint edge_aa_mask, ' + 'GLboolean is_clipped, GLint sorting_context_id, ' + 'GLuint shm_id, GLuint shm_offset', 'extension': 'CHROMIUM_schedule_ca_layer', 'chromium': True, },
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index b8b4bd98..35f57ec6 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1521,12 +1521,17 @@ void GL_APIENTRY GLES2ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) { gles2::GetGLContext()->ScheduleCALayerCHROMIUM( contents_texture_id, contents_rect, opacity, background_color, - bounds_size, transform); + edge_aa_mask, bounds_rect, is_clipped, clip_rect, sorting_context_id, + transform); } void GL_APIENTRY GLES2CommitOverlayPlanesCHROMIUM() { gles2::GetGLContext()->CommitOverlayPlanesCHROMIUM();
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index e9043d1..605db93 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -2846,12 +2846,16 @@ void ScheduleCALayerCHROMIUM(GLuint contents_texture_id, GLfloat opacity, GLuint background_color, + GLuint edge_aa_mask, + GLboolean is_clipped, + GLint sorting_context_id, GLuint shm_id, GLuint shm_offset) { gles2::cmds::ScheduleCALayerCHROMIUM* c = GetCmdSpace<gles2::cmds::ScheduleCALayerCHROMIUM>(); if (c) { - c->Init(contents_texture_id, opacity, background_color, shm_id, shm_offset); + c->Init(contents_texture_id, opacity, background_color, edge_aa_mask, + is_clipped, sorting_context_id, shm_id, shm_offset); } }
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index d5a05e9a..8fe6f98 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -3541,10 +3541,10 @@ } if (bound_pixel_pack_buffer_) { - // TODO(zmo): Need to handle the case of reading into a PIXEL_PACK_BUFFER - // in ES3. For now, generate a GL error. - SetGLError(GL_INVALID_OPERATION, "glReadPixels", - "ReadPixels to a pixel pack buffer isn't implemented"); + GLuint offset = ToGLuint(pixels); + helper_->ReadPixels( + xoffset, yoffset, width, height, format, type, 0, offset, 0, 0, false); + CheckGLError(); return; } @@ -4438,9 +4438,13 @@ const GLfloat* contents_rect, GLfloat opacity, GLuint background_color, - const GLfloat* bounds_size, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) { - size_t shm_size = 22 * sizeof(GLfloat); + size_t shm_size = 28 * sizeof(GLfloat); ScopedTransferBufferPtr buffer(shm_size, helper_, transfer_buffer_); if (!buffer.valid() || buffer.size() < shm_size) { SetGLError(GL_OUT_OF_MEMORY, "GLES2::ScheduleCALayerCHROMIUM", @@ -4449,10 +4453,12 @@ } GLfloat* mem = static_cast<GLfloat*>(buffer.address()); memcpy(mem + 0, contents_rect, 4 * sizeof(GLfloat)); - memcpy(mem + 4, bounds_size, 2 * sizeof(GLfloat)); - memcpy(mem + 6, transform, 16 * sizeof(GLfloat)); + memcpy(mem + 4, bounds_rect, 4 * sizeof(GLfloat)); + memcpy(mem + 8, clip_rect, 4 * sizeof(GLfloat)); + memcpy(mem + 12, transform, 16 * sizeof(GLfloat)); helper_->ScheduleCALayerCHROMIUM(contents_texture_id, opacity, - background_color, buffer.shm_id(), + background_color, edge_aa_mask, is_clipped, + sorting_context_id, buffer.shm_id(), buffer.offset()); }
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index eb1b63c..2e6c771 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1058,8 +1058,12 @@ void ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) override; void CommitOverlayPlanesCHROMIUM() override;
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index 382a3717..23b628b 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -784,8 +784,12 @@ virtual void ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) = 0; virtual void CommitOverlayPlanesCHROMIUM() = 0; virtual void SwapInterval(GLint interval) = 0;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index 1bfac6a9..8cc06fb3 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -762,8 +762,12 @@ void ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) override; void CommitOverlayPlanesCHROMIUM() override; void SwapInterval(GLint interval) override;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index 1bf15120..af5353b 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1040,8 +1040,12 @@ GLuint /* contents_texture_id */, const GLfloat* /* contents_rect */, GLfloat /* opacity */, - const GLuint /* background_color */, - const GLfloat* /* bounds_size */, + GLuint /* background_color */, + GLuint /* edge_aa_mask */, + const GLfloat* /* bounds_rect */, + GLboolean /* is_clipped */, + const GLfloat* /* clip_rect */, + GLint /* sorting_context_id */, const GLfloat* /* transform */) {} void GLES2InterfaceStub::CommitOverlayPlanesCHROMIUM() {} void GLES2InterfaceStub::SwapInterval(GLint /* interval */) {}
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index 9206943..ef07e9d2 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -762,8 +762,12 @@ void ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) override; void CommitOverlayPlanesCHROMIUM() override; void SwapInterval(GLint interval) override;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index c8dea68..3674646 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2219,12 +2219,18 @@ GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ScheduleCALayerCHROMIUM"); gl_->ScheduleCALayerCHROMIUM(contents_texture_id, contents_rect, opacity, - background_color, bounds_size, transform); + background_color, edge_aa_mask, bounds_rect, + is_clipped, clip_rect, sorting_context_id, + transform); } void GLES2TraceImplementation::CommitOverlayPlanesCHROMIUM() {
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt index ba5336a..fa982dd 100644 --- a/gpu/command_buffer/cmd_buffer_functions.txt +++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -314,7 +314,7 @@ GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei count, const GLenum* bufs); GL_APICALL void GL_APIENTRY glDiscardBackbufferCHROMIUM (void); GL_APICALL void GL_APIENTRY glScheduleOverlayPlaneCHROMIUM (GLint plane_z_order, GLenum plane_transform, GLuint overlay_texture_id, GLint bounds_x, GLint bounds_y, GLint bounds_width, GLint bounds_height, GLfloat uv_x, GLfloat uv_y, GLfloat uv_width, GLfloat uv_height); -GL_APICALL void GL_APIENTRY glScheduleCALayerCHROMIUM (GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, const GLuint background_color, const GLfloat* bounds_size, const GLfloat* transform); +GL_APICALL void GL_APIENTRY glScheduleCALayerCHROMIUM (GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, GLuint background_color, GLuint edge_aa_mask, const GLfloat* bounds_rect, GLboolean is_clipped, const GLfloat* clip_rect, GLint sorting_context_id, const GLfloat* transform); GL_APICALL void GL_APIENTRY glCommitOverlayPlanesCHROMIUM (void); GL_APICALL void GL_APIENTRY glSwapInterval (GLint interval); GL_APICALL void GL_APIENTRY glFlushDriverCachesCHROMIUM (void);
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index d866081..9b1a225 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -13925,12 +13925,18 @@ void Init(GLuint _contents_texture_id, GLfloat _opacity, GLuint _background_color, + GLuint _edge_aa_mask, + GLboolean _is_clipped, + GLint _sorting_context_id, GLuint _shm_id, GLuint _shm_offset) { SetHeader(); contents_texture_id = _contents_texture_id; opacity = _opacity; background_color = _background_color; + edge_aa_mask = _edge_aa_mask; + is_clipped = _is_clipped; + sorting_context_id = _sorting_context_id; shm_id = _shm_id; shm_offset = _shm_offset; } @@ -13939,10 +13945,14 @@ GLuint _contents_texture_id, GLfloat _opacity, GLuint _background_color, + GLuint _edge_aa_mask, + GLboolean _is_clipped, + GLint _sorting_context_id, GLuint _shm_id, GLuint _shm_offset) { - static_cast<ValueType*>(cmd)->Init(_contents_texture_id, _opacity, - _background_color, _shm_id, _shm_offset); + static_cast<ValueType*>(cmd) + ->Init(_contents_texture_id, _opacity, _background_color, _edge_aa_mask, + _is_clipped, _sorting_context_id, _shm_id, _shm_offset); return NextCmdAddress<ValueType>(cmd); } @@ -13950,12 +13960,15 @@ uint32_t contents_texture_id; float opacity; uint32_t background_color; + uint32_t edge_aa_mask; + uint32_t is_clipped; + int32_t sorting_context_id; uint32_t shm_id; uint32_t shm_offset; }; -static_assert(sizeof(ScheduleCALayerCHROMIUM) == 24, - "size of ScheduleCALayerCHROMIUM should be 24"); +static_assert(sizeof(ScheduleCALayerCHROMIUM) == 36, + "size of ScheduleCALayerCHROMIUM should be 36"); static_assert(offsetof(ScheduleCALayerCHROMIUM, header) == 0, "offset of ScheduleCALayerCHROMIUM header should be 0"); static_assert( @@ -13966,10 +13979,17 @@ static_assert( offsetof(ScheduleCALayerCHROMIUM, background_color) == 12, "offset of ScheduleCALayerCHROMIUM background_color should be 12"); -static_assert(offsetof(ScheduleCALayerCHROMIUM, shm_id) == 16, - "offset of ScheduleCALayerCHROMIUM shm_id should be 16"); -static_assert(offsetof(ScheduleCALayerCHROMIUM, shm_offset) == 20, - "offset of ScheduleCALayerCHROMIUM shm_offset should be 20"); +static_assert(offsetof(ScheduleCALayerCHROMIUM, edge_aa_mask) == 16, + "offset of ScheduleCALayerCHROMIUM edge_aa_mask should be 16"); +static_assert(offsetof(ScheduleCALayerCHROMIUM, is_clipped) == 20, + "offset of ScheduleCALayerCHROMIUM is_clipped should be 20"); +static_assert( + offsetof(ScheduleCALayerCHROMIUM, sorting_context_id) == 24, + "offset of ScheduleCALayerCHROMIUM sorting_context_id should be 24"); +static_assert(offsetof(ScheduleCALayerCHROMIUM, shm_id) == 28, + "offset of ScheduleCALayerCHROMIUM shm_id should be 28"); +static_assert(offsetof(ScheduleCALayerCHROMIUM, shm_offset) == 32, + "offset of ScheduleCALayerCHROMIUM shm_offset should be 32"); struct CommitOverlayPlanesCHROMIUM { typedef CommitOverlayPlanesCHROMIUM ValueType;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index 3428ea4..01847c9 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -4812,17 +4812,22 @@ TEST_F(GLES2FormatTest, ScheduleCALayerCHROMIUM) { cmds::ScheduleCALayerCHROMIUM& cmd = *GetBufferAs<cmds::ScheduleCALayerCHROMIUM>(); - void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), - static_cast<GLfloat>(12), static_cast<GLuint>(13), - static_cast<GLuint>(14), static_cast<GLuint>(15)); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLfloat>(12), + static_cast<GLuint>(13), static_cast<GLuint>(14), + static_cast<GLboolean>(15), static_cast<GLint>(16), + static_cast<GLuint>(17), static_cast<GLuint>(18)); EXPECT_EQ(static_cast<uint32_t>(cmds::ScheduleCALayerCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.contents_texture_id); EXPECT_EQ(static_cast<GLfloat>(12), cmd.opacity); EXPECT_EQ(static_cast<GLuint>(13), cmd.background_color); - EXPECT_EQ(static_cast<GLuint>(14), cmd.shm_id); - EXPECT_EQ(static_cast<GLuint>(15), cmd.shm_offset); + EXPECT_EQ(static_cast<GLuint>(14), cmd.edge_aa_mask); + EXPECT_EQ(static_cast<GLboolean>(15), cmd.is_clipped); + EXPECT_EQ(static_cast<GLint>(16), cmd.sorting_context_id); + EXPECT_EQ(static_cast<GLuint>(17), cmd.shm_id); + EXPECT_EQ(static_cast<GLuint>(18), cmd.shm_offset); CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); }
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h index af31a510..622f75d 100644 --- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -409,6 +409,9 @@ 0x0DE1, "GL_TEXTURE_2D", }, { + 0x1, "GL_CA_LAYER_EDGE_LEFT_CHROMIUM", + }, + { 0x10000000, "GL_MULTISAMPLE_BUFFER_BIT4_QCOM", }, { @@ -535,6 +538,9 @@ 0x1F03, "GL_EXTENSIONS", }, { + 0x2, "GL_CA_LAYER_EDGE_RIGHT_CHROMIUM", + }, + { 0x20000000, "GL_MULTISAMPLE_BUFFER_BIT5_QCOM", }, { @@ -607,6 +613,9 @@ 0x300E, "GL_CONTEXT_LOST", }, { + 0x4, "GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM", + }, + { 0x40000000, "GL_MULTISAMPLE_BUFFER_BIT6_QCOM", }, { @@ -646,6 +655,9 @@ 0x78FC, "GL_RGB_YCBCR_420V_CHROMIUM", }, { + 0x8, "GL_CA_LAYER_EDGE_TOP_CHROMIUM", + }, + { 0x80000000, "GL_MULTISAMPLE_BUFFER_BIT7_QCOM", }, {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 46211cce..b508299 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -9114,24 +9114,61 @@ return error::kNoError; } typedef cmds::ReadPixels::Result Result; - uint32 pixels_size; - if (state_.bound_pixel_pack_buffer.get()) { - // TODO(zmo): Need to handle the case of reading into a PIXEL_PACK_BUFFER - // in ES3, including more pack parameters. For now, generate a GL error. - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glReadPixels", - "ReadPixels to a pixel pack buffer isn't implemented"); - return error::kNoError; + uint32 pixels_size = 0; + if (c.pixels_shm_id == 0) { + PixelStoreParams params = state_.GetPackParams(); + if (!GLES2Util::ComputeImageDataSizesES3(width, height, 1, format, type, + params, &pixels_size, nullptr, nullptr, nullptr)) { + return error::kOutOfBounds; + } + } else { + // When reading into client buffer, we actually set pack parameters to 0 + // (except for alignment) before calling glReadPixels. This makes sure we + // only send back meaningful pixel data to the command buffer client side, + // and the client side will take the responsibility to take the pixels and + // write to the client buffer according to the full ES3 pack parameters. + if (!GLES2Util::ComputeImageDataSizes(width, height, 1, format, type, + state_.pack_alignment, &pixels_size, nullptr, nullptr)) { + return error::kOutOfBounds; + } } - if (!GLES2Util::ComputeImageDataSizes( - width, height, 1, format, type, state_.pack_alignment, &pixels_size, - NULL, NULL)) { - return error::kOutOfBounds; + + void* pixels = nullptr; + Buffer* buffer = state_.bound_pixel_pack_buffer.get(); + if (c.pixels_shm_id == 0) { + if (buffer) { + if (buffer->GetMappedRange()) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glReadPixels", + "pixel pack buffer should not be mapped to client memory"); + return error::kNoError; + } + uint32 size = 0; + if (!SafeAddUint32(pixels_size, c.pixels_shm_offset, &size)) { + LOCAL_SET_GL_ERROR( + GL_INVALID_VALUE, "glReadPixels", "size + offset overflow"); + return error::kNoError; + } + if (static_cast<uint32>(buffer->size()) < size) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glReadPixels", + "pixel pack buffer is not large enough"); + return error::kNoError; + } + pixels = reinterpret_cast<void *>(c.pixels_shm_offset); + } else { + return error::kInvalidArguments; + } + } else { + if (buffer) { + return error::kInvalidArguments; + } else { + pixels = GetSharedMemoryAs<void*>( + c.pixels_shm_id, c.pixels_shm_offset, pixels_size); + if (!pixels) { + return error::kOutOfBounds; + } + } } - void* pixels = GetSharedMemoryAs<void*>( - c.pixels_shm_id, c.pixels_shm_offset, pixels_size); - if (!pixels) { - return error::kOutOfBounds; - } + Result* result = NULL; if (c.result_shm_id != 0) { result = GetSharedMemoryAs<Result*>( @@ -9267,6 +9304,13 @@ ScopedResolvedFrameBufferBinder binder(this, false, true); if (x < 0 || y < 0 || max_x > max_size.width() || max_y > max_size.height()) { + // TODO(yunchao): need to handle the out-of-bounds case for reading pixels + // into PIXEL_PACK buffer. + if (c.pixels_shm_id == 0) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glReadPixels", + "read pixels out of bounds into PIXEL_PACK buffer"); + return error::kNoError; + } // The user requested an out of range area. Get the results 1 line // at a time. uint32 temp_size; @@ -9342,12 +9386,14 @@ } glReadPixels(x, y, width, height, format, type, pixels); } - GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); - if (error == GL_NO_ERROR) { - if (result != NULL) { - *result = true; + if (c.pixels_shm_id != 0) { + GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); + if (error == GL_NO_ERROR) { + if (result != NULL) { + *result = true; + } + FinishReadPixels(c, 0); } - FinishReadPixels(c, 0); } return error::kNoError; @@ -9558,18 +9604,21 @@ } const GLfloat* mem = GetSharedMemoryAs<const GLfloat*>(c.shm_id, c.shm_offset, - 22 * sizeof(GLfloat)); + 28 * sizeof(GLfloat)); if (!mem) { return error::kOutOfBounds; } gfx::RectF contents_rect(mem[0], mem[1], mem[2], mem[3]); - gfx::SizeF bounds_size(mem[4], mem[5]); - gfx::Transform transform(mem[6], mem[10], mem[14], mem[18], - mem[7], mem[11], mem[15], mem[19], - mem[8], mem[12], mem[16], mem[20], - mem[9], mem[13], mem[17], mem[21]); + gfx::RectF bounds_rect(mem[4], mem[5], mem[6], mem[7]); + gfx::RectF clip_rect(mem[8], mem[9], mem[10], mem[11]); + gfx::Transform transform(mem[12], mem[16], mem[20], mem[24], + mem[13], mem[17], mem[21], mem[25], + mem[14], mem[18], mem[22], mem[26], + mem[15], mem[19], mem[23], mem[27]); if (!surface_->ScheduleCALayer(image, contents_rect, c.opacity, - c.background_color, bounds_size, transform)) { + c.background_color, c.edge_aa_mask, + bounds_rect, c.is_clipped ? true : false, + clip_rect, transform)) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glScheduleCALayerCHROMIUM", "failed to schedule CALayer"); }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index a6ccf617..c4d6eb08 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -831,6 +831,17 @@ EXPECT_CALL(*gl_, BindBuffer(target, service_id)) .Times(1) .RetiresOnSaturation(); + if (target == GL_PIXEL_PACK_BUFFER) { + EXPECT_CALL(*gl_, PixelStorei(GL_PACK_ROW_LENGTH, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, PixelStorei(GL_PACK_SKIP_PIXELS, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, PixelStorei(GL_PACK_SKIP_ROWS, _)) + .Times(1) + .RetiresOnSaturation(); + } cmds::BindBuffer cmd; cmd.Init(target, client_id); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc index ce6fbb8..c8a7197 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
@@ -660,6 +660,154 @@ } } +TEST_P(GLES3DecoderTest, ReadPixels2PixelPackBufferNoBufferBound) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); + + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0, + 0, + 0, + false); + EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES3DecoderTest, ReadPixelsBufferBound) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 4; + GLint size = kWidth * kHeight * kBytesPerPixel; + EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(ReadPixels::Result); + + DoBindBuffer(GL_PIXEL_PACK_BUFFER, client_buffer_id_, kServiceBufferId); + DoBufferData(GL_PIXEL_PACK_BUFFER, size); + + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES3DecoderTest, ReadPixels2PixelPackBuffer) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 4; + GLint size = kWidth * kHeight * kBytesPerPixel; + + DoBindBuffer(GL_PIXEL_PACK_BUFFER, client_buffer_id_, kServiceBufferId); + DoBufferData(GL_PIXEL_PACK_BUFFER, size); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + ReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, _)); + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0, + 0, + 0, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES3DecoderTest, ReadPixelsPixelPackBufferMapped) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 4; + GLint size = kWidth * kHeight * kBytesPerPixel; + + DoBindBuffer(GL_PIXEL_PACK_BUFFER, client_buffer_id_, kServiceBufferId); + + uint32_t result_shm_id = kSharedMemoryId; + uint32_t result_shm_offset = kSharedMemoryOffset; + uint32_t data_shm_id = kSharedMemoryId; + // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. + uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); + EXPECT_CALL(*gl_, + MapBufferRange(GL_PIXEL_PACK_BUFFER, 0, size, GL_MAP_READ_BIT)) + .RetiresOnSaturation(); + MapBufferRange map_buffer_range; + map_buffer_range.Init(GL_PIXEL_PACK_BUFFER, 0, size, GL_MAP_READ_BIT, + data_shm_id, data_shm_offset, + result_shm_id, result_shm_offset); + EXPECT_EQ(error::kNoError, ExecuteCmd(map_buffer_range)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0, + 0, + 0, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES3DecoderTest, ReadPixelsPixelPackBufferIsNotLargeEnough) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 4; + GLint size = kWidth * kHeight * kBytesPerPixel; + + DoBindBuffer(GL_PIXEL_PACK_BUFFER, client_buffer_id_, kServiceBufferId); + + DoBufferData(GL_PIXEL_PACK_BUFFER, size - 4); + EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); + + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0, + 0, + 0, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + TEST_P(GLES2DecoderRGBBackbufferTest, ReadPixelsNoAlphaBackbuffer) { const GLsizei kWidth = 3; const GLsizei kHeight = 3;
diff --git "a/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json" "b/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json" index 52ed953..d12ff59 100644 --- "a/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json" +++ "b/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json"
@@ -23,16 +23,6 @@ "include": "common_tests.json", "device type": "iPad Retina", "os": "9.0" - }, - { - "include": "common_tests.json", - "device type": "iPhone 5s", - "os": "8.3" - }, - { - "include": "common_tests.json", - "device type": "iPad Retina", - "os": "8.3" } ] }
diff --git "a/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" "b/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" index 52ed953..d12ff59 100644 --- "a/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" +++ "b/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json"
@@ -23,16 +23,6 @@ "include": "common_tests.json", "device type": "iPad Retina", "os": "9.0" - }, - { - "include": "common_tests.json", - "device type": "iPhone 5s", - "os": "8.3" - }, - { - "include": "common_tests.json", - "device type": "iPad Retina", - "os": "8.3" } ] }
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json index 52ed953..d12ff59 100644 --- a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json +++ b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json
@@ -23,16 +23,6 @@ "include": "common_tests.json", "device type": "iPad Retina", "os": "9.0" - }, - { - "include": "common_tests.json", - "device type": "iPhone 5s", - "os": "8.3" - }, - { - "include": "common_tests.json", - "device type": "iPad Retina", - "os": "8.3" } ] }
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json index bf3f26c..99fd2ab 100644 --- a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json +++ b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json
@@ -27,16 +27,6 @@ "include": "common_tests.json", "device type": "iPad Retina", "os": "9.0" - }, - { - "include": "common_tests.json", - "device type": "iPhone 5s", - "os": "8.3" - }, - { - "include": "common_tests.json", - "device type": "iPad Retina", - "os": "8.3" } ] }
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index 3a507f7..c330157e 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -148,6 +148,9 @@ <message name="IDS_IOS_LOCATION_AUTHORIZATION_ALERT" desc="Specifies the reason for sending the user's location to Google [Length: unlimited] [iOS only]."> Get a better Google experience in Chromium based on your location. </message> + <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT" desc="Info bar message to save a password. [Length: 60em]"> + Do you want Chromium to save your password for this site? + </message> </messages> </release> </grit>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd index 8552aac..756a6445 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -148,6 +148,9 @@ <message name="IDS_IOS_LOCATION_AUTHORIZATION_ALERT" desc="Specifies the reason for sending the user's location to Google [Length: unlimited] [iOS only]."> Get a better Google experience in Chrome based on your location. </message> + <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT" desc="Info bar message to save a password. [Length: 60em]"> + Do you want Google Chrome to save your password for this site? + </message> </messages> </release> </grit>
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 7d76e91..0d1c6404 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -195,15 +195,16 @@ </message> <!-- Password Manager --> - <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT" desc="Info bar message to save a password. [Length: 60em]"> - Do you want <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> to save your password for this site? - </message> <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Save button text for password manager [Length: 10em]"> Save </message> <message name="IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON" desc="Button text for the 'Save Password' infobar's 'Never remember for this site' option [Length: 10em]"> Never </message> + <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT_SMART_LOCK_BRANDING" desc="Info bar message to save a password, referring to the Google Smart Lock +brand. [Length: 70em]"> + Do you want Google Smart Lock to save your password for this site? + </message> <!-- Password Generation --> <message name="IDS_IOS_GENERATED_PASSWORD_ACCEPT" desc="The text of the button that accepts the generated password. [Length: 20em] [iOS only]">
diff --git a/ios/chrome/app/theme/default_100_percent/infobar_save_password.png b/ios/chrome/app/theme/default_100_percent/infobar_save_password.png new file mode 100644 index 0000000..b27576fc --- /dev/null +++ b/ios/chrome/app/theme/default_100_percent/infobar_save_password.png Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/infobar_save_password.png b/ios/chrome/app/theme/default_200_percent/infobar_save_password.png new file mode 100644 index 0000000..99809f8 --- /dev/null +++ b/ios/chrome/app/theme/default_200_percent/infobar_save_password.png Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/infobar_save_password.png b/ios/chrome/app/theme/default_300_percent/infobar_save_password.png new file mode 100644 index 0000000..505db3a --- /dev/null +++ b/ios/chrome/app/theme/default_300_percent/infobar_save_password.png Binary files differ
diff --git a/ios/chrome/app/theme/ios_theme_resources.grd b/ios/chrome/app/theme/ios_theme_resources.grd index 11d9a15..ce09bf7 100644 --- a/ios/chrome/app/theme/ios_theme_resources.grd +++ b/ios/chrome/app/theme/ios_theme_resources.grd
@@ -25,8 +25,9 @@ <!-- 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_IOS_INFOBAR_TRANSLATE" file="infobar_translate.png" /> <structure type="chrome_scaled_image" name="IDR_IOS_INFOBAR_AUTOLOGIN" file="infobar_autologin.png" /> + <structure type="chrome_scaled_image" name="IDR_IOS_INFOBAR_SAVE_PASSWORD" file="infobar_save_password.png" /> + <structure type="chrome_scaled_image" name="IDR_IOS_INFOBAR_TRANSLATE" file="infobar_translate.png" /> </structures> </release> </grit>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index 6c9831f..0e9879a 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -252,12 +252,24 @@ "ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc", "open_from_clipboard/create_clipboard_recent_content.h", "open_from_clipboard/create_clipboard_recent_content.mm", + "passwords/ios_chrome_password_manager_client.h", + "passwords/ios_chrome_password_manager_client.mm", + "passwords/ios_chrome_password_manager_driver.h", + "passwords/ios_chrome_password_manager_driver.mm", "passwords/ios_chrome_password_manager_setting_migrator_service_factory.cc", "passwords/ios_chrome_password_manager_setting_migrator_service_factory.h", "passwords/ios_chrome_password_store_factory.cc", "passwords/ios_chrome_password_store_factory.h", + "passwords/ios_chrome_save_password_infobar_delegate.h", + "passwords/ios_chrome_save_password_infobar_delegate.mm", + "passwords/password_controller.h", + "passwords/password_controller.mm", + "passwords/password_generation_agent.h", + "passwords/password_generation_agent.mm", + "passwords/password_generation_prompt_delegate.h", "passwords/password_generation_utils.h", "passwords/password_generation_utils.mm", + "passwords/passwords_ui_delegate.h", "pref_names.cc", "pref_names.h", "prefs/browser_prefs.h",
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h new file mode 100644 index 0000000..4af0cdb --- /dev/null +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
@@ -0,0 +1,79 @@ +// 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 IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_PASSWORD_MANAGER_CLIENT_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_PASSWORD_MANAGER_CLIENT_H_ + +#include "base/macros.h" +#include "base/prefs/pref_member.h" +#import "components/password_manager/core/browser/password_manager_client.h" +#include "components/password_manager/sync/browser/sync_credentials_filter.h" + +namespace ios { +class ChromeBrowserState; +} + +namespace password_manager { +class PasswordFormManager; +} + +@protocol PasswordManagerClientDelegate + +// Shows UI to prompt the user to save the password. +- (void)showSavePasswordInfoBar: + (scoped_ptr<password_manager::PasswordFormManager>)formToSave; + +@property(readonly, nonatomic) ios::ChromeBrowserState* browserState; + +@property(readonly, nonatomic) const GURL& lastCommittedURL; + +@end + +// An iOS implementation of password_manager::PasswordManagerClient. +class IOSChromePasswordManagerClient + : public password_manager::PasswordManagerClient { + public: + explicit IOSChromePasswordManagerClient( + id<PasswordManagerClientDelegate> delegate); + + ~IOSChromePasswordManagerClient() override; + + // password_manager::PasswordManagerClient implementation. + password_manager::PasswordSyncState GetPasswordSyncState() const override; + bool PromptUserToSaveOrUpdatePassword( + scoped_ptr<password_manager::PasswordFormManager> form_to_save, + password_manager::CredentialSourceType type, + bool update_password) override; + bool PromptUserToChooseCredentials( + ScopedVector<autofill::PasswordForm> local_forms, + ScopedVector<autofill::PasswordForm> federated_forms, + const GURL& origin, + base::Callback<void(const password_manager::CredentialInfo&)> callback) + override; + void AutomaticPasswordSave(scoped_ptr<password_manager::PasswordFormManager> + saved_form_manager) override; + bool IsOffTheRecord() const override; + PrefService* GetPrefs() override; + password_manager::PasswordStore* GetPasswordStore() const override; + void NotifyUserAutoSignin( + ScopedVector<autofill::PasswordForm> local_forms) override; + void ForceSavePassword() override; + bool IsSavingAndFillingEnabledForCurrentPage() const override; + const GURL& GetLastCommittedEntryURL() const override; + const password_manager::CredentialsFilter* GetStoreResultFilter() + const override; + + private: + id<PasswordManagerClientDelegate> delegate_; // (weak) + + // The preference associated with + // password_manager::prefs::kPasswordManagerSavingEnabled. + BooleanPrefMember saving_passwords_enabled_; + + const password_manager::SyncCredentialsFilter credentials_filter_; + + DISALLOW_COPY_AND_ASSIGN(IOSChromePasswordManagerClient); +}; + +#endif // IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_PASSWORD_MANAGER_CLIENT_H_
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm new file mode 100644 index 0000000..73d1144 --- /dev/null +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -0,0 +1,119 @@ +// 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 "ios/chrome/browser/passwords/ios_chrome_password_manager_client.h" + +#include "base/memory/scoped_ptr.h" +#include "components/autofill/core/common/password_form.h" +#include "components/browser_sync/browser/profile_sync_service.h" +#include "components/keyed_service/core/service_access_type.h" +#include "components/password_manager/core/browser/password_form_manager.h" +#include "components/password_manager/core/browser/password_manager_util.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" +#include "components/signin/core/browser/signin_manager_base.h" +#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" +#include "ios/chrome/browser/signin/signin_manager_factory.h" +#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h" +#include "ios/public/provider/chrome/browser/browser_state/chrome_browser_state.h" +#include "url/gurl.h" + +using password_manager::PasswordFormManager; +using password_manager::PasswordStore; +using password_manager::PasswordSyncState; + +namespace { + +const sync_driver::SyncService* GetSyncService( + ios::ChromeBrowserState* browser_state) { + return IOSChromeProfileSyncServiceFactory::GetForBrowserStateIfExists( + browser_state); +} + +const SigninManagerBase* GetSigninManager( + ios::ChromeBrowserState* browser_state) { + return ios::SigninManagerFactory::GetForBrowserState(browser_state); +} + +} // namespace + +IOSChromePasswordManagerClient::IOSChromePasswordManagerClient( + id<PasswordManagerClientDelegate> delegate) + : delegate_(delegate), + credentials_filter_( + this, + base::Bind(&GetSyncService, delegate_.browserState), + base::Bind(&GetSigninManager, delegate_.browserState)) { + saving_passwords_enabled_.Init( + password_manager::prefs::kPasswordManagerSavingEnabled, GetPrefs()); +} + +IOSChromePasswordManagerClient::~IOSChromePasswordManagerClient() = default; + +PasswordSyncState IOSChromePasswordManagerClient::GetPasswordSyncState() const { + ProfileSyncService* sync_service = + IOSChromeProfileSyncServiceFactory::GetForBrowserState( + delegate_.browserState); + return password_manager_util::GetPasswordSyncState(sync_service); +} + +bool IOSChromePasswordManagerClient::PromptUserToChooseCredentials( + ScopedVector<autofill::PasswordForm> local_forms, + ScopedVector<autofill::PasswordForm> federated_forms, + const GURL& origin, + base::Callback<void(const password_manager::CredentialInfo&)> callback) { + NOTIMPLEMENTED(); + return false; +} + +bool IOSChromePasswordManagerClient::PromptUserToSaveOrUpdatePassword( + scoped_ptr<PasswordFormManager> form_to_save, + password_manager::CredentialSourceType type, + bool update_password) { + if (form_to_save->IsBlacklisted()) + return false; + [delegate_ showSavePasswordInfoBar:form_to_save.Pass()]; + return true; +} + +void IOSChromePasswordManagerClient::AutomaticPasswordSave( + scoped_ptr<PasswordFormManager> saved_form_manager) { + NOTIMPLEMENTED(); +} + +bool IOSChromePasswordManagerClient::IsOffTheRecord() const { + return (delegate_.browserState)->IsOffTheRecord(); +} + +PrefService* IOSChromePasswordManagerClient::GetPrefs() { + return (delegate_.browserState)->GetPrefs(); +} + +PasswordStore* IOSChromePasswordManagerClient::GetPasswordStore() const { + return IOSChromePasswordStoreFactory::GetForBrowserState( + delegate_.browserState, ServiceAccessType::EXPLICIT_ACCESS) + .get(); +} + +void IOSChromePasswordManagerClient::NotifyUserAutoSignin( + ScopedVector<autofill::PasswordForm> local_forms) {} + +void IOSChromePasswordManagerClient::ForceSavePassword() { + NOTIMPLEMENTED(); +} + +bool IOSChromePasswordManagerClient::IsSavingAndFillingEnabledForCurrentPage() + const { + return *saving_passwords_enabled_ && !IsOffTheRecord() && + !DidLastPageLoadEncounterSSLErrors() && + IsFillingEnabledForCurrentPage(); +} + +const GURL& IOSChromePasswordManagerClient::GetLastCommittedEntryURL() const { + return delegate_.lastCommittedURL; +} + +const password_manager::CredentialsFilter* +IOSChromePasswordManagerClient::GetStoreResultFilter() const { + return &credentials_filter_; +}
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h new file mode 100644 index 0000000..7c026d0 --- /dev/null +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h
@@ -0,0 +1,77 @@ +// 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 IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_PASSWORD_MANAGER_DRIVER_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_PASSWORD_MANAGER_DRIVER_H_ + +#include <vector> + +#include "base/macros.h" +#include "components/password_manager/core/browser/password_manager_driver.h" + +@class PasswordGenerationAgent; + +namespace autofill { +struct PasswordForm; +struct PasswordFormFillData; +} // namespace autofill + +namespace password_manager { +class PasswordAutofillManager; +class PasswordGenerationManager; +class PasswordManager; +} // namespace password_manager + +// Defines the interface the driver needs to the controller. +@protocol PasswordManagerDriverDelegate + +- (PasswordGenerationAgent*)passwordGenerationAgent; + +- (password_manager::PasswordGenerationManager*)passwordGenerationManager; + +- (password_manager::PasswordManager*)passwordManager; + +// Finds and fills the password form using the supplied |formData| to +// match the password form and to populate the field values. Calls +// |completionHandler| with YES if a form field has been filled, NO otherwise. +// |completionHandler| can be nil. +- (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData + completionHandler:(void (^)(BOOL))completionHandler; +@end + +// An iOS implementation of password_manager::PasswordManagerDriver. +class IOSChromePasswordManagerDriver + : public password_manager::PasswordManagerDriver { + public: + explicit IOSChromePasswordManagerDriver( + id<PasswordManagerDriverDelegate> controller); + ~IOSChromePasswordManagerDriver() override; + + // password_manager::PasswordManagerDriver implementation. + void FillPasswordForm( + const autofill::PasswordFormFillData& form_data) override; + void AllowPasswordGenerationForForm( + const autofill::PasswordForm& form) override; + void FormsEligibleForGenerationFound( + const std::vector<autofill::PasswordFormGenerationData>& forms) override; + void GeneratedPasswordAccepted(const base::string16& password) override; + void FillSuggestion(const base::string16& username, + const base::string16& password) override; + void PreviewSuggestion(const base::string16& username, + const base::string16& password) override; + void ClearPreviewedForm() override; + password_manager::PasswordGenerationManager* GetPasswordGenerationManager() + override; + password_manager::PasswordManager* GetPasswordManager() override; + password_manager::PasswordAutofillManager* GetPasswordAutofillManager() + override; + void ForceSavePassword() override; + + private: + id<PasswordManagerDriverDelegate> delegate_; // (weak) + + DISALLOW_COPY_AND_ASSIGN(IOSChromePasswordManagerDriver); +}; + +#endif // IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_PASSWORD_MANAGER_DRIVER_H_
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_driver.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_driver.mm new file mode 100644 index 0000000..50ca458 --- /dev/null +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_driver.mm
@@ -0,0 +1,78 @@ +// 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 "ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h" + +#include "base/strings/string16.h" +#include "components/autofill/core/common/password_form.h" +#include "components/autofill/core/common/password_form_fill_data.h" +#include "components/password_manager/core/browser/password_generation_manager.h" +#include "components/password_manager/core/browser/password_manager.h" +#import "ios/chrome/browser/passwords/password_generation_agent.h" + +using password_manager::PasswordAutofillManager; +using password_manager::PasswordGenerationManager; +using password_manager::PasswordManager; + +IOSChromePasswordManagerDriver::IOSChromePasswordManagerDriver( + id<PasswordManagerDriverDelegate> delegate) + : delegate_(delegate) {} + +IOSChromePasswordManagerDriver::~IOSChromePasswordManagerDriver() = default; + +void IOSChromePasswordManagerDriver::FillPasswordForm( + const autofill::PasswordFormFillData& form_data) { + [delegate_ fillPasswordForm:form_data completionHandler:nil]; +} + +void IOSChromePasswordManagerDriver::FormsEligibleForGenerationFound( + const std::vector<autofill::PasswordFormGenerationData>& forms) { + // TODO(crbug.com/569579): Implement. +} + +void IOSChromePasswordManagerDriver::GeneratedPasswordAccepted( + const base::string16& password) { + NOTIMPLEMENTED(); +} + +void IOSChromePasswordManagerDriver::FillSuggestion( + const base::string16& username, + const base::string16& password) { + NOTIMPLEMENTED(); +} + +void IOSChromePasswordManagerDriver::PreviewSuggestion( + const base::string16& username, + const base::string16& password) { + NOTIMPLEMENTED(); +} + +void IOSChromePasswordManagerDriver::ClearPreviewedForm() { + NOTIMPLEMENTED(); +} + +PasswordGenerationManager* +IOSChromePasswordManagerDriver::GetPasswordGenerationManager() { + return [delegate_ passwordGenerationManager]; +} + +PasswordManager* IOSChromePasswordManagerDriver::GetPasswordManager() { + return [delegate_ passwordManager]; +} + +void IOSChromePasswordManagerDriver::AllowPasswordGenerationForForm( + const autofill::PasswordForm& form) { + [[delegate_ passwordGenerationAgent] allowPasswordGenerationForForm:form]; +} + +PasswordAutofillManager* +IOSChromePasswordManagerDriver::GetPasswordAutofillManager() { + // TODO(crbug.com/341877): Use PasswordAutofillManager to implement password + // autofill on iOS. + return nullptr; +} + +void IOSChromePasswordManagerDriver::ForceSavePassword() { + NOTIMPLEMENTED(); +}
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h new file mode 100644 index 0000000..4fb0b20 --- /dev/null +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
@@ -0,0 +1,70 @@ +// 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 IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_SAVE_PASSWORD_INFOBAR_DELEGATE_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_SAVE_PASSWORD_INFOBAR_DELEGATE_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "components/infobars/core/confirm_infobar_delegate.h" + +namespace password_manager { +class PasswordFormManager; +} + +namespace infobars { +class InfoBarManager; +} + +// After a successful *new* login attempt, Chrome passes the current +// password_manager::PasswordFormManager and move it to a +// IOSChromeSavePasswordInfoBarDelegate while the user makes up their mind +// with the "save password" infobar. +class IOSChromeSavePasswordInfoBarDelegate : public ConfirmInfoBarDelegate { + public: + // Creates the infobar for |form_to_save| and adds it to |infobar_manager|. + // |is_smart_lock_enabled| controls the branding string. + static void Create( + bool is_smart_lock_branding_enabled, + infobars::InfoBarManager* infobar_manager, + scoped_ptr<password_manager::PasswordFormManager> form_to_save); + + ~IOSChromeSavePasswordInfoBarDelegate() override; + + private: + enum ResponseType { + NO_RESPONSE = 0, + REMEMBER_PASSWORD, + DO_NOT_REMEMBER_PASSWORD, + NUM_RESPONSE_TYPES, + }; + + IOSChromeSavePasswordInfoBarDelegate( + bool is_smart_lock_branding_enabled, + scoped_ptr<password_manager::PasswordFormManager> form_to_save); + + // ConfirmInfoBarDelegate implementation. + Type GetInfoBarType() const override; + base::string16 GetMessageText() const override; + base::string16 GetLinkText() const override; + base::string16 GetButtonLabel(InfoBarButton button) const override; + bool Accept() override; + bool Cancel() override; + int GetIconId() const override; + bool LinkClicked(WindowOpenDisposition disposition) override; + + // The password_manager::PasswordFormManager managing the form we're asking + // the user about, and should update as per her decision. + scoped_ptr<password_manager::PasswordFormManager> form_to_save_; + + // Used to track the results we get from the info bar. + ResponseType infobar_response_; + + // Whether to show the password manager branded as Smart Lock. + bool is_smart_lock_branding_enabled_; + + DISALLOW_COPY_AND_ASSIGN(IOSChromeSavePasswordInfoBarDelegate); +}; + +#endif // IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_SAVE_PASSWORD_INFOBAR_DELEGATE_H_
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm new file mode 100644 index 0000000..b15e427 --- /dev/null +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
@@ -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. + +#import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h" + +#include <utility> + +#include "base/mac/scoped_nsobject.h" +#include "base/metrics/histogram.h" +#include "base/strings/string16.h" +#include "components/infobars/core/infobar.h" +#include "components/infobars/core/infobar_manager.h" +#include "components/password_manager/core/browser/password_form_manager.h" +#include "components/password_manager/core/browser/password_manager_constants.h" +#include "grit/components_strings.h" +#import "ios/chrome/browser/ui/commands/open_url_command.h" +#import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" +#include "ios/chrome/grit/ios_chromium_strings.h" +#include "ios/chrome/grit/ios_google_chrome_strings.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ios/chrome/grit/ios_theme_resources.h" +#include "ios/web/public/referrer.h" +#include "ui/base/l10n/l10n_util.h" +#include "url/gurl.h" + +using password_manager::PasswordFormManager; + +// static +void IOSChromeSavePasswordInfoBarDelegate::Create( + bool is_smart_lock_branding_enabled, + infobars::InfoBarManager* infobar_manager, + scoped_ptr<PasswordFormManager> form_to_save) { + DCHECK(infobar_manager); + auto delegate = make_scoped_ptr(new IOSChromeSavePasswordInfoBarDelegate( + is_smart_lock_branding_enabled, std::move(form_to_save))); + infobar_manager->AddInfoBar( + infobar_manager->CreateConfirmInfoBar(std::move(delegate))); +} + +IOSChromeSavePasswordInfoBarDelegate::~IOSChromeSavePasswordInfoBarDelegate() { + UMA_HISTOGRAM_ENUMERATION("PasswordManager.InfoBarResponse", + infobar_response_, NUM_RESPONSE_TYPES); +} + +IOSChromeSavePasswordInfoBarDelegate::IOSChromeSavePasswordInfoBarDelegate( + bool is_smart_lock_branding_enabled, + scoped_ptr<PasswordFormManager> form_to_save) + : form_to_save_(std::move(form_to_save)), + infobar_response_(NO_RESPONSE), + is_smart_lock_branding_enabled_(is_smart_lock_branding_enabled) {} + +infobars::InfoBarDelegate::Type +IOSChromeSavePasswordInfoBarDelegate::GetInfoBarType() const { + return PAGE_ACTION_TYPE; +} + +base::string16 IOSChromeSavePasswordInfoBarDelegate::GetMessageText() const { + if (is_smart_lock_branding_enabled_) { + return l10n_util::GetStringUTF16( + IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT_SMART_LOCK_BRANDING); + } + return l10n_util::GetStringUTF16( + IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT); +} + +base::string16 IOSChromeSavePasswordInfoBarDelegate::GetLinkText() const { + return is_smart_lock_branding_enabled_ + ? l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SMART_LOCK) + : base::string16(); +} + +base::string16 IOSChromeSavePasswordInfoBarDelegate::GetButtonLabel( + InfoBarButton button) const { + return l10n_util::GetStringUTF16( + (button == BUTTON_OK) ? IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON + : IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON); +} + +bool IOSChromeSavePasswordInfoBarDelegate::Accept() { + DCHECK(form_to_save_); + form_to_save_->Save(); + infobar_response_ = REMEMBER_PASSWORD; + return true; +} + +bool IOSChromeSavePasswordInfoBarDelegate::Cancel() { + DCHECK(form_to_save_); + form_to_save_->PermanentlyBlacklist(); + infobar_response_ = DO_NOT_REMEMBER_PASSWORD; + return true; +} + +bool IOSChromeSavePasswordInfoBarDelegate::LinkClicked( + WindowOpenDisposition disposition) { + base::scoped_nsobject<OpenUrlCommand> command([[OpenUrlCommand alloc] + initWithURL:GURL(password_manager::kPasswordManagerAccountDashboardURL) + referrer:web::Referrer() + windowName:nil + inIncognito:NO + inBackground:NO + appendTo:kCurrentTab]); + UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow]; + [mainWindow chromeExecuteCommand:command]; + return true; +} + +int IOSChromeSavePasswordInfoBarDelegate::GetIconId() const { + return IDR_IOS_INFOBAR_SAVE_PASSWORD; +}
diff --git a/ios/chrome/browser/passwords/password_controller.h b/ios/chrome/browser/passwords/password_controller.h new file mode 100644 index 0000000..498481f --- /dev/null +++ b/ios/chrome/browser/passwords/password_controller.h
@@ -0,0 +1,67 @@ +// Copyright 2012 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 IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_ + +#import <Foundation/NSObject.h> + +#import "ios/chrome/browser/autofill/form_suggestion_provider.h" +#import "ios/chrome/browser/passwords/ios_chrome_password_manager_client.h" +#import "ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h" + +@protocol FormInputAccessoryViewProvider; +@protocol PasswordsUiDelegate; +@class PasswordGenerationAgent; + +namespace password_manager { +class PasswordGenerationManager; +class PasswordManager; +class PasswordManagerClient; +class PasswordManagerDriver; +} // namespace password_manager + +// Per-tab password controller. Handles password autofill and saving. +@interface PasswordController + : NSObject<PasswordManagerClientDelegate, PasswordManagerDriverDelegate> + +// An object that can provide suggestions from this PasswordController. +@property(readonly) id<FormSuggestionProvider> suggestionProvider; + +// An object that can provide an input accessory view from this +// PasswordController. +@property(readonly) id<FormInputAccessoryViewProvider> accessoryViewProvider; + +// The PasswordGenerationManager owned by this PasswordController. +@property(readonly) + password_manager::PasswordGenerationManager* passwordGenerationManager; + +// The PasswordManagerClient owned by this PasswordController. +@property(readonly) + password_manager::PasswordManagerClient* passwordManagerClient; + +// The PasswordManagerDriver owned by this PasswordController. +@property(readonly) + password_manager::PasswordManagerDriver* passwordManagerDriver; + +// |webState| should not be nil. +- (instancetype)initWithWebState:(web::WebState*)webState + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate + NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +// Releases all tab-specific members. Must be called when the Tab is closing, +// otherwise invalid memory might be accessed during destruction. +- (void)detach; + +// Uses JavaScript to find password forms using the |webState_| and fills +// them with the |username| and |password|. |completionHandler|, if not nil, +// is called once per form filled. +- (void)findAndFillPasswordForms:(NSString*)username + password:(NSString*)password + completionHandler:(void (^)(BOOL))completionHandler; + +@end + +#endif // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm new file mode 100644 index 0000000..2326a86 --- /dev/null +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -0,0 +1,795 @@ +// Copyright 2012 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 "ios/chrome/browser/passwords/password_controller.h" + +#include <algorithm> +#include <utility> +#include <vector> + +#import "base/ios/weak_nsobject.h" +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/mac/foundation_util.h" +#include "base/mac/scoped_nsobject.h" +#include "base/memory/scoped_ptr.h" +#include "base/strings/string16.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "components/autofill/core/common/password_form.h" +#include "components/autofill/core/common/password_form_fill_data.h" +#include "components/browser_sync/browser/profile_sync_service.h" +#include "components/infobars/core/infobar_manager.h" +#include "components/password_manager/core/browser/password_bubble_experiment.h" +#include "components/password_manager/core/browser/password_generation_manager.h" +#include "components/password_manager/core/browser/password_manager.h" +#include "components/password_manager/core/browser/password_manager_client.h" +#include "components/password_manager/core/browser/password_manager_driver.h" +#include "components/sync_driver/sync_service.h" +#include "ios/chrome/browser/experimental_flags.h" +#include "ios/chrome/browser/infobars/infobar_manager_impl.h" +#import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h" +#import "ios/chrome/browser/passwords/js_password_manager.h" +#import "ios/chrome/browser/passwords/password_generation_agent.h" +#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h" +#include "ios/public/provider/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/web/public/url_scheme_util.h" +#import "ios/web/public/web_state/js/crw_js_injection_receiver.h" +#import "ios/web/public/web_state/web_state.h" +#import "ios/web/public/web_state/web_state_observer_bridge.h" +#include "url/gurl.h" + +using password_manager::PasswordFormManager; +using password_manager::PasswordGenerationManager; +using password_manager::PasswordManager; +using password_manager::PasswordManagerClient; +using password_manager::PasswordManagerDriver; + +@interface PasswordController ()<CRWWebStateObserver, FormSuggestionProvider> + +// Parses the |jsonString| which contatins the password forms found on a web +// page to populate the |forms| vector. +- (void)getPasswordForms:(std::vector<autofill::PasswordForm>*)forms + fromFormsJSON:(NSString*)jsonString + pageURL:(const GURL&)pageURL; + +// Processes the JSON string returned as a result of extracting the submitted +// form data and populates |form|. Returns YES on success. NO otherwise. +// |form| cannot be nil. +- (BOOL)getPasswordForm:(autofill::PasswordForm*)form + fromPasswordFormJSON:(NSString*)jsonString + pageURL:(const GURL&)pageURL; + +// Informs the |passwordManager_| of the password forms (if any were present) +// that have been found on the page. +- (void)didFinishPasswordFormExtraction: + (const std::vector<autofill::PasswordForm>&)forms; + +// Autofills |username| and |password| into the form specified by |formData|, +// invoking |completionHandler| when finished with YES if successful and +// NO otherwise. |completionHandler| may be nil. +- (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData + withUsername:(const base::string16&)username + password:(const base::string16&)password + completionHandler:(void (^)(BOOL))completionHandler; + +// Uses JavaScript to find password forms. Calls |completionHandler| with the +// extracted information used for matching and saving passwords. Calls +// |completionHandler| with an empty vector if no password forms are found. +// |completionHandler| cannot be nil. +- (void)findPasswordFormsWithCompletionHandler: + (void (^)(const std::vector<autofill::PasswordForm>&))completionHandler; + +// Finds the currently submitted password form and calls |completionHandler| +// with the populated data structure. |found| is YES if the current form was +// found successfully, NO otherwise. |completionHandler| cannot be nil. +- (void)extractSubmittedPasswordForm:(const std::string&)formName + completionHandler: + (void (^)(BOOL found, + const autofill::PasswordForm& form)) + completionHandler; + +// Takes values from a JSON |dictionary| and populates the |form|. +// The |pageLocation| is the URL of the current page. +// Returns YES if the form was correctly populated, NO otherwise. +- (BOOL)getPasswordForm:(autofill::PasswordForm*)form + fromDictionary:(const base::DictionaryValue*)dictionary + pageURL:(const GURL&)pageLocation; + +@end + +namespace { + +// Constructs an array of FormSuggestions, each corresponding to a username/ +// password pair in |formFillData|, such that |prefix| is a prefix of the +// username of each suggestion. +NSArray* BuildSuggestions(const autofill::PasswordFormFillData& formFillData, + NSString* prefix) { + NSMutableArray* suggestions = [NSMutableArray array]; + + // Add the default credentials. + NSString* defaultUsername = + base::SysUTF16ToNSString(formFillData.username_field.value); + if ([prefix length] == 0 || + [defaultUsername rangeOfString:prefix].location == 0) { + NSString* origin = + formFillData.preferred_realm.empty() + ? nil + : base::SysUTF8ToNSString(formFillData.preferred_realm); + [suggestions addObject:[FormSuggestion suggestionWithValue:defaultUsername + displayDescription:origin + icon:nil + identifier:0]]; + } + + // Add the additional credentials. + for (const auto& it : formFillData.additional_logins) { + NSString* additionalUsername = base::SysUTF16ToNSString(it.first); + NSString* additionalOrigin = it.second.realm.empty() + ? nil + : base::SysUTF8ToNSString(it.second.realm); + if ([prefix length] == 0 || + [additionalUsername rangeOfString:prefix].location == 0) { + [suggestions + addObject:[FormSuggestion suggestionWithValue:additionalUsername + displayDescription:additionalOrigin + icon:nil + identifier:0]]; + } + } + + return suggestions; +} + +// Looks for a credential pair in |formData| for with |username|. If such a pair +// exists, returns true and |matchingPassword|; returns false otherwise. +bool FindMatchingUsername(const autofill::PasswordFormFillData& formData, + const base::string16& username, + base::string16* matchingPassword) { + base::string16 defaultUsername = formData.username_field.value; + if (defaultUsername == username) { + *matchingPassword = formData.password_field.value; + return true; + } + + // Check whether the user has finished typing an alternate username. + for (const auto& it : formData.additional_logins) { + if (it.first == username) { + *matchingPassword = it.second.password; + return true; + } + } + + return false; +} + +// Removes URL components not essential for matching the URL to +// saved password databases entries. The stripped components are: +// user, password, query and ref. +GURL stripURL(GURL& url) { + url::Replacements<char> replacements; + replacements.ClearUsername(); + replacements.ClearPassword(); + replacements.ClearQuery(); + replacements.ClearRef(); + return url.ReplaceComponents(replacements); +} + +// Serializes |formData| into a JSON string that can be used by the JS side +// of PasswordController. +NSString* SerializePasswordFormFillData( + const autofill::PasswordFormFillData& formData) { + // Repackage PasswordFormFillData as a JSON object. + base::DictionaryValue rootDict; + + // The normalized URL of the web page. + rootDict.SetString("origin", formData.origin.spec()); + + // The normalized URL from the "action" attribute of the <form> tag. + rootDict.SetString("action", formData.action.spec()); + + // Input elements in the form. The list does not necessarily contain + // all elements from the form, but all elements listed here are required + // to identify the right form to fill. + auto fieldList = make_scoped_ptr(new base::ListValue()); + + auto usernameField = make_scoped_ptr(new base::DictionaryValue()); + usernameField->SetString("name", formData.username_field.name); + usernameField->SetString("value", formData.username_field.value); + fieldList->Append(usernameField.release()); + + auto passwordField = make_scoped_ptr(new base::DictionaryValue()); + passwordField->SetString("name", formData.password_field.name); + passwordField->SetString("value", formData.password_field.value); + fieldList->Append(passwordField.release()); + + rootDict.Set("fields", fieldList.release()); + + std::string jsonString; + base::JSONWriter::Write(rootDict, &jsonString); + return base::SysUTF8ToNSString(jsonString); +} + +// Returns true if the trust level for the current page URL of |web_state| is +// kAbsolute. If |page_url| is not null, fills it with the current page URL. +bool GetPageURLAndCheckTrustLevel(web::WebState* web_state, GURL* page_url) { + auto trustLevel = web::URLVerificationTrustLevel::kNone; + GURL dummy; + if (!page_url) + page_url = &dummy; + *page_url = web_state->GetCurrentURL(&trustLevel); + return trustLevel == web::URLVerificationTrustLevel::kAbsolute; +} + +} // namespace + +@implementation PasswordController { + scoped_ptr<PasswordManager> passwordManager_; + scoped_ptr<PasswordGenerationManager> passwordGenerationManager_; + scoped_ptr<PasswordManagerClient> passwordManagerClient_; + scoped_ptr<PasswordManagerDriver> passwordManagerDriver_; + base::scoped_nsobject<PasswordGenerationAgent> passwordGenerationAgent_; + + JsPasswordManager* passwordJsManager_; // weak + + // The pending form data. + scoped_ptr<autofill::PasswordFormFillData> formData_; + + // Bridge to observe WebState from Objective-C. + scoped_ptr<web::WebStateObserverBridge> webStateObserverBridge_; +} + +- (instancetype)initWithWebState:(web::WebState*)webState + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate { + DCHECK(webState); + self = [super init]; + if (self) { + webStateObserverBridge_.reset( + new web::WebStateObserverBridge(webState, self)); + passwordManagerClient_.reset(new IOSChromePasswordManagerClient(self)); + passwordManager_.reset(new PasswordManager(passwordManagerClient_.get())); + passwordManagerDriver_.reset(new IOSChromePasswordManagerDriver(self)); + if (experimental_flags::IsPasswordGenerationEnabled() && + !passwordManagerClient_->IsOffTheRecord()) { + passwordGenerationManager_.reset(new PasswordGenerationManager( + passwordManagerClient_.get(), passwordManagerDriver_.get())); + passwordGenerationAgent_.reset([[PasswordGenerationAgent alloc] + initWithWebState:webState + passwordManager:passwordManager_.get() + passwordManagerDriver:passwordManagerDriver_.get() + passwordsUiDelegate:UIDelegate]); + } + + passwordJsManager_ = base::mac::ObjCCastStrict<JsPasswordManager>( + [webState->GetJSInjectionReceiver() + instanceOfClass:[JsPasswordManager class]]); + } + return self; +} + +- (instancetype)init { + NOTREACHED(); + return nil; +} + +- (void)dealloc { + [self detach]; + [super dealloc]; +} + +- (ios::ChromeBrowserState*)browserState { + return webStateObserverBridge_ && webStateObserverBridge_->web_state() + ? ios::ChromeBrowserState::FromBrowserState( + webStateObserverBridge_->web_state()->GetBrowserState()) + : nullptr; +} + +- (const GURL&)lastCommittedURL { + if (!webStateObserverBridge_ || !webStateObserverBridge_->web_state()) + return GURL::EmptyGURL(); + return webStateObserverBridge_->web_state()->GetLastCommittedURL(); +} + +- (void)detach { + webStateObserverBridge_.reset(); + passwordGenerationAgent_.reset(); + passwordGenerationManager_.reset(); + passwordManagerDriver_.reset(); + passwordManager_.reset(); + passwordManagerClient_.reset(); +} + +- (void)findAndFillPasswordForms:(NSString*)username + password:(NSString*)password + completionHandler:(void (^)(BOOL))completionHandler { + [self findPasswordFormsWithCompletionHandler:^( + const std::vector<autofill::PasswordForm>& forms) { + for (const auto& form : forms) { + autofill::PasswordFormFillData formData; + autofill::PasswordFormMap matches; + // Initialize |matches| to satisfy the expectation from + // InitPasswordFormFillData() that the preferred match (3rd parameter) + // should be one of the |matches|. + auto scoped_form = make_scoped_ptr(new autofill::PasswordForm(form)); + matches.insert(std::make_pair(form.username_value, scoped_form.Pass())); + autofill::InitPasswordFormFillData(form, matches, &form, false, false, + &formData); + [self fillPasswordForm:formData + withUsername:base::SysNSStringToUTF16(username) + password:base::SysNSStringToUTF16(password) + completionHandler:completionHandler]; + } + }]; +} + +#pragma mark - +#pragma mark CRWWebStateObserver + +- (void)webStateDidLoadPage:(web::WebState*)webState { + // Clear per-page state. + formData_.reset(); + + // Retrieve the identity of the page. In case the page might be malicous, + // returns early. + GURL pageURL; + if (!GetPageURLAndCheckTrustLevel(webState, &pageURL)) + return; + + if (!web::UrlHasWebScheme(pageURL) || !webState->ContentIsHTML()) + return; + + // Notify the password manager that the page loaded so it can clear its own + // per-page state. + passwordManager_->DidNavigateMainFrame(); + + // Read all password forms from the page and send them to the password + // manager. + base::WeakNSObject<PasswordController> weakSelf(self); + [self findPasswordFormsWithCompletionHandler:^( + const std::vector<autofill::PasswordForm>& forms) { + [weakSelf didFinishPasswordFormExtraction:forms]; + }]; +} + +- (void)webState:(web::WebState*)webState + didSubmitDocumentWithFormNamed:(const std::string&)formName + userInitiated:(BOOL)userInitiated { + base::WeakNSObject<PasswordController> weakSelf(self); + // This code is racing against the new page loading and will not get the + // password form data if the page has changed. In most cases this code wins + // the race. + // TODO(crbug.com/418827): Fix this by passing in more data from the JS side. + id completionHandler = ^(BOOL found, const autofill::PasswordForm& form) { + if (weakSelf) { + weakSelf.get()->passwordManager_->OnPasswordFormSubmitted( + weakSelf.get()->passwordManagerDriver_.get(), form); + } + }; + [self extractSubmittedPasswordForm:formName + completionHandler:completionHandler]; +} + +- (void)webStateDestroyed:(web::WebState*)webState { + [self detach]; +} + +- (void)findPasswordFormsWithCompletionHandler: + (void (^)(const std::vector<autofill::PasswordForm>&))completionHandler { + DCHECK(completionHandler); + + if (!webStateObserverBridge_ || !webStateObserverBridge_->web_state()) + return; + + GURL pageURL; + if (!GetPageURLAndCheckTrustLevel(webStateObserverBridge_->web_state(), + &pageURL)) { + return; + } + + base::WeakNSObject<PasswordController> weakSelf(self); + [passwordJsManager_ findPasswordFormsWithCompletionHandler:^( + NSString* jsonString) { + std::vector<autofill::PasswordForm> forms; + [weakSelf getPasswordForms:&forms fromFormsJSON:jsonString pageURL:pageURL]; + completionHandler(forms); + }]; +} + +- (void)getPasswordForms:(std::vector<autofill::PasswordForm>*)forms + fromFormsJSON:(NSString*)jsonString + pageURL:(const GURL&)pageURL { + DCHECK(forms); + if (![jsonString length]) { + VLOG(1) << "Error in password controller javascript."; + return; + } + + int errorCode = 0; + std::string errorMessage; + scoped_ptr<base::Value> jsonData(base::JSONReader::ReadAndReturnError( + std::string([jsonString UTF8String]), false, &errorCode, &errorMessage)); + if (errorCode || !jsonData || !jsonData->IsType(base::Value::TYPE_LIST)) { + VLOG(1) << "JSON parse error " << errorMessage + << " JSON string: " << [jsonString UTF8String]; + return; + } + + const base::ListValue* formDataList; + if (!jsonData->GetAsList(&formDataList)) + return; + for (size_t i = 0; i != formDataList->GetSize(); ++i) { + const base::DictionaryValue* formData; + if (formDataList->GetDictionary(i, &formData)) { + autofill::PasswordForm form; + if ([self getPasswordForm:&form + fromDictionary:formData + pageURL:pageURL]) { + forms->push_back(form); + } + } + } +} + +- (void)extractSubmittedPasswordForm:(const std::string&)formName + completionHandler: + (void (^)(BOOL found, + const autofill::PasswordForm& form)) + completionHandler { + DCHECK(completionHandler); + + if (!webStateObserverBridge_ || !webStateObserverBridge_->web_state()) + return; + + GURL pageURL; + if (!GetPageURLAndCheckTrustLevel(webStateObserverBridge_->web_state(), + &pageURL)) { + completionHandler(NO, autofill::PasswordForm()); + return; + } + + base::WeakNSObject<PasswordController> weakSelf(self); + id extractSubmittedFormCompletionHandler = ^(NSString* jsonString) { + autofill::PasswordForm form; + BOOL found = [weakSelf getPasswordForm:&form + fromPasswordFormJSON:jsonString + pageURL:pageURL]; + completionHandler(found, form); + }; + + [passwordJsManager_ extractForm:base::SysUTF8ToNSString(formName) + completionHandler:extractSubmittedFormCompletionHandler]; +} + +- (BOOL)getPasswordForm:(autofill::PasswordForm*)form + fromPasswordFormJSON:(NSString*)jsonString + pageURL:(const GURL&)pageURL { + DCHECK(form); + // There is no identifiable password form on the page. + if ([jsonString isEqualToString:@"noPasswordsFound"]) + return NO; + + int errorCode = 0; + std::string errorMessage; + scoped_ptr<const base::Value> jsonData(base::JSONReader::ReadAndReturnError( + std::string([jsonString UTF8String]), false, &errorCode, &errorMessage)); + + // If the the JSON string contains null, there is no identifiable password + // form on the page. + if (!errorCode && !jsonData) { + return NO; + } + + if (errorCode || !jsonData->IsType(base::Value::TYPE_DICTIONARY)) { + VLOG(1) << "JSON parse error " << errorMessage + << " JSON string: " << [jsonString UTF8String]; + return NO; + } + + const base::DictionaryValue* passwordJsonData; + return jsonData->GetAsDictionary(&passwordJsonData) && + [self getPasswordForm:form + fromDictionary:passwordJsonData + pageURL:pageURL]; +} + +- (void)didFinishPasswordFormExtraction: + (const std::vector<autofill::PasswordForm>&)forms { + // Do nothing if |self| has been detached. + if (!passwordManager_) + return; + + if (!forms.empty()) { + // Invoke the password manager callback to autofill password forms + // on the loaded page. + passwordManager_->OnPasswordFormsParsed(passwordManagerDriver_.get(), + forms); + + // Pass the forms to PasswordGenerationAgent to look for account creation + // forms with local heuristics. + [passwordGenerationAgent_ processParsedPasswordForms:forms]; + } + // Invoke the password manager callback to check if password was + // accepted or rejected. If accepted, infobar is presented. If + // rejected, the provisionally saved password is deleted. On Chrome + // w/ a renderer, it is the renderer who calls OnPasswordFormsParsed() + // and OnPasswordFormsRendered(). Bling has to improvised a bit on the + // ordering of these two calls. + passwordManager_->OnPasswordFormsRendered(passwordManagerDriver_.get(), forms, + true); +} + +- (id<FormInputAccessoryViewProvider>)accessoryViewProvider { + return [passwordGenerationAgent_ accessoryViewProvider]; +} + +#pragma mark - +#pragma mark FormSuggestionProvider + +- (id<FormSuggestionProvider>)suggestionProvider { + return self; +} + +- (void)checkIfSuggestionsAvailableForForm:(NSString*)formName + field:(NSString*)fieldName + type:(NSString*)type + typedValue:(NSString*)typedValue + webState:(web::WebState*)webState + completionHandler: + (SuggestionsAvailableCompletion)completion { + if (!formData_ || !GetPageURLAndCheckTrustLevel(webState, nullptr)) { + completion(NO); + return; + } + + // Suggestions are available for the username field of the password form. + const base::string16& pendingFormName = formData_->name; + const base::string16& pendingFieldName = formData_->username_field.name; + completion(base::SysNSStringToUTF16(formName) == pendingFormName && + base::SysNSStringToUTF16(fieldName) == pendingFieldName); +} + +- (void)retrieveSuggestionsForForm:(NSString*)formName + field:(NSString*)fieldName + type:(NSString*)type + typedValue:(NSString*)typedValue + webState:(web::WebState*)webState + completionHandler:(SuggestionsReadyCompletion)completion { + DCHECK(GetPageURLAndCheckTrustLevel(webState, nullptr)); + if (!formData_) { + completion(@[], nil); + return; + } + completion(BuildSuggestions(*formData_, typedValue), self); +} + +- (void)didSelectSuggestion:(FormSuggestion*)suggestion + forField:(NSString*)fieldName + form:(NSString*)formName + completionHandler:(SuggestionHandledCompletion)completion { + const base::string16 username = base::SysNSStringToUTF16(suggestion.value); + base::string16 password; + if (FindMatchingUsername(*formData_, username, &password)) { + [self fillPasswordForm:*formData_ + withUsername:username + password:password + completionHandler:^(BOOL success) { + completion(); + }]; + } else { + completion(); + } +} + +#pragma mark - +#pragma mark WebPasswordFormData Adaptation + +- (BOOL)getPasswordForm:(autofill::PasswordForm*)form + fromDictionary:(const base::DictionaryValue*)dictionary + pageURL:(const GURL&)pageLocation { + DCHECK(form); + DCHECK(dictionary); + DCHECK(pageLocation.is_valid()); + + base::string16 formOrigin; + if (!(dictionary->GetString("origin", &formOrigin)) || + (GURL(formOrigin).GetOrigin() != pageLocation.GetOrigin())) { + return NO; + } + + std::string origin = pageLocation.spec(); + GURL originUrl(origin); + if (!originUrl.is_valid()) { + return NO; + } + form->origin = stripURL(originUrl); + url::Replacements<char> remove_path; + remove_path.ClearPath(); + form->signon_realm = form->origin.ReplaceComponents(remove_path).spec(); + + std::string action; + // Not checking the return value, as empty action is valid. + dictionary->GetString("action", &action); + GURL actionUrl = action.empty() ? originUrl : originUrl.Resolve(action); + if (!actionUrl.is_valid()) + return NO; + form->action = stripURL(actionUrl); + + if (!dictionary->GetString("usernameElement", &form->username_element) || + !dictionary->GetString("usernameValue", &form->username_value) || + !dictionary->GetString("name", &form->form_data.name)) { + return NO; + } + + const base::ListValue* passwordDataList; + if (!dictionary->GetList("passwords", &passwordDataList)) + return NO; + + size_t passwordCount = passwordDataList->GetSize(); + if (passwordCount == 0) + return NO; + + const base::DictionaryValue* passwordData; + + // The "passwords" list contains element/value pairs for + // password inputs found in the form. We recognize + // up to three passwords in any given form and ignore the rest. + const size_t kMaxPasswordsConsidered = 3; + base::string16 elements[kMaxPasswordsConsidered]; + base::string16 values[kMaxPasswordsConsidered]; + + for (size_t i = 0; i < std::min(passwordCount, kMaxPasswordsConsidered); + ++i) { + if (!passwordDataList->GetDictionary(i, &passwordData) || + !passwordData->GetString("element", &elements[i]) || + !passwordData->GetString("value", &values[i])) { + return NO; + } + } + + // Determine which password is the main one, and which is + // an old password (e.g on a "make new password" form), if any. + // TODO(crbug.com/564578): Make this compatible with other platforms. + switch (passwordCount) { + case 1: + form->password_element = elements[0]; + form->password_value = values[0]; + break; + case 2: { + if (values[0] == values[1]) { + // Treat two identical passwords as a single password. + form->password_element = elements[0]; + form->password_value = values[0]; + } else { + // Assume first is old password, second is new (no choice but to guess). + form->new_password_element = elements[0]; + form->new_password_value = values[0]; + form->password_element = elements[1]; + form->password_value = values[1]; + } + break; + default: + if (values[0] == values[1] && values[0] == values[2]) { + // All three passwords the same? Just treat as one and hope. + form->password_element = elements[0]; + form->password_value = values[0]; + } else if (values[0] == values[1]) { + // Two the same and one different -> old password is the duplicated + // one. + form->new_password_element = elements[0]; + form->new_password_value = values[0]; + form->password_element = elements[2]; + form->password_value = values[2]; + } else if (values[1] == values[2]) { + // Two the same and one different -> new password is the duplicated + // one. + form->new_password_element = elements[0]; + form->new_password_value = values[0]; + form->password_element = elements[1]; + form->password_value = values[1]; + } else { + // Three different passwords, or first and last match with middle + // different. No idea which is which, so no luck. + } + break; + } + } + + // Fill in as much data about the fields as is required for password + // generation. + const base::ListValue* fieldList = nullptr; + if (!dictionary->GetList("fields", &fieldList)) + return NO; + for (size_t i = 0; i < fieldList->GetSize(); ++i) { + const base::DictionaryValue* fieldDictionary = nullptr; + if (!fieldList->GetDictionary(i, &fieldDictionary)) + return NO; + base::string16 element; + base::string16 type; + if (!fieldDictionary->GetString("element", &element) || + !fieldDictionary->GetString("type", &type)) { + return NO; + } + autofill::FormFieldData field; + field.name = std::move(element); + field.form_control_type = base::UTF16ToUTF8(type); + form->form_data.fields.push_back(field); + } + + return YES; +} + +- (void)showSavePasswordInfoBar:(scoped_ptr<PasswordFormManager>)formToSave { + if (!webStateObserverBridge_ || !webStateObserverBridge_->web_state()) + return; + + bool isSmartLockBrandingEnabled = false; + if (self.browserState) { + sync_driver::SyncService* sync_service = + IOSChromeProfileSyncServiceFactory::GetForBrowserState( + self.browserState); + isSmartLockBrandingEnabled = + password_bubble_experiment::IsSmartLockBrandingEnabled(sync_service); + } + infobars::InfoBarManager* infoBarManager = + InfoBarManagerImpl::FromWebState(webStateObserverBridge_->web_state()); + IOSChromeSavePasswordInfoBarDelegate::Create( + isSmartLockBrandingEnabled, infoBarManager, std::move(formToSave)); +} + +- (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData + withUsername:(const base::string16&)username + password:(const base::string16&)password + completionHandler:(void (^)(BOOL))completionHandler { + // Send JSON over to the web view. + [passwordJsManager_ fillPasswordForm:SerializePasswordFormFillData(formData) + withUsername:base::SysUTF16ToNSString(username) + password:base::SysUTF16ToNSString(password) + completionHandler:^(BOOL result) { + if (completionHandler) + completionHandler(result); + }]; +} + +- (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData + completionHandler:(void (^)(BOOL))completionHandler { + formData_.reset(new autofill::PasswordFormFillData(formData)); + + // Don't fill immediately if waiting for the user to type a username. + if (formData_->wait_for_username) { + if (completionHandler) + completionHandler(NO); + return; + } + + [self fillPasswordForm:*formData_ + withUsername:formData_->username_field.value + password:formData_->password_field.value + completionHandler:completionHandler]; +} + +- (PasswordGenerationAgent*)passwordGenerationAgent { + return passwordGenerationAgent_.get(); +} + +- (PasswordGenerationManager*)passwordGenerationManager { + return passwordGenerationManager_.get(); +} + +- (PasswordManagerClient*)passwordManagerClient { + return passwordManagerClient_.get(); +} + +- (PasswordManagerDriver*)passwordManagerDriver { + return passwordManagerDriver_.get(); +} + +- (PasswordManager*)passwordManager { + return passwordManager_.get(); +} + +- (JsPasswordManager*)passwordJsManager { + return passwordJsManager_; +} + +@end
diff --git a/ios/chrome/browser/passwords/password_generation_agent.h b/ios/chrome/browser/passwords/password_generation_agent.h new file mode 100644 index 0000000..ca9b457 --- /dev/null +++ b/ios/chrome/browser/passwords/password_generation_agent.h
@@ -0,0 +1,102 @@ +// 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 IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_GENERATION_AGENT_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_GENERATION_AGENT_H_ + +#import <Foundation/Foundation.h> +#include <vector> + +#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h" +#import "ios/chrome/browser/passwords/password_generation_offer_view.h" +#import "ios/chrome/browser/passwords/password_generation_prompt_delegate.h" +#import "ios/chrome/browser/passwords/passwords_ui_delegate.h" +#import "ios/web/public/web_state/web_state_observer_bridge.h" + +@class CRWWebController; +@protocol FormInputAccessoryViewProvider; +@class JsPasswordManager; +@class JsSuggestionManager; + +namespace autofill { +struct FormData; +struct FormFieldData; +struct PasswordForm; +} + +namespace password_manager { +class PasswordManager; +class PasswordManagerDriver; +} + +// Performs password generation for a web state. Locates eligible password +// form fields, manages the user experience flow, and injects generated +// passwords into the page. This is the iOS counterpart to the upstream +// renderer-side PasswordGenerationAgent. This class is not meant to be +// subclassed and should only be used from the main thread. +@interface PasswordGenerationAgent : NSObject + +// Initializes PasswordGenerationAgent, which observes the specified web state. +- (instancetype) + initWithWebState:(web::WebState*)webState + passwordManager:(password_manager::PasswordManager*)passwordManager + passwordManagerDriver:(password_manager::PasswordManagerDriver*)driver + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate; + +- (instancetype)init NS_UNAVAILABLE; + +// Remembers that the specified |forms| are account creation forms, meaning that +// they might contain fields suitable for password generation. +- (void)registerAccountCreationForms: + (const std::vector<autofill::FormData>&)forms; + +// Indicates that the specified |form| has not been blacklisted by the user +// for the purposes of password management. +- (void)allowPasswordGenerationForForm:(const autofill::PasswordForm&)form; + +// Passes the |forms| that were parsed from the current page to this agent so +// that account creation forms and generation fields can be found. +- (void)processParsedPasswordForms: + (const std::vector<autofill::PasswordForm>&)forms; + +// Provides an input accessory view from this PasswordGenerationAgent. +@property(nonatomic, readonly) + id<FormInputAccessoryViewProvider> accessoryViewProvider; + +@end + +@interface PasswordGenerationAgent ( + ForTesting)<CRWWebStateObserver, + FormInputAccessoryViewProvider, + PasswordGenerationOfferDelegate, + PasswordGenerationPromptDelegate> + +// The form that has been identified by local heuristics as an account creation +// form. +@property(nonatomic, readonly) + autofill::PasswordForm* possibleAccountCreationForm; + +// The password fields in |possibleAccountCreationForm|. +@property(nonatomic, readonly) + const std::vector<autofill::FormFieldData>& passwordFields; + +// The field that triggers the password generation UI. +@property(nonatomic, readonly) autofill::FormFieldData* passwordGenerationField; + +// Initializes PasswordGenerationAgent, which observes the specified web state, +// and allows injecting JavaScript managers for testing. +- (instancetype) + initWithWebState:(web::WebState*)webState + passwordManager:(password_manager::PasswordManager*)passwordManager + passwordManagerDriver:(password_manager::PasswordManagerDriver*)driver + JSPasswordManager:(JsPasswordManager*)JSPasswordManager + JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate; + +// Clears all per-page state. +- (void)clearState; + +@end + +#endif // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_GENERATION_AGENT_H_
diff --git a/ios/chrome/browser/passwords/password_generation_agent.mm b/ios/chrome/browser/passwords/password_generation_agent.mm new file mode 100644 index 0000000..b8838b0 --- /dev/null +++ b/ios/chrome/browser/passwords/password_generation_agent.mm
@@ -0,0 +1,466 @@ +// 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. + +#import "ios/chrome/browser/passwords/password_generation_agent.h" + +#import "base/ios/weak_nsobject.h" +#include "base/mac/foundation_util.h" +#include "base/mac/scoped_block.h" +#include "base/mac/scoped_nsobject.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "components/autofill/core/browser/password_generator.h" +#include "components/autofill/core/common/form_data.h" +#include "components/autofill/core/common/password_form.h" +#include "components/autofill/core/common/password_generation_util.h" +#import "components/autofill/ios/browser/js_suggestion_manager.h" +#include "components/password_manager/core/browser/password_manager.h" +#include "google_apis/gaia/gaia_urls.h" +#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h" +#include "ios/chrome/browser/experimental_flags.h" +#import "ios/chrome/browser/passwords/js_password_manager.h" +#import "ios/chrome/browser/passwords/password_generation_edit_view.h" +#import "ios/chrome/browser/ui/commands/generic_chrome_command.h" +#include "ios/chrome/browser/ui/commands/ios_command_ids.h" +#include "ios/web/public/url_scheme_util.h" +#import "ios/web/public/web_state/js/crw_js_injection_receiver.h" +#include "ios/web/public/web_state/web_state.h" +#include "ui/base/l10n/l10n_util.h" +#include "url/gurl.h" + +namespace { + +// Target length of generated passwords. +const int kGeneratedPasswordLength = 20; + +// The minimum number of text fields that a form needs to be considered as +// an account creation form. +const size_t kMinimumTextFieldsForAccountCreation = 3; + +// Returns true if |urls| contains |url|. +bool VectorContainsURL(const std::vector<GURL>& urls, const GURL& url) { + return std::find(urls.begin(), urls.end(), url) != urls.end(); +} + +// Returns whether |field| should be considered a text field. Implementation +// mirrors that of password_controller.js. +// TODO(dconnelly): Figure out how (and if) to determine if |field| is visible. +// http://crbug.com/433856 +bool IsTextField(const autofill::FormFieldData& field) { + return field.form_control_type == "text" || + field.form_control_type == "email" || + field.form_control_type == "number" || + field.form_control_type == "tel" || field.form_control_type == "url" || + field.form_control_type == "search" || + field.form_control_type == "password"; +} + +} // namespace + +@interface PasswordGenerationAgent ()<CRWWebStateObserver, + FormInputAccessoryViewProvider, + PasswordGenerationOfferDelegate, + PasswordGenerationPromptDelegate> + +// Clears all per-page state. +- (void)clearState; + +// Returns YES if |form| belongs to the GAIA realm. +- (BOOL)formHasGAIARealm:(const autofill::PasswordForm&)form; + +// Returns YES if |form| contains enough text fields to be considered as an +// account creation form. +- (BOOL)formHasEnoughTextFieldsForAccountCreation: + (const autofill::PasswordForm&)form; + +// Returns a list of all password fields in |form|. +- (std::vector<autofill::FormFieldData>)passwordFieldsInForm: + (const autofill::PasswordForm&)form; + +// Merges the data from local heuristics, the autofill server, and the password +// manager to find the field that should trigger the password generation UI +// when selected by the user. The resulting field is stored in +// |_passwordGenerationField|. This logic is nearly identical to that of the +// upstream autofill::PasswordGenerationAgent::DetermineGenerationElement. +// TODO(dconnelly): Try to find a way to share this code with the upstream +// implementation, even though it lives in the renderer. +// http://crbug.com/434679. +- (void)determinePasswordGenerationField; + +// Returns YES if the specified form and field should trigger the +// password generation UI. +- (BOOL)isGenerationForm:(const base::string16&)formName + field:(const base::string16&)fieldName; + +// The name of the form identified as an account creation form, if it exists. +- (NSString*)passwordGenerationFormName; + +// Hides and deletes the alert with generation prompt, if it exists. +- (void)hideAlert; + +// Returns an autoreleased input accessory view corresponding to the current +// password generation state. Should only be used when password generation +// should be offered for the currently-focused form field. +- (UIView*)currentAccessoryView; + +// Initializes PasswordGenerationAgent, which observes the specified web state, +// and allows injecting JavaScript managers. +- (instancetype) + initWithWebState:(web::WebState*)webState + passwordManager:(password_manager::PasswordManager*)passwordManager + passwordManagerDriver:(password_manager::PasswordManagerDriver*)driver + JSPasswordManager:(JsPasswordManager*)JSPasswordManager + JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation PasswordGenerationAgent { + // Bridge to observe the web state from Objective-C. + scoped_ptr<web::WebStateObserverBridge> _webStateObserverBridge; + + // The origin URLs of forms on the current page that contain account creation + // forms as reported by autofill. + std::vector<GURL> _accountCreationFormOrigins; + + // The origin URLs of forms on the current page that have not been blacklisted + // by the password manager. + std::vector<GURL> _allowedGenerationFormOrigins; + + // Stores the account creation form we detected on the page. + scoped_ptr<autofill::PasswordForm> _possibleAccountCreationForm; + + // Password fields found in |_possibleAccountCreationForm|. + std::vector<autofill::FormFieldData> _passwordFields; + + // The password field that triggers the password generation UI. + scoped_ptr<autofill::FormFieldData> _passwordGenerationField; + + // Wrapper for suggestion JavaScript. Used for form navigation. + base::scoped_nsobject<JsSuggestionManager> _JSSuggestionManager; + + // Wrapper for passwords JavaScript. Used for form filling. + base::scoped_nsobject<JsPasswordManager> _JSPasswordManager; + + // Driver that is passed to PasswordManager when a password is generated. + password_manager::PasswordManagerDriver* _passwordManagerDriver; + + // PasswordManager to inform when a password is generated. + password_manager::PasswordManager* _passwordManager; + + // Callback to update the custom keyboard accessory view. Will be non-nil when + // this PasswordGenerationAgent controls the keyboard accessory view. + base::mac::ScopedBlock<AccessoryViewReadyCompletion> + _accessoryViewReadyCompletion; + + // The delegate for controlling the password generation UI. + base::scoped_nsprotocol<id<PasswordsUiDelegate>> _passwords_ui_delegate; + + // The password that was generated and accepted by the user. + base::scoped_nsobject<NSString> _generatedPassword; +} + +- (instancetype)init { + NOTREACHED(); + return nil; +} + +- (instancetype) + initWithWebState:(web::WebState*)webState + passwordManager:(password_manager::PasswordManager*)passwordManager + passwordManagerDriver:(password_manager::PasswordManagerDriver*)driver + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate { + JsPasswordManager* JSPasswordManager = + base::mac::ObjCCast<JsPasswordManager>([webState->GetJSInjectionReceiver() + instanceOfClass:[JsPasswordManager class]]); + JsSuggestionManager* JSSuggestionManager = + base::mac::ObjCCast<JsSuggestionManager>( + [webState->GetJSInjectionReceiver() + instanceOfClass:[JsSuggestionManager class]]); + return [self initWithWebState:webState + passwordManager:passwordManager + passwordManagerDriver:driver + JSPasswordManager:JSPasswordManager + JSSuggestionManager:JSSuggestionManager + passwordsUiDelegate:UIDelegate]; +} + +- (instancetype) + initWithWebState:(web::WebState*)webState + passwordManager:(password_manager::PasswordManager*)passwordManager + passwordManagerDriver:(password_manager::PasswordManagerDriver*)driver + JSPasswordManager:(JsPasswordManager*)JSPasswordManager + JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager + passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate { + DCHECK([NSThread isMainThread]); + DCHECK(webState); + DCHECK_EQ([self class], [PasswordGenerationAgent class]); + self = [super init]; + if (self) { + _passwordManager = passwordManager; + _passwordManagerDriver = driver; + _JSPasswordManager.reset([JSPasswordManager retain]); + _JSSuggestionManager.reset([JSSuggestionManager retain]); + _webStateObserverBridge.reset( + new web::WebStateObserverBridge(webState, self)); + _passwords_ui_delegate.reset([UIDelegate retain]); + } + return self; +} + +- (void)dealloc { + DCHECK([NSThread isMainThread]); + [super dealloc]; +} + +- (autofill::PasswordForm*)possibleAccountCreationForm { + return _possibleAccountCreationForm.get(); +} + +- (const std::vector<autofill::FormFieldData>&)passwordFields { + return _passwordFields; +} + +- (autofill::FormFieldData*)passwordGenerationField { + return _passwordGenerationField.get(); +} + +- (void)clearState { + [self hideAlert]; + _accountCreationFormOrigins.clear(); + _allowedGenerationFormOrigins.clear(); + _possibleAccountCreationForm.reset(); + _passwordFields.clear(); + _passwordGenerationField.reset(); + _generatedPassword.reset(); +} + +- (BOOL)formHasGAIARealm:(const autofill::PasswordForm&)form { + // Do not generate password for GAIA since it is used to retrieve the + // generated paswords. + return GURL(form.signon_realm) == + GaiaUrls::GetInstance()->gaia_login_form_realm(); +} + +- (BOOL)formHasEnoughTextFieldsForAccountCreation: + (const autofill::PasswordForm&)form { + size_t numVisibleTextFields = 0; + for (const auto& formFieldData : form.form_data.fields) + if (IsTextField(formFieldData)) + ++numVisibleTextFields; + return (numVisibleTextFields >= kMinimumTextFieldsForAccountCreation); +} + +- (std::vector<autofill::FormFieldData>)passwordFieldsInForm: + (const autofill::PasswordForm&)form { + std::vector<autofill::FormFieldData> passwordFields; + for (const auto& formFieldData : form.form_data.fields) + if (formFieldData.form_control_type == "password") + passwordFields.push_back(formFieldData); + return passwordFields; +} + +- (void)registerAccountCreationForms: + (const std::vector<autofill::FormData>&)forms { + for (const auto& form : forms) + _accountCreationFormOrigins.push_back(form.origin); + [self determinePasswordGenerationField]; +} + +- (void)allowPasswordGenerationForForm:(const autofill::PasswordForm&)form { + _allowedGenerationFormOrigins.push_back(form.origin); + [self determinePasswordGenerationField]; +} + +- (void)processParsedPasswordForms: + (const std::vector<autofill::PasswordForm>&)forms { + // TODO(dconnelly): Find a way to share some of this logic with the desktop + // agent. http://crbug.com/434679. + for (const auto& passwordForm : forms) { + if ([self formHasGAIARealm:passwordForm]) + continue; + if (![self formHasEnoughTextFieldsForAccountCreation:passwordForm]) + continue; + std::vector<autofill::FormFieldData> passwordFields( + [self passwordFieldsInForm:passwordForm]); + if (passwordFields.empty()) + continue; + // This form checks out. + _possibleAccountCreationForm.reset( + new autofill::PasswordForm(passwordForm)); + _passwordFields = passwordFields; + break; + } + [self determinePasswordGenerationField]; +} + +- (void)determinePasswordGenerationField { + // If the current page hasn't been parsed yet or doesn't contain any account + // creation forms, wait. + if (!_possibleAccountCreationForm) + return; + if (_passwordFields.empty()) + return; + + // If the form origin hasn't been cleared by both the autofill and the + // password manager, wait. + GURL origin = _possibleAccountCreationForm->origin; + if (!experimental_flags::UseOnlyLocalHeuristicsForPasswordGeneration()) { + if (!VectorContainsURL(_allowedGenerationFormOrigins, origin)) + return; + if (!VectorContainsURL(_accountCreationFormOrigins, origin)) + return; + } + + // Use the first password field in the form as the generation field. + _passwordGenerationField.reset( + new autofill::FormFieldData(_passwordFields[0])); + autofill::password_generation::LogPasswordGenerationEvent( + autofill::password_generation::GENERATION_AVAILABLE); +} + +- (id<FormInputAccessoryViewProvider>)accessoryViewProvider { + return self; +} + +- (BOOL)isGenerationForm:(const base::string16&)formName + field:(const base::string16&)fieldName { + return _possibleAccountCreationForm && + _possibleAccountCreationForm->form_data.name == formName && + _passwordGenerationField && + _passwordGenerationField->name == fieldName; +} + +- (NSString*)passwordGenerationFormName { + return base::SysUTF16ToNSString(_possibleAccountCreationForm->form_data.name); +} + +- (void)hideAlert { + [_passwords_ui_delegate hideGenerationAlert]; +} + +- (UIView*)currentAccessoryView { + return [_generatedPassword length] > 0 + ? [[[PasswordGenerationEditView alloc] + initWithPassword:_generatedPassword] autorelease] + : [[[PasswordGenerationOfferView alloc] initWithDelegate:self] + autorelease]; +} + +#pragma mark - +#pragma mark CRWWebStateObserver + +- (void)webStateDidLoadPage:(web::WebState*)webState { + [self clearState]; +} + +- (void)webStateDestroyed:(web::WebState*)webState { + [self clearState]; + _webStateObserverBridge.reset(); +} + +#pragma mark - +#pragma mark PasswordGenerationPromptDelegate + +- (void)acceptPasswordGeneration:(id)sender { + [self hideAlert]; + base::WeakNSObject<PasswordGenerationAgent> weakSelf(self); + id completionHandler = ^(BOOL success) { + if (!success) + return; + base::scoped_nsobject<PasswordGenerationAgent> strongSelf( + [weakSelf retain]); + if (!strongSelf) + return; + if (strongSelf.get()->_passwordManager) { + // Might be null in tests. + strongSelf.get()->_passwordManager->SetHasGeneratedPasswordForForm( + strongSelf.get()->_passwordManagerDriver, + *strongSelf.get()->_possibleAccountCreationForm, true); + } + if (strongSelf.get()->_accessoryViewReadyCompletion) { + strongSelf.get()->_accessoryViewReadyCompletion.get()( + [strongSelf currentAccessoryView], strongSelf); + } + }; + [_JSPasswordManager fillPasswordForm:[self passwordGenerationFormName] + withGeneratedPassword:_generatedPassword + completionHandler:completionHandler]; +} + +- (void)showSavedPasswords:(id)sender { + [self hideAlert]; + base::scoped_nsobject<GenericChromeCommand> command( + [[GenericChromeCommand alloc] + initWithTag:IDC_SHOW_SAVE_PASSWORDS_SETTINGS]); + [command executeOnMainWindow]; +} + +#pragma mark - +#pragma mark PasswordGenerationOfferDelegate + +- (void)generatePassword { + _generatedPassword.reset([base::SysUTF8ToNSString( + autofill::PasswordGenerator(kGeneratedPasswordLength).Generate()) copy]); + [_passwords_ui_delegate showGenerationAlertWithPassword:_generatedPassword + andPromptDelegate:self]; +} + +#pragma mark - +#pragma mark FormInputAccessoryViewProvider + +- (id<FormInputAccessoryViewDelegate>)accessoryViewDelegate { + return nil; +} + +- (void)setAccessoryViewDelegate:(id<FormInputAccessoryViewDelegate>)delegate { + // Unused. +} + +- (void) + checkIfAccessoryViewIsAvailableForFormNamed:(const std::string&)formName + fieldName:(const std::string&)fieldName + webState:(web::WebState*)webState + completionHandler: + (AccessoryViewAvailableCompletion) + completionHandler { + completionHandler( + _passwordGenerationField && + [self isGenerationForm:base::UTF8ToUTF16(formName) + field:base::UTF8ToUTF16(fieldName)]); +} + +- (void)retrieveAccessoryViewForFormNamed:(const std::string&)formName + fieldName:(const std::string&)fieldName + value:(const std::string&)value + type:(const std::string&)type + webState:(web::WebState*)webState + accessoryViewUpdateBlock: + (AccessoryViewReadyCompletion)accessoryViewUpdateBlock { + DCHECK(!_accessoryViewReadyCompletion); + if ([_generatedPassword length] > 0) + _generatedPassword.reset([base::SysUTF8ToNSString(value) copy]); + accessoryViewUpdateBlock([self currentAccessoryView], self); + _accessoryViewReadyCompletion.reset([accessoryViewUpdateBlock copy]); +} + +- (void)inputAccessoryViewControllerDidReset: + (FormInputAccessoryViewController*)controller { + [self hideAlert]; + DCHECK(_accessoryViewReadyCompletion); + _accessoryViewReadyCompletion.reset(); +} + +- (void)resizeAccessoryView { + DCHECK(_accessoryViewReadyCompletion); + _accessoryViewReadyCompletion.get()([self currentAccessoryView], self); +} + +- (BOOL)getLogKeyboardAccessoryMetrics { + // Only store metrics for regular Autofill, not passwords. + return NO; +} + +@end
diff --git a/ios/chrome/browser/passwords/password_generation_prompt_delegate.h b/ios/chrome/browser/passwords/password_generation_prompt_delegate.h new file mode 100644 index 0000000..a8e6013 --- /dev/null +++ b/ios/chrome/browser/passwords/password_generation_prompt_delegate.h
@@ -0,0 +1,19 @@ +// 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 IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_GENERATION_PROMPT_DELEGATE_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_GENERATION_PROMPT_DELEGATE_H_ + +// Handles user interaction with the PasswordGenerationPromptView. +@protocol PasswordGenerationPromptDelegate + +// Indicates that the user decided to accept the generated password. +- (void)acceptPasswordGeneration:(id)sender; + +// Indicates that the user wants to view their saved passwords. +- (void)showSavedPasswords:(id)sender; + +@end + +#endif // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_GENERATION_PROMPT_DELEGATE_H_
diff --git a/ios/chrome/browser/passwords/passwords_ui_delegate.h b/ios/chrome/browser/passwords/passwords_ui_delegate.h new file mode 100644 index 0000000..831e7980 --- /dev/null +++ b/ios/chrome/browser/passwords/passwords_ui_delegate.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 IOS_CHROME_BROWSER_PASSWORDS_PASSWORDS_UI_DELEGATE_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORDS_UI_DELEGATE_H_ + +#import <Foundation/Foundation.h> + +#import "ios/chrome/browser/passwords/password_generation_prompt_delegate.h" + +// Abstracts some UI-related tasks to isolate the rest of the code from +// Google's internal Material Design implementation. +@protocol PasswordsUiDelegate<NSObject> + +// Opens the password generation alert to offer the generated |password| to the +// user. +- (void)showGenerationAlertWithPassword:(NSString*)password + andPromptDelegate: + (id<PasswordGenerationPromptDelegate>)delegate; + +// Hides the alert (if open) from showGenerationAlertWithPassword. +- (void)hideGenerationAlert; + +@end + +#endif // IOS_CHROME_BROWSER_PASSWORDS_PASSWORDS_UI_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm index 1c22a77..37387a8 100644 --- a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm +++ b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
@@ -83,13 +83,13 @@ // was submitted, the WebContents is guaranteed to be live. Since the // InfoBarService is a WebContentsUserData, it must also be alive at this // time. - AutofillCCInfoBarDelegate::Create(infobar_manager_, this, callback); + AutofillCCInfoBarDelegate::CreateForLocalSave(infobar_manager_, callback); } void AutofillClientIOS::ConfirmSaveCreditCardToCloud( const base::Closure& callback, scoped_ptr<base::DictionaryValue> legal_message) { - NOTIMPLEMENTED(); + AutofillCCInfoBarDelegate::CreateForUpload(infobar_manager_, callback); } void AutofillClientIOS::LoadRiskData(
diff --git a/ios/chrome/ios_chrome.gyp b/ios/chrome/ios_chrome.gyp index 925498a..949bd8a 100644 --- a/ios/chrome/ios_chrome.gyp +++ b/ios/chrome/ios_chrome.gyp
@@ -396,20 +396,32 @@ 'browser/open_from_clipboard/create_clipboard_recent_content.mm', 'browser/passwords/credential_manager.h', 'browser/passwords/credential_manager.mm', + 'browser/passwords/ios_chrome_password_manager_client.h', + 'browser/passwords/ios_chrome_password_manager_client.mm', + 'browser/passwords/ios_chrome_password_manager_driver.h', + 'browser/passwords/ios_chrome_password_manager_driver.mm', 'browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.cc', 'browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.h', 'browser/passwords/ios_chrome_password_store_factory.cc', 'browser/passwords/ios_chrome_password_store_factory.h', + 'browser/passwords/ios_chrome_save_password_infobar_delegate.h', + 'browser/passwords/ios_chrome_save_password_infobar_delegate.mm', 'browser/passwords/js_credential_manager.h', 'browser/passwords/js_credential_manager.mm', 'browser/passwords/js_password_manager.h', 'browser/passwords/js_password_manager.mm', + 'browser/passwords/password_controller.h', + 'browser/passwords/password_controller.mm', + 'browser/passwords/password_generation_agent.h', + 'browser/passwords/password_generation_agent.mm', 'browser/passwords/password_generation_edit_view.h', 'browser/passwords/password_generation_edit_view.mm', 'browser/passwords/password_generation_offer_view.h', 'browser/passwords/password_generation_offer_view.mm', + 'browser/passwords/password_generation_prompt_delegate.h', 'browser/passwords/password_generation_utils.h', 'browser/passwords/password_generation_utils.mm', + 'browser/passwords/passwords_ui_delegate.h', 'browser/pref_names.cc', 'browser/pref_names.h', 'browser/prefs/browser_prefs.h',
diff --git a/ios/web/net/request_tracker_impl_unittest.mm b/ios/web/net/request_tracker_impl_unittest.mm index 0c8e76ec..5765b3a 100644 --- a/ios/web/net/request_tracker_impl_unittest.mm +++ b/ios/web/net/request_tracker_impl_unittest.mm
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/mac/scoped_nsobject.h" +#include "base/macros.h" #include "base/memory/scoped_vector.h" #include "base/message_loop/message_loop.h" #include "base/strings/sys_string_conversions.h" @@ -121,6 +122,19 @@ // Used and incremented each time a tabId is created. int g_count = 0; +// URLRequest::Delegate that does nothing. +class DummyURLRequestDelegate : public net::URLRequest::Delegate { + public: + DummyURLRequestDelegate() {} + ~DummyURLRequestDelegate() override {} + + void OnResponseStarted(net::URLRequest* request) override {} + void OnReadCompleted(net::URLRequest* request, int bytes_read) override {} + + private: + DISALLOW_COPY_AND_ASSIGN(DummyURLRequestDelegate); +}; + class RequestTrackerTest : public PlatformTest { public: RequestTrackerTest() @@ -239,9 +253,10 @@ while (i >= requests_.size()) { contexts_.push_back(new net::URLRequestContext()); - requests_.push_back(contexts_[i]->CreateRequest(url, - net::DEFAULT_PRIORITY, - NULL).release()); + requests_.push_back( + contexts_[i] + ->CreateRequest(url, net::DEFAULT_PRIORITY, &request_delegate_) + .release()); if (secure) { // Put a valid SSLInfo inside @@ -262,6 +277,8 @@ return requests_[i]; } + DummyURLRequestDelegate request_delegate_; + DISALLOW_COPY_AND_ASSIGN(RequestTrackerTest); };
diff --git a/ios/web/webui/crw_web_ui_manager.mm b/ios/web/webui/crw_web_ui_manager.mm index 0b74af1d7..aeeaadd 100644 --- a/ios/web/webui/crw_web_ui_manager.mm +++ b/ios/web/webui/crw_web_ui_manager.mm
@@ -111,6 +111,12 @@ }]; } +- (void)webStateDidLoadPage:(web::WebState*)webState { + DCHECK_EQ(webState, _webState); + // All WebUI pages are HTML based. + _webState->SetContentsMimeType("text/html"); +} + - (void)webStateDestroyed:(web::WebState*)webState { [self resetWebState]; }
diff --git a/media/base/android/android_cdm_factory.cc b/media/base/android/android_cdm_factory.cc index a2b467a..729ff7d 100644 --- a/media/base/android/android_cdm_factory.cc +++ b/media/base/android/android_cdm_factory.cc
@@ -46,28 +46,12 @@ return; } - scoped_refptr<MediaDrmBridge> cdm(MediaDrmBridge::Create( - key_system, create_fetcher_cb_, session_message_cb, session_closed_cb, - legacy_session_error_cb, session_keys_change_cb, - session_expiration_update_cb)); - if (!cdm) { - error_message = "MediaDrmBridge cannot be created for " + key_system; - NOTREACHED() << error_message; - bound_cdm_created_cb.Run(nullptr, error_message); - return; - } - + MediaDrmBridge::SecurityLevel security_level = + MediaDrmBridge::SECURITY_LEVEL_DEFAULT; if (key_system == kWidevineKeySystem) { - MediaDrmBridge::SecurityLevel security_level = - cdm_config.use_hw_secure_codecs ? MediaDrmBridge::SECURITY_LEVEL_1 - : MediaDrmBridge::SECURITY_LEVEL_3; - if (!cdm->SetSecurityLevel(security_level)) { - error_message = - "failed to set security level " + base::IntToString(security_level); - DVLOG(1) << error_message; - bound_cdm_created_cb.Run(nullptr, error_message); - return; - } + security_level = cdm_config.use_hw_secure_codecs + ? MediaDrmBridge::SECURITY_LEVEL_1 + : MediaDrmBridge::SECURITY_LEVEL_3; } else if (!cdm_config.use_hw_secure_codecs) { // Assume other key systems require hardware-secure codecs and thus do not // support full compositing. @@ -79,6 +63,18 @@ return; } + scoped_refptr<MediaDrmBridge> cdm(MediaDrmBridge::Create( + key_system, security_level, create_fetcher_cb_, session_message_cb, + session_closed_cb, legacy_session_error_cb, session_keys_change_cb, + session_expiration_update_cb)); + if (!cdm) { + error_message = "MediaDrmBridge cannot be created for " + key_system + + " with security level " + base::IntToString(security_level); + LOG(ERROR) << error_message; + bound_cdm_created_cb.Run(nullptr, error_message); + return; + } + // Success! bound_cdm_created_cb.Run(cdm, ""); }
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java index 3a62582..e739c27f 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
@@ -9,8 +9,6 @@ import android.media.AudioManager; import android.media.AudioTrack; import android.media.MediaCodec; -import android.media.MediaCodecInfo; -import android.media.MediaCodecList; import android.media.MediaCrypto; import android.media.MediaFormat; import android.os.Build; @@ -142,26 +140,6 @@ } } - @SuppressWarnings("deprecation") - private static String getDecoderNameForMime(String mime) { - int count = MediaCodecList.getCodecCount(); - for (int i = 0; i < count; ++i) { - MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i); - if (info.isEncoder()) { - continue; - } - - String[] supportedTypes = info.getSupportedTypes(); - for (int j = 0; j < supportedTypes.length; ++j) { - if (supportedTypes[j].equalsIgnoreCase(mime)) { - return info.getName(); - } - } - } - - return null; - } - private MediaCodecBridge( MediaCodec mediaCodec, String mime, boolean adaptivePlaybackSupported) { assert mediaCodec != null; @@ -175,47 +153,23 @@ @CalledByNative private static MediaCodecBridge create(String mime, boolean isSecure, int direction) { - // Creation of ".secure" codecs sometimes crash instead of throwing exceptions - // on pre-JBMR2 devices. - if (isSecure && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - return null; - } - MediaCodec mediaCodec = null; - boolean adaptivePlaybackSupported = false; + MediaCodecUtil.CodecCreationInfo info = new MediaCodecUtil.CodecCreationInfo(); try { - // |isSecure| only applies to video decoders. - if (mime.startsWith("video") && isSecure - && direction == MediaCodecUtil.MEDIA_CODEC_DECODER) { - String decoderName = MediaCodecUtil.getDecoderNameForMime(mime); - if (decoderName == null) { - return null; - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - // To work around an issue that we cannot get the codec info from the secure - // decoder, create an insecure decoder first so that we can query its codec - // info. http://b/15587335. - MediaCodec insecureCodec = MediaCodec.createByCodecName(decoderName); - adaptivePlaybackSupported = codecSupportsAdaptivePlayback(insecureCodec, mime); - insecureCodec.release(); - } - mediaCodec = MediaCodec.createByCodecName(decoderName + ".secure"); + if (direction == MediaCodecUtil.MEDIA_CODEC_ENCODER) { + info.mediaCodec = MediaCodec.createEncoderByType(mime); + info.supportsAdaptivePlayback = false; } else { - if (direction == MediaCodecUtil.MEDIA_CODEC_ENCODER) { - mediaCodec = MediaCodec.createEncoderByType(mime); - } else { - mediaCodec = MediaCodec.createDecoderByType(mime); - adaptivePlaybackSupported = codecSupportsAdaptivePlayback(mediaCodec, mime); - } + // |isSecure| only applies to video decoders. + info = MediaCodecUtil.createDecoder(mime, isSecure); } } catch (Exception e) { Log.e(TAG, "Failed to create MediaCodec: %s, isSecure: %s, direction: %d", mime, isSecure, direction, e); } - if (mediaCodec == null) { - return null; - } - return new MediaCodecBridge(mediaCodec, mime, adaptivePlaybackSupported); + if (info.mediaCodec == null) return null; + + return new MediaCodecBridge(info.mediaCodec, mime, info.supportsAdaptivePlayback); } @CalledByNative @@ -509,25 +463,6 @@ return width <= MAX_ADAPTIVE_PLAYBACK_WIDTH && height <= MAX_ADAPTIVE_PLAYBACK_HEIGHT; } - @TargetApi(Build.VERSION_CODES.KITKAT) - private static boolean codecSupportsAdaptivePlayback(MediaCodec mediaCodec, String mime) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || mediaCodec == null) { - return false; - } - try { - MediaCodecInfo info = mediaCodec.getCodecInfo(); - if (info.isEncoder()) { - return false; - } - MediaCodecInfo.CodecCapabilities capabilities = info.getCapabilitiesForType(mime); - return (capabilities != null) && capabilities.isFeatureSupported( - MediaCodecInfo.CodecCapabilities.FEATURE_AdaptivePlayback); - } catch (IllegalArgumentException e) { - Log.e(TAG, "Cannot retrieve codec information", e); - } - return false; - } - @CalledByNative private static void setCodecSpecificData(MediaFormat format, int index, byte[] bytes) { // Codec Specific Data is set in the MediaFormat as ByteBuffer entries with keys csd-0,
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java index b498b29..1bd40fd 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.Locale; import java.util.Map; /** @@ -60,6 +61,14 @@ } /** + * Class to pass parameters from createDecoder() + */ + public static class CodecCreationInfo { + public MediaCodec mediaCodec = null; + public boolean supportsAdaptivePlayback = false; + } + + /** * @return a list of supported android codec information. */ @SuppressWarnings("deprecation") @@ -168,7 +177,7 @@ * @return name of the decoder. */ @SuppressWarnings("deprecation") - protected static String getDecoderNameForMime(String mime) { + static String getDecoderNameForMime(String mime) { int count = MediaCodecList.getCodecCount(); for (int i = 0; i < count; ++i) { MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i); @@ -187,45 +196,115 @@ } /** - * Check if a given MIME type can be decoded. - * @param mime MIME type of the media. - * @param secure Whether secure decoder is required. - * @return true if system is able to decode, or false otherwise. - */ + * Check if a given MIME type can be decoded. + * @param mime MIME type of the media. + * @param secure Whether secure decoder is required. + * @return true if system is able to decode, or false otherwise. + */ @CalledByNative private static boolean canDecode(String mime, boolean isSecure) { - // Creation of ".secure" codecs sometimes crash instead of throwing exceptions - // on pre-JBMR2 devices. - if (isSecure && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - return false; - } - MediaCodec mediaCodec = null; - try { - // |isSecure| only applies to video decoders. - if (mime.startsWith("video") && isSecure) { - String decoderName = getDecoderNameForMime(mime); - if (decoderName == null) return false; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - // To work around an issue that we cannot get the codec info from the secure - // decoder, create an insecure decoder first so that we can query its codec - // info. http://b/15587335. - MediaCodec insecureCodec = MediaCodec.createByCodecName(decoderName); - insecureCodec.release(); - } - mediaCodec = MediaCodec.createByCodecName(decoderName + ".secure"); - } else { - mediaCodec = MediaCodec.createDecoderByType(mime); - } - } catch (Exception e) { - Log.e(TAG, "Failed to create MediaCodec: %s, isSecure: %s", mime, isSecure, e); - } + CodecCreationInfo info = createDecoder(mime, isSecure); + if (info.mediaCodec == null) return false; - if (mediaCodec == null) return false; try { - mediaCodec.release(); + info.mediaCodec.release(); } catch (IllegalStateException e) { Log.e(TAG, "Cannot release media codec", e); } return true; } + + /** + * Creates MediaCodec decoder. + * @param mime MIME type of the media. + * @param secure Whether secure decoder is required. + * @return CodecCreationInfo object + */ + static CodecCreationInfo createDecoder(String mime, boolean isSecure) { + // Always return a valid CodecCreationInfo, its |mediaCodec| field will be null + // if we cannot create the codec. + CodecCreationInfo result = new CodecCreationInfo(); + + assert result.mediaCodec == null; + + // Creation of ".secure" codecs sometimes crash instead of throwing exceptions + // on pre-JBMR2 devices. + if (isSecure && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) return result; + + // Do not create codec for blacklisted devices. + if (!isDecoderSupportedForDevice(mime)) return result; + + try { + // |isSecure| only applies to video decoders. + if (mime.startsWith("video") && isSecure) { + String decoderName = getDecoderNameForMime(mime); + if (decoderName == null) return null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // To work around an issue that we cannot get the codec info from the secure + // decoder, create an insecure decoder first so that we can query its codec + // info. http://b/15587335. + // Futhermore, it is impossible to create an insecure decoder if the secure + // one is already created. + MediaCodec insecureCodec = MediaCodec.createByCodecName(decoderName); + result.supportsAdaptivePlayback = + codecSupportsAdaptivePlayback(insecureCodec, mime); + insecureCodec.release(); + } + result.mediaCodec = MediaCodec.createByCodecName(decoderName + ".secure"); + } else { + result.mediaCodec = MediaCodec.createDecoderByType(mime); + result.supportsAdaptivePlayback = + codecSupportsAdaptivePlayback(result.mediaCodec, mime); + } + } catch (Exception e) { + Log.e(TAG, "Failed to create MediaCodec: %s, isSecure: %s", mime, isSecure, e); + result.mediaCodec = null; + } + return result; + } + + /** + * This is a way to blacklist misbehaving devices. + * Some devices cannot decode certain codecs, while other codecs work fine. + * @param mime MIME type as passed to mediaCodec.createDecoderByType(mime). + * @return true if this codec is supported for decoder on this device. + */ + private static boolean isDecoderSupportedForDevice(String mime) { + if (mime.equals("video/x-vnd.on2.vp8")) { + // Samsung Galaxy S4 Mini cannot render the frames decoded with VP8 + if (Build.MANUFACTURER.toLowerCase(Locale.getDefault()).equals("samsung") + && Build.MODEL.equals("GT-I9190")) { + Log.e(TAG, "VP8 video decoder is not supported on this device"); + return false; + } + } + + return true; + } + + /** + * Returns true if the given codec supports adaptive playback (dynamic resolution change). + * @param mediaCodec the codec. + * @param mime MIME type that corresponds to the codec creation. + * @return true if this codec and mime type combination supports adaptive playback. + */ + @TargetApi(Build.VERSION_CODES.KITKAT) + private static boolean codecSupportsAdaptivePlayback(MediaCodec mediaCodec, String mime) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || mediaCodec == null) { + return false; + } + try { + MediaCodecInfo info = mediaCodec.getCodecInfo(); + if (info.isEncoder()) { + return false; + } + MediaCodecInfo.CodecCapabilities capabilities = info.getCapabilitiesForType(mime); + return (capabilities != null) + && capabilities.isFeatureSupported( + MediaCodecInfo.CodecCapabilities.FEATURE_AdaptivePlayback); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Cannot retrieve codec information", e); + } + return false; + } }
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java index b0ce6f0..f259d4f6 100644 --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
@@ -309,10 +309,12 @@ * Create a new MediaDrmBridge from the crypto scheme UUID. * * @param schemeUUID Crypto scheme UUID. + * @param securityLevel Security level. If empty, the default one should be used. * @param nativeMediaDrmBridge Native object of this class. */ @CalledByNative - private static MediaDrmBridge create(byte[] schemeUUID, long nativeMediaDrmBridge) { + private static MediaDrmBridge create( + byte[] schemeUUID, String securityLevel, long nativeMediaDrmBridge) { UUID cryptoScheme = getUUIDFromBytes(schemeUUID); if (cryptoScheme == null || !MediaDrm.isCryptoSchemeSupported(cryptoScheme)) { return null; @@ -330,6 +332,14 @@ Log.e(TAG, "Failed to create MediaDrmBridge", e); } + if (mediaDrmBridge == null) { + return null; + } + + if (!securityLevel.isEmpty() && !mediaDrmBridge.setSecurityLevel(securityLevel)) { + return null; + } + return mediaDrmBridge; } @@ -341,8 +351,9 @@ * @param securityLevel Security level to be set. * @return whether the security level was successfully set. */ - @CalledByNative private boolean setSecurityLevel(String securityLevel) { + assert !securityLevel.isEmpty(); + if (mMediaDrm == null || mMediaCrypto != null) { return false; }
diff --git a/media/base/android/media_codec_player.cc b/media/base/android/media_codec_player.cc index 1fb821d..6c15652 100644 --- a/media/base/android/media_codec_player.cc +++ b/media/base/android/media_codec_player.cc
@@ -87,6 +87,8 @@ DVLOG(1) << "MediaCodecPlayer::~MediaCodecPlayer"; DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); + media_stat_->StopAndReport(GetInterpolatedTime()); + // Currently the unit tests wait for the MediaCodecPlayer destruction by // watching the demuxer, which is destroyed as one of the member variables. // Release the codecs here, before any member variable is destroyed to make @@ -97,8 +99,6 @@ if (audio_decoder_) audio_decoder_->ReleaseDecoderResources(); - media_stat_->StopAndReport(GetInterpolatedTime()); - if (cdm_) { DCHECK(cdm_registration_id_); static_cast<MediaDrmBridge*>(cdm_.get()) @@ -247,6 +247,8 @@ DVLOG(1) << __FUNCTION__; + media_stat_->StopAndReport(GetInterpolatedTime()); + SetPendingStart(false); switch (state_) { @@ -279,6 +281,8 @@ DVLOG(1) << __FUNCTION__ << " " << timestamp; + media_stat_->StopAndReport(GetInterpolatedTime()); + switch (state_) { case kStatePaused: SetState(kStateWaitingForSeek); @@ -329,6 +333,8 @@ DVLOG(1) << __FUNCTION__; + media_stat_->StopAndReport(GetInterpolatedTime()); + // Stop decoding threads and delete MediaCodecs, but keep IPC between browser // and renderer processes going. Seek should work across and after Release(). @@ -822,13 +828,13 @@ return; } - media_stat_->StopAndReport(GetInterpolatedTime()); - // DetachListener to UI thread ui_task_runner_->PostTask(FROM_HERE, detach_listener_cb_); - if (AudioFinished() && VideoFinished()) + if (AudioFinished() && VideoFinished()) { + media_stat_->StopAndReport(GetInterpolatedTime()); ui_task_runner_->PostTask(FROM_HERE, completion_cb_); + } } void MediaCodecPlayer::OnMissingKeyReported(DemuxerStream::Type type) { @@ -839,6 +845,8 @@ key_is_required_ = true; if (state_ == kStatePlaying) { + media_stat_->StopAndReport(GetInterpolatedTime()); + SetState(kStateStopping); RequestToStopDecoders(); SetPendingStart(true); @@ -849,6 +857,8 @@ DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__; + media_stat_->StopAndReport(GetInterpolatedTime()); + // kStateError blocks all events SetState(kStateError); @@ -1243,7 +1253,6 @@ // At this point decoder threads are either not running at all or their // message pumps are in the idle state after the preroll is done. - media_stat_->Start(current_time); if (!AudioFinished()) { if (!audio_decoder_->Start(current_time)) @@ -1258,6 +1267,8 @@ return kStartFailed; } + media_stat_->Start(current_time); + return kStartOk; } @@ -1267,8 +1278,6 @@ video_decoder_->SyncStop(); audio_decoder_->SyncStop(); - - media_stat_->StopAndReport(GetInterpolatedTime()); } void MediaCodecPlayer::RequestToStopDecoders() { @@ -1326,8 +1335,6 @@ // At this point decoder threads should not be running if (interpolator_.interpolating()) interpolator_.StopInterpolating(); - - media_stat_->StopAndReport(GetInterpolatedTime()); } void MediaCodecPlayer::CreateDecoders() {
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc index cb95f43..3de86c6c 100644 --- a/media/base/android/media_drm_bridge.cc +++ b/media/base/android/media_drm_bridge.cc
@@ -195,13 +195,15 @@ if (0 == security_level_str.compare("L3")) return MediaDrmBridge::SECURITY_LEVEL_3; DCHECK(security_level_str.empty()); - return MediaDrmBridge::SECURITY_LEVEL_NONE; + return MediaDrmBridge::SECURITY_LEVEL_DEFAULT; } +// Do not change the return values as they are part of Android MediaDrm API for +// Widevine. std::string GetSecurityLevelString( MediaDrmBridge::SecurityLevel security_level) { switch (security_level) { - case MediaDrmBridge::SECURITY_LEVEL_NONE: + case MediaDrmBridge::SECURITY_LEVEL_DEFAULT: return ""; case MediaDrmBridge::SECURITY_LEVEL_1: return "L1"; @@ -256,6 +258,7 @@ // static scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( const std::string& key_system, + SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, @@ -271,10 +274,10 @@ if (scheme_uuid.empty()) return nullptr; - scoped_refptr<MediaDrmBridge> media_drm_bridge( - new MediaDrmBridge(scheme_uuid, create_fetcher_cb, session_message_cb, - session_closed_cb, legacy_session_error_cb, - session_keys_change_cb, session_expiration_update_cb)); + scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge( + scheme_uuid, security_level, create_fetcher_cb, session_message_cb, + session_closed_cb, legacy_session_error_cb, session_keys_change_cb, + session_expiration_update_cb)); if (media_drm_bridge->j_media_drm_.is_null()) media_drm_bridge = nullptr; @@ -285,8 +288,9 @@ // static scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( const std::string& key_system, + SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb) { - return MediaDrmBridge::Create(key_system, create_fetcher_cb, + return MediaDrmBridge::Create(key_system, security_level, create_fetcher_cb, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), SessionKeysChangeCB(), SessionExpirationUpdateCB()); @@ -435,26 +439,6 @@ player_tracker_.UnregisterPlayer(registration_id); } -bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) { - if (security_level != SECURITY_LEVEL_NONE && - !std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) { - NOTREACHED() << "Widevine security level " << security_level - << "used with another key system"; - return false; - } - - JNIEnv* env = AttachCurrentThread(); - - std::string security_level_str = GetSecurityLevelString(security_level); - if (security_level_str.empty()) - return false; - - ScopedJavaLocalRef<jstring> j_security_level = - ConvertUTF8ToJavaString(env, security_level_str); - return Java_MediaDrmBridge_setSecurityLevel(env, j_media_drm_.obj(), - j_security_level.obj()); -} - bool MediaDrmBridge::IsProtectedSurfaceRequired() { // For Widevine, this depends on the security level. if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) @@ -714,6 +698,7 @@ MediaDrmBridge::MediaDrmBridge( const std::vector<uint8>& scheme_uuid, + SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, @@ -738,8 +723,14 @@ ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); + + std::string security_level_str = GetSecurityLevelString(security_level); + ScopedJavaLocalRef<jstring> j_security_level = + ConvertUTF8ToJavaString(env, security_level_str); + j_media_drm_.Reset(Java_MediaDrmBridge_create( - env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); + env, j_scheme_uuid.obj(), j_security_level.obj(), + reinterpret_cast<intptr_t>(this))); } MediaDrmBridge::~MediaDrmBridge() {
diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h index 0cf315a1..ff17252a1 100644 --- a/media/base/android/media_drm_bridge.h +++ b/media/base/android/media_drm_bridge.h
@@ -37,7 +37,7 @@ public: // TODO(ddorwin): These are specific to Widevine. http://crbug.com/459400 enum SecurityLevel { - SECURITY_LEVEL_NONE = 0, + SECURITY_LEVEL_DEFAULT = 0, SECURITY_LEVEL_1 = 1, SECURITY_LEVEL_3 = 3, }; @@ -73,11 +73,12 @@ // are not handled by Chrome explicitly. static std::vector<std::string> GetPlatformKeySystemNames(); - // Returns a MediaDrmBridge instance if |key_system| is supported, or a NULL - // pointer otherwise. - // TODO(xhwang): Is it okay not to update session expiration info? + // Returns a MediaDrmBridge instance if |key_system| and |security_level| are + // supported, and nullptr otherwise. The default security level will be used + // if |security_level| is SECURITY_LEVEL_DEFAULT. static scoped_refptr<MediaDrmBridge> Create( const std::string& key_system, + SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, @@ -85,11 +86,11 @@ const SessionKeysChangeCB& session_keys_change_cb, const SessionExpirationUpdateCB& session_expiration_update_cb); - // Returns a MediaDrmBridge instance if |key_system| is supported, or a NULL - // otherwise. No session callbacks are provided. This is used when we need to - // use MediaDrmBridge without creating any sessions. + // Same as Create() except that no session callbacks are provided. This is + // used when we need to use MediaDrmBridge without creating any sessions. static scoped_refptr<MediaDrmBridge> CreateWithoutSessionSupport( const std::string& key_system, + SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb); // MediaKeys implementation. @@ -123,15 +124,6 @@ const base::Closure& cdm_unset_cb) override; void UnregisterPlayer(int registration_id) override; - // Returns true if |security_level| is successfully set, or false otherwise. - // Call this function right after Create() and before any other calls. - // Note: - // - If this function is not called, the default security level of the device - // will be used. - // - It's recommended to call this function only once on a MediaDrmBridge - // object. Calling this function multiples times may cause errors. - bool SetSecurityLevel(SecurityLevel security_level); - // Helper function to determine whether a protected surface is needed for the // video playback. bool IsProtectedSurfaceRequired(); @@ -248,7 +240,11 @@ // For DeleteSoon() in DeleteOnCorrectThread(). friend class base::DeleteHelper<MediaDrmBridge>; + // Constructs a MediaDrmBridge for |scheme_uuid| and |security_level|. The + // default security level will be used if |security_level| is + // SECURITY_LEVEL_DEFAULT. MediaDrmBridge(const std::vector<uint8>& scheme_uuid, + SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb,
diff --git a/media/base/android/media_drm_bridge_unittest.cc b/media/base/android/media_drm_bridge_unittest.cc index f2ab9dcc..d9f0e478 100644 --- a/media/base/android/media_drm_bridge_unittest.cc +++ b/media/base/android/media_drm_bridge_unittest.cc
@@ -30,8 +30,8 @@ const char kAudioWebM[] = "audio/webm"; const char kVideoWebM[] = "video/webm"; const char kInvalidKeySystem[] = "invalid.keysystem"; -const MediaDrmBridge::SecurityLevel kLNone = - MediaDrmBridge::SECURITY_LEVEL_NONE; +const MediaDrmBridge::SecurityLevel kDefault = + MediaDrmBridge::SECURITY_LEVEL_DEFAULT; const MediaDrmBridge::SecurityLevel kL1 = MediaDrmBridge::SECURITY_LEVEL_1; const MediaDrmBridge::SecurityLevel kL3 = MediaDrmBridge::SECURITY_LEVEL_3; @@ -97,30 +97,26 @@ TEST(MediaDrmBridgeTest, CreateWithoutSessionSupport_Widevine) { base::MessageLoop message_loop_; EXPECT_TRUE_IF_WIDEVINE_AVAILABLE(MediaDrmBridge::CreateWithoutSessionSupport( - kWidevineKeySystem, base::Bind(&MockProvisionFetcher::Create))); + kWidevineKeySystem, kDefault, base::Bind(&MockProvisionFetcher::Create))); } // Invalid key system is NOT supported regardless whether MediaDrm is available. TEST(MediaDrmBridgeTest, CreateWithoutSessionSupport_InvalidKeySystem) { base::MessageLoop message_loop_; EXPECT_FALSE(MediaDrmBridge::CreateWithoutSessionSupport( - kInvalidKeySystem, base::Bind(&MockProvisionFetcher::Create))); + kInvalidKeySystem, kDefault, base::Bind(&MockProvisionFetcher::Create))); } -TEST(MediaDrmBridgeTest, SetSecurityLevel_Widevine) { +TEST(MediaDrmBridgeTest, CreateWithSecurityLevel_Widevine) { base::MessageLoop message_loop_; - scoped_refptr<MediaDrmBridge> media_drm_bridge = - MediaDrmBridge::CreateWithoutSessionSupport( - kWidevineKeySystem, base::Bind(&MockProvisionFetcher::Create)); - EXPECT_TRUE_IF_WIDEVINE_AVAILABLE(media_drm_bridge); - if (!media_drm_bridge) - return; - EXPECT_FALSE(media_drm_bridge->SetSecurityLevel(kLNone)); // We test "L3" fully. But for "L1" we don't check the result as it depends on // whether the test device supports "L1". - EXPECT_TRUE(media_drm_bridge->SetSecurityLevel(kL3)); - media_drm_bridge->SetSecurityLevel(kL1); + EXPECT_TRUE_IF_WIDEVINE_AVAILABLE(MediaDrmBridge::CreateWithoutSessionSupport( + kWidevineKeySystem, kL3, base::Bind(&MockProvisionFetcher::Create))); + + MediaDrmBridge::CreateWithoutSessionSupport( + kWidevineKeySystem, kL1, base::Bind(&MockProvisionFetcher::Create)); } } // namespace media
diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc index a00b028..610f459d 100644 --- a/media/base/android/media_source_player.cc +++ b/media/base/android/media_source_player.cc
@@ -504,7 +504,7 @@ if (IsEventPending(SEEK_EVENT_PENDING)) { ProcessPendingEvents(); // In case of Seek GetCurrentTime() already tells the time to seek to. - if (is_clock_manager) + if (is_clock_manager && !doing_browser_seek_) media_stat_->StopAndReport(current_presentation_timestamp); return; } @@ -568,8 +568,6 @@ // in the middle of a seek or stop event and needs to wait for the IPCs to // come. if (status == MEDIA_CODEC_ABORT) { - if (is_clock_manager) - media_stat_->StopAndReport(GetCurrentTime()); return; } @@ -761,7 +759,8 @@ if (!interpolator_.interpolating()) interpolator_.StartInterpolating(); - media_stat_->Start(start_presentation_timestamp_); + if (!AudioFinished() || !VideoFinished()) + media_stat_->Start(start_presentation_timestamp_); if (!AudioFinished()) DecodeMoreAudio();
diff --git a/media/base/android/media_statistics.h b/media/base/android/media_statistics.h index 5b6daabb..1e76c36 100644 --- a/media/base/android/media_statistics.h +++ b/media/base/android/media_statistics.h
@@ -57,12 +57,12 @@ // Returns the frame statistics for video frames. FrameStatistics& video_frame_stats() { return video_frame_stats_; } - // Starts gathering statistics. When called in a row only the firts call will + // Starts gathering statistics. When called in a row only the first call will // take effect. void Start(base::TimeDelta current_playback_time); // Stops gathering statistics, calculate and report results. When called - // in a row only the firts call will take effect. + // in a row only the first call will take effect. void StopAndReport(base::TimeDelta current_playback_time); // Adds starvation event. Starvation happens when the player interrupts
diff --git a/media/blink/buffered_data_source_host_impl.cc b/media/blink/buffered_data_source_host_impl.cc index 542b856..19d01be2 100644 --- a/media/blink/buffered_data_source_host_impl.cc +++ b/media/blink/buffered_data_source_host_impl.cc
@@ -19,7 +19,12 @@ } void BufferedDataSourceHostImpl::AddBufferedByteRange(int64 start, int64 end) { - buffered_byte_ranges_.Add(start, end); + const auto i = buffered_byte_ranges_.find(start); + if (i.value() && i.interval_end() >= end) { + // No change + return; + } + buffered_byte_ranges_.SetInterval(start, end, 1); did_loading_progress_ = true; } @@ -40,13 +45,15 @@ base::TimeDelta media_duration) const { DCHECK(media_duration != kNoTimestamp()); DCHECK(media_duration != kInfiniteDuration()); - if (total_bytes_ && buffered_byte_ranges_.size()) { - for (size_t i = 0; i < buffered_byte_ranges_.size(); ++i) { - int64 start = buffered_byte_ranges_.start(i); - int64 end = buffered_byte_ranges_.end(i); - buffered_time_ranges->Add( - TimeForByteOffset(start, total_bytes_, media_duration), - TimeForByteOffset(end, total_bytes_, media_duration)); + if (total_bytes_ && !buffered_byte_ranges_.empty()) { + for (const auto i : buffered_byte_ranges_) { + if (i.second) { + int64 start = i.first.begin; + int64 end = i.first.end; + buffered_time_ranges->Add( + TimeForByteOffset(start, total_bytes_, media_duration), + TimeForByteOffset(end, total_bytes_, media_duration)); + } } } }
diff --git a/media/blink/buffered_data_source_host_impl.h b/media/blink/buffered_data_source_host_impl.h index d58c8c06..b028c0e 100644 --- a/media/blink/buffered_data_source_host_impl.h +++ b/media/blink/buffered_data_source_host_impl.h
@@ -6,7 +6,6 @@ #define MEDIA_BLINK_BUFFERED_DATA_SOURCE_HOST_IMPL_H_ #include "base/time/time.h" -#include "media/base/ranges.h" #include "media/blink/buffered_data_source.h" #include "media/blink/media_blink_export.h" @@ -37,7 +36,8 @@ int64 total_bytes_; // List of buffered byte ranges for estimating buffered time. - Ranges<int64> buffered_byte_ranges_; + // The InterValMap value is 1 for bytes that are buffered, 0 otherwise. + IntervalMap<int64, int> buffered_byte_ranges_; // True when AddBufferedByteRange() has been called more recently than // DidLoadingProgress().
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn index cb9bcbf..eda7fb35 100644 --- a/media/mojo/services/BUILD.gn +++ b/media/mojo/services/BUILD.gn
@@ -81,14 +81,14 @@ } source_set("media_client") { + sources = [ + "mojo_media_client.cc", + "mojo_media_client.h", + ] if (is_android) { - sources = [ - "android_mojo_media_client.cc", - ] + sources += [ "android_mojo_media_client.cc" ] } else { - sources = [ - "default_mojo_media_client.cc", - ] + sources += [ "default_mojo_media_client.cc" ] } public_configs = [ ":enable_mojo_media_config" ] @@ -158,8 +158,6 @@ sources = [ "mojo_media_application.cc", "mojo_media_application.h", - "mojo_media_client.cc", - "mojo_media_client.h", "service_factory_impl.cc", "service_factory_impl.h", ]
diff --git a/media/mojo/services/default_mojo_media_client.cc b/media/mojo/services/default_mojo_media_client.cc index 31c2863..164dc72 100644 --- a/media/mojo/services/default_mojo_media_client.cc +++ b/media/mojo/services/default_mojo_media_client.cc
@@ -20,7 +20,9 @@ class DefaultMojoMediaClient : public PlatformMojoMediaClient { public: - DefaultMojoMediaClient() { + DefaultMojoMediaClient() {} + + void Initialize() override { InitializeMediaLibrary(); // TODO(dalecurtis): We should find a single owner per process for the audio
diff --git a/media/mojo/services/main.cc b/media/mojo/services/main.cc index 5ee05895..f3582d4 100644 --- a/media/mojo/services/main.cc +++ b/media/mojo/services/main.cc
@@ -3,11 +3,13 @@ // found in the LICENSE file. #include "media/mojo/services/mojo_media_application.h" +#include "media/mojo/services/mojo_media_client.h" #include "mojo/application/public/cpp/application_runner.h" #include "mojo/public/c/system/main.h" MojoResult MojoMain(MojoHandle mojo_handle) { // Create MojoMediaApplication and enable logging. - mojo::ApplicationRunner runner(new media::MojoMediaApplication(true)); + mojo::ApplicationRunner runner( + new media::MojoMediaApplication(true, media::MojoMediaClient::Create())); return runner.Run(mojo_handle); }
diff --git a/media/mojo/services/mojo_media_application.cc b/media/mojo/services/mojo_media_application.cc index e568514c..41e2fee 100644 --- a/media/mojo/services/mojo_media_application.cc +++ b/media/mojo/services/mojo_media_application.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "media/base/media_log.h" +#include "media/mojo/services/mojo_media_client.h" #include "media/mojo/services/service_factory_impl.h" #include "mojo/application/public/cpp/application_connection.h" #include "mojo/application/public/cpp/application_impl.h" @@ -17,12 +18,16 @@ // In all existing use cases we don't need to initialize logging when using // CreateApp() to create the application. We can pass |enable_logging| in // CreateApp() if this isn't the case any more in the future. - return scoped_ptr<mojo::ApplicationDelegate>(new MojoMediaApplication(false)); + return scoped_ptr<mojo::ApplicationDelegate>( + new MojoMediaApplication(false, MojoMediaClient::Create())); } // TODO(xhwang): Hook up MediaLog when possible. -MojoMediaApplication::MojoMediaApplication(bool enable_logging) +MojoMediaApplication::MojoMediaApplication( + bool enable_logging, + scoped_ptr<MojoMediaClient> mojo_media_client) : enable_logging_(enable_logging), + mojo_media_client_(std::move(mojo_media_client)), app_impl_(nullptr), media_log_(new MediaLog()) {} @@ -39,6 +44,7 @@ // Display process ID, thread ID and timestamp in logs. logging::SetLogItems(true, true, true, false); } + mojo_media_client_->Initialize(); } bool MojoMediaApplication::ConfigureIncomingConnection( @@ -53,7 +59,8 @@ // The created object is owned by the pipe. new ServiceFactoryImpl(request.Pass(), connection->GetServiceProvider(), media_log_, - app_impl_->app_lifetime_helper()->CreateAppRefCount()); + app_impl_->app_lifetime_helper()->CreateAppRefCount(), + mojo_media_client_.get()); } } // namespace media
diff --git a/media/mojo/services/mojo_media_application.h b/media/mojo/services/mojo_media_application.h index 073622b..ccf86e1 100644 --- a/media/mojo/services/mojo_media_application.h +++ b/media/mojo/services/mojo_media_application.h
@@ -11,6 +11,7 @@ namespace media { class MediaLog; +class MojoMediaClient; class MojoMediaApplication : public mojo::ApplicationDelegate, @@ -18,7 +19,8 @@ public: static scoped_ptr<mojo::ApplicationDelegate> CreateApp(); - explicit MojoMediaApplication(bool enable_logging); + MojoMediaApplication(bool enable_logging, + scoped_ptr<MojoMediaClient> mojo_media_client); ~MojoMediaApplication() final; private: @@ -32,6 +34,7 @@ mojo::InterfaceRequest<interfaces::ServiceFactory> request) final; bool enable_logging_; + scoped_ptr<MojoMediaClient> mojo_media_client_; mojo::ApplicationImpl* app_impl_; scoped_refptr<MediaLog> media_log_; };
diff --git a/media/mojo/services/mojo_media_client.cc b/media/mojo/services/mojo_media_client.cc index 3d05f1b..f9dd4442 100644 --- a/media/mojo/services/mojo_media_client.cc +++ b/media/mojo/services/mojo_media_client.cc
@@ -10,6 +10,8 @@ PlatformMojoMediaClient::~PlatformMojoMediaClient(){}; +void PlatformMojoMediaClient::Initialize() {} + scoped_ptr<RendererFactory> PlatformMojoMediaClient::CreateRendererFactory( const scoped_refptr<MediaLog>& media_log) { return nullptr; @@ -34,36 +36,39 @@ extern scoped_ptr<PlatformMojoMediaClient> CreatePlatformMojoMediaClient(); } // namespace internal -static base::LazyInstance<MojoMediaClient>::Leaky g_mojo_media_client = - LAZY_INSTANCE_INITIALIZER; - // static -MojoMediaClient* MojoMediaClient::Get() { - return g_mojo_media_client.Pointer(); +scoped_ptr<MojoMediaClient> MojoMediaClient::Create() { + return make_scoped_ptr( + new MojoMediaClient(internal::CreatePlatformMojoMediaClient())); +} + +void MojoMediaClient::Initialize() { + platform_client_->Initialize(); } scoped_ptr<RendererFactory> MojoMediaClient::CreateRendererFactory( const scoped_refptr<MediaLog>& media_log) { - return mojo_media_client_->CreateRendererFactory(media_log); + return platform_client_->CreateRendererFactory(media_log); } scoped_refptr<AudioRendererSink> MojoMediaClient::CreateAudioRendererSink() { - return mojo_media_client_->CreateAudioRendererSink(); + return platform_client_->CreateAudioRendererSink(); } scoped_ptr<VideoRendererSink> MojoMediaClient::CreateVideoRendererSink( const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { - return mojo_media_client_->CreateVideoRendererSink(task_runner); + return platform_client_->CreateVideoRendererSink(task_runner); } scoped_ptr<CdmFactory> MojoMediaClient::CreateCdmFactory( mojo::ServiceProvider* service_provider) { - return mojo_media_client_->CreateCdmFactory(service_provider); + return platform_client_->CreateCdmFactory(service_provider); } -MojoMediaClient::MojoMediaClient() - : mojo_media_client_(internal::CreatePlatformMojoMediaClient()) { - DCHECK(mojo_media_client_); +MojoMediaClient::MojoMediaClient( + scoped_ptr<PlatformMojoMediaClient> platform_client) + : platform_client_(std::move(platform_client)) { + DCHECK(platform_client_); } MojoMediaClient::~MojoMediaClient() {
diff --git a/media/mojo/services/mojo_media_client.h b/media/mojo/services/mojo_media_client.h index 323d748..5d3f53a 100644 --- a/media/mojo/services/mojo_media_client.h +++ b/media/mojo/services/mojo_media_client.h
@@ -26,6 +26,8 @@ public: virtual ~PlatformMojoMediaClient(); + // Called exactly once before any other method. + virtual void Initialize(); // Returns the RendererFactory to be used by MojoRendererService. If returns // null, a RendererImpl will be used with audio/video decoders provided in // CreateAudioDecoders() and CreateVideoDecoders(). @@ -43,11 +45,12 @@ class MojoMediaClient { public: - // Returns an instance of the MojoMediaClient object. Only one instance will - // exist per process. - static MojoMediaClient* Get(); + ~MojoMediaClient(); + + static scoped_ptr<MojoMediaClient> Create(); // Copy of the PlatformMojoMediaClient interface. + void Initialize(); scoped_ptr<RendererFactory> CreateRendererFactory( const scoped_refptr<MediaLog>& media_log); scoped_refptr<AudioRendererSink> CreateAudioRendererSink(); @@ -57,12 +60,9 @@ mojo::ServiceProvider* service_provider); private: - friend struct base::DefaultLazyInstanceTraits<MojoMediaClient>; + MojoMediaClient(scoped_ptr<PlatformMojoMediaClient> platform_client); - MojoMediaClient(); - ~MojoMediaClient(); - - scoped_ptr<PlatformMojoMediaClient> mojo_media_client_; + scoped_ptr<PlatformMojoMediaClient> platform_client_; DISALLOW_COPY_AND_ASSIGN(MojoMediaClient); };
diff --git a/media/mojo/services/service_factory_impl.cc b/media/mojo/services/service_factory_impl.cc index de5c7c9..fe62213b 100644 --- a/media/mojo/services/service_factory_impl.cc +++ b/media/mojo/services/service_factory_impl.cc
@@ -20,11 +20,13 @@ mojo::InterfaceRequest<interfaces::ServiceFactory> request, mojo::ServiceProvider* service_provider, scoped_refptr<MediaLog> media_log, - scoped_ptr<mojo::AppRefCount> parent_app_refcount) + scoped_ptr<mojo::AppRefCount> parent_app_refcount, + MojoMediaClient* mojo_media_client) : binding_(this, std::move(request)), service_provider_(service_provider), media_log_(media_log), - parent_app_refcount_(std::move(parent_app_refcount)) { + parent_app_refcount_(std::move(parent_app_refcount)), + mojo_media_client_(mojo_media_client) { DVLOG(1) << __FUNCTION__; } @@ -38,11 +40,10 @@ // The created object is owned by the pipe. scoped_refptr<base::SingleThreadTaskRunner> task_runner( base::MessageLoop::current()->task_runner()); - MojoMediaClient* mojo_media_client = MojoMediaClient::Get(); scoped_refptr<AudioRendererSink> audio_renderer_sink = - mojo_media_client->CreateAudioRendererSink(); + mojo_media_client_->CreateAudioRendererSink(); scoped_ptr<VideoRendererSink> video_renderer_sink = - mojo_media_client->CreateVideoRendererSink(task_runner); + mojo_media_client_->CreateVideoRendererSink(task_runner); scoped_ptr<Renderer> renderer = GetRendererFactory()->CreateRenderer( task_runner, task_runner, audio_renderer_sink.get(), video_renderer_sink.get()); @@ -60,14 +61,13 @@ RendererFactory* ServiceFactoryImpl::GetRendererFactory() { if (!renderer_factory_) - renderer_factory_ = - MojoMediaClient::Get()->CreateRendererFactory(media_log_); + renderer_factory_ = mojo_media_client_->CreateRendererFactory(media_log_); return renderer_factory_.get(); } CdmFactory* ServiceFactoryImpl::GetCdmFactory() { if (!cdm_factory_) - cdm_factory_ = MojoMediaClient::Get()->CreateCdmFactory(service_provider_); + cdm_factory_ = mojo_media_client_->CreateCdmFactory(service_provider_); return cdm_factory_.get(); }
diff --git a/media/mojo/services/service_factory_impl.h b/media/mojo/services/service_factory_impl.h index 8357f8a..494f4c0 100644 --- a/media/mojo/services/service_factory_impl.h +++ b/media/mojo/services/service_factory_impl.h
@@ -20,6 +20,7 @@ class CdmFactory; class MediaLog; +class MojoMediaClient; class RendererFactory; class ServiceFactoryImpl : public interfaces::ServiceFactory { @@ -27,7 +28,8 @@ ServiceFactoryImpl(mojo::InterfaceRequest<interfaces::ServiceFactory> request, mojo::ServiceProvider* service_provider, scoped_refptr<MediaLog> media_log, - scoped_ptr<mojo::AppRefCount> parent_app_refcount); + scoped_ptr<mojo::AppRefCount> parent_app_refcount, + MojoMediaClient* mojo_media_client); ~ServiceFactoryImpl() final; // interfaces::ServiceFactory implementation. @@ -46,6 +48,7 @@ mojo::ServiceProvider* service_provider_; scoped_refptr<MediaLog> media_log_; scoped_ptr<mojo::AppRefCount> parent_app_refcount_; + MojoMediaClient* mojo_media_client_; scoped_ptr<RendererFactory> renderer_factory_; scoped_ptr<CdmFactory> cdm_factory_;
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc index 63b8781..75f7227c9 100644 --- a/mojo/edk/system/message_pipe_dispatcher.cc +++ b/mojo/edk/system/message_pipe_dispatcher.cc
@@ -154,6 +154,7 @@ void MessagePipeDispatcher::CloseOnIO() { base::AutoLock locker(lock()); + Release(); // To match CloseImplNoLock. if (transferable_) { if (channel_) { channel_->Shutdown(); @@ -435,6 +436,12 @@ void MessagePipeDispatcher::CloseImplNoLock() { lock().AssertAcquired(); + // We take a manual refcount because at shutdown, the task below might not get + // a chance to execute. If that happens, the RawChannel's will still call our + // OnError method because it always runs (since it watches thread + // destruction). So to avoid UAF, manually add a reference and only release it + // if the task runs. + AddRef(); internal::g_io_thread_task_runner->PostTask( FROM_HERE, base::Bind(&MessagePipeDispatcher::CloseOnIO, this)); }
diff --git a/mojo/gpu/mojo_gles2_impl_autogen.cc b/mojo/gpu/mojo_gles2_impl_autogen.cc index 6380a30..5818a65 100644 --- a/mojo/gpu/mojo_gles2_impl_autogen.cc +++ b/mojo/gpu/mojo_gles2_impl_autogen.cc
@@ -1704,12 +1704,18 @@ void MojoGLES2Impl::ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) { MojoGLES2MakeCurrent(context_); glScheduleCALayerCHROMIUM(contents_texture_id, contents_rect, opacity, - background_color, bounds_size, transform); + background_color, edge_aa_mask, bounds_rect, + is_clipped, clip_rect, sorting_context_id, + transform); } void MojoGLES2Impl::CommitOverlayPlanesCHROMIUM() { MojoGLES2MakeCurrent(context_);
diff --git a/mojo/gpu/mojo_gles2_impl_autogen.h b/mojo/gpu/mojo_gles2_impl_autogen.h index ca855bc..4197089 100644 --- a/mojo/gpu/mojo_gles2_impl_autogen.h +++ b/mojo/gpu/mojo_gles2_impl_autogen.h
@@ -787,8 +787,12 @@ void ScheduleCALayerCHROMIUM(GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform) override; void CommitOverlayPlanesCHROMIUM() override; void SwapInterval(GLint interval) override;
diff --git a/mojo/public/BUILD.gn b/mojo/public/BUILD.gn index b917cf1c..f87fb94 100644 --- a/mojo/public/BUILD.gn +++ b/mojo/public/BUILD.gn
@@ -6,7 +6,6 @@ # Meta-target, don't link into production code. testonly = true deps = [ - ":libmojo_sdk", ":sdk", "cpp/bindings", "cpp/environment:standalone", @@ -32,10 +31,3 @@ "js", ] } - -static_library("libmojo_sdk") { - complete_static_lib = true - deps = [ - ":sdk", - ] -}
diff --git a/mojo/public/c/gles2/gles2_call_visitor_chromium_extension_autogen.h b/mojo/public/c/gles2/gles2_call_visitor_chromium_extension_autogen.h index ba6a5e9..b2d8e24 100644 --- a/mojo/public/c/gles2/gles2_call_visitor_chromium_extension_autogen.h +++ b/mojo/public/c/gles2/gles2_call_visitor_chromium_extension_autogen.h
@@ -378,14 +378,22 @@ (GLuint contents_texture_id, const GLfloat* contents_rect, GLfloat opacity, - const GLuint background_color, - const GLfloat* bounds_size, + GLuint background_color, + GLuint edge_aa_mask, + const GLfloat* bounds_rect, + GLboolean is_clipped, + const GLfloat* clip_rect, + GLint sorting_context_id, const GLfloat* transform), (contents_texture_id, contents_rect, opacity, background_color, - bounds_size, + edge_aa_mask, + bounds_rect, + is_clipped, + clip_rect, + sorting_context_id, transform)) VISIT_GL_CALL(CommitOverlayPlanesCHROMIUM, void, (), ()) VISIT_GL_CALL(SwapInterval, void, (GLint interval), (interval))
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn index c8ee3974..6d9acd3 100644 --- a/mojo/public/cpp/bindings/BUILD.gn +++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -80,6 +80,7 @@ "string.h", "strong_binding.h", "struct_ptr.h", + "struct_traits.h", "type_converter.h", ]
diff --git a/mojo/public/cpp/bindings/struct_traits.h b/mojo/public/cpp/bindings/struct_traits.h new file mode 100644 index 0000000..fb7290b --- /dev/null +++ b/mojo/public/cpp/bindings/struct_traits.h
@@ -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. + +#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_ +#define MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_ + +namespace mojo { + +// This must be specialized for any type |T| to be serialized/deserialized as +// a mojom struct of type |MojomType|. +// +// Each specialization must implement a few things: +// +// 1. Static getters for each field in the Mojom type. These should be +// of the form: +// +// static <return type> <field name>(const T&) +// +// and should return a serializable form of the named field as extracted +// from the referenced |T| instance. +// +// 2. A static Read method to initialize a new |T| from a MojomType::Reader: +// +// static bool Read(MojomType::Reader r, T* out); +// +// The generated MojomType::Reader type provides a convenient, inexpensive +// view of a serialized struct's field data. +// +template <typename MojomType, typename T> +struct StructTraits; + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn index 4d466a18..33610fd 100644 --- a/mojo/public/cpp/bindings/tests/BUILD.gn +++ b/mojo/public/cpp/bindings/tests/BUILD.gn
@@ -30,6 +30,8 @@ "pickled_struct_blink.h", "pickled_struct_chromium.cc", "pickled_struct_chromium.h", + "rect_blink.h", + "rect_chromium.h", "request_response_unittest.cc", "router_test_util.cc", "router_test_util.h", @@ -37,6 +39,7 @@ "sample_service_unittest.cc", "serialization_warning_unittest.cc", "string_unittest.cc", + "struct_traits_unittest.cc", "struct_unittest.cc", "type_conversion_unittest.cc", "union_unittest.cc",
diff --git a/mojo/public/cpp/bindings/tests/rect_blink.h b/mojo/public/cpp/bindings/tests/rect_blink.h new file mode 100644 index 0000000..b246847 --- /dev/null +++ b/mojo/public/cpp/bindings/tests/rect_blink.h
@@ -0,0 +1,85 @@ +// 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_ +#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_ + +#include "base/logging.h" +#include "mojo/public/interfaces/bindings/tests/rect.mojom.h" + +namespace mojo { +namespace test { + +// An implementation of a hypothetical Rect type specifically for consumers in +// in Blink. Unlike the Chromium variant (see rect_chromium.h) this does not +// support negative origin coordinates and is not copyable. +class RectBlink { + public: + RectBlink() {} + RectBlink(int x, int y, int width, int height) : + x_(x), y_(y), width_(width), height_(height) { + DCHECK_GE(x_, 0); + DCHECK_GE(y_, 0); + DCHECK_GE(width_, 0); + DCHECK_GE(height_, 0); + } + ~RectBlink() {} + + int x() const { return x_; } + void setX(int x) { + DCHECK_GE(x, 0); + x_ = x; + } + + int y() const { return y_; } + void setY(int y) { + DCHECK_GE(y, 0); + y_ = y; + } + + int width() const { return width_; } + void setWidth(int width) { + DCHECK_GE(width, 0); + width_ = width; + } + + int height() const { return height_; } + void setHeight(int height) { + DCHECK_GE(height, 0); + height_ = height; + } + + int computeArea() const { return width_ * height_; } + + private: + int x_ = 0; + int y_ = 0; + int width_ = 0; + int height_ = 0; +}; + +} // namespace test + +template <> +struct StructTraits<test::Rect, test::RectBlink> { + static int x(const test::RectBlink& r) { return r.x(); } + static int y(const test::RectBlink& r) { return r.y(); } + static int width(const test::RectBlink& r) { return r.width(); } + static int height(const test::RectBlink& r) { return r.height(); } + + static bool Read(test::Rect::Reader r, test::RectBlink* out) { + if (r.x() < 0 || r.y() < 0 || r.width() < 0 || r.height() < 0) { + return false; + } + out->setX(r.x()); + out->setY(r.y()); + out->setWidth(r.width()); + out->setHeight(r.height()); + return true; + } +}; + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium.h b/mojo/public/cpp/bindings/tests/rect_chromium.h new file mode 100644 index 0000000..569780ae8 --- /dev/null +++ b/mojo/public/cpp/bindings/tests/rect_chromium.h
@@ -0,0 +1,87 @@ +// 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_ +#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_ + +#include "mojo/public/interfaces/bindings/tests/rect.mojom.h" + +namespace mojo { +namespace test { + +// An implementation of a hypothetical Rect type specifically for consumers in +// in Chromium. +class RectChromium { + public: + RectChromium() {} + RectChromium(const RectChromium& other) + : x_(other.x_), + y_(other.y_), + width_(other.width_), + height_(other.height_) {} + RectChromium(int x, int y, int width, int height) : + x_(x), y_(y), width_(width), height_(height) { + DCHECK_GE(width_, 0); + DCHECK_GE(height_, 0); + } + ~RectChromium() {} + + RectChromium& operator=(const RectChromium& other) { + x_ = other.x_; + y_ = other.y_; + width_ = other.width_; + height_ = other.height_; + return *this; + } + + int x() const { return x_; } + void set_x(int x) { x_ = x; } + + int y() const { return y_; } + void set_y(int y) { y_ = y; } + + int width() const { return width_; } + void set_width(int width) { + DCHECK_GE(width, 0); + width_ = width; + } + + int height() const { return height_; } + void set_height(int height) { + DCHECK_GE(height, 0); + height_ = height; + } + + int GetArea() const { return width_ * height_; } + + private: + int x_ = 0; + int y_ = 0; + int width_ = 0; + int height_ = 0; +}; + +} // namespace test + +template <> +struct StructTraits<test::Rect, test::RectChromium> { + static int x(const test::RectChromium& r) { return r.x(); } + static int y(const test::RectChromium& r) { return r.y(); } + static int width(const test::RectChromium& r) { return r.width(); } + static int height(const test::RectChromium& r) { return r.height(); } + + static bool Read(test::Rect::Reader r, test::RectChromium* out) { + if (r.width() < 0 || r.height() < 0) + return false; + out->set_x(r.x()); + out->set_y(r.y()); + out->set_width(r.width()); + out->set_height(r.height()); + return true; + } +}; + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
diff --git a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc new file mode 100644 index 0000000..d924c5c --- /dev/null +++ b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
@@ -0,0 +1,185 @@ +// 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.h" +#include "base/logging.h" +#include "base/message_loop/message_loop.h" +#include "base/run_loop.h" +#include "mojo/common/weak_binding_set.h" +#include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/tests/rect_blink.h" +#include "mojo/public/cpp/bindings/tests/rect_chromium.h" +#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom-blink.h" +#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom-chromium.h" +#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace mojo { +namespace test { +namespace { + +template <typename T> +void DoExpectResult(const T& expected, + const base::Closure& callback, + const T& actual) { + EXPECT_EQ(expected.x(), actual.x()); + EXPECT_EQ(expected.y(), actual.y()); + EXPECT_EQ(expected.width(), actual.width()); + EXPECT_EQ(expected.height(), actual.height()); + callback.Run(); +} + +template <typename T> +base::Callback<void(const T&)> ExpectResult(const T& r, + const base::Closure& callback) { + return base::Bind(&DoExpectResult<T>, r, callback); +} + +template <typename T> +void DoFail(const std::string& reason, const T&) { + EXPECT_TRUE(false) << reason; +} + +template <typename T> +base::Callback<void(const T&)> Fail(const std::string& reason) { + return base::Bind(&DoFail<T>, reason); +} + +template <typename T> +void ExpectError(InterfacePtr<T> *proxy, const base::Closure& callback) { + proxy->set_connection_error_handler(callback); +} + +// This implements the generated Chromium variant of RectService. +class ChromiumRectServiceImpl : public chromium::RectService { + public: + ChromiumRectServiceImpl() {} + + // mojo::test::chromium::RectService: + void AddRect(const RectChromium& r) override { + if (r.GetArea() > largest_rect_.GetArea()) + largest_rect_ = r; + } + + void GetLargestRect(const GetLargestRectCallback& callback) override { + callback.Run(largest_rect_); + } + + private: + RectChromium largest_rect_; +}; + +// This implements the generated Blink variant of RectService. +class BlinkRectServiceImpl : public blink::RectService { + public: + BlinkRectServiceImpl() {} + + // mojo::test::blink::RectService: + void AddRect(const RectBlink& r) override { + if (r.computeArea() > largest_rect_.computeArea()) { + largest_rect_.setX(r.x()); + largest_rect_.setY(r.y()); + largest_rect_.setWidth(r.width()); + largest_rect_.setHeight(r.height()); + } + } + + void GetLargestRect(const GetLargestRectCallback& callback) override { + callback.Run(largest_rect_); + } + + private: + RectBlink largest_rect_; +}; + +// A test which runs both Chromium and Blink implementations of a RectService. +class StructTraitsTest : public testing::Test { + public: + StructTraitsTest() {} + + void BindToChromiumService(mojo::InterfaceRequest<RectService> request) { + chromium_bindings_.AddBinding(&chromium_service_, std::move(request)); + } + + void BindToBlinkService(mojo::InterfaceRequest<RectService> request) { + blink_bindings_.AddBinding(&blink_service_, std::move(request)); + } + + private: + base::MessageLoop loop_; + + ChromiumRectServiceImpl chromium_service_; + mojo::WeakBindingSet<chromium::RectService> chromium_bindings_; + + BlinkRectServiceImpl blink_service_; + mojo::WeakBindingSet<blink::RectService> blink_bindings_; +}; + +} // namespace + +TEST_F(StructTraitsTest, ChromiumProxyToChromiumService) { + chromium::RectServicePtr chromium_proxy; + BindToChromiumService(GetProxy(&chromium_proxy)); + { + base::RunLoop loop; + chromium_proxy->AddRect(RectChromium(1, 1, 4, 5)); + chromium_proxy->AddRect(RectChromium(-1, -1, 2, 2)); + chromium_proxy->GetLargestRect( + ExpectResult(RectChromium(1, 1, 4, 5), loop.QuitClosure())); + loop.Run(); + } +} + +TEST_F(StructTraitsTest, ChromiumToBlinkService) { + chromium::RectServicePtr chromium_proxy; + BindToBlinkService(GetProxy(&chromium_proxy)); + { + base::RunLoop loop; + chromium_proxy->AddRect(RectChromium(1, 1, 4, 5)); + chromium_proxy->AddRect(RectChromium(2, 2, 5, 5)); + chromium_proxy->GetLargestRect( + ExpectResult(RectChromium(2, 2, 5, 5), loop.QuitClosure())); + loop.Run(); + } + // The Blink service should drop our connection because RectBlink's + // deserializer rejects negative origins. + { + base::RunLoop loop; + ExpectError(&chromium_proxy, loop.QuitClosure()); + chromium_proxy->AddRect(RectChromium(-1, -1, 2, 2)); + chromium_proxy->GetLargestRect( + Fail<RectChromium>("The pipe should have been closed.")); + loop.Run(); + } +} + +TEST_F(StructTraitsTest, BlinkProxyToBlinkService) { + blink::RectServicePtr blink_proxy; + BindToBlinkService(GetProxy(&blink_proxy)); + { + base::RunLoop loop; + blink_proxy->AddRect(RectBlink(1, 1, 4, 5)); + blink_proxy->AddRect(RectBlink(10, 10, 20, 20)); + blink_proxy->GetLargestRect( + ExpectResult(RectBlink(10, 10, 20, 20), loop.QuitClosure())); + loop.Run(); + } +} + +TEST_F(StructTraitsTest, BlinkProxyToChromiumService) { + blink::RectServicePtr blink_proxy; + BindToChromiumService(GetProxy(&blink_proxy)); + { + base::RunLoop loop; + blink_proxy->AddRect(RectBlink(1, 1, 4, 5)); + blink_proxy->AddRect(RectBlink(10, 10, 2, 2)); + blink_proxy->GetLargestRect( + ExpectResult(RectBlink(1, 1, 4, 5), loop.QuitClosure())); + loop.Run(); + } +} + +} // namespace test +} // namespace mojo
diff --git a/mojo/public/interfaces/bindings/tests/blink_test.typemap b/mojo/public/interfaces/bindings/tests/blink_test.typemap index 511a549..effc0a2 100644 --- a/mojo/public/interfaces/bindings/tests/blink_test.typemap +++ b/mojo/public/interfaces/bindings/tests/blink_test.typemap
@@ -9,6 +9,12 @@ "headers": [ "mojo/public/cpp/bindings/tests/pickled_struct_blink.h" ] + }, + "mojo.test.Rect": { + "typename": "mojo::test::RectBlink", + "headers": [ + "mojo/public/cpp/bindings/tests/rect_blink.h" + ] } } }
diff --git a/mojo/public/interfaces/bindings/tests/chromium_test.typemap b/mojo/public/interfaces/bindings/tests/chromium_test.typemap index 1028982..95b08e6 100644 --- a/mojo/public/interfaces/bindings/tests/chromium_test.typemap +++ b/mojo/public/interfaces/bindings/tests/chromium_test.typemap
@@ -9,6 +9,12 @@ "headers": [ "mojo/public/cpp/bindings/tests/pickled_struct_chromium.h" ] + }, + "mojo.test.Rect": { + "typename": "mojo::test::RectChromium", + "headers": [ + "mojo/public/cpp/bindings/tests/rect_chromium.h" + ] } } }
diff --git a/mojo/public/interfaces/bindings/tests/test_native_types.mojom b/mojo/public/interfaces/bindings/tests/test_native_types.mojom index 0a3a197..1012756 100644 --- a/mojo/public/interfaces/bindings/tests/test_native_types.mojom +++ b/mojo/public/interfaces/bindings/tests/test_native_types.mojom
@@ -4,6 +4,8 @@ module mojo.test; +import "mojo/public/interfaces/bindings/tests/rect.mojom"; + // Used to verify that structs can be declared with no body in mojom. [native=True] @@ -12,3 +14,12 @@ interface PicklePasser { PassPickle(PickledStruct pickle) => (PickledStruct passed); }; + +// Used to verify support for native serialization of mojom-defined structs. +// This is tested with a typemap applied to the Rect type from rect.mojom. + +interface RectService { + AddRect(Rect r); + GetLargestRect() => (Rect largest); +}; +
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl index a5df160..f7ad8542 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
@@ -31,6 +31,7 @@ #include "mojo/public/cpp/bindings/no_interface.h" #include "mojo/public/cpp/bindings/string.h" #include "mojo/public/cpp/bindings/struct_ptr.h" +#include "mojo/public/cpp/bindings/struct_traits.h" #include "{{variant_path}}-internal.h" {%- for import in imports %} #include "{{import.module.path}}.h" @@ -73,6 +74,7 @@ {#--- Struct Forward Declarations -#} {% for struct in structs %} class {{struct.name}}; +class {{struct.name}}_Reader; {% if struct|should_inline %} using {{struct.name}}Ptr = mojo::InlinedStructPtr<{{struct.name}}>; {% else %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl index cc186fb1..ff9bb12 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
@@ -14,13 +14,19 @@ {%- macro get_serialized_size(struct, input_field_pattern) -%} size_t size = sizeof(internal::{{struct.name}}_Data); {%- for pf in struct.packed.packed_fields_in_ordinal_order if pf.field.kind|is_object_kind %} -{%- if pf.field.kind|is_native_only_kind %} +{%- set name = pf.field.name -%} +{%- set kind = pf.field.kind -%} +{%- if kind|is_native_only_kind %} size += mojo::internal::GetSerializedSizeNative_( - {{input_field_pattern|format(pf.field.name)}}); -{%- elif pf.field.kind|is_union_kind %} - size += GetSerializedSize_({{input_field_pattern|format(pf.field.name)}}, true); + {{input_field_pattern|format(name)}}); +{%- elif kind|is_typemapped_kind %} + size += + {{kind|get_name_for_kind}}_SerializerTraits_<{{kind|cpp_wrapper_type}}> + ::GetSize({{input_field_pattern|format(name)}}); +{%- elif kind|is_union_kind %} + size += GetSerializedSize_({{input_field_pattern|format(name)}}, true); {%- else %} - size += GetSerializedSize_({{input_field_pattern|format(pf.field.name)}}); + size += GetSerializedSize_({{input_field_pattern|format(name)}}); {%- endif %} {%- endfor %} {%- endmacro -%} @@ -60,6 +66,9 @@ {%- elif kind|is_native_only_kind %} mojo::internal::SerializeNative_( {{input_field}}, {{buffer}}, &{{output}}->{{name}}.ptr); +{%- elif kind|is_typemapped_kind %} + {{kind|get_name_for_kind}}_SerializerTraits_<{{kind|cpp_wrapper_type}}> + ::Serialize({{input_field}}, {{buffer}}, &{{output}}->{{name}}.ptr); {%- elif kind|is_union_kind %} internal::{{kind.name}}_Data* {{name}}_ptr = &{{output}}->{{name}}; SerializeUnion_(std::move({{input_field}}), {{buffer}}, &{{name}}_ptr, true); @@ -143,6 +152,12 @@ {{input}}->{{name}}.ptr, &{{output_field}}, {{context}})) { {{success}} = false; } +{%- elif kind|is_typemapped_kind %} + if (!{{kind|get_name_for_kind}}_SerializerTraits_<{{kind|cpp_wrapper_type}}> + ::Deserialize( + {{input}}->{{name}}.ptr, &{{output_field}}, {{context}})) { + {{success}} = false; + } {%- elif kind|is_object_kind %} {%- if kind|is_union_kind %} if (!Deserialize_(&{{input}}->{{name}}, &{{output_field}}, {{context}}))
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl index 5ded622..52aafac 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
@@ -4,3 +4,80 @@ bool Deserialize_(internal::{{struct.name}}_Data* input, {{struct.name}}Ptr* output, mojo::internal::SerializationContext* context); + +{%- if not variant %} + +{# NOTE: Generated Reader instances are intentionally cheap to copy and devoid + of heap allocations. They should stay this way. #} +class {{struct.name}}_Reader { + public: + {{struct.name}}_Reader(internal::{{struct.name}}_Data* data, + mojo::internal::SerializationContext* context); + +{%- for pf in struct.packed.packed_fields_in_ordinal_order %} +{%- set kind = pf.field.kind -%} +{%- set name = pf.field.name -%} +{%- if kind|is_struct_kind %} + {{kind|get_name_for_kind}}::Reader {{name}}() const; +{%- elif kind|is_union_kind %} + // TODO(rockot): Support reading unions. ({{name}}() omitted) +{%- elif kind|is_object_kind %} + // TODO(rockot): Support reading other object kinds. ({{name}}() omitted) +{%- elif kind|is_any_handle_kind %} + // TODO(rockot): Support reading handles. ({{name}}() omitted) +{%- elif kind|is_interface_kind %} + // TODO(rockot): Support reading interfaces. ({{name}}() omitted) +{%- elif kind|is_interface_request_kind %} + // TODO(rockot): Support reading interface requests. ({{name}}() omitted) +{%- elif kind|is_associated_kind %} + // TODO(rockot): Support reading associated kinds. ({{name}}() omitted) +{%- elif kind|is_enum_kind %} + {{kind|cpp_result_type}} {{name}}() const { + return static_cast<{{kind|cpp_result_type}}>(data_->{{name}}); + } +{%- else %} + {{kind|cpp_result_type}} {{name}}() const { return data_->{{name}}; } +{%- endif %} +{%- endfor %} + + private: + internal::{{struct.name}}_Data* data_; + mojo::internal::SerializationContext* context_; +}; + +template <typename NativeType> +struct {{struct.name}}_SerializerTraits_ { + static size_t GetSize(const NativeType& input) { + size_t size = sizeof(internal::{{struct.name}}_Data); +{%- for pf in struct.packed.packed_fields_in_ordinal_order %} +{%- if pf.field.kind|is_object_kind %} + NOTREACHED() << "Mojom struct traits only support POD fields at this time. " + << "Cannot determine the size of field {{pf.field.name}}"; +{%- endif %} +{%- endfor %} + return size; + } + + static void Serialize(const NativeType& input, + mojo::internal::Buffer* buffer, + internal::{{struct.name}}_Data** output) { + internal::{{struct.name}}_Data* result = + internal::{{struct.name}}_Data::New(buffer); +{%- for pf in struct.packed.packed_fields_in_ordinal_order %} +{%- set name = pf.field.name -%} +{%- set kind = pf.field.kind %} + result->{{name}} = mojo::StructTraits<{{struct.name}}, NativeType> + ::{{name}}(input); +{%- endfor %} + *output = result; + } + + static bool Deserialize(internal::{{struct.name}}_Data* input, + NativeType* output, + mojo::internal::SerializationContext* context) { + return mojo::StructTraits<{{struct.name}}, NativeType>::Read( + {{struct.name}}_Reader(input, context), output); + } +}; + +{%- endif %} {# not variant #}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl index 5c14ea0..5557501 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
@@ -29,3 +29,22 @@ } return success; } + +{%- if not variant %} + +{{struct.name}}_Reader::{{struct.name}}_Reader( + internal::{{struct.name}}_Data* data, + mojo::internal::SerializationContext* context) + : data_(data), context_(context) { } + +{%- for pf in struct.packed.packed_fields_in_ordinal_order %} +{%- set name = pf.field.name -%} +{%- set kind = pf.field.kind -%} +{%- if kind|is_struct_kind %} +{{kind|get_name_for_kind}}_Reader {{struct.name}}_Reader::{{name}}() const { + return {{kind|get_name_for_kind}}_Reader(data_->{{name}}.ptr, context_); +} +{%- endif %} +{%- endfor %} + +{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl index 0293accd..7861942 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
@@ -1,7 +1,11 @@ {% from "enum_macros.tmpl" import enum_decl -%} + +class {{struct.name}}_Reader; + class {{struct.name}} { public: using Data_ = internal::{{struct.name}}_Data; + using Reader = {{struct.name}}_Reader; {#--- Enums #} {%- for enum in struct.enums -%}
diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py index 856ae0d..0733e1a 100644 --- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py +++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
@@ -132,6 +132,8 @@ def GetCppArrayArgWrapperType(kind): if mojom.IsStructKind(kind) and kind.native_only: raise Exception("Cannot serialize containers of native-only types yet!") + if IsTypemappedKind(kind): + raise Exception("Cannot serialize containers of typemapped structs yet!") if mojom.IsEnumKind(kind): return GetNameForKind(kind) if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
diff --git a/native_client_sdk/doc_generated/c-api-beta.html b/native_client_sdk/doc_generated/c-api-beta.html index 82d3c31..1bb2e15 100644 --- a/native_client_sdk/doc_generated/c-api-beta.html +++ b/native_client_sdk/doc_generated/c-api-beta.html
@@ -2,20 +2,20 @@ <span class="target" id="c-api-beta"><span id="pepper-beta-c-index"></span></span><section id="pepper-c-api-reference-beta"> <h1 id="pepper-c-api-reference-beta">Pepper C API Reference (Beta)</h1> -<p>This page lists the C API for Pepper 41. Apps that use this API can -run in Chrome 41 or higher.</p> +<p>This page lists the C API for Pepper 48. Apps that use this API can +run in Chrome 48 or higher.</p> <h2 id="interfaces"><a class="reference external" href="pepper_beta/c/group___interfaces.html">Interfaces</a></h2> <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___audio__1__1.html">PPB_Audio</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___compositor__0__1.html">PPB_Compositor</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___compositor_layer__0__2.html">PPB_CompositorLayer</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___console__1__0.html">PPB_Console</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___core__1__0.html">PPB_Core</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></li> -<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li> @@ -58,7 +58,7 @@ <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___touch_input_event__1__0.html">PPB_TouchInputEvent</a></li> -<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___u_r_l_response_info__1__0.html">PPB_URLResponseInfo</a></li> @@ -66,7 +66,8 @@ <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___var_array__1__0.html">PPB_VarArray</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></li> -<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___view__1__2.html">PPB_View</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></li> @@ -83,6 +84,9 @@ <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_beta/c/struct_p_p___array_output.html">PP_ArrayOutput</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p___completion_callback.html">PP_CompletionCallback</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p___directory_entry.html">PP_DirectoryEntry</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p___file_info.html">PP_FileInfo</a></li> @@ -106,6 +110,8 @@ <li><a class="reference external" href="pepper_beta/c/struct_p_p___var.html">PP_Var</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p___video_picture.html">PP_VideoPicture</a></li> <li><a class="reference external" href="pepper_beta/c/struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></li> +<li><a class="reference external" href="pepper_beta/c/struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></li> <li><a class="reference external" href="pepper_beta/c/union_p_p___var_value.html">PP_VarValue</a></li> </ul> </div></blockquote> @@ -139,12 +145,12 @@ <li><a class="reference external" href="pepper_beta/c/ppb__audio_8h.html">ppb_audio.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__audio__buffer_8h.html">ppb_audio_buffer.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__audio__config_8h.html">ppb_audio_config.h</a></li> +<li><a class="reference external" href="pepper_beta/c/ppb__audio__encoder_8h.html">ppb_audio_encoder.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__compositor_8h.html">ppb_compositor.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__compositor__layer_8h.html">ppb_compositor_layer.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__console_8h.html">ppb_console.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__core_8h.html">ppb_core.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__file__io_8h.html">ppb_file_io.h</a></li> -<li><a class="reference external" href="pepper_beta/c/ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__file__ref_8h.html">ppb_file_ref.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__file__system_8h.html">ppb_file_system.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__fullscreen_8h.html">ppb_fullscreen.h</a></li> @@ -177,6 +183,7 @@ <li><a class="reference external" href="pepper_beta/c/ppb__var__array__buffer_8h.html">ppb_var_array_buffer.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__var__dictionary_8h.html">ppb_var_dictionary.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__video__decoder_8h.html">ppb_video_decoder.h</a></li> +<li><a class="reference external" href="pepper_beta/c/ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__video__frame_8h.html">ppb_video_frame.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__view_8h.html">ppb_view.h</a></li> <li><a class="reference external" href="pepper_beta/c/ppb__websocket_8h.html">ppb_websocket.h</a></li>
diff --git a/native_client_sdk/doc_generated/c-api-dev.html b/native_client_sdk/doc_generated/c-api-dev.html index 8bab9ea..7eba9f2f 100644 --- a/native_client_sdk/doc_generated/c-api-dev.html +++ b/native_client_sdk/doc_generated/c-api-dev.html
@@ -2,20 +2,20 @@ <span class="target" id="c-api-dev"><span id="pepper-dev-c-index"></span></span><section id="pepper-c-api-reference-dev"> <h1 id="pepper-c-api-reference-dev">Pepper C API Reference (Dev)</h1> -<p>This page lists the C API for Pepper 42. Apps that use this API can -run in Chrome 42 or higher.</p> +<p>This page lists the C API for Pepper 49. Apps that use this API can +run in Chrome 49 or higher.</p> <h2 id="interfaces"><a class="reference external" href="pepper_dev/c/group___interfaces.html">Interfaces</a></h2> <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___audio__1__1.html">PPB_Audio</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___compositor__0__1.html">PPB_Compositor</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___compositor_layer__0__2.html">PPB_CompositorLayer</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___console__1__0.html">PPB_Console</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___core__1__0.html">PPB_Core</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></li> -<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li> @@ -58,7 +58,7 @@ <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___touch_input_event__1__0.html">PPB_TouchInputEvent</a></li> -<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___u_r_l_response_info__1__0.html">PPB_URLResponseInfo</a></li> @@ -66,7 +66,8 @@ <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___var_array__1__0.html">PPB_VarArray</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></li> -<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___view__1__2.html">PPB_View</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></li> @@ -83,6 +84,9 @@ <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_dev/c/struct_p_p___array_output.html">PP_ArrayOutput</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p___completion_callback.html">PP_CompletionCallback</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p___directory_entry.html">PP_DirectoryEntry</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p___file_info.html">PP_FileInfo</a></li> @@ -106,6 +110,8 @@ <li><a class="reference external" href="pepper_dev/c/struct_p_p___var.html">PP_Var</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p___video_picture.html">PP_VideoPicture</a></li> <li><a class="reference external" href="pepper_dev/c/struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></li> +<li><a class="reference external" href="pepper_dev/c/struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></li> <li><a class="reference external" href="pepper_dev/c/union_p_p___var_value.html">PP_VarValue</a></li> </ul> </div></blockquote> @@ -139,12 +145,12 @@ <li><a class="reference external" href="pepper_dev/c/ppb__audio_8h.html">ppb_audio.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__audio__buffer_8h.html">ppb_audio_buffer.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__audio__config_8h.html">ppb_audio_config.h</a></li> +<li><a class="reference external" href="pepper_dev/c/ppb__audio__encoder_8h.html">ppb_audio_encoder.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__compositor_8h.html">ppb_compositor.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__compositor__layer_8h.html">ppb_compositor_layer.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__console_8h.html">ppb_console.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__core_8h.html">ppb_core.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__file__io_8h.html">ppb_file_io.h</a></li> -<li><a class="reference external" href="pepper_dev/c/ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__file__ref_8h.html">ppb_file_ref.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__file__system_8h.html">ppb_file_system.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__fullscreen_8h.html">ppb_fullscreen.h</a></li> @@ -177,6 +183,7 @@ <li><a class="reference external" href="pepper_dev/c/ppb__var__array__buffer_8h.html">ppb_var_array_buffer.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__var__dictionary_8h.html">ppb_var_dictionary.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__video__decoder_8h.html">ppb_video_decoder.h</a></li> +<li><a class="reference external" href="pepper_dev/c/ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__video__frame_8h.html">ppb_video_frame.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__view_8h.html">ppb_view.h</a></li> <li><a class="reference external" href="pepper_dev/c/ppb__websocket_8h.html">ppb_websocket.h</a></li>
diff --git a/native_client_sdk/doc_generated/c-api.html b/native_client_sdk/doc_generated/c-api.html index 08e3630e..7ccf67d 100644 --- a/native_client_sdk/doc_generated/c-api.html +++ b/native_client_sdk/doc_generated/c-api.html
@@ -2,20 +2,20 @@ <span class="target" id="c-api"><span id="pepper-stable-c-index"></span></span><section id="pepper-c-api-reference-stable"> <h1 id="pepper-c-api-reference-stable">Pepper C API Reference (Stable)</h1> -<p>This page lists the C API for Pepper 40. Apps that use this API can -run in Chrome 40 or higher.</p> +<p>This page lists the C API for Pepper 47. Apps that use this API can +run in Chrome 47 or higher.</p> <h2 id="interfaces"><a class="reference external" href="pepper_stable/c/group___interfaces.html">Interfaces</a></h2> <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___audio__1__1.html">PPB_Audio</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___compositor__0__1.html">PPB_Compositor</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___compositor_layer__0__2.html">PPB_CompositorLayer</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___console__1__0.html">PPB_Console</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___core__1__0.html">PPB_Core</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></li> -<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___fullscreen__1__0.html">PPB_Fullscreen</a></li> @@ -55,10 +55,10 @@ <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___open_g_l_e_s2_query__1__0.html">PPB_OpenGLES2Query</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___open_g_l_e_s2_vertex_array_object.html">PPB_OpenGLES2VertexArrayObject</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___open_g_l_e_s2_vertex_array_object__1__0.html">PPB_OpenGLES2VertexArrayObject</a></li> -<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___t_c_p_socket__1__1.html">PPB_TCPSocket</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___touch_input_event__1__0.html">PPB_TouchInputEvent</a></li> -<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___u_d_p_socket__1__0.html">PPB_UDPSocket</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___u_r_l_response_info__1__0.html">PPB_URLResponseInfo</a></li> @@ -66,7 +66,8 @@ <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___var_array__1__0.html">PPB_VarArray</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></li> -<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___view__1__2.html">PPB_View</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a></li> @@ -83,6 +84,9 @@ <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_stable/c/struct_p_p___array_output.html">PP_ArrayOutput</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p___completion_callback.html">PP_CompletionCallback</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p___directory_entry.html">PP_DirectoryEntry</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p___file_info.html">PP_FileInfo</a></li> @@ -106,6 +110,8 @@ <li><a class="reference external" href="pepper_stable/c/struct_p_p___var.html">PP_Var</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p___video_picture.html">PP_VideoPicture</a></li> <li><a class="reference external" href="pepper_stable/c/struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></li> +<li><a class="reference external" href="pepper_stable/c/struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></li> <li><a class="reference external" href="pepper_stable/c/union_p_p___var_value.html">PP_VarValue</a></li> </ul> </div></blockquote> @@ -139,12 +145,12 @@ <li><a class="reference external" href="pepper_stable/c/ppb__audio_8h.html">ppb_audio.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__audio__buffer_8h.html">ppb_audio_buffer.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__audio__config_8h.html">ppb_audio_config.h</a></li> +<li><a class="reference external" href="pepper_stable/c/ppb__audio__encoder_8h.html">ppb_audio_encoder.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__compositor_8h.html">ppb_compositor.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__compositor__layer_8h.html">ppb_compositor_layer.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__console_8h.html">ppb_console.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__core_8h.html">ppb_core.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__file__io_8h.html">ppb_file_io.h</a></li> -<li><a class="reference external" href="pepper_stable/c/ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__file__ref_8h.html">ppb_file_ref.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__file__system_8h.html">ppb_file_system.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__fullscreen_8h.html">ppb_fullscreen.h</a></li> @@ -177,6 +183,7 @@ <li><a class="reference external" href="pepper_stable/c/ppb__var__array__buffer_8h.html">ppb_var_array_buffer.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__var__dictionary_8h.html">ppb_var_dictionary.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__video__decoder_8h.html">ppb_video_decoder.h</a></li> +<li><a class="reference external" href="pepper_stable/c/ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__video__frame_8h.html">ppb_video_frame.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__view_8h.html">ppb_view.h</a></li> <li><a class="reference external" href="pepper_stable/c/ppb__websocket_8h.html">ppb_websocket.h</a></li>
diff --git a/native_client_sdk/doc_generated/cpp-api-beta.html b/native_client_sdk/doc_generated/cpp-api-beta.html index f242e67..2d33b8fb 100644 --- a/native_client_sdk/doc_generated/cpp-api-beta.html +++ b/native_client_sdk/doc_generated/cpp-api-beta.html
@@ -2,14 +2,15 @@ <span class="target" id="cpp-api-beta"><span id="pepper-beta-cpp-index"></span></span><section id="pepper-c-api-reference-beta"> <h1 id="pepper-c-api-reference-beta">Pepper C++ API Reference (Beta)</h1> -<p>This page lists the C++ API for Pepper 41. Apps that use this API can -run in Chrome 41 or higher.</p> +<p>This page lists the C++ API for Pepper 48. Apps that use this API can +run in Chrome 48 or higher.</p> <h2 id="classes"><a class="reference external" href="pepper_beta/cpp/inherits.html">Classes</a></h2> <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_audio.html">Audio</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_audio_buffer.html">AudioBuffer</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_audio_config.html">AudioConfig</a></li> +<li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_audio_encoder.html">AudioEncoder</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_completion_callback.html">CompletionCallback</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></li> @@ -64,6 +65,7 @@ <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_var_array_buffer.html">VarArrayBuffer</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_var_dictionary.html">VarDictionary</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_video_decoder.html">VideoDecoder</a></li> +<li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_video_encoder.html">VideoEncoder</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_video_frame.html">VideoFrame</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_view.html">View</a></li> <li><a class="reference external" href="pepper_beta/cpp/classpp_1_1_web_socket.html">WebSocket</a></li> @@ -77,6 +79,7 @@ <li><a class="reference external" href="pepper_beta/cpp/audio_8h.html">audio.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/audio__buffer_8h.html">audio_buffer.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/audio__config_8h.html">audio_config.h</a></li> +<li><a class="reference external" href="pepper_beta/cpp/audio__encoder_8h.html">audio_encoder.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/completion__callback_8h.html">completion_callback.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/completion__callback__factory_8h.html">completion_callback_factory.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/compositor_8h.html">compositor.h</a></li> @@ -126,6 +129,7 @@ <li><a class="reference external" href="pepper_beta/cpp/var__array__buffer_8h.html">var_array_buffer.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/var__dictionary_8h.html">var_dictionary.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/video__decoder_8h.html">video_decoder.h</a></li> +<li><a class="reference external" href="pepper_beta/cpp/video__encoder_8h.html">video_encoder.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/video__frame_8h.html">video_frame.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/view_8h.html">view.h</a></li> <li><a class="reference external" href="pepper_beta/cpp/websocket_8h.html">websocket.h</a></li>
diff --git a/native_client_sdk/doc_generated/cpp-api-dev.html b/native_client_sdk/doc_generated/cpp-api-dev.html index 72970af..aac0740 100644 --- a/native_client_sdk/doc_generated/cpp-api-dev.html +++ b/native_client_sdk/doc_generated/cpp-api-dev.html
@@ -2,14 +2,15 @@ <span class="target" id="cpp-api-dev"><span id="pepper-dev-cpp-index"></span></span><section id="pepper-c-api-reference-dev"> <h1 id="pepper-c-api-reference-dev">Pepper C++ API Reference (Dev)</h1> -<p>This page lists the C++ API for Pepper 42. Apps that use this API can -run in Chrome 42 or higher.</p> +<p>This page lists the C++ API for Pepper 49. Apps that use this API can +run in Chrome 49 or higher.</p> <h2 id="classes"><a class="reference external" href="pepper_dev/cpp/inherits.html">Classes</a></h2> <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_audio.html">Audio</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_audio_buffer.html">AudioBuffer</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_audio_config.html">AudioConfig</a></li> +<li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_audio_encoder.html">AudioEncoder</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_completion_callback.html">CompletionCallback</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></li> @@ -64,6 +65,7 @@ <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_var_array_buffer.html">VarArrayBuffer</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_var_dictionary.html">VarDictionary</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_video_decoder.html">VideoDecoder</a></li> +<li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_video_encoder.html">VideoEncoder</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_video_frame.html">VideoFrame</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_view.html">View</a></li> <li><a class="reference external" href="pepper_dev/cpp/classpp_1_1_web_socket.html">WebSocket</a></li> @@ -77,6 +79,7 @@ <li><a class="reference external" href="pepper_dev/cpp/audio_8h.html">audio.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/audio__buffer_8h.html">audio_buffer.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/audio__config_8h.html">audio_config.h</a></li> +<li><a class="reference external" href="pepper_dev/cpp/audio__encoder_8h.html">audio_encoder.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/completion__callback_8h.html">completion_callback.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/completion__callback__factory_8h.html">completion_callback_factory.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/compositor_8h.html">compositor.h</a></li> @@ -126,6 +129,7 @@ <li><a class="reference external" href="pepper_dev/cpp/var__array__buffer_8h.html">var_array_buffer.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/var__dictionary_8h.html">var_dictionary.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/video__decoder_8h.html">video_decoder.h</a></li> +<li><a class="reference external" href="pepper_dev/cpp/video__encoder_8h.html">video_encoder.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/video__frame_8h.html">video_frame.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/view_8h.html">view.h</a></li> <li><a class="reference external" href="pepper_dev/cpp/websocket_8h.html">websocket.h</a></li>
diff --git a/native_client_sdk/doc_generated/cpp-api.html b/native_client_sdk/doc_generated/cpp-api.html index aecb7fe..94b9de8 100644 --- a/native_client_sdk/doc_generated/cpp-api.html +++ b/native_client_sdk/doc_generated/cpp-api.html
@@ -2,14 +2,15 @@ <span class="target" id="cpp-api"><span id="pepper-stable-cpp-index"></span></span><section id="pepper-c-api-reference-stable"> <h1 id="pepper-c-api-reference-stable">Pepper C++ API Reference (Stable)</h1> -<p>This page lists the C++ API for Pepper 40. Apps that use this API can -run in Chrome 40 or higher.</p> +<p>This page lists the C++ API for Pepper 47. Apps that use this API can +run in Chrome 47 or higher.</p> <h2 id="classes"><a class="reference external" href="pepper_stable/cpp/inherits.html">Classes</a></h2> <blockquote> <div><ul class="small-gap"> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_audio.html">Audio</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_audio_buffer.html">AudioBuffer</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_audio_config.html">AudioConfig</a></li> +<li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_audio_encoder.html">AudioEncoder</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_completion_callback.html">CompletionCallback</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_completion_callback_factory.html">CompletionCallbackFactory</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></li> @@ -64,6 +65,7 @@ <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_var_array_buffer.html">VarArrayBuffer</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_var_dictionary.html">VarDictionary</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_video_decoder.html">VideoDecoder</a></li> +<li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_video_encoder.html">VideoEncoder</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_video_frame.html">VideoFrame</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_view.html">View</a></li> <li><a class="reference external" href="pepper_stable/cpp/classpp_1_1_web_socket.html">WebSocket</a></li> @@ -77,6 +79,7 @@ <li><a class="reference external" href="pepper_stable/cpp/audio_8h.html">audio.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/audio__buffer_8h.html">audio_buffer.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/audio__config_8h.html">audio_config.h</a></li> +<li><a class="reference external" href="pepper_stable/cpp/audio__encoder_8h.html">audio_encoder.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/completion__callback_8h.html">completion_callback.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/completion__callback__factory_8h.html">completion_callback_factory.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/compositor_8h.html">compositor.h</a></li> @@ -126,6 +129,7 @@ <li><a class="reference external" href="pepper_stable/cpp/var__array__buffer_8h.html">var_array_buffer.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/var__dictionary_8h.html">var_dictionary.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/video__decoder_8h.html">video_decoder.h</a></li> +<li><a class="reference external" href="pepper_stable/cpp/video__encoder_8h.html">video_encoder.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/video__frame_8h.html">video_frame.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/view_8h.html">view.h</a></li> <li><a class="reference external" href="pepper_stable/cpp/websocket_8h.html">websocket.h</a></li>
diff --git a/native_client_sdk/doc_generated/devguide/devcycle/building.html b/native_client_sdk/doc_generated/devguide/devcycle/building.html index a3fd054..12f540f 100644 --- a/native_client_sdk/doc_generated/devguide/devcycle/building.html +++ b/native_client_sdk/doc_generated/devguide/devcycle/building.html
@@ -514,10 +514,9 @@ For an example of how to use nacl_io, see <code>examples/demo/nacl_io_demo</code>.</dd> <dt>libppapi_simple.a</dt> <dd>Provides a familiar C programming environment by letting a module have a -simple entry point that is registered by <code>PPAPI_SIMPLE_REGISTER_MAIN</code>. -The entry point is similar to the standard C <code>main()</code> function, complete -with <code>argc</code> and <code>argv[]</code> parameters. For details see -<code>include/ppapi_simple/ps.h</code>. For an example of +simple <code>main()</code> entry point. The entry point is similar to the standard C +<code>main()</code> function, complete with <code>argc</code> and <code>argv[]</code> parameters. For +details see <code>include/ppapi_simple/ps.h</code>. For an example of how to use ppapi_simple, <code>see examples/tutorial/using_ppapi_simple</code>.</dd> </dl> <aside class="note">
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html index ec7106fe..b08950b1 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/globals_defs.html
@@ -31,6 +31,9 @@ <li>PPB_AUDIOBUFFER_INTERFACE_0_1 : <a class="el" href="ppb__audio__buffer_8h.html#a4fddf6d285021552ba11f4460ba47445">ppb_audio_buffer.h</a> </li> +<li>PPB_AUDIOENCODER_INTERFACE_0_1 +: <a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">ppb_audio_encoder.h</a> +</li> <li>PPB_COMPOSITOR_INTERFACE_0_1 : <a class="el" href="ppb__compositor_8h.html#ac8b0ddbdff260dd5531525784556c045">ppb_compositor.h</a> </li> @@ -55,9 +58,6 @@ <li>PPB_FILEIO_INTERFACE_1_1 : <a class="el" href="ppb__file__io_8h.html#aee417de3562daef62dbf68ddc16a8477">ppb_file_io.h</a> </li> -<li>PPB_FILEMAPPING_INTERFACE_0_1 -: <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">ppb_file_mapping.h</a> -</li> <li>PPB_FILEREF_INTERFACE : <a class="el" href="ppb__file__ref_8h.html#a00615ce99f7d6774b0fc5c8f0326f0ba">ppb_file_ref.h</a> </li> @@ -262,8 +262,8 @@ <li>PPB_UDPSOCKET_INTERFACE : <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">ppb_udp_socket.h</a> </li> -<li>PPB_UDPSOCKET_INTERFACE_1_1 -: <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">ppb_udp_socket.h</a> +<li>PPB_UDPSOCKET_INTERFACE_1_2 +: <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">ppb_udp_socket.h</a> </li> <li>PPB_URLLOADER_INTERFACE : <a class="el" href="ppb__url__loader_8h.html#ae1fa8c5cdfccb7ea67e184b1e5e1009e">ppb_url_loader.h</a> @@ -310,8 +310,14 @@ <li>PPB_VIDEODECODER_INTERFACE : <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">ppb_video_decoder.h</a> </li> -<li>PPB_VIDEODECODER_INTERFACE_1_0 -: <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">ppb_video_decoder.h</a> +<li>PPB_VIDEODECODER_INTERFACE_1_1 +: <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">ppb_video_decoder.h</a> +</li> +<li>PPB_VIDEOENCODER_INTERFACE +: <a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">ppb_video_encoder.h</a> +</li> +<li>PPB_VIDEOENCODER_INTERFACE_0_2 +: <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">ppb_video_encoder.h</a> </li> <li>PPB_VIDEOFRAME_INTERFACE : <a class="el" href="ppb__video__frame_8h.html#ac161d8c49f583eda31622d9fc010cd0d">ppb_video_frame.h</a>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html b/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html index 3bd2e7d..f5d7907 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/group___enums.html
@@ -34,6 +34,9 @@ <a class="el" href="group___enums.html#gga4d50d27186f68b2de578e82162206feaa884e0f18fee1bae2472a15f6fb1d7e79">PP_VIDEOPROFILE_MAX</a> = PP_VIDEOPROFILE_VP9_ANY <br /> }</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> { <a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191">PP_AUDIOPROFILE_OPUS</a> = 0, +<a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77">PP_AUDIOPROFILE_MAX</a> = PP_AUDIOPROFILE_OPUS + }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> { <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5a6208cea63b7e6c1c8c9c67616df4ba85">PP_HARDWAREACCELERATION_ONLY</a> = 0, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5ad29490655cc25165817de26c5caff7ea">PP_HARDWAREACCELERATION_WITHFALLBACK</a> = 1, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5acf901685e6e14afe89e7d22ad35af4e1">PP_HARDWAREACCELERATION_NONE</a> = 2, @@ -189,13 +192,6 @@ <a class="el" href="group___enums.html#gga4c87e6dd19c1d49b66a9b37136a82e82a78c13cbbccebfa9c2b8b2f758397795c">PP_FILEOPENFLAG_APPEND</a> = 1 << 5 <br /> }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a> { <a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb">PP_FILEMAPPROTECTION_READ</a> = 1u << 0, -<a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e">PP_FILEMAPPROTECTION_WRITE</a> = 1u << 1 - }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a> { <a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c">PP_FILEMAPFLAG_SHARED</a> = 1u << 0, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03">PP_FILEMAPFLAG_PRIVATE</a> = 1u << 1, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e">PP_FILEMAPFLAG_FIXED</a> = 1u << 2 - }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadcb0a92e6ca510586c3f34088d35dc9f">PP_MakeDirectoryFlags</a> { <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fafeeef418b62780276c4671a57196ad3f">PP_MAKEDIRECTORYFLAG_NONE</a> = 0 << 0, <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fa5c7f89c8784c9d8abfaeae51d9cb84ba">PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS</a> = 1 << 0, <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fa34dd5b5ba9af9e5c820d3c6e21fc2094">PP_MAKEDIRECTORYFLAG_EXCLUSIVE</a> = 1 << 1 @@ -373,10 +369,15 @@ <a class="el" href="group___enums.html#gga5fef49ee4c2cc6dcead825340da0f116ad4371ecdd1a6631a78d4721d83062394">PP_TEXTINPUT_TYPE_URL</a> = 7 <br /> }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00">PP_UDPSOCKET_OPTION_BROADCAST</a> = 1, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57">PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</a> = 2, -<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3 +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3, +<br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c">PP_UDPSOCKET_OPTION_MULTICAST_LOOP</a> = 4, +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82">PP_UDPSOCKET_OPTION_MULTICAST_TTL</a> = 5 +<br /> }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga41975630f0a4c49e47d4a21754f8402d">PP_URLRequestProperty</a> { <br />   <a class="el" href="group___enums.html#gga41975630f0a4c49e47d4a21754f8402da89e44812e771fed9df0ff8994690e44d">PP_URLREQUESTPROPERTY_URL</a> = 0, @@ -464,8 +465,6 @@ <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gaee750c350655f2fb0fe04c04029e0ff8">PP_AudioSampleRate</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gac39067c0883ec80b94290dd2a3bae440">PP_LogLevel</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga4c87e6dd19c1d49b66a9b37136a82e82">PP_FileOpenFlags</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadb4b8db19266831040fc604f73c83a25">PP_HostResolver_Flag</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2ee7ad01799553e5f17bdaa35dd952ee">PP_ImageDataFormat</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gaca7296cfec99fcb6646b7144d1d6a0c5">PP_InputEvent_Type</a></td></tr> @@ -713,6 +712,27 @@ </dl> </div> </div> +<a class="anchor" id="gadadb1eaddb4ea71cb8620db1f4ce301e"></a><!-- doxytag: member="pp_codecs.h::PP_AudioProfile" ref="gadadb1eaddb4ea71cb8620db1f4ce301e" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">enum <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Audio profiles. </p> +<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> +<tr><td valign="top"><em><a class="anchor" id="ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191"></a><!-- doxytag: member="PP_AUDIOPROFILE_OPUS" ref="ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191" args="" -->PP_AUDIOPROFILE_OPUS</em> </td><td> +</td></tr> +<tr><td valign="top"><em><a class="anchor" id="ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77"></a><!-- doxytag: member="PP_AUDIOPROFILE_MAX" ref="ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77" args="" -->PP_AUDIOPROFILE_MAX</em> </td><td> +</td></tr> +</table> +</dd> +</dl> +</div> +</div> <a class="anchor" id="gaee750c350655f2fb0fe04c04029e0ff8"></a><!-- doxytag: member="ppb_audio_config.h::PP_AudioSampleRate" ref="gaee750c350655f2fb0fe04c04029e0ff8" args="" --> <div class="memitem"> <div class="memproto"> @@ -814,59 +834,6 @@ </dl> </div> </div> -<a class="anchor" id="ga47ce032e16d18ba6fc6c16bbe8939bad"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapFlags" ref="ga47ce032e16d18ba6fc6c16bbe8939bad" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">enum <a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>The PP_FileMapFlags contain flag values for use with Map(). </p> -<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c"></a><!-- doxytag: member="PP_FILEMAPFLAG_SHARED" ref="gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c" args="" -->PP_FILEMAPFLAG_SHARED</em> </td><td> -<p>Requests a shared mapping. </p> -<p>If this flag is set, changes written to the memory region will be reflected in the underlying file and will thus eventually be visible to other processes which have opened the file. The file may not actually be updated until Unmap() is called. This is only valid if the PPB_FileIO resource was opened with write permission. </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03"></a><!-- doxytag: member="PP_FILEMAPFLAG_PRIVATE" ref="gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03" args="" -->PP_FILEMAPFLAG_PRIVATE</em> </td><td> -<p>Requests a copy-on-write mapping. </p> -<p>If this flag is set, changes are not written to the underlying file, but only in the memory of the process (copy-on-write). </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e"></a><!-- doxytag: member="PP_FILEMAPFLAG_FIXED" ref="gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e" args="" -->PP_FILEMAPFLAG_FIXED</em> </td><td> -<p>Forces Map() to map the file contents at the provided |address|. </p> -<p>If Map() can not comply, Map() will fail. </p> -</td></tr> -</table> -</dd> -</dl> -</div> -</div> -<a class="anchor" id="ga07cb383dee51bc7e8e1f234068652668"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapProtection" ref="ga07cb383dee51bc7e8e1f234068652668" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">enum <a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>The PP_FileMapProtection values indicate the permissions requested for the file mapping. </p> -<p>These should be used in a uint32_t bitfield. </p> -<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> -<tr><td valign="top"><em><a class="anchor" id="gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb"></a><!-- doxytag: member="PP_FILEMAPPROTECTION_READ" ref="gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb" args="" -->PP_FILEMAPPROTECTION_READ</em> </td><td> -<p>Requests read access to the mapped address. </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e"></a><!-- doxytag: member="PP_FILEMAPPROTECTION_WRITE" ref="gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e" args="" -->PP_FILEMAPPROTECTION_WRITE</em> </td><td> -<p>Requests write access to the mapped address. </p> -</td></tr> -</table> -</dd> -</dl> -</div> -</div> <a class="anchor" id="ga4c87e6dd19c1d49b66a9b37136a82e82"></a><!-- doxytag: member="ppb_file_io.h::PP_FileOpenFlags" ref="ga4c87e6dd19c1d49b66a9b37136a82e82" args="" --> <div class="memitem"> <div class="memproto"> @@ -1753,6 +1720,16 @@ <p>Value's type should be <code>PP_VARTYPE_INT32</code>. On version 1.0, this option can only be set after a successful <code>Bind()</code> call. On version 1.1 or later, there is no such limitation.</p> <p>Note: This is only treated as a hint for the browser to set the buffer size. Even if <code>SetOption()</code> succeeds, the browser doesn't guarantee it will conform to the size. </p> </td></tr> +<tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_MULTICAST_LOOP" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c" args="" -->PP_UDPSOCKET_OPTION_MULTICAST_LOOP</em> </td><td> +<p>Specifies whether the packets sent from the host to the multicast group should be looped back to the host or not. </p> +<p>Value's type should be <code>PP_VARTYPE_BOOL</code>. This option can only be set before calling <code>Bind()</code>.</p> +<p>This is only supported in version 1.2 of the API (Chrome 43) and later. </p> +</td></tr> +<tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_MULTICAST_TTL" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82" args="" -->PP_UDPSOCKET_OPTION_MULTICAST_TTL</em> </td><td> +<p>Specifies the time-to-live for packets sent to the multicast group. </p> +<p>The value should be within 0 to 255 range. The default value is 1 and means that packets will not be routed beyond the local network. Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set before calling <code>Bind()</code>.</p> +<p>This is only supported in version 1.2 of the API (Chrome 43) and later. </p> +</td></tr> </table> </dd> </dl> @@ -2178,30 +2155,6 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga47ce032e16d18ba6fc6c16bbe8939bad"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapFlags" ref="ga47ce032e16d18ba6fc6c16bbe8939bad" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> -<a class="anchor" id="ga07cb383dee51bc7e8e1f234068652668"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapProtection" ref="ga07cb383dee51bc7e8e1f234068652668" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> <a class="anchor" id="ga4c87e6dd19c1d49b66a9b37136a82e82"></a><!-- doxytag: member="ppb_file_io.h::PP_FileOpenFlags" ref="ga4c87e6dd19c1d49b66a9b37136a82e82" args="" --> <div class="memitem"> <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html index e4a64ed8..72f88bb 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/group___interfaces.html
@@ -16,6 +16,8 @@ <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_AudioConfig</code> interface contains pointers to several functions for establishing your audio configuration within the browser. <a href="struct_p_p_b___audio_config__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Audio encoder interface. <a href="struct_p_p_b___audio_encoder__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___compositor__0__1.html">PPB_Compositor</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Defines the <code>PPB_Compositor</code> interface. <a href="struct_p_p_b___compositor__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___compositor_layer__0__2.html">PPB_CompositorLayer</a></td></tr> @@ -25,8 +27,6 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_Core</code> interface contains pointers to functions related to memory management, time, and threads on the browser. <a href="struct_p_p_b___core__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_FileIO</code> struct is used to operate on a regular file (PP_FileType_Regular). <a href="struct_p_p_b___file_i_o__1__1.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. <a href="struct_p_p_b___file_mapping__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_FileRef</code> struct represents a "weak pointer" to a file in a file system. <a href="struct_p_p_b___file_ref__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></td></tr> @@ -94,8 +94,8 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_TCPSocket</code> interface provides TCP socket operations. <a href="struct_p_p_b___t_c_p_socket__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code>PPB_TextInputController</code> provides a set of functions for giving hints to the browser about the text input status of plugins, and functions for controlling input method editors (IMEs). <a href="struct_p_p_b___text_input_controller__1__0.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <b>PPB_URLLoader</b> interface contains pointers to functions for loading URLs. <a href="struct_p_p_b___u_r_l_loader__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></td></tr> @@ -109,8 +109,10 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_VarArrayBuffer</code> interface provides a way to interact with JavaScript ArrayBuffers, which represent a contiguous sequence of bytes. <a href="struct_p_p_b___var_array_buffer__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">A dictionary var contains key-value pairs with unique keys. <a href="struct_p_p_b___var_dictionary__1__0.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="struct_p_p_b___video_encoder__0__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code>PPB_View</code> represents the state of the view of an instance. <a href="struct_p_p_b___view__1__2.html#details">More...</a><br /></td></tr> @@ -169,7 +171,7 @@ <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga68e25baffc8cfc72d6c636a3a6217aa0">PPB_TCPSocket</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab387085f6044f3a0b1631d119d22a942">PPB_TextInputController</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga03552c99ad9e2a408a988822f834f548">PPB_UDPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga307f562a9e41991de7c80b75cd7f379c">PPB_URLLoader</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad60387934d9e235d3d145ee5a1fb4e74">PPB_URLRequestInfo</a></td></tr> @@ -181,7 +183,8 @@ <a class="el" href="struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab26d5bb032f5438d02faf5bdf7b208cb">PPB_VarArrayBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga69826004b5c32232c9639090f3e1db2e">PPB_VarDictionary</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaa76d004c840f6c4f64a0694e7c844ae9">PPB_VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga116e11e23c92c99094c9704d97636a67">PPB_View</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad0e152d14cefb0b480228f3fc7070faf">PPB_WebSocket</a></td></tr> @@ -566,12 +569,12 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga03552c99ad9e2a408a988822f834f548"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSocket" ref="ga03552c99ad9e2a408a988822f834f548" args="" --> +<a class="anchor" id="gac45ce5bed449ca63680c4769663fd2b1"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSocket" ref="gac45ce5bed449ca63680c4769663fd2b1" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a> <a class="el" href="group___interfaces.html#ga03552c99ad9e2a408a988822f834f548">PPB_UDPSocket</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> <a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td> </tr> </table> </div> @@ -662,12 +665,24 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga2b4555d8bd239fa28b60c42df75f7ce5"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VideoDecoder" ref="ga2b4555d8bd239fa28b60c42df75f7ce5" args="" --> +<a class="anchor" id="ga3bfb47f476c3153e5638265c17702ed9"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VideoDecoder" ref="ga3bfb47f476c3153e5638265c17702ed9" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> <a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> <a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +<a class="anchor" id="ga1a72f170f2aaa94cd41aa16949e27973"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VideoEncoder" ref="ga1a72f170f2aaa94cd41aa16949e27973" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> <a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/group___structs.html b/native_client_sdk/doc_generated/pepper_beta/c/group___structs.html index 1bf6366..1bbd2a7 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/group___structs.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/group___structs.html
@@ -17,6 +17,16 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported audio profile information. <a href="struct_p_p___audio_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a bitstream buffer. <a href="struct_p_p___bitstream_buffer.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing an audio bitstream buffer. <a href="struct_p_p___audio_bitstream_buffer.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> is a common mechanism for supporting potentially asynchronous calls in browser interfaces. <a href="struct_p_p___completion_callback.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___directory_entry.html">PP_DirectoryEntry</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h.html index c9cbed88..5e4b639 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h.html
@@ -23,6 +23,16 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported audio profile information. <a href="struct_p_p___audio_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a bitstream buffer. <a href="struct_p_p___bitstream_buffer.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing an audio bitstream buffer. <a href="struct_p_p___audio_bitstream_buffer.html#details">More...</a><br /></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> { <br /> @@ -45,6 +55,9 @@ <a class="el" href="group___enums.html#gga4d50d27186f68b2de578e82162206feaa884e0f18fee1bae2472a15f6fb1d7e79">PP_VIDEOPROFILE_MAX</a> = PP_VIDEOPROFILE_VP9_ANY <br /> }</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> { <a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191">PP_AUDIOPROFILE_OPUS</a> = 0, +<a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77">PP_AUDIOPROFILE_MAX</a> = PP_AUDIOPROFILE_OPUS + }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> { <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5a6208cea63b7e6c1c8c9c67616df4ba85">PP_HARDWAREACCELERATION_ONLY</a> = 0, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5ad29490655cc25165817de26c5caff7ea">PP_HARDWAREACCELERATION_WITHFALLBACK</a> = 1, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5acf901685e6e14afe89e7d22ad35af4e1">PP_HARDWAREACCELERATION_NONE</a> = 2,
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h__incl.png index e74f895..d5c4e9a 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h__incl.png +++ b/native_client_sdk/doc_generated/pepper_beta/c/pp__codecs_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__audio__encoder_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__audio__encoder_8h.html new file mode 100644 index 0000000..04270d5 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__audio__encoder_8h.html
@@ -0,0 +1,45 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>ppb_audio_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for ppb_audio_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="ppb__audio__encoder_8h__incl.png" border="0" usemap="#ppb__audio__encoder_8h" alt="" /></div> +<map name="ppb__audio__encoder_8h" id="ppb__audio__encoder_8h"> +</map> +</div> +</div><h2> +Data Structures</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Audio encoder interface. <a href="struct_p_p_b___audio_encoder__0__1.html#details">More...</a><br /></td></tr> +</table><h2> +Defines</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">PPB_AUDIOENCODER_INTERFACE</a>   "PPB_AudioEncoder;0.1" /* dev */</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the <code>PPB_AudioEncoder</code> interface. </p> +</div><hr /><h2>Define Documentation</h2> +<a class="anchor" id="a4c4871532f8ac42a5a98f9f0aaac27a6"></a><!-- doxytag: member="ppb_audio_encoder.h::PPB_AUDIOENCODER_INTERFACE" ref="a4c4871532f8ac42a5a98f9f0aaac27a6" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">PPB_AUDIOENCODER_INTERFACE</a>   "PPB_AudioEncoder;0.1" /* dev */</td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__audio__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/c/ppb__audio__encoder_8h__incl.png new file mode 100644 index 0000000..0e98fe6 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__audio__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__file__mapping_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__file__mapping_8h.html deleted file mode 100644 index c5aba956..0000000 --- a/native_client_sdk/doc_generated/pepper_beta/c/ppb__file__mapping_8h.html +++ /dev/null
@@ -1,58 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>ppb_file_mapping.h File Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<div class="textblock"><div class="dynheader"> -Include dependency graph for ppb_file_mapping.h:</div> -<div class="dyncontent"> -<div class="center"><img src="ppb__file__mapping_8h__incl.png" border="0" usemap="#ppb__file__mapping_8h" alt="" /></div> -<map name="ppb__file__mapping_8h" id="ppb__file__mapping_8h"> -</map> -</div> -</div><h2> -Data Structures</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. <a href="struct_p_p_b___file_mapping__0__1.html#details">More...</a><br /></td></tr> -</table><h2> -Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">PPB_FILEMAPPING_INTERFACE</a>   "PPB_FileMapping;0.1" /* dev */</td></tr> -</table><h2> -Enumerations</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a> { <a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb">PP_FILEMAPPROTECTION_READ</a> = 1u << 0, -<a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e">PP_FILEMAPPROTECTION_WRITE</a> = 1u << 1 - }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a> { <a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c">PP_FILEMAPFLAG_SHARED</a> = 1u << 0, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03">PP_FILEMAPFLAG_PRIVATE</a> = 1u << 1, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e">PP_FILEMAPFLAG_FIXED</a> = 1u << 2 - }</td></tr> -</table><h2> -Variables</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>This file defines methods for mapping and unmapping files into and out of memory. </p> -</div><hr /><h2>Define Documentation</h2> -<a class="anchor" id="a657d5d4684814f79fd2c764fd8aa540e"></a><!-- doxytag: member="ppb_file_mapping.h::PPB_FILEMAPPING_INTERFACE" ref="a657d5d4684814f79fd2c764fd8aa540e" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">#define <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">PPB_FILEMAPPING_INTERFACE</a>   "PPB_FileMapping;0.1" /* dev */</td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__file__mapping_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/c/ppb__file__mapping_8h__incl.png deleted file mode 100644 index 45abc54..0000000 --- a/native_client_sdk/doc_generated/pepper_beta/c/ppb__file__mapping_8h__incl.png +++ /dev/null Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__udp__socket_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__udp__socket_8h.html index 130ae3d..b26a466 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/ppb__udp__socket_8h.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__udp__socket_8h.html
@@ -19,21 +19,26 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__2.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.1"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga03552c99ad9e2a408a988822f834f548">PPB_UDPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00">PP_UDPSOCKET_OPTION_BROADCAST</a> = 1, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57">PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</a> = 2, -<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3 +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3, +<br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c">PP_UDPSOCKET_OPTION_MULTICAST_LOOP</a> = 4, +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82">PP_UDPSOCKET_OPTION_MULTICAST_TTL</a> = 5 +<br /> }</td></tr> </table><h2> Variables</h2><table class="memberdecls"> @@ -47,19 +52,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="a756bacac14becc5cbc2efedcd3ccd509"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSOCKET_INTERFACE" ref="a756bacac14becc5cbc2efedcd3ccd509" args="" --> +<a class="anchor" id="ad6bc6ae5b1d72251b6b81fdd7d8009f7"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSOCKET_INTERFACE" ref="ad6bc6ae5b1d72251b6b81fdd7d8009f7" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.1"</td> +<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.2"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__decoder_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__decoder_8h.html index 212d41ab..51449aa 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__decoder_8h.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__decoder_8h.html
@@ -19,15 +19,15 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__1.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.0"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.1"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>This file defines the <code>PPB_VideoDecoder</code> interface. </p> @@ -37,19 +37,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="af814c8f0028bce254da6fb5c3e61a4d8"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VIDEODECODER_INTERFACE" ref="af814c8f0028bce254da6fb5c3e61a4d8" args="" --> +<a class="anchor" id="ac9994bddaa7ccc8f52799a00031d5441"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VIDEODECODER_INTERFACE" ref="ac9994bddaa7ccc8f52799a00031d5441" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.0"</td> +<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.1"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__encoder_8h.html b/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__encoder_8h.html new file mode 100644 index 0000000..7c900c39 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__encoder_8h.html
@@ -0,0 +1,61 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>ppb_video_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for ppb_video_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="ppb__video__encoder_8h__incl.png" border="0" usemap="#ppb__video__encoder_8h" alt="" /></div> +<map name="ppb__video__encoder_8h" id="ppb__video__encoder_8h"> +</map> +</div> +</div><h2> +Data Structures</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="struct_p_p_b___video_encoder__0__2.html#details">More...</a><br /></td></tr> +</table><h2> +Defines</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a>   "PPB_VideoEncoder;0.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">PPB_VIDEOENCODER_INTERFACE</a>   <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a></td></tr> +</table><h2> +Typedefs</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the <code>PPB_VideoEncoder</code> interface. </p> +</div><hr /><h2>Define Documentation</h2> +<a class="anchor" id="abdb2ab6ab0553f6b0086aee71996ea3d"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VIDEOENCODER_INTERFACE" ref="abdb2ab6ab0553f6b0086aee71996ea3d" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">PPB_VIDEOENCODER_INTERFACE</a>   <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +<a class="anchor" id="af8c3e2794a4f7f9cbd6c253cbacfe177"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VIDEOENCODER_INTERFACE" ref="af8c3e2794a4f7f9cbd6c253cbacfe177" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a>   "PPB_VideoEncoder;0.2"</td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__encoder_8h__incl.png new file mode 100644 index 0000000..6ecf7208 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/ppb__video__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___audio_bitstream_buffer.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___audio_bitstream_buffer.html new file mode 100644 index 0000000..8cdf217 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___audio_bitstream_buffer.html
@@ -0,0 +1,52 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_AudioBitstreamBuffer Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_AudioBitstreamBuffer" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html#ab76b8c0357d850c84ff417aa1282f3da">size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html#a888a0bc135ab6e5e434927309eb5fe9a">buffer</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Struct describing an audio bitstream buffer. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a888a0bc135ab6e5e434927309eb5fe9a"></a><!-- doxytag: member="PP_AudioBitstreamBuffer::buffer" ref="a888a0bc135ab6e5e434927309eb5fe9a" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void* <a class="el" href="struct_p_p___audio_bitstream_buffer.html#a888a0bc135ab6e5e434927309eb5fe9a">PP_AudioBitstreamBuffer::buffer</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The base address of the bitstream data. </p> +</div> +</div> +<a class="anchor" id="ab76b8c0357d850c84ff417aa1282f3da"></a><!-- doxytag: member="PP_AudioBitstreamBuffer::size" ref="ab76b8c0357d850c84ff417aa1282f3da" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_bitstream_buffer.html#ab76b8c0357d850c84ff417aa1282f3da">PP_AudioBitstreamBuffer::size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The size, in bytes, of the bitstream data. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___audio_profile_description.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___audio_profile_description.html new file mode 100644 index 0000000..ba55b78 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___audio_profile_description.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_AudioProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_AudioProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a4253ebb9ec2065525a4b9c948111d896">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a4806e98fc63b158b26b293c4de803667">max_channels</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a1a340d0676442d0dfad60219c6dd3886">sample_size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a266fce27c0c60cd5648ec331da9f04cf">sample_rate</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a3f77a750a3d903e565deae13d8d814b4">hardware_accelerated</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported audio profile information. </p> +<p>See the PPB_AudioEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a3f77a750a3d903e565deae13d8d814b4"></a><!-- doxytag: member="PP_AudioProfileDescription::hardware_accelerated" ref="a3f77a750a3d903e565deae13d8d814b4" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___audio_profile_description.html#a3f77a750a3d903e565deae13d8d814b4">PP_AudioProfileDescription::hardware_accelerated</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the profile is hardware accelerated. </p> +</div> +</div> +<a class="anchor" id="a4806e98fc63b158b26b293c4de803667"></a><!-- doxytag: member="PP_AudioProfileDescription::max_channels" ref="a4806e98fc63b158b26b293c4de803667" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a4806e98fc63b158b26b293c4de803667">PP_AudioProfileDescription::max_channels</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Maximum number of channels that can be encoded. </p> +</div> +</div> +<a class="anchor" id="a4253ebb9ec2065525a4b9c948111d896"></a><!-- doxytag: member="PP_AudioProfileDescription::profile" ref="a4253ebb9ec2065525a4b9c948111d896" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> <a class="el" href="struct_p_p___audio_profile_description.html#a4253ebb9ec2065525a4b9c948111d896">PP_AudioProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<a class="anchor" id="a266fce27c0c60cd5648ec331da9f04cf"></a><!-- doxytag: member="PP_AudioProfileDescription::sample_rate" ref="a266fce27c0c60cd5648ec331da9f04cf" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a266fce27c0c60cd5648ec331da9f04cf">PP_AudioProfileDescription::sample_rate</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Sampling rate that can be encoded. </p> +</div> +</div> +<a class="anchor" id="a1a340d0676442d0dfad60219c6dd3886"></a><!-- doxytag: member="PP_AudioProfileDescription::sample_size" ref="a1a340d0676442d0dfad60219c6dd3886" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a1a340d0676442d0dfad60219c6dd3886">PP_AudioProfileDescription::sample_size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Sample size. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___bitstream_buffer.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___bitstream_buffer.html new file mode 100644 index 0000000..a97c869 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___bitstream_buffer.html
@@ -0,0 +1,66 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_BitstreamBuffer Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_BitstreamBuffer" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#aaa6f173b3478e960f26d87ae417f5d09">size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#a864bd5618ebcdb6bb743e5699c0dff39">buffer</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#a4ae08468a70d30e5d8124d713f8e8c47">key_frame</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Struct describing a bitstream buffer. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a864bd5618ebcdb6bb743e5699c0dff39"></a><!-- doxytag: member="PP_BitstreamBuffer::buffer" ref="a864bd5618ebcdb6bb743e5699c0dff39" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void* <a class="el" href="struct_p_p___bitstream_buffer.html#a864bd5618ebcdb6bb743e5699c0dff39">PP_BitstreamBuffer::buffer</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The base address of the bitstream data. </p> +</div> +</div> +<a class="anchor" id="a4ae08468a70d30e5d8124d713f8e8c47"></a><!-- doxytag: member="PP_BitstreamBuffer::key_frame" ref="a4ae08468a70d30e5d8124d713f8e8c47" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___bitstream_buffer.html#a4ae08468a70d30e5d8124d713f8e8c47">PP_BitstreamBuffer::key_frame</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the buffer represents a key frame. </p> +</div> +</div> +<a class="anchor" id="aaa6f173b3478e960f26d87ae417f5d09"></a><!-- doxytag: member="PP_BitstreamBuffer::size" ref="aaa6f173b3478e960f26d87ae417f5d09" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___bitstream_buffer.html#aaa6f173b3478e960f26d87ae417f5d09">PP_BitstreamBuffer::size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The size, in bytes, of the bitstream data. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___video_profile_description.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___video_profile_description.html new file mode 100644 index 0000000..54ea6d9 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___video_profile_description.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_VideoProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_VideoProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa4cf8bf248f49de606d5bda97c5b4ae1">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa53694c107dc67256986b95e62ca13a2">max_resolution</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#a21f8d2e8f5b995afb27edd43667f3eed">max_framerate_numerator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa4b5113713acbb32d92145ac9f3a925f">max_framerate_denominator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#a10da7a8d059171fcf5bd907a6d9c0e60">hardware_accelerated</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported video profile information. </p> +<p>See the PPB_VideoEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a10da7a8d059171fcf5bd907a6d9c0e60"></a><!-- doxytag: member="PP_VideoProfileDescription::hardware_accelerated" ref="a10da7a8d059171fcf5bd907a6d9c0e60" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___video_profile_description.html#a10da7a8d059171fcf5bd907a6d9c0e60">PP_VideoProfileDescription::hardware_accelerated</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the profile is hardware accelerated. </p> +</div> +</div> +<a class="anchor" id="aa4b5113713acbb32d92145ac9f3a925f"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_denominator" ref="aa4b5113713acbb32d92145ac9f3a925f" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description.html#aa4b5113713acbb32d92145ac9f3a925f">PP_VideoProfileDescription::max_framerate_denominator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The denominator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="a21f8d2e8f5b995afb27edd43667f3eed"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_numerator" ref="a21f8d2e8f5b995afb27edd43667f3eed" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description.html#a21f8d2e8f5b995afb27edd43667f3eed">PP_VideoProfileDescription::max_framerate_numerator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The numerator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="aa53694c107dc67256986b95e62ca13a2"></a><!-- doxytag: member="PP_VideoProfileDescription::max_resolution" ref="aa53694c107dc67256986b95e62ca13a2" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> <a class="el" href="struct_p_p___video_profile_description.html#aa53694c107dc67256986b95e62ca13a2">PP_VideoProfileDescription::max_resolution</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Dimensions of the maximum resolution of video frames, in pixels. </p> +</div> +</div> +<a class="anchor" id="aa4cf8bf248f49de606d5bda97c5b4ae1"></a><!-- doxytag: member="PP_VideoProfileDescription::profile" ref="aa4cf8bf248f49de606d5bda97c5b4ae1" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> <a class="el" href="struct_p_p___video_profile_description.html#aa4cf8bf248f49de606d5bda97c5b4ae1">PP_VideoProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___video_profile_description__0__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___video_profile_description__0__1.html new file mode 100644 index 0000000..a6d7c86 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p___video_profile_description__0__1.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_VideoProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_VideoProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a97e76f7bc9c271fdd8b8964670711f65">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#ab3ffdab3497ff29df3d31e44c560f2f4">max_resolution</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a01c7a68c5b96c3d2cc048e35d82330dd">max_framerate_numerator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a5339510fd2f94fde1e83f81b9bd47aa8">max_framerate_denominator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a4d558d8ca3c8903544cb1f12c07d2a42">acceleration</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported video profile information. </p> +<p>See the PPB_VideoEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a4d558d8ca3c8903544cb1f12c07d2a42"></a><!-- doxytag: member="PP_VideoProfileDescription::acceleration" ref="a4d558d8ca3c8903544cb1f12c07d2a42" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#a4d558d8ca3c8903544cb1f12c07d2a42">PP_VideoProfileDescription::acceleration</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A value indicating if the profile is available in hardware, software, or both. </p> +</div> +</div> +<a class="anchor" id="a5339510fd2f94fde1e83f81b9bd47aa8"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_denominator" ref="a5339510fd2f94fde1e83f81b9bd47aa8" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description__0__1.html#a5339510fd2f94fde1e83f81b9bd47aa8">PP_VideoProfileDescription::max_framerate_denominator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The denominator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="a01c7a68c5b96c3d2cc048e35d82330dd"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_numerator" ref="a01c7a68c5b96c3d2cc048e35d82330dd" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description__0__1.html#a01c7a68c5b96c3d2cc048e35d82330dd">PP_VideoProfileDescription::max_framerate_numerator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The numerator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="ab3ffdab3497ff29df3d31e44c560f2f4"></a><!-- doxytag: member="PP_VideoProfileDescription::max_resolution" ref="ab3ffdab3497ff29df3d31e44c560f2f4" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#ab3ffdab3497ff29df3d31e44c560f2f4">PP_VideoProfileDescription::max_resolution</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Dimensions of the maximum resolution of video frames, in pixels. </p> +</div> +</div> +<a class="anchor" id="a97e76f7bc9c271fdd8b8964670711f65"></a><!-- doxytag: member="PP_VideoProfileDescription::profile" ref="a97e76f7bc9c271fdd8b8964670711f65" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#a97e76f7bc9c271fdd8b8964670711f65">PP_VideoProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___audio_encoder__0__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___audio_encoder__0__1.html new file mode 100644 index 0000000..1b01f3e --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___audio_encoder__0__1.html
@@ -0,0 +1,286 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PPB_AudioEncoder Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PPB_AudioEncoder" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a63e54ec7e63e940c59c1b365669a5002">IsAudioEncoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61">GetSupportedProfiles</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t channels, <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> input_sample_rate, <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> input_sample_size, <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a49a627f22227a877391f2f569a4490ff">GetNumberOfSamples</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f">GetBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3">Encode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529">GetBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80">RecycleBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, const struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac5a8cbc3578816a15f3418882b6b720c">RequestBitrateChange</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t bitrate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Audio encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110" title="Creates a new audio encoder resource.">Create()</a> to create a new audio encoder resource.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61" title="Gets an array of supported audio encoder profiles.">GetSupportedProfiles()</a> to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f" title="Gets a blank audio buffer (with metadata given by the Initialize() call) which can be filled with aud...">GetBuffer()</a> to get an empty buffer and fill it in, or get an audio buffer from another resource, e.g. <code>PPB_MediaStreamAudioTrack</code>.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3" title="Encodes an audio buffer.">Encode()</a> to push the audio buffer to the encoder. If an external buffer is pushed, wait for completion to recycle the buffer.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded buffers from the encoder.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available audio codecs vary by platform. All: opus. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="ad472829d0944505ce8cfb2a2b6308165"></a><!-- doxytag: member="PPB_AudioEncoder::Close" ref="ad472829d0944505ce8cfb2a2b6308165" args=")(PP_Resource audio_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165">PPB_AudioEncoder::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the audio encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the audio encoder closes it implicitly, so you are not required to call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165" title="Closes the audio encoder, and cancels any pending encodes.">Close()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a116d0908bcdd955e33e00cbd9ae04110"></a><!-- doxytag: member="PPB_AudioEncoder::Create" ref="a116d0908bcdd955e33e00cbd9ae04110" args=")(PP_Instance instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110">PPB_AudioEncoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Creates a new audio encoder resource. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the audio encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to an audio encoder if successful or 0 otherwise. </dd></dl> +</div> +</div> +<a class="anchor" id="a61e9304df6da6bbb97236805d702d0a3"></a><!-- doxytag: member="PPB_AudioEncoder::Encode" ref="a61e9304df6da6bbb97236805d702d0a3" args=")(PP_Resource audio_encoder, PP_Resource audio_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3">PPB_AudioEncoder::Encode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes an audio buffer. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_buffer</td><td>The <code>PPB_AudioBuffer</code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. Plugins that pass <code>PPB_AudioBuffer</code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a7386d14006ed634530d0ad2ecdb61529"></a><!-- doxytag: member="PPB_AudioEncoder::GetBitstreamBuffer" ref="a7386d14006ed634530d0ad2ecdb61529" args=")(PP_Resource audio_encoder, struct PP_AudioBitstreamBuffer *bitstream_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529">PPB_AudioEncoder::GetBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> containing encoded audio data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ac154730ff2248134c73d5155c4a7095f"></a><!-- doxytag: member="PPB_AudioEncoder::GetBuffer" ref="ac154730ff2248134c73d5155c4a7095f" args=")(PP_Resource audio_encoder, PP_Resource *audio_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f">PPB_AudioEncoder::GetBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank audio buffer (with metadata given by the <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> call) which can be filled with audio data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">audio_buffer</td><td>A blank <code>PPB_AudioBuffer</code> resource. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a49a627f22227a877391f2f569a4490ff"></a><!-- doxytag: member="PPB_AudioEncoder::GetNumberOfSamples" ref="a49a627f22227a877391f2f569a4490ff" args=")(PP_Resource audio_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a49a627f22227a877391f2f569a4490ff">PPB_AudioEncoder::GetNumberOfSamples</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of audio samples per channel that audio buffers must contain in order to be processed by the encoder. </p> +<p>This will be the number of samples per channels contained in buffers returned by <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f" title="Gets a blank audio buffer (with metadata given by the Initialize() call) which can be filled with aud...">GetBuffer()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of samples required, or an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a2ad5e2334abb35ede4c413e50e92ec61"></a><!-- doxytag: member="PPB_AudioEncoder::GetSupportedProfiles" ref="a2ad5e2334abb35ede4c413e50e92ec61" args=")(PP_Resource audio_encoder, struct PP_ArrayOutput output, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61">PPB_AudioEncoder::GetSupportedProfiles</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported audio encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output</td><td>A <code><a class="el" href="struct_p_p___array_output.html" title="A structure that defines a way for the browser to return arrays of data to the plugin.">PP_ArrayOutput</a></code> to receive the supported <code><a class="el" href="struct_p_p___audio_profile_description.html" title="Supported audio profile information.">PP_AudioProfileDescription</a></code> structs. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a676b09b0a98069daea08678a8c9e5d70"></a><!-- doxytag: member="PPB_AudioEncoder::Initialize" ref="a676b09b0a98069daea08678a8c9e5d70" args=")(PP_Resource audio_encoder, uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70">PPB_AudioEncoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t channels, <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> input_sample_rate, <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> input_sample_size, <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes an audio encoder resource. </p> +<p>The plugin should call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> successfully before calling any of the functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">channels</td><td>The number of audio channels to encode. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sampling_rate</td><td>The sampling rate of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sample_size</td><td>The sample size of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_AudioProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">initial_bitrate</td><td>The initial bitrate for the encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if audio encoding is not available, or the requested codec profile is not supported. </dd></dl> +</div> +</div> +<a class="anchor" id="a63e54ec7e63e940c59c1b365669a5002"></a><!-- doxytag: member="PPB_AudioEncoder::IsAudioEncoder" ref="a63e54ec7e63e940c59c1b365669a5002" args=")(PP_Resource resource)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a63e54ec7e63e940c59c1b365669a5002">PPB_AudioEncoder::IsAudioEncoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Determines if the given resource is an audio encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> identifying a resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_AudioEncoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> +</div> +</div> +<a class="anchor" id="a8046882d9584418d02e017130aa55d80"></a><!-- doxytag: member="PPB_AudioEncoder::RecycleBitstreamBuffer" ref="a8046882d9584418d02e017130aa55d80" args=")(PP_Resource audio_encoder, const struct PP_AudioBitstreamBuffer *bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80">PPB_AudioEncoder::RecycleBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, const struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ac5a8cbc3578816a15f3418882b6b720c"></a><!-- doxytag: member="PPB_AudioEncoder::RequestBitrateChange" ref="ac5a8cbc3578816a15f3418882b6b720c" args=")(PP_Resource audio_encoder, uint32_t bitrate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac5a8cbc3578816a15f3418882b6b720c">PPB_AudioEncoder::RequestBitrateChange</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t bitrate)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to the encoding bitrate. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="ppb__audio__encoder_8h.html">ppb_audio_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___compositor__0__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___compositor__0__1.html index 85fcb76..eae22619 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___compositor__0__1.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___compositor__0__1.html
@@ -50,7 +50,7 @@ <p>Creates a new <code>PPB_CompositorLayer</code> and adds it to the end of the layer stack. </p> <p>A <code>PP_Resource</code> containing the layer is returned. It is uninitialized, <code>SetColor()</code>, <code>SetTexture</code> or <code>SetImage</code> should be used to initialize it. The layer will appear above other pre-existing layers. If <code>ResetLayers</code> is called or the <code>PPB_Compositor</code> is released, the returned layer will be invalidated, and any further calls on the layer will return <code>PP_ERROR_BADRESOURCE</code>.</p> <p>param[in] compositor A <code>PP_Resource</code> corresponding to a compositor layer resource.</p> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor layer resource if sucessful or 0 otherwise. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor layer resource if successful or 0 otherwise. </dd></dl> </div> </div> <a class="anchor" id="a5082b0dce4a58032439bc3dd4ff741fd"></a><!-- doxytag: member="PPB_Compositor::CommitLayers" ref="a5082b0dce4a58032439bc3dd4ff741fd" args=")(PP_Resource compositor, struct PP_CompletionCallback cc)" --> @@ -91,7 +91,7 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor resource if sucessful or 0 otherwise. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor resource if successful or 0 otherwise. </dd></dl> </div> </div> <a class="anchor" id="a22fb77daabd3894db97ab1111d111a92"></a><!-- doxytag: member="PPB_Compositor::IsCompositor" ref="a22fb77daabd3894db97ab1111d111a92" args=")(PP_Resource resource)" -->
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___file_mapping__0__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___file_mapping__0__1.html deleted file mode 100644 index 64437048..0000000 --- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___file_mapping__0__1.html +++ /dev/null
@@ -1,98 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>PPB_FileMapping Struct Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<!-- doxytag: class="PPB_FileMapping" --><h2> -Data Fields</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb">Map</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d">Unmap</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const void *address, int64_t length, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int64_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0">GetMapPageSize</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. </p> -</div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ae479690b258985b51dda4d438b8156f0"></a><!-- doxytag: member="PPB_FileMapping::GetMapPageSize" ref="ae479690b258985b51dda4d438b8156f0" args=")(PP_Instance instance)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int64_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0">PPB_FileMapping::GetMapPageSize</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a> retrieves the size of pages that <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> uses. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>The size of pages that <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> uses. Returns 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="a425d8d5b11de51e8edf539ee13bac1fb"></a><!-- doxytag: member="PPB_FileMapping::Map" ref="a425d8d5b11de51e8edf539ee13bac1fb" args=")(PP_Instance instance, PP_Resource file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb">PPB_FileMapping::Map</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> maps the contents from an offset of the file into memory. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying one instance of a module. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">file_io</td><td>A <code>PPB_FileIO</code> <code>PP_Resource</code> corresponding to the file that should be mapped in to memory. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The number of bytes to map. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">map_protection</td><td>A bitfield containing values from <code>PP_FileMapProtection</code>, indicating what memory operations should be permitted on the mapped region. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">map_flags</td><td>A bitfield containing values from <code>PP_FileMapFlags</code>, providing options for the behavior of Map. If the region is to be writeable, then exactly one of <code>PP_FILEMAPFLAG_SHARED</code> or <code>PP_FILEMAPFLAG_PRIVATE</code> must be set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset into the file. Must be a multiple of the Map page size as returned by <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a>. </td></tr> -<tr><td class="paramdir"></td><td class="paramname">inout]</td><td>address The value of <code>*address</code>, if non-NULL, will be used as a hint to determine where in memory the file should be mapped. If the value is NULL, the host operating system will choose <code>address</code>. Upon <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> completing, <code>*address</code> will contain the actual memory location at which the file was mapped. If the plugin provides a non-NULL <code>*address</code>, it must be a multiple of the map page size as returned by <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a>. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a>.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<a class="anchor" id="a4fa72d6e6660e16ce1ff08453eff172d"></a><!-- doxytag: member="PPB_FileMapping::Unmap" ref="a4fa72d6e6660e16ce1ff08453eff172d" args=")(PP_Instance instance, const void *address, int64_t length, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d">PPB_FileMapping::Unmap</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const void *address, int64_t length, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d" title="Unmap() deletes the mapping of the specified address.">Unmap()</a> deletes the mapping of the specified address. </p> -<p>The specified address must have been retrieved with <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a>. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>The starting address of the address in memory to be unmapped. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the region to unmap. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d" title="Unmap() deletes the mapping of the specified address.">Unmap()</a>.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<hr />The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li> -</ul> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__2.html similarity index 63% rename from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html rename to native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__2.html index 6307ad0..8e1b0e13 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__2.html
@@ -12,25 +12,27 @@ <!-- doxytag: class="PPB_UDPSocket" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#abe2a2dc1170e9ea60f63656152b7b3ce">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a955e5c21c99668dc80fa54f8a12119de">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a2195768a7698776e83298b86b9670fa4">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae27417e3577d5dbb3a88efa7867df7b9">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ac0656c7002acbb1d9c4b17fb679f63df">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a3012f1d7f38fff9d45925e05850cfdb0">JoinGroup</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a5e46591a3a742ee1a9e3de81a76624d3">LeaveGroup</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>The <code>PPB_UDPSocket</code> interface provides UDP socket operations. </p> -<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> +<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ab35f5cda2711b220a2b6c090b469d044"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="ab35f5cda2711b220a2b6c090b469d044" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a07dad506a240b35c8ceb5dcd5f9e12ce"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="a07dad506a240b35c8ceb5dcd5f9e12ce" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -47,18 +49,18 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_ADDRESS_IN_USE</code> will be returned if the address is already in use. </dd></dl> </div> </div> -<a class="anchor" id="a9c349fbeb2a9fca70b8ecf0a860d2112"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="a9c349fbeb2a9fca70b8ecf0a860d2112" args=")(PP_Resource udp_socket)" --> +<a class="anchor" id="ae27417e3577d5dbb3a88efa7867df7b9"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="ae27417e3577d5dbb3a88efa7867df7b9" args=")(PP_Resource udp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae27417e3577d5dbb3a88efa7867df7b9">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> </tr> </table> </div> <div class="memdoc"> <p>Cancels all pending reads and writes, and closes the socket. </p> -<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code> again.</p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce" title="Binds the socket to the given address.">Bind()</a></code> again.</p> <p>The socket is implicitly closed if it is destroyed, so you are not required to call this method.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> @@ -68,12 +70,12 @@ </dl> </div> </div> -<a class="anchor" id="a687ffa461f068fae0e0cc6694b3157bd"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="a687ffa461f068fae0e0cc6694b3157bd" args=")(PP_Instance instance)" --> +<a class="anchor" id="abe2a2dc1170e9ea60f63656152b7b3ce"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="abe2a2dc1170e9ea60f63656152b7b3ce" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#abe2a2dc1170e9ea60f63656152b7b3ce">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -88,12 +90,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a UDP socket or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="a33be83f9c8d91811c9ee20fd04ae9be3"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a33be83f9c8d91811c9ee20fd04ae9be3" args=")(PP_Resource udp_socket)" --> +<a class="anchor" id="a2195768a7698776e83298b86b9670fa4"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a2195768a7698776e83298b86b9670fa4" args=")(PP_Resource udp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a2195768a7698776e83298b86b9670fa4">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> </tr> </table> </div> @@ -109,12 +111,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="a122be12f51d87e13cbe33bf30b3bef86"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a122be12f51d87e13cbe33bf30b3bef86" args=")(PP_Resource resource)" --> +<a class="anchor" id="a955e5c21c99668dc80fa54f8a12119de"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a955e5c21c99668dc80fa54f8a12119de" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a955e5c21c99668dc80fa54f8a12119de">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -129,12 +131,56 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the input is a <code>PPB_UDPSocket</code> resource; <code>PP_FALSE</code> otherwise. </dd></dl> </div> </div> -<a class="anchor" id="aa15ebcb5bfc899d2d46f8f25266e4913"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="aa15ebcb5bfc899d2d46f8f25266e4913" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a3012f1d7f38fff9d45925e05850cfdb0"></a><!-- doxytag: member="PPB_UDPSocket::JoinGroup" ref="a3012f1d7f38fff9d45925e05850cfdb0" args=")(PP_Resource udp_socket, PP_Resource group, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a3012f1d7f38fff9d45925e05850cfdb0">PPB_UDPSocket::JoinGroup</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Joins the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code>PPB_NetAddress</code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code>PP_Resource</code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a5e46591a3a742ee1a9e3de81a76624d3"></a><!-- doxytag: member="PPB_UDPSocket::LeaveGroup" ref="a5e46591a3a742ee1a9e3de81a76624d3" args=")(PP_Resource udp_socket, PP_Resource group, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a5e46591a3a742ee1a9e3de81a76624d3">PPB_UDPSocket::LeaveGroup</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Leaves the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code>PPB_NetAddress</code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code>PP_Resource</code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="afaf246c84eb76e033ee8794faa997af5"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="afaf246c84eb76e033ee8794faa997af5" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -154,12 +200,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been received; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> </div> </div> -<a class="anchor" id="ad6b1bd2a28fdc4fa58b8872353524d38"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ad6b1bd2a28fdc4fa58b8872353524d38" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ae6764f319a9af980dbb1ba5625a417be"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ae6764f319a9af980dbb1ba5625a417be" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -179,12 +225,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_INPROGRESS</code> will be returned if the socket is busy sending. The caller should wait until a pending send completes before retrying. </dd></dl> </div> </div> -<a class="anchor" id="a7107524b673568e4e69c63c43ecd0eec"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="a7107524b673568e4e69c63c43ecd0eec" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ac0656c7002acbb1d9c4b17fb679f63df"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="ac0656c7002acbb1d9c4b17fb679f63df" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ac0656c7002acbb1d9c4b17fb679f63df">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_decoder__1__0.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_decoder__1__1.html similarity index 71% rename from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_decoder__1__0.html rename to native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_decoder__1__1.html index c8dd134..7eb7007 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_decoder__1__0.html +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_decoder__1__1.html
@@ -12,35 +12,35 @@ <!-- doxytag: class="PPB_VideoDecoder" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ae2329143c44bd5eaae507074c1fc0ec3">IsVideoDecoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366">Decode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e">GetPicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f">RecyclePicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e">Reset</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#aa32bb990160f3e1fbfa90a2f363c61bc">IsVideoDecoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, uint32_t min_picture_count, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd">Decode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c">GetPicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb">RecyclePicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0">Reset</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>Video decoder interface. </p> <p>Typical usage:</p> <ul> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c" title="Creates a new video decoder resource.">Create()</a> to create a new video decoder resource.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> to quickly stop the decoder (e.g. to implement Seek) and wait for the callback before restarting decoding at another point.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f" title="Creates a new video decoder resource.">Create()</a> to create a new video decoder resource.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> to quickly stop the decoder (e.g. to implement Seek) and wait for the callback before restarting decoding at another point.</li> <li>To destroy the decoder, the plugin should release all of its references to it. Any pending callbacks will abort before the decoder is destroyed.</li> </ul> <p>Available video codecs vary by platform. All: theora, vorbis, vp8. Chrome and ChromeOS: aac, h264. ChromeOS: mpeg4. </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="a81200f606c493c49a70190ca86ac135c"></a><!-- doxytag: member="PPB_VideoDecoder::Create" ref="a81200f606c493c49a70190ca86ac135c" args=")(PP_Instance instance)" --> +<a class="anchor" id="ab84df8254cf35702e09425b835b5958f"></a><!-- doxytag: member="PPB_VideoDecoder::Create" ref="ab84df8254cf35702e09425b835b5958f" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c">PPB_VideoDecoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f">PPB_VideoDecoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -55,45 +55,45 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a video decoder if successful or 0 otherwise. </dd></dl> </div> </div> -<a class="anchor" id="acc8662be4232325abc545d1ae8b79366"></a><!-- doxytag: member="PPB_VideoDecoder::Decode" ref="acc8662be4232325abc545d1ae8b79366" args=")(PP_Resource video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a5f87d174876dc480029275f94e4669cd"></a><!-- doxytag: member="PPB_VideoDecoder::Decode" ref="a5f87d174876dc480029275f94e4669cd" args=")(PP_Resource video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366">PPB_VideoDecoder::Decode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd">PPB_VideoDecoder::Decode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Decodes a bitstream buffer. </p> -<p>Copies |size| bytes of data from the plugin's |buffer|. The plugin should wait until the decoder signals completion by returning PP_OK or by running |callback| before calling <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> again.</p> +<p>Copies |size| bytes of data from the plugin's |buffer|. The plugin should wait until the decoder signals completion by returning PP_OK or by running |callback| before calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> again.</p> <p>In general, each bitstream buffer should contain a demuxed bitstream frame for the selected video codec. For example, H264 decoders expect to receive one AnnexB NAL unit, including the 4 byte start code prefix, while VP8 decoders expect to receive a bitstream frame without the IVF frame header.</p> -<p>If the call to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> eventually results in a picture, the |decode_id| parameter is copied into the returned picture. The plugin can use this to associate decoded pictures with <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> calls (e.g. to assign timestamps or frame numbers to pictures.) This value is opaque to the API so the plugin is free to pass any value.</p> +<p>If the call to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> eventually results in a picture, the |decode_id| parameter is copied into the returned picture. The plugin can use this to associate decoded pictures with <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> calls (e.g. to assign timestamps or frame numbers to pictures.) This value is opaque to the API so the plugin is free to pass any value.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">decode_id</td><td>An optional value, chosen by the plugin, that can be used to associate calls to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> with decoded pictures returned by <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a>. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">decode_id</td><td>An optional value, chosen by the plugin, that can be used to associate calls to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> with decoded pictures returned by <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a>. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Buffer size in bytes. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Starting address of buffer. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called on completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> or <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> call pending. Returns PP_ERROR_NOMEMORY if a bitstream buffer can't be created. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> is called while <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> is pending. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> or <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> call pending. Returns PP_ERROR_NOMEMORY if a bitstream buffer can't be created. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> is called while <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="adf3ea0876d1ba686266589a04532e86d"></a><!-- doxytag: member="PPB_VideoDecoder::Flush" ref="adf3ea0876d1ba686266589a04532e86d" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a40e2989df1005096fd6fc9832e078413"></a><!-- doxytag: member="PPB_VideoDecoder::Flush" ref="a40e2989df1005096fd6fc9832e078413" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d">PPB_VideoDecoder::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413">PPB_VideoDecoder::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Flushes the decoder. </p> -<p>The plugin should call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> when it reaches the end of its video stream in order to stop cleanly. The decoder will run any pending <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> call to completion. The plugin should make no further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Just before completion, any pending <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> call will complete by running its callback with result PP_ERROR_ABORTED to signal that no more pictures are available. Any pictures held by the plugin remain valid during and after the flush and should be recycled back to the decoder.</p> +<p>The plugin should call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> when it reaches the end of its video stream in order to stop cleanly. The decoder will run any pending <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> call to completion. The plugin should make no further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Just before completion, any pending <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> call will complete by running its callback with result PP_ERROR_ABORTED to signal that no more pictures are available. Any pictures held by the plugin remain valid during and after the flush and should be recycled back to the decoder.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> @@ -104,18 +104,18 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized. </dd></dl> </div> </div> -<a class="anchor" id="a2351fe0cf66513ee77df0c1a22306c3e"></a><!-- doxytag: member="PPB_VideoDecoder::GetPicture" ref="a2351fe0cf66513ee77df0c1a22306c3e" args=")(PP_Resource video_decoder, struct PP_VideoPicture *picture, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="adc8b4eb41199cdf96aaa55d9a2df0b6c"></a><!-- doxytag: member="PPB_VideoDecoder::GetPicture" ref="adc8b4eb41199cdf96aaa55d9a2df0b6c" args=")(PP_Resource video_decoder, struct PP_VideoPicture *picture, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e">PPB_VideoDecoder::GetPicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c">PPB_VideoDecoder::GetPicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Gets the next picture from the decoder. </p> -<p>The picture is valid after the decoder signals completion by returning PP_OK or running |callback|. The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> again after the decoder signals completion. When the plugin is finished using the picture, it should return it to the system by calling <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>.</p> +<p>The picture is valid after the decoder signals completion by returning PP_OK or running |callback|. The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> again after the decoder signals completion. When the plugin is finished using the picture, it should return it to the system by calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> @@ -124,40 +124,41 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="ad115b7705b740b771e7dd9acb2b36f16"></a><!-- doxytag: member="PPB_VideoDecoder::Initialize" ref="ad115b7705b740b771e7dd9acb2b36f16" args=")(PP_Resource video_decoder, PP_Resource graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a65fc7d77135a1c55eb77ad4f7fd1a8a8"></a><!-- doxytag: member="PPB_VideoDecoder::Initialize" ref="a65fc7d77135a1c55eb77ad4f7fd1a8a8" args=")(PP_Resource video_decoder, PP_Resource graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16">PPB_VideoDecoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8">PPB_VideoDecoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, uint32_t min_picture_count, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Initializes a video decoder resource. </p> -<p>This should be called after <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c" title="Creates a new video decoder resource.">Create()</a> and before any other functions.</p> +<p>This should be called after <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f" title="Creates a new video decoder resource.">Create()</a> and before any other functions.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">graphics3d_context</td><td>A <code>PPB_Graphics3D</code> resource to use during decoding. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">profile</td><td>A <code>PP_VideoProfile</code> specifying the video codec profile. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">min_picture_count</td><td>A count of pictures the plugin would like to have in flight. This is effectively the number of times the plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> and get a decoded frame without calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>. The decoder has its own internal minimum count, and will take the larger of its internal and this value. A client that doesn't care can therefore just pass in zero for this argument. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. Returns PP_ERROR_BADARGUMENT if the requested minimum picture count is unreasonably large. </dd></dl> </div> </div> -<a class="anchor" id="ae2329143c44bd5eaae507074c1fc0ec3"></a><!-- doxytag: member="PPB_VideoDecoder::IsVideoDecoder" ref="ae2329143c44bd5eaae507074c1fc0ec3" args=")(PP_Resource resource)" --> +<a class="anchor" id="aa32bb990160f3e1fbfa90a2f363c61bc"></a><!-- doxytag: member="PPB_VideoDecoder::IsVideoDecoder" ref="aa32bb990160f3e1fbfa90a2f363c61bc" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ae2329143c44bd5eaae507074c1fc0ec3">PPB_VideoDecoder::IsVideoDecoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#aa32bb990160f3e1fbfa90a2f363c61bc">PPB_VideoDecoder::IsVideoDecoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -172,12 +173,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_VideoDecoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> </div> </div> -<a class="anchor" id="ac7e6b42866d42eade96519f32755509f"></a><!-- doxytag: member="PPB_VideoDecoder::RecyclePicture" ref="ac7e6b42866d42eade96519f32755509f" args=")(PP_Resource video_decoder, const struct PP_VideoPicture *picture)" --> +<a class="anchor" id="ab0b4f4b781cf6c0b347832961a08b6bb"></a><!-- doxytag: member="PPB_VideoDecoder::RecyclePicture" ref="ab0b4f4b781cf6c0b347832961a08b6bb" args=")(PP_Resource video_decoder, const struct PP_VideoPicture *picture)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f">PPB_VideoDecoder::RecyclePicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb">PPB_VideoDecoder::RecyclePicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td> </tr> </table> </div> @@ -193,18 +194,18 @@ </dl> </div> </div> -<a class="anchor" id="aeb4704cfd86a4ad737af19e77f3ffd5e"></a><!-- doxytag: member="PPB_VideoDecoder::Reset" ref="aeb4704cfd86a4ad737af19e77f3ffd5e" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ad8151e35df062e82434fb1d6e0629fd0"></a><!-- doxytag: member="PPB_VideoDecoder::Reset" ref="ad8151e35df062e82434fb1d6e0629fd0" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e">PPB_VideoDecoder::Reset</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0">PPB_VideoDecoder::Reset</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Resets the decoder as quickly as possible. </p> -<p>The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> to skip to another position in the video stream. After <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> returns, any pending calls to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a>) abort, causing their callbacks to run with PP_ERROR_ABORTED. The plugin should not make further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Any pictures held by the plugin remain valid during and after the reset and should be recycled back to the decoder.</p> +<p>The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> to skip to another position in the video stream. After <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> returns, any pending calls to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a>) abort, causing their callbacks to run with PP_ERROR_ABORTED. The plugin should not make further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Any pictures held by the plugin remain valid during and after the reset and should be recycled back to the decoder.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_encoder__0__2.html b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_encoder__0__2.html new file mode 100644 index 0000000..de97a32 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___video_encoder__0__2.html
@@ -0,0 +1,309 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PPB_VideoEncoder Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PPB_VideoEncoder" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9006f1c2d0d3fe9a71bb2343e22e679a">IsVideoEncoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#abe007473d19c6c82555799c0ecff0cc7">GetSupportedProfiles</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___enums.html#ga4e7cf746d8acbfa268db1f5ebe8061bf">PP_VideoFrame_Format</a> input_format, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *input_visible_size, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a468e94294b704c002a6532687bb53ed0">GetFramesRequired</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#adbd41c5b25729bbfb1ad90124d9e9528">GetFrameCodedSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *coded_size)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a">GetVideoFrame</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *video_frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9">Encode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_frame, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> force_keyframe, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4">GetBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a">RecycleBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, const struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#aa1a3fa20e5d8c56e420d169af6f02845">RequestEncodingParametersChange</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, uint32_t bitrate, uint32_t framerate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Video encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c" title="Creates a new video encoder resource.">Create()</a> to create a new video encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a" title="Gets a blank video frame which can be filled with video data and passed to the encoder.">GetVideoFrame()</a> to get a blank frame and fill it in, or get a video frame from another resource, e.g. <code>PPB_MediaStreamVideoTrack</code>.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9" title="Encodes a video frame.">Encode()</a> to push the video frame to the encoder. If an external frame is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded pictures from the encoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available video codecs vary by platform. All: vp8 (software). ChromeOS, depending on your device: h264 (hardware), vp8 (hardware) </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="afe91b697d39e41ca9c4b187e1f66749f"></a><!-- doxytag: member="PPB_VideoEncoder::Close" ref="afe91b697d39e41ca9c4b187e1f66749f" args=")(PP_Resource video_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f">PPB_VideoEncoder::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the video encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the video encoder closes it implicitly, so you are not required to call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f" title="Closes the video encoder, and cancels any pending encodes.">Close()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a94d87da92ccfb984cef497977d00d80c"></a><!-- doxytag: member="PPB_VideoEncoder::Create" ref="a94d87da92ccfb984cef497977d00d80c" args=")(PP_Instance instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c">PPB_VideoEncoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Creates a new video encoder resource. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the video encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a video encoder if successful or 0 otherwise. </dd></dl> +</div> +</div> +<a class="anchor" id="a873344d65a32d15426cd4424e76bb6d9"></a><!-- doxytag: member="PPB_VideoEncoder::Encode" ref="a873344d65a32d15426cd4424e76bb6d9" args=")(PP_Resource video_encoder, PP_Resource video_frame, PP_Bool force_keyframe, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9">PPB_VideoEncoder::Encode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_frame, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> force_keyframe, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes a video frame. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">video_frame</td><td>The <code>PPB_VideoFrame</code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">force_keyframe</td><td>A <code>PP_Bool> specifying whether the encoder should emit a key frame for this video frame. </code></td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td><code>A </code><code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. Plugins that pass <code>PPB_VideoFrame</code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code> An int32_t containing an error code from </code><code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a8b2b489462a35bdc6300bcf1fdadabe4"></a><!-- doxytag: member="PPB_VideoEncoder::GetBitstreamBuffer" ref="a8b2b489462a35bdc6300bcf1fdadabe4" args=")(PP_Resource video_encoder, struct PP_BitstreamBuffer *bitstream_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4">PPB_VideoEncoder::GetBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> containing encoded video data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="adbd41c5b25729bbfb1ad90124d9e9528"></a><!-- doxytag: member="PPB_VideoEncoder::GetFrameCodedSize" ref="adbd41c5b25729bbfb1ad90124d9e9528" args=")(PP_Resource video_encoder, struct PP_Size *coded_size)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#adbd41c5b25729bbfb1ad90124d9e9528">PPB_VideoEncoder::GetFrameCodedSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *coded_size)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the coded size of the video frames required by the encoder. </p> +<p>Coded size is the logical size of the input frames, in pixels. The encoder may have hardware alignment requirements that make this different from |input_visible_size|, as requested in the call to <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">coded_size</td><td>A <code><a class="el" href="struct_p_p___size.html" title="The PP_Size struct contains the size of a 2D rectangle.">PP_Size</a></code> to hold the coded size. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a468e94294b704c002a6532687bb53ed0"></a><!-- doxytag: member="PPB_VideoEncoder::GetFramesRequired" ref="a468e94294b704c002a6532687bb53ed0" args=")(PP_Resource video_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a468e94294b704c002a6532687bb53ed0">PPB_VideoEncoder::GetFramesRequired</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of input video frames that the encoder may hold while encoding. </p> +<p>If the plugin is providing the video frames, it should have at least this many available.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of frames required, or an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="abe007473d19c6c82555799c0ecff0cc7"></a><!-- doxytag: member="PPB_VideoEncoder::GetSupportedProfiles" ref="abe007473d19c6c82555799c0ecff0cc7" args=")(PP_Resource video_encoder, struct PP_ArrayOutput output, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#abe007473d19c6c82555799c0ecff0cc7">PPB_VideoEncoder::GetSupportedProfiles</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported video encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output</td><td>A <code><a class="el" href="struct_p_p___array_output.html" title="A structure that defines a way for the browser to return arrays of data to the plugin.">PP_ArrayOutput</a></code> to receive the supported <code><a class="el" href="struct_p_p___video_profile_description.html" title="Supported video profile information.">PP_VideoProfileDescription</a></code> structs. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a64a5b77b1130f13184b797828a49587a"></a><!-- doxytag: member="PPB_VideoEncoder::GetVideoFrame" ref="a64a5b77b1130f13184b797828a49587a" args=")(PP_Resource video_encoder, PP_Resource *video_frame, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a">PPB_VideoEncoder::GetVideoFrame</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *video_frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank video frame which can be filled with video data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">video_frame</td><td>A blank <code>PPB_VideoFrame</code> resource. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a9cd78deaf493477ca7ec96a6e6445561"></a><!-- doxytag: member="PPB_VideoEncoder::Initialize" ref="a9cd78deaf493477ca7ec96a6e6445561" args=")(PP_Resource video_encoder, PP_VideoFrame_Format input_format, const struct PP_Size *input_visible_size, PP_VideoProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561">PPB_VideoEncoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___enums.html#ga4e7cf746d8acbfa268db1f5ebe8061bf">PP_VideoFrame_Format</a> input_format, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *input_visible_size, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a video encoder resource. </p> +<p>The plugin should call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> successfully before calling any of the functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_format</td><td>The <code>PP_VideoFrame_Format</code> of the frames which will be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_visible_size</td><td>A <code><a class="el" href="struct_p_p___size.html" title="The PP_Size struct contains the size of a 2D rectangle.">PP_Size</a></code> specifying the dimensions of the visible part of the input frames. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_VideoProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video encoding is not available, or the requested codec profile is not supported. </dd></dl> +</div> +</div> +<a class="anchor" id="a9006f1c2d0d3fe9a71bb2343e22e679a"></a><!-- doxytag: member="PPB_VideoEncoder::IsVideoEncoder" ref="a9006f1c2d0d3fe9a71bb2343e22e679a" args=")(PP_Resource resource)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9006f1c2d0d3fe9a71bb2343e22e679a">PPB_VideoEncoder::IsVideoEncoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Determines if the given resource is a video encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> identifying a resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_VideoEncoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> +</div> +</div> +<a class="anchor" id="a072f3199019aa262fbdf42412678220a"></a><!-- doxytag: member="PPB_VideoEncoder::RecycleBitstreamBuffer" ref="a072f3199019aa262fbdf42412678220a" args=")(PP_Resource video_encoder, const struct PP_BitstreamBuffer *bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a">PPB_VideoEncoder::RecycleBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, const struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="aa1a3fa20e5d8c56e420d169af6f02845"></a><!-- doxytag: member="PPB_VideoEncoder::RequestEncodingParametersChange" ref="aa1a3fa20e5d8c56e420d169af6f02845" args=")(PP_Resource video_encoder, uint32_t bitrate, uint32_t framerate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#aa1a3fa20e5d8c56e420d169af6f02845">PPB_VideoEncoder::RequestEncodingParametersChange</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, uint32_t bitrate, uint32_t framerate)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to encoding parameters. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">framerate</td><td>The requested new framerate, in frames per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/audio__encoder_8h.html b/native_client_sdk/doc_generated/pepper_beta/cpp/audio__encoder_8h.html new file mode 100644 index 0000000..f04836a --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/audio__encoder_8h.html
@@ -0,0 +1,32 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>audio_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for audio_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="audio__encoder_8h__incl.png" border="0" usemap="#audio__encoder_8h" alt="" /></div> +<map name="audio__encoder_8h" id="audio__encoder_8h"> +</map> +</div> +</div><h2> +Classes</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. <a href="classpp_1_1_audio_encoder.html#details">More...</a><br /></td></tr> +</table><h2> +Namespaces</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the API to create and use a AudioEncoder resource. </p> +</div></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/audio__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/cpp/audio__encoder_8h__incl.png new file mode 100644 index 0000000..9eb1bf12 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/audio__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder-members.html new file mode 100644 index 0000000..9872974 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder-members.html
@@ -0,0 +1,39 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>Member List</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +This is the complete list of members for <a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a>, including all inherited members.<table> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">AudioEncoder</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a1b5126d5112082bfa782bf5423715030">AudioEncoder</a>(const InstanceHandle &instance)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td><code> [explicit]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#ac4a116ff790ce5dc1cc4847118aabc9d">AudioEncoder</a>(const AudioEncoder &other)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">Close</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">Encode</a>(const AudioBuffer &buffer, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">GetBitstreamBuffer</a>(const CompletionCallbackWithOutput< PP_AudioBitstreamBuffer > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">GetBuffer</a>(const CompletionCallbackWithOutput< AudioBuffer > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">GetNumberOfSamples</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">GetSupportedProfiles</a>(const CompletionCallbackWithOutput< std::vector< PP_AudioProfileDescription > > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">Initialize</a>(uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">RecycleBitstreamBuffer</a>(const PP_AudioBitstreamBuffer &bitstream_buffer)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">RequestBitrateChange</a>(uint32_t bitrate)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> +</table></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder.html new file mode 100644 index 0000000..525e399 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder.html
@@ -0,0 +1,381 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>pp::AudioEncoder Class Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="pp::AudioEncoder" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader"> +Inheritance diagram for pp::AudioEncoder:</div> +<div class="dyncontent"> +<div class="center"><img src="classpp_1_1_audio_encoder__inherit__graph.png" border="0" usemap="#pp_1_1_audio_encoder_inherit__map" alt="Inheritance graph" /></div> +<map name="pp_1_1_audio_encoder_inherit__map" id="pp_1_1_audio_encoder_inherit__map"> +<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="20,5,124,32"></area></map> +<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> +<p><a href="classpp_1_1_audio_encoder-members.html">List of all members.</a></p> +<h2> +Public Member Functions</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">AudioEncoder</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a1b5126d5112082bfa782bf5423715030">AudioEncoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#ac4a116ff790ce5dc1cc4847118aabc9d">AudioEncoder</a> (const <a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a> &other)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">GetSupportedProfiles</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_AudioProfileDescription > > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">Initialize</a> (uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">GetNumberOfSamples</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">GetBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">Encode</a> (const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &buffer, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">GetBitstreamBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_AudioBitstreamBuffer > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">RecycleBitstreamBuffer</a> (const PP_AudioBitstreamBuffer &bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">RequestBitrateChange</a> (uint32_t bitrate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">Close</a> ()</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call Create() to create a new audio encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687" title="Gets a blank audio frame which can be filled with audio data and passed to the encoder.">GetBuffer()</a> to get a blank frame and fill it in, or get an audio frame from another resource, e.g. <code>PPB_MediaStreamAudioTrack</code>.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19" title="Encodes an audio buffer.">Encode()</a> to push the audio buffer to the encoder. If an external buffer is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded buffers from the encoder.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available audio codecs vary by platform. All: opus. </p> +</div><hr /><h2>Constructor & Destructor Documentation</h2> +<a class="anchor" id="afaf804d519fc0f2370c2d011b4e68378"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="afaf804d519fc0f2370c2d011b4e68378" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code> object. </p> +</div> +</div> +<a class="anchor" id="a1b5126d5112082bfa782bf5423715030"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="a1b5126d5112082bfa782bf5423715030" args="(const InstanceHandle &instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> & </td> +<td class="paramname"><em>instance</em></td><td>)</td> +<td><code> [explicit]</code></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A constructor used to create a <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code> and associate it with the provided <code><a class="el" href="classpp_1_1_instance.html">Instance</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ac4a116ff790ce5dc1cc4847118aabc9d"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="ac4a116ff790ce5dc1cc4847118aabc9d" args="(const AudioEncoder &other)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a> & </td> +<td class="paramname"><em>other</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The copy constructor for <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code>. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr /><h2>Member Function Documentation</h2> +<a class="anchor" id="a5f5f533624660ca8561fea403da85f5b"></a><!-- doxytag: member="pp::AudioEncoder::Close" ref="a5f5f533624660ca8561fea403da85f5b" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">pp::AudioEncoder::Close</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the audio encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the audio encoder closes it implicitly, so you are not required to call <a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b" title="Closes the audio encoder, and cancels any pending encodes.">Close()</a>. </p> +</div> +</div> +<a class="anchor" id="a75278dc12dfcc3d000e47e17f014be19"></a><!-- doxytag: member="pp::AudioEncoder::Encode" ref="a75278dc12dfcc3d000e47e17f014be19" args="(const AudioBuffer &buffer, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">pp::AudioEncoder::Encode</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> & </td> +<td class="paramname"><em>buffer</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes an audio buffer. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_buffer</td><td>The <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion. Plugins that pass <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ad1a2c96562e2baa7a61d63fbb8a49999"></a><!-- doxytag: member="pp::AudioEncoder::GetBitstreamBuffer" ref="ad1a2c96562e2baa7a61d63fbb8a49999" args="(const CompletionCallbackWithOutput< PP_AudioBitstreamBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">pp::AudioEncoder::GetBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_AudioBitstreamBuffer > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the next bitstream buffer. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a113d4a018e987f2f5227c6e0dc8a7687"></a><!-- doxytag: member="pp::AudioEncoder::GetBuffer" ref="a113d4a018e987f2f5227c6e0dc8a7687" args="(const CompletionCallbackWithOutput< AudioBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">pp::AudioEncoder::GetBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank audio frame which can be filled with audio data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the blank <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a706b305dae8bc5f5e0bca4491c991d59"></a><!-- doxytag: member="pp::AudioEncoder::GetNumberOfSamples" ref="a706b305dae8bc5f5e0bca4491c991d59" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">pp::AudioEncoder::GetNumberOfSamples</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of audio samples per channel that audio buffers must contain in order to be processed by the encoder. </p> +<p>This will be the number of samples per channels contained in buffers returned by <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687" title="Gets a blank audio frame which can be filled with audio data and passed to the encoder.">GetBuffer()</a>.</p> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of samples required, or an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a34b94c7bb1f509f4b56bfe7349560669"></a><!-- doxytag: member="pp::AudioEncoder::GetSupportedProfiles" ref="a34b94c7bb1f509f4b56bfe7349560669" args="(const CompletionCallbackWithOutput< std::vector< PP_AudioProfileDescription > > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">pp::AudioEncoder::GetSupportedProfiles</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_AudioProfileDescription > > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported audio encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the PP_AudioProfileDescription structs.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a28aa43f8c92b387b81e7cf63219c2933"></a><!-- doxytag: member="pp::AudioEncoder::Initialize" ref="a28aa43f8c92b387b81e7cf63219c2933" args="(uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">pp::AudioEncoder::Initialize</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>channels</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioBuffer_SampleRate </td> +<td class="paramname"><em>input_sample_rate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioBuffer_SampleSize </td> +<td class="paramname"><em>input_sample_size</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioProfile </td> +<td class="paramname"><em>output_profile</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>initial_bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_HardwareAcceleration </td> +<td class="paramname"><em>acceleration</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a audio encoder resource. </p> +<p>This should be called after <a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669" title="Gets an array of supported audio encoder profiles.">GetSupportedProfiles()</a> and before any functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">channels</td><td>The number of audio channels to encode. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sampling_rate</td><td>The sampling rate of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sample_size</td><td>The sample size of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_AudioProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">initial_bitrate</td><td>The initial bitrate for the encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if audio encoding is not available, or the requested codec profile is not supported. Returns PP_ERROR_NOMEMORY if bitstream buffers can't be created. </dd></dl> +</div> +</div> +<a class="anchor" id="a9c5b90b6dbfd81154b28f402197184bc"></a><!-- doxytag: member="pp::AudioEncoder::RecycleBitstreamBuffer" ref="a9c5b90b6dbfd81154b28f402197184bc" args="(const PP_AudioBitstreamBuffer &bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">pp::AudioEncoder::RecycleBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const PP_AudioBitstreamBuffer & </td> +<td class="paramname"><em>bitstream_buffer</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A<code>PP_AudioBitstreamBuffer</code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="aa64ea3b0313335817833a72ceed96114"></a><!-- doxytag: member="pp::AudioEncoder::RequestBitrateChange" ref="aa64ea3b0313335817833a72ceed96114" args="(uint32_t bitrate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">pp::AudioEncoder::RequestBitrateChange</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>bitrate</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to the encoding bitrate. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this class was generated from the following file:<ul> +<li><a class="el" href="audio__encoder_8h.html">audio_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder__inherit__graph.png b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder__inherit__graph.png new file mode 100644 index 0000000..5b2e1e1 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_audio_encoder__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_instance.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_instance.html index c1426e0..3894b01 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_instance.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_instance.html
@@ -113,7 +113,7 @@ <div class="memdoc"> <p><a class="el" href="classpp_1_1_instance.html#a9773263ee281405030548fc224eeec08" title="AddPerInstanceObject() associates an instance with an interface, creating an object.">AddPerInstanceObject()</a> associates an instance with an interface, creating an object. </p> <p>Many optional interfaces are associated with a plugin instance. For example, the find in PPP_Find interface receives updates on a per-instance basis. This "per-instance" tracking allows such objects to associate themselves with an instance as "the" handler for that interface name.</p> -<p>In the case of the find example, the find object registers with its associated instance in its constructor and unregisters in its destructor. Then whenever it gets updates with a PP_Instance parameter, it can map back to the find object corresponding to that given PP_Instance by calling GetPerInstanceObject</p> +<p>In the case of the find example, the find object registers with its associated instance in its constructor and unregisters in its destructor. Then whenever it gets updates with a PP_Instance parameter, it can map back to the find object corresponding to that given PP_Instance by calling GetPerInstanceObject.</p> <p>This lookup is done on a per-interface-name basis. This means you can only have one object of a given interface name associated with an instance.</p> <p>If you are adding a handler for an additional interface, be sure to register with the module (AddPluginInterface) for your interface name to get the C calls in the first place.</p> <p>Refer to <a class="el" href="classpp_1_1_instance.html#a33c633189c7c321dac8e0c5dc6e67f5b" title="Refer to AddPerInstanceObject() for further information.">RemovePerInstanceObject()</a> and <a class="el" href="classpp_1_1_instance.html#a6dec498f1d49571be9fd40e23745327f" title="Look up an object previously associated with an instance.">GetPerInstanceObject()</a> for further information.</p>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html index 7845d8d..9e77949 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@ <div class="dyncontent"> <div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div> <map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map"> -<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,157,317,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,208,335,235"></area><area shape="rect" id="node7" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,259,297,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,309,300,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,360,315,387"></area><area shape="rect" id="node10" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,411,317,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,512,322,539"></area><area shape="rect" id="node13" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,563,316,589"></area><area shape="rect" id="node14" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,613,315,640"></area><area shape="rect" id="node20" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,664,357,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,765,325,792"></area><area shape="rect" id="node23" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,816,318,843"></area><area shape="rect" id="node24" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,867,317,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,917,331,944"></area><area shape="rect" id="node26" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,968,314,995"></area><area shape="rect" id="node27" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1019,317,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1069,315,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1120,330,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1171,335,1197"></area><area shape="rect" id="node31" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1221,325,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1272,319,1299"></area><area shape="rect" id="node33" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1323,295,1349"></area><area shape="rect" id="node34" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1373,315,1400"></area><area shape="rect" id="node15" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,512,560,539"></area><area shape="rect" id="node16" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,563,579,589"></area><area shape="rect" id="node17" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,613,570,640"></area><area shape="rect" id="node18" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,664,567,691"></area><area shape="rect" id="node19" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,715,568,741"></area></map> +<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map> <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> <p><a href="classpp_1_1_resource-members.html">List of all members.</a></p> <h2>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png index 68d3837b4..5fd5ac3 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_resource__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket-members.html index 2484890..4bd8553 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket-members.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket-members.html
@@ -18,6 +18,8 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#ae98c9decb3c3ea4ba1006943577b684d">GetBoundAddress</a>()</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a76a2e93f2fa01d0dce8d8216d53b4f44">IsAvailable</a>()</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td><code> [static]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">JoinGroup</a>(const NetAddress &group, const CompletionCallback callback)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">LeaveGroup</a>(const NetAddress &group, const CompletionCallback callback)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a72112f67b757bbbfaaf67ae3cfe2f602">operator=</a>(const UDPSocket &other)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">pp::Resource::operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket.html index c0bf3229..84f508f 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_u_d_p_socket.html
@@ -33,6 +33,8 @@ <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a657309cd3bc38cf28e25f4c71190d1a0">SendTo</a> (const char *buffer, int32_t num_bytes, const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &addr, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#aa1f03d8d0e7ef59c40724e2691f165f2">Close</a> ()</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a5ff91fd2342e534b57980c0c2e414251">SetOption</a> (PP_UDPSocket_Option name, const <a class="el" href="classpp_1_1_var.html">Var</a> &value, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">JoinGroup</a> (const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &group, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">LeaveGroup</a> (const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &group, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> callback)</td></tr> </table><h2> Static Public Member Functions</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a76a2e93f2fa01d0dce8d8216d53b4f44">IsAvailable</a> ()</td></tr> @@ -241,6 +243,76 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>true if the interface is available, false otherwise. </dd></dl> </div> </div> +<a class="anchor" id="a51bdeaeeef690d741850e7d691fa479d"></a><!-- doxytag: member="pp::UDPSocket::JoinGroup" ref="a51bdeaeeef690d741850e7d691fa479d" args="(const NetAddress &group, const CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">pp::UDPSocket::JoinGroup</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> & </td> +<td class="paramname"><em>group</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> </td> +<td class="paramname"><em>callback</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Joins the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a7efaa9eda9e58ffbd5f6b5c5c9e8b38c"></a><!-- doxytag: member="pp::UDPSocket::LeaveGroup" ref="a7efaa9eda9e58ffbd5f6b5c5c9e8b38c" args="(const NetAddress &group, const CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">pp::UDPSocket::LeaveGroup</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> & </td> +<td class="paramname"><em>group</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> </td> +<td class="paramname"><em>callback</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Leaves the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> <a class="anchor" id="a72112f67b757bbbfaaf67ae3cfe2f602"></a><!-- doxytag: member="pp::UDPSocket::operator=" ref="a72112f67b757bbbfaaf67ae3cfe2f602" args="(const UDPSocket &other)" --> <div class="memitem"> <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder-members.html index f383c8c..68a4c3e 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder-members.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder-members.html
@@ -16,7 +16,7 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366">Flush</a>(const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a">GetPicture</a>(const CompletionCallbackWithOutput< PP_VideoPicture > &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> -<tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">Initialize</a>(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">Initialize</a>(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder.html index a82fcda6..d05fd0a 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_decoder.html
@@ -24,7 +24,7 @@ <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#afc9613c960f58ff4c97804da4645cd64">VideoDecoder</a> ()</td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a5c7b1010b42e179cf51e55266eb1491a">VideoDecoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a0eec2949dd73ef6d52b6782cee3b427d">VideoDecoder</a> (const <a class="el" href="classpp_1_1_video_decoder.html">VideoDecoder</a> &other)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">Initialize</a> (const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">Initialize</a> (const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a2f1a48cf6d2f1854b20e6a747c9b03e3">Decode</a> (uint32_t decode_id, uint32_t size, const void *buffer, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a">GetPicture</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_VideoPicture > &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a7b9c4917ebd205572a0fe69a34f1bfd9">RecyclePicture</a> (const PP_VideoPicture &picture)</td></tr> @@ -36,7 +36,7 @@ <p>Typical usage:</p> <ul> <li>Call Create() to create a new video decoder resource.</li> -<li>Call <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> +<li>Call <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#a2f1a48cf6d2f1854b20e6a747c9b03e3" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> @@ -210,12 +210,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="classpp_1_1_video_decoder.html#aa05481906b07e929c9567bc22a48917a" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="classpp_1_1_video_decoder.html#aa05481906b07e929c9567bc22a48917a" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="a52d1b4e5b5427d3bfb263cdec051274e"></a><!-- doxytag: member="pp::VideoDecoder::Initialize" ref="a52d1b4e5b5427d3bfb263cdec051274e" args="(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const CompletionCallback &callback)" --> +<a class="anchor" id="a284c6a99f5c3ea83465f7eab81ca4ba8"></a><!-- doxytag: member="pp::VideoDecoder::Initialize" ref="a284c6a99f5c3ea83465f7eab81ca4ba8" args="(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const CompletionCallback &callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">pp::VideoDecoder::Initialize</a> </td> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">pp::VideoDecoder::Initialize</a> </td> <td>(</td> <td class="paramtype">const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> & </td> <td class="paramname"><em>graphics3d_context</em>, </td> @@ -235,6 +235,12 @@ <tr> <td class="paramkey"></td> <td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>min_picture_count</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> <td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> <td class="paramname"><em>callback</em> </td> </tr> @@ -253,11 +259,12 @@ <tr><td class="paramdir">[in]</td><td class="paramname">graphics3d_context</td><td>A <code>PPB_Graphics3D</code> resource to use during decoding. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">profile</td><td>A <code>PP_VideoProfile</code> specifying the video codec profile. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">min_picture_count</td><td>A count of pictures the plugin would like to have in flight. This is effectively the number of times the plugin can call <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> and get a decoded frame without calling <a class="el" href="classpp_1_1_video_decoder.html#a7b9c4917ebd205572a0fe69a34f1bfd9" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>. The decoder has its own internal minimum count, and will take the larger of its internal and this value. A client that doesn't care can therefore just pass in zero for this argument. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> </div> </div> <a class="anchor" id="a7b9c4917ebd205572a0fe69a34f1bfd9"></a><!-- doxytag: member="pp::VideoDecoder::RecyclePicture" ref="a7b9c4917ebd205572a0fe69a34f1bfd9" args="(const PP_VideoPicture &picture)" -->
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder-members.html new file mode 100644 index 0000000..1f9a454 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder-members.html
@@ -0,0 +1,40 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>Member List</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +This is the complete list of members for <a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a>, including all inherited members.<table> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">Close</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">Encode</a>(const VideoFrame &video_frame, bool force_keyframe, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">GetBitstreamBuffer</a>(const CompletionCallbackWithOutput< PP_BitstreamBuffer > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">GetFrameCodedSize</a>(Size *coded_size)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">GetFramesRequired</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">GetSupportedProfiles</a>(const CompletionCallbackWithOutput< std::vector< PP_VideoProfileDescription > > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">GetVideoFrame</a>(const CompletionCallbackWithOutput< VideoFrame > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">Initialize</a>(const PP_VideoFrame_Format &input_format, const Size &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">RecycleBitstreamBuffer</a>(const PP_BitstreamBuffer &bitstream_buffer)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">RequestEncodingParametersChange</a>(uint32_t bitrate, uint32_t framerate)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">VideoEncoder</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a479c6cbd73b497c98871d877ef9e0b29">VideoEncoder</a>(const InstanceHandle &instance)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td><code> [explicit]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ad9d09d444a0480153aa5086fda13f064">VideoEncoder</a>(const VideoEncoder &other)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> +</table></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder.html new file mode 100644 index 0000000..c653949 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder.html
@@ -0,0 +1,418 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>pp::VideoEncoder Class Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="pp::VideoEncoder" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader"> +Inheritance diagram for pp::VideoEncoder:</div> +<div class="dyncontent"> +<div class="center"><img src="classpp_1_1_video_encoder__inherit__graph.png" border="0" usemap="#pp_1_1_video_encoder_inherit__map" alt="Inheritance graph" /></div> +<map name="pp_1_1_video_encoder_inherit__map" id="pp_1_1_video_encoder_inherit__map"> +<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="20,5,124,32"></area></map> +<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> +<p><a href="classpp_1_1_video_encoder-members.html">List of all members.</a></p> +<h2> +Public Member Functions</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">VideoEncoder</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a479c6cbd73b497c98871d877ef9e0b29">VideoEncoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ad9d09d444a0480153aa5086fda13f064">VideoEncoder</a> (const <a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a> &other)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">GetSupportedProfiles</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_VideoProfileDescription > > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">Initialize</a> (const PP_VideoFrame_Format &input_format, const <a class="el" href="classpp_1_1_size.html">Size</a> &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">GetFramesRequired</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">GetFrameCodedSize</a> (<a class="el" href="classpp_1_1_size.html">Size</a> *coded_size)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">GetVideoFrame</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">Encode</a> (const <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> &video_frame, bool force_keyframe, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">GetBitstreamBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_BitstreamBuffer > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">RecycleBitstreamBuffer</a> (const PP_BitstreamBuffer &bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">RequestEncodingParametersChange</a> (uint32_t bitrate, uint32_t framerate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">Close</a> ()</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Video encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call Create() to create a new video encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2" title="Gets a blank video frame which can be filled with video data and passed to the encoder.">GetVideoFrame()</a> to get a blank frame and fill it in, or get a video frame from another resource, e.g. <code>PPB_MediaStreamVideoTrack</code>.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd" title="Encodes a video frame.">Encode()</a> to push the video frame to the encoder. If an external frame is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded pictures from the encoder.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available video codecs vary by platform. All: vp8 (software). ChromeOS, depending on your device: h264 (hardware), vp8 (hardware) </p> +</div><hr /><h2>Constructor & Destructor Documentation</h2> +<a class="anchor" id="a6a84b977ee05e00bb2c00519d1893d08"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="a6a84b977ee05e00bb2c00519d1893d08" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code> object. </p> +</div> +</div> +<a class="anchor" id="a479c6cbd73b497c98871d877ef9e0b29"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="a479c6cbd73b497c98871d877ef9e0b29" args="(const InstanceHandle &instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> & </td> +<td class="paramname"><em>instance</em></td><td>)</td> +<td><code> [explicit]</code></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A constructor used to create a <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code> and associate it with the provided <code><a class="el" href="classpp_1_1_instance.html">Instance</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ad9d09d444a0480153aa5086fda13f064"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="ad9d09d444a0480153aa5086fda13f064" args="(const VideoEncoder &other)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a> & </td> +<td class="paramname"><em>other</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The copy constructor for <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code>. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr /><h2>Member Function Documentation</h2> +<a class="anchor" id="a411036495143eb6484b668e2d26c1170"></a><!-- doxytag: member="pp::VideoEncoder::Close" ref="a411036495143eb6484b668e2d26c1170" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">pp::VideoEncoder::Close</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the video encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the video encoder closes it implicitly, so you are not required to call <a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170" title="Closes the video encoder, and cancels any pending encodes.">Close()</a>. </p> +</div> +</div> +<a class="anchor" id="a39755b4e3aee295d8ba509da9904e5cd"></a><!-- doxytag: member="pp::VideoEncoder::Encode" ref="a39755b4e3aee295d8ba509da9904e5cd" args="(const VideoFrame &video_frame, bool force_keyframe, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">pp::VideoEncoder::Encode</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> & </td> +<td class="paramname"><em>video_frame</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">bool </td> +<td class="paramname"><em>force_keyframe</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes a video frame. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_frame</td><td>The <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">force_keyframe</td><td>A <code>PP_Bool> specifying whether the encoder should emit a key frame for this video frame. </code></td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td><code>A </code><code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion. Plugins that pass <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code> An int32_t containing an error code from </code><code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a9c0861d91f7c93cb15cf917ca6d6cf95"></a><!-- doxytag: member="pp::VideoEncoder::GetBitstreamBuffer" ref="a9c0861d91f7c93cb15cf917ca6d6cf95" args="(const CompletionCallbackWithOutput< PP_BitstreamBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">pp::VideoEncoder::GetBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_BitstreamBuffer > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code>PP_BitstreamBuffer</code> containing encoded video data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the next bitstream buffer. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a2112ec6caf60385c1625b85e3697d777"></a><!-- doxytag: member="pp::VideoEncoder::GetFrameCodedSize" ref="a2112ec6caf60385c1625b85e3697d777" args="(Size *coded_size)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">pp::VideoEncoder::GetFrameCodedSize</a> </td> +<td>(</td> +<td class="paramtype"><a class="el" href="classpp_1_1_size.html">Size</a> * </td> +<td class="paramname"><em>coded_size</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the coded size of the video frames required by the encoder. </p> +<p>Coded size is the logical size of the input frames, in pixels. The encoder may have hardware alignment requirements that make this different from |input_visible_size|, as requested in the call to <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">coded_size</td><td>A <code><a class="el" href="classpp_1_1_size.html" title="A size of an object based on width and height.">Size</a></code> to hold the coded size.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ae673a5ebfed4fc3198a405cccecfbe54"></a><!-- doxytag: member="pp::VideoEncoder::GetFramesRequired" ref="ae673a5ebfed4fc3198a405cccecfbe54" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">pp::VideoEncoder::GetFramesRequired</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of input video frames that the encoder may hold while encoding. </p> +<p>If the plugin is providing the video frames, it should have at least this many available.</p> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of frames required, or an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a5c264d3b6ec0a5970cc1dee74dbfaf55"></a><!-- doxytag: member="pp::VideoEncoder::GetSupportedProfiles" ref="a5c264d3b6ec0a5970cc1dee74dbfaf55" args="(const CompletionCallbackWithOutput< std::vector< PP_VideoProfileDescription > > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">pp::VideoEncoder::GetSupportedProfiles</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_VideoProfileDescription > > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported video encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the PP_VideoProfileDescription structs.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a5c5fabe6a00afe6b8849bbc612183bb2"></a><!-- doxytag: member="pp::VideoEncoder::GetVideoFrame" ref="a5c5fabe6a00afe6b8849bbc612183bb2" args="(const CompletionCallbackWithOutput< VideoFrame > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">pp::VideoEncoder::GetVideoFrame</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank video frame which can be filled with video data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the blank <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="ad2c47c10cfe92a3bf41e204d326560c7"></a><!-- doxytag: member="pp::VideoEncoder::Initialize" ref="ad2c47c10cfe92a3bf41e204d326560c7" args="(const PP_VideoFrame_Format &input_format, const Size &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">pp::VideoEncoder::Initialize</a> </td> +<td>(</td> +<td class="paramtype">const PP_VideoFrame_Format & </td> +<td class="paramname"><em>input_format</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_size.html">Size</a> & </td> +<td class="paramname"><em>input_visible_size</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const PP_VideoProfile & </td> +<td class="paramname"><em>output_profile</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const uint32_t </td> +<td class="paramname"><em>initial_bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_HardwareAcceleration </td> +<td class="paramname"><em>acceleration</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a video encoder resource. </p> +<p>This should be called after <a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55" title="Gets an array of supported video encoder profiles.">GetSupportedProfiles()</a> and before any functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">input_format</td><td>The <code>PP_VideoFrame_Format</code> of the frames which will be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_visible_size</td><td>A <code><a class="el" href="classpp_1_1_size.html" title="A size of an object based on width and height.">Size</a></code> specifying the dimensions of the visible part of the input frames. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_VideoProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video encoding is not available, or the requested codec profile is not supported. Returns PP_ERROR_NOMEMORY if frame and bitstream buffers can't be created. </dd></dl> +</div> +</div> +<a class="anchor" id="a81aec23c26a3f9c16ff90efdc38b2895"></a><!-- doxytag: member="pp::VideoEncoder::RecycleBitstreamBuffer" ref="a81aec23c26a3f9c16ff90efdc38b2895" args="(const PP_BitstreamBuffer &bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">pp::VideoEncoder::RecycleBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const PP_BitstreamBuffer & </td> +<td class="paramname"><em>bitstream_buffer</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code>PP_BitstreamBuffer</code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a727159fe366c6ce146dce4c42a608fd7"></a><!-- doxytag: member="pp::VideoEncoder::RequestEncodingParametersChange" ref="a727159fe366c6ce146dce4c42a608fd7" args="(uint32_t bitrate, uint32_t framerate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">pp::VideoEncoder::RequestEncodingParametersChange</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>framerate</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to encoding parameters. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">framerate</td><td>The requested new framerate, in frames per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this class was generated from the following file:<ul> +<li><a class="el" href="video__encoder_8h.html">video_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder__inherit__graph.png b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder__inherit__graph.png new file mode 100644 index 0000000..14d3b23 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_video_encoder__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view-members.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view-members.html index faae169..a080677 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view-members.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view-members.html
@@ -30,7 +30,7 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#aebcd4ab8818a6e1dfe68e2c435823ad9">View</a>()</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td></td></tr> -<tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#a89cc79b6731f0e67d0821fe83b3e64fb">View</a>(PP_Resource view_resource)</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#a89cc79b6731f0e67d0821fe83b3e64fb">View</a>(PP_Resource view_resource)</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td><code> [explicit]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> </table></div><!-- contents --> </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view.html b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view.html index a415406..7f23b4d 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/classpp_1_1_view.html
@@ -60,7 +60,7 @@ <td>(</td> <td class="paramtype">PP_Resource </td> <td class="paramname"><em>view_resource</em></td><td>)</td> -<td></td> +<td><code> [explicit]</code></td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png b/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png index 6aebbb2..056cffd 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/inherit_graph_23.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html index 150ad2b..f1a43a2c 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/inherits.html
@@ -106,7 +106,7 @@ </td></tr> <tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#pp_1_1_resource" /> <map name="pp_1_1_resource" id="pp_1_1_resource"> -<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,689,109,716"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,157,317,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,208,335,235"></area><area shape="rect" id="node7" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,259,297,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,309,300,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,360,315,387"></area><area shape="rect" id="node10" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,411,317,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,512,322,539"></area><area shape="rect" id="node13" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,563,316,589"></area><area shape="rect" id="node14" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,613,315,640"></area><area shape="rect" id="node20" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,664,357,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,765,325,792"></area><area shape="rect" id="node23" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,816,318,843"></area><area shape="rect" id="node24" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,867,317,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,917,331,944"></area><area shape="rect" id="node26" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,968,314,995"></area><area shape="rect" id="node27" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1019,317,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1069,315,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1120,330,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1171,335,1197"></area><area shape="rect" id="node31" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1221,325,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1272,319,1299"></area><area shape="rect" id="node33" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1323,295,1349"></area><area shape="rect" id="node34" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1373,315,1400"></area><area shape="rect" id="node15" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,512,560,539"></area><area shape="rect" id="node16" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,563,579,589"></area><area shape="rect" id="node17" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,613,570,640"></area><area shape="rect" id="node18" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,664,567,691"></area><area shape="rect" id="node19" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,715,568,741"></area></map> +<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,740,109,767"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map> </td></tr> <tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#pp_1_1_size" /> <map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html index d04f649..e888367 100644 --- a/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/namespacepp.html
@@ -20,6 +20,8 @@ <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_config.html">AudioConfig</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">A 16 bit stereo <a class="el" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource.">AudioConfig</a> resource. <a href="classpp_1_1_audio_config.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. <a href="classpp_1_1_audio_encoder.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">This API enables you to implement and receive callbacks when Pepper operations complete asynchronously. <a href="classpp_1_1_completion_callback.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></td></tr> @@ -112,6 +114,8 @@ <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var_dictionary.html">VarDictionary</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html">VideoDecoder</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="classpp_1_1_video_decoder.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="classpp_1_1_video_encoder.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_view.html">View</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">This class represents the state of the view for an instance and contains functions for retrieving the current state of that view. <a href="classpp_1_1_view.html#details">More...</a><br /></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/video__encoder_8h.html b/native_client_sdk/doc_generated/pepper_beta/cpp/video__encoder_8h.html new file mode 100644 index 0000000..2de4073 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/video__encoder_8h.html
@@ -0,0 +1,32 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>video_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for video_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="video__encoder_8h__incl.png" border="0" usemap="#video__encoder_8h" alt="" /></div> +<map name="video__encoder_8h" id="video__encoder_8h"> +</map> +</div> +</div><h2> +Classes</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="classpp_1_1_video_encoder.html#details">More...</a><br /></td></tr> +</table><h2> +Namespaces</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the API to create and use a VideoEncoder resource. </p> +</div></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/cpp/video__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_beta/cpp/video__encoder_8h__incl.png new file mode 100644 index 0000000..553cbab9 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_beta/cpp/video__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_beta/index.html b/native_client_sdk/doc_generated/pepper_beta/index.html index 882199b..c830c8f 100644 --- a/native_client_sdk/doc_generated/pepper_beta/index.html +++ b/native_client_sdk/doc_generated/pepper_beta/index.html
@@ -2,8 +2,8 @@ <section id="pepper-api-reference-beta"> <h1 id="pepper-api-reference-beta">Pepper API Reference (Beta)</h1> -<p>This page lists the API for Pepper 41. Apps that use this API can -run in Chrome 41 or higher.</p> +<p>This page lists the API for Pepper 48. Apps that use this API can +run in Chrome 48 or higher.</p> <h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/c-api-beta.html#pepper-beta-c-index"><em>Pepper C API Reference</em></a></h2> <h2 id="id1"><a class="reference internal" href="/native-client/cpp-api-beta.html#pepper-beta-cpp-index"><em>Pepper C++ API Reference</em></a></h2> </section>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html index ec7106fe..b08950b1 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/globals_defs.html
@@ -31,6 +31,9 @@ <li>PPB_AUDIOBUFFER_INTERFACE_0_1 : <a class="el" href="ppb__audio__buffer_8h.html#a4fddf6d285021552ba11f4460ba47445">ppb_audio_buffer.h</a> </li> +<li>PPB_AUDIOENCODER_INTERFACE_0_1 +: <a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">ppb_audio_encoder.h</a> +</li> <li>PPB_COMPOSITOR_INTERFACE_0_1 : <a class="el" href="ppb__compositor_8h.html#ac8b0ddbdff260dd5531525784556c045">ppb_compositor.h</a> </li> @@ -55,9 +58,6 @@ <li>PPB_FILEIO_INTERFACE_1_1 : <a class="el" href="ppb__file__io_8h.html#aee417de3562daef62dbf68ddc16a8477">ppb_file_io.h</a> </li> -<li>PPB_FILEMAPPING_INTERFACE_0_1 -: <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">ppb_file_mapping.h</a> -</li> <li>PPB_FILEREF_INTERFACE : <a class="el" href="ppb__file__ref_8h.html#a00615ce99f7d6774b0fc5c8f0326f0ba">ppb_file_ref.h</a> </li> @@ -262,8 +262,8 @@ <li>PPB_UDPSOCKET_INTERFACE : <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">ppb_udp_socket.h</a> </li> -<li>PPB_UDPSOCKET_INTERFACE_1_1 -: <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">ppb_udp_socket.h</a> +<li>PPB_UDPSOCKET_INTERFACE_1_2 +: <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">ppb_udp_socket.h</a> </li> <li>PPB_URLLOADER_INTERFACE : <a class="el" href="ppb__url__loader_8h.html#ae1fa8c5cdfccb7ea67e184b1e5e1009e">ppb_url_loader.h</a> @@ -310,8 +310,14 @@ <li>PPB_VIDEODECODER_INTERFACE : <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">ppb_video_decoder.h</a> </li> -<li>PPB_VIDEODECODER_INTERFACE_1_0 -: <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">ppb_video_decoder.h</a> +<li>PPB_VIDEODECODER_INTERFACE_1_1 +: <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">ppb_video_decoder.h</a> +</li> +<li>PPB_VIDEOENCODER_INTERFACE +: <a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">ppb_video_encoder.h</a> +</li> +<li>PPB_VIDEOENCODER_INTERFACE_0_2 +: <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">ppb_video_encoder.h</a> </li> <li>PPB_VIDEOFRAME_INTERFACE : <a class="el" href="ppb__video__frame_8h.html#ac161d8c49f583eda31622d9fc010cd0d">ppb_video_frame.h</a>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html b/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html index 3bd2e7d..f5d7907 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/group___enums.html
@@ -34,6 +34,9 @@ <a class="el" href="group___enums.html#gga4d50d27186f68b2de578e82162206feaa884e0f18fee1bae2472a15f6fb1d7e79">PP_VIDEOPROFILE_MAX</a> = PP_VIDEOPROFILE_VP9_ANY <br /> }</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> { <a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191">PP_AUDIOPROFILE_OPUS</a> = 0, +<a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77">PP_AUDIOPROFILE_MAX</a> = PP_AUDIOPROFILE_OPUS + }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> { <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5a6208cea63b7e6c1c8c9c67616df4ba85">PP_HARDWAREACCELERATION_ONLY</a> = 0, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5ad29490655cc25165817de26c5caff7ea">PP_HARDWAREACCELERATION_WITHFALLBACK</a> = 1, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5acf901685e6e14afe89e7d22ad35af4e1">PP_HARDWAREACCELERATION_NONE</a> = 2, @@ -189,13 +192,6 @@ <a class="el" href="group___enums.html#gga4c87e6dd19c1d49b66a9b37136a82e82a78c13cbbccebfa9c2b8b2f758397795c">PP_FILEOPENFLAG_APPEND</a> = 1 << 5 <br /> }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a> { <a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb">PP_FILEMAPPROTECTION_READ</a> = 1u << 0, -<a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e">PP_FILEMAPPROTECTION_WRITE</a> = 1u << 1 - }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a> { <a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c">PP_FILEMAPFLAG_SHARED</a> = 1u << 0, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03">PP_FILEMAPFLAG_PRIVATE</a> = 1u << 1, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e">PP_FILEMAPFLAG_FIXED</a> = 1u << 2 - }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadcb0a92e6ca510586c3f34088d35dc9f">PP_MakeDirectoryFlags</a> { <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fafeeef418b62780276c4671a57196ad3f">PP_MAKEDIRECTORYFLAG_NONE</a> = 0 << 0, <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fa5c7f89c8784c9d8abfaeae51d9cb84ba">PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS</a> = 1 << 0, <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fa34dd5b5ba9af9e5c820d3c6e21fc2094">PP_MAKEDIRECTORYFLAG_EXCLUSIVE</a> = 1 << 1 @@ -373,10 +369,15 @@ <a class="el" href="group___enums.html#gga5fef49ee4c2cc6dcead825340da0f116ad4371ecdd1a6631a78d4721d83062394">PP_TEXTINPUT_TYPE_URL</a> = 7 <br /> }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00">PP_UDPSOCKET_OPTION_BROADCAST</a> = 1, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57">PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</a> = 2, -<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3 +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3, +<br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c">PP_UDPSOCKET_OPTION_MULTICAST_LOOP</a> = 4, +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82">PP_UDPSOCKET_OPTION_MULTICAST_TTL</a> = 5 +<br /> }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga41975630f0a4c49e47d4a21754f8402d">PP_URLRequestProperty</a> { <br />   <a class="el" href="group___enums.html#gga41975630f0a4c49e47d4a21754f8402da89e44812e771fed9df0ff8994690e44d">PP_URLREQUESTPROPERTY_URL</a> = 0, @@ -464,8 +465,6 @@ <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gaee750c350655f2fb0fe04c04029e0ff8">PP_AudioSampleRate</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gac39067c0883ec80b94290dd2a3bae440">PP_LogLevel</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga4c87e6dd19c1d49b66a9b37136a82e82">PP_FileOpenFlags</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadb4b8db19266831040fc604f73c83a25">PP_HostResolver_Flag</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2ee7ad01799553e5f17bdaa35dd952ee">PP_ImageDataFormat</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gaca7296cfec99fcb6646b7144d1d6a0c5">PP_InputEvent_Type</a></td></tr> @@ -713,6 +712,27 @@ </dl> </div> </div> +<a class="anchor" id="gadadb1eaddb4ea71cb8620db1f4ce301e"></a><!-- doxytag: member="pp_codecs.h::PP_AudioProfile" ref="gadadb1eaddb4ea71cb8620db1f4ce301e" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">enum <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Audio profiles. </p> +<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> +<tr><td valign="top"><em><a class="anchor" id="ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191"></a><!-- doxytag: member="PP_AUDIOPROFILE_OPUS" ref="ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191" args="" -->PP_AUDIOPROFILE_OPUS</em> </td><td> +</td></tr> +<tr><td valign="top"><em><a class="anchor" id="ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77"></a><!-- doxytag: member="PP_AUDIOPROFILE_MAX" ref="ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77" args="" -->PP_AUDIOPROFILE_MAX</em> </td><td> +</td></tr> +</table> +</dd> +</dl> +</div> +</div> <a class="anchor" id="gaee750c350655f2fb0fe04c04029e0ff8"></a><!-- doxytag: member="ppb_audio_config.h::PP_AudioSampleRate" ref="gaee750c350655f2fb0fe04c04029e0ff8" args="" --> <div class="memitem"> <div class="memproto"> @@ -814,59 +834,6 @@ </dl> </div> </div> -<a class="anchor" id="ga47ce032e16d18ba6fc6c16bbe8939bad"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapFlags" ref="ga47ce032e16d18ba6fc6c16bbe8939bad" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">enum <a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>The PP_FileMapFlags contain flag values for use with Map(). </p> -<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c"></a><!-- doxytag: member="PP_FILEMAPFLAG_SHARED" ref="gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c" args="" -->PP_FILEMAPFLAG_SHARED</em> </td><td> -<p>Requests a shared mapping. </p> -<p>If this flag is set, changes written to the memory region will be reflected in the underlying file and will thus eventually be visible to other processes which have opened the file. The file may not actually be updated until Unmap() is called. This is only valid if the PPB_FileIO resource was opened with write permission. </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03"></a><!-- doxytag: member="PP_FILEMAPFLAG_PRIVATE" ref="gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03" args="" -->PP_FILEMAPFLAG_PRIVATE</em> </td><td> -<p>Requests a copy-on-write mapping. </p> -<p>If this flag is set, changes are not written to the underlying file, but only in the memory of the process (copy-on-write). </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e"></a><!-- doxytag: member="PP_FILEMAPFLAG_FIXED" ref="gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e" args="" -->PP_FILEMAPFLAG_FIXED</em> </td><td> -<p>Forces Map() to map the file contents at the provided |address|. </p> -<p>If Map() can not comply, Map() will fail. </p> -</td></tr> -</table> -</dd> -</dl> -</div> -</div> -<a class="anchor" id="ga07cb383dee51bc7e8e1f234068652668"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapProtection" ref="ga07cb383dee51bc7e8e1f234068652668" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">enum <a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>The PP_FileMapProtection values indicate the permissions requested for the file mapping. </p> -<p>These should be used in a uint32_t bitfield. </p> -<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> -<tr><td valign="top"><em><a class="anchor" id="gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb"></a><!-- doxytag: member="PP_FILEMAPPROTECTION_READ" ref="gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb" args="" -->PP_FILEMAPPROTECTION_READ</em> </td><td> -<p>Requests read access to the mapped address. </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e"></a><!-- doxytag: member="PP_FILEMAPPROTECTION_WRITE" ref="gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e" args="" -->PP_FILEMAPPROTECTION_WRITE</em> </td><td> -<p>Requests write access to the mapped address. </p> -</td></tr> -</table> -</dd> -</dl> -</div> -</div> <a class="anchor" id="ga4c87e6dd19c1d49b66a9b37136a82e82"></a><!-- doxytag: member="ppb_file_io.h::PP_FileOpenFlags" ref="ga4c87e6dd19c1d49b66a9b37136a82e82" args="" --> <div class="memitem"> <div class="memproto"> @@ -1753,6 +1720,16 @@ <p>Value's type should be <code>PP_VARTYPE_INT32</code>. On version 1.0, this option can only be set after a successful <code>Bind()</code> call. On version 1.1 or later, there is no such limitation.</p> <p>Note: This is only treated as a hint for the browser to set the buffer size. Even if <code>SetOption()</code> succeeds, the browser doesn't guarantee it will conform to the size. </p> </td></tr> +<tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_MULTICAST_LOOP" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c" args="" -->PP_UDPSOCKET_OPTION_MULTICAST_LOOP</em> </td><td> +<p>Specifies whether the packets sent from the host to the multicast group should be looped back to the host or not. </p> +<p>Value's type should be <code>PP_VARTYPE_BOOL</code>. This option can only be set before calling <code>Bind()</code>.</p> +<p>This is only supported in version 1.2 of the API (Chrome 43) and later. </p> +</td></tr> +<tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_MULTICAST_TTL" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82" args="" -->PP_UDPSOCKET_OPTION_MULTICAST_TTL</em> </td><td> +<p>Specifies the time-to-live for packets sent to the multicast group. </p> +<p>The value should be within 0 to 255 range. The default value is 1 and means that packets will not be routed beyond the local network. Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set before calling <code>Bind()</code>.</p> +<p>This is only supported in version 1.2 of the API (Chrome 43) and later. </p> +</td></tr> </table> </dd> </dl> @@ -2178,30 +2155,6 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga47ce032e16d18ba6fc6c16bbe8939bad"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapFlags" ref="ga47ce032e16d18ba6fc6c16bbe8939bad" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> -<a class="anchor" id="ga07cb383dee51bc7e8e1f234068652668"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapProtection" ref="ga07cb383dee51bc7e8e1f234068652668" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> <a class="anchor" id="ga4c87e6dd19c1d49b66a9b37136a82e82"></a><!-- doxytag: member="ppb_file_io.h::PP_FileOpenFlags" ref="ga4c87e6dd19c1d49b66a9b37136a82e82" args="" --> <div class="memitem"> <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html index e4a64ed8..72f88bb 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/group___interfaces.html
@@ -16,6 +16,8 @@ <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_AudioConfig</code> interface contains pointers to several functions for establishing your audio configuration within the browser. <a href="struct_p_p_b___audio_config__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Audio encoder interface. <a href="struct_p_p_b___audio_encoder__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___compositor__0__1.html">PPB_Compositor</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Defines the <code>PPB_Compositor</code> interface. <a href="struct_p_p_b___compositor__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___compositor_layer__0__2.html">PPB_CompositorLayer</a></td></tr> @@ -25,8 +27,6 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_Core</code> interface contains pointers to functions related to memory management, time, and threads on the browser. <a href="struct_p_p_b___core__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_FileIO</code> struct is used to operate on a regular file (PP_FileType_Regular). <a href="struct_p_p_b___file_i_o__1__1.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. <a href="struct_p_p_b___file_mapping__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_FileRef</code> struct represents a "weak pointer" to a file in a file system. <a href="struct_p_p_b___file_ref__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></td></tr> @@ -94,8 +94,8 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_TCPSocket</code> interface provides TCP socket operations. <a href="struct_p_p_b___t_c_p_socket__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code>PPB_TextInputController</code> provides a set of functions for giving hints to the browser about the text input status of plugins, and functions for controlling input method editors (IMEs). <a href="struct_p_p_b___text_input_controller__1__0.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <b>PPB_URLLoader</b> interface contains pointers to functions for loading URLs. <a href="struct_p_p_b___u_r_l_loader__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></td></tr> @@ -109,8 +109,10 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_VarArrayBuffer</code> interface provides a way to interact with JavaScript ArrayBuffers, which represent a contiguous sequence of bytes. <a href="struct_p_p_b___var_array_buffer__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">A dictionary var contains key-value pairs with unique keys. <a href="struct_p_p_b___var_dictionary__1__0.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="struct_p_p_b___video_encoder__0__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code>PPB_View</code> represents the state of the view of an instance. <a href="struct_p_p_b___view__1__2.html#details">More...</a><br /></td></tr> @@ -169,7 +171,7 @@ <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga68e25baffc8cfc72d6c636a3a6217aa0">PPB_TCPSocket</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab387085f6044f3a0b1631d119d22a942">PPB_TextInputController</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga03552c99ad9e2a408a988822f834f548">PPB_UDPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga307f562a9e41991de7c80b75cd7f379c">PPB_URLLoader</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad60387934d9e235d3d145ee5a1fb4e74">PPB_URLRequestInfo</a></td></tr> @@ -181,7 +183,8 @@ <a class="el" href="struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab26d5bb032f5438d02faf5bdf7b208cb">PPB_VarArrayBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga69826004b5c32232c9639090f3e1db2e">PPB_VarDictionary</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaa76d004c840f6c4f64a0694e7c844ae9">PPB_VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga116e11e23c92c99094c9704d97636a67">PPB_View</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad0e152d14cefb0b480228f3fc7070faf">PPB_WebSocket</a></td></tr> @@ -566,12 +569,12 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga03552c99ad9e2a408a988822f834f548"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSocket" ref="ga03552c99ad9e2a408a988822f834f548" args="" --> +<a class="anchor" id="gac45ce5bed449ca63680c4769663fd2b1"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSocket" ref="gac45ce5bed449ca63680c4769663fd2b1" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a> <a class="el" href="group___interfaces.html#ga03552c99ad9e2a408a988822f834f548">PPB_UDPSocket</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> <a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td> </tr> </table> </div> @@ -662,12 +665,24 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga2b4555d8bd239fa28b60c42df75f7ce5"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VideoDecoder" ref="ga2b4555d8bd239fa28b60c42df75f7ce5" args="" --> +<a class="anchor" id="ga3bfb47f476c3153e5638265c17702ed9"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VideoDecoder" ref="ga3bfb47f476c3153e5638265c17702ed9" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> <a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> <a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +<a class="anchor" id="ga1a72f170f2aaa94cd41aa16949e27973"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VideoEncoder" ref="ga1a72f170f2aaa94cd41aa16949e27973" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> <a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/group___structs.html b/native_client_sdk/doc_generated/pepper_dev/c/group___structs.html index 1bf6366..1bbd2a7 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/group___structs.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/group___structs.html
@@ -17,6 +17,16 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported audio profile information. <a href="struct_p_p___audio_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a bitstream buffer. <a href="struct_p_p___bitstream_buffer.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing an audio bitstream buffer. <a href="struct_p_p___audio_bitstream_buffer.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> is a common mechanism for supporting potentially asynchronous calls in browser interfaces. <a href="struct_p_p___completion_callback.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___directory_entry.html">PP_DirectoryEntry</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h.html index c9cbed88..5e4b639 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h.html
@@ -23,6 +23,16 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported audio profile information. <a href="struct_p_p___audio_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a bitstream buffer. <a href="struct_p_p___bitstream_buffer.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing an audio bitstream buffer. <a href="struct_p_p___audio_bitstream_buffer.html#details">More...</a><br /></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> { <br /> @@ -45,6 +55,9 @@ <a class="el" href="group___enums.html#gga4d50d27186f68b2de578e82162206feaa884e0f18fee1bae2472a15f6fb1d7e79">PP_VIDEOPROFILE_MAX</a> = PP_VIDEOPROFILE_VP9_ANY <br /> }</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> { <a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191">PP_AUDIOPROFILE_OPUS</a> = 0, +<a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77">PP_AUDIOPROFILE_MAX</a> = PP_AUDIOPROFILE_OPUS + }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> { <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5a6208cea63b7e6c1c8c9c67616df4ba85">PP_HARDWAREACCELERATION_ONLY</a> = 0, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5ad29490655cc25165817de26c5caff7ea">PP_HARDWAREACCELERATION_WITHFALLBACK</a> = 1, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5acf901685e6e14afe89e7d22ad35af4e1">PP_HARDWAREACCELERATION_NONE</a> = 2,
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h__incl.png index e74f895..d5c4e9a 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h__incl.png +++ b/native_client_sdk/doc_generated/pepper_dev/c/pp__codecs_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__encoder_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__encoder_8h.html new file mode 100644 index 0000000..04270d5 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__encoder_8h.html
@@ -0,0 +1,45 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>ppb_audio_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for ppb_audio_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="ppb__audio__encoder_8h__incl.png" border="0" usemap="#ppb__audio__encoder_8h" alt="" /></div> +<map name="ppb__audio__encoder_8h" id="ppb__audio__encoder_8h"> +</map> +</div> +</div><h2> +Data Structures</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Audio encoder interface. <a href="struct_p_p_b___audio_encoder__0__1.html#details">More...</a><br /></td></tr> +</table><h2> +Defines</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">PPB_AUDIOENCODER_INTERFACE</a>   "PPB_AudioEncoder;0.1" /* dev */</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the <code>PPB_AudioEncoder</code> interface. </p> +</div><hr /><h2>Define Documentation</h2> +<a class="anchor" id="a4c4871532f8ac42a5a98f9f0aaac27a6"></a><!-- doxytag: member="ppb_audio_encoder.h::PPB_AUDIOENCODER_INTERFACE" ref="a4c4871532f8ac42a5a98f9f0aaac27a6" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">PPB_AUDIOENCODER_INTERFACE</a>   "PPB_AudioEncoder;0.1" /* dev */</td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__encoder_8h__incl.png new file mode 100644 index 0000000..0e98fe6 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__audio__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__mapping_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__mapping_8h.html deleted file mode 100644 index c5aba956..0000000 --- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__mapping_8h.html +++ /dev/null
@@ -1,58 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>ppb_file_mapping.h File Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<div class="textblock"><div class="dynheader"> -Include dependency graph for ppb_file_mapping.h:</div> -<div class="dyncontent"> -<div class="center"><img src="ppb__file__mapping_8h__incl.png" border="0" usemap="#ppb__file__mapping_8h" alt="" /></div> -<map name="ppb__file__mapping_8h" id="ppb__file__mapping_8h"> -</map> -</div> -</div><h2> -Data Structures</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. <a href="struct_p_p_b___file_mapping__0__1.html#details">More...</a><br /></td></tr> -</table><h2> -Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">PPB_FILEMAPPING_INTERFACE</a>   "PPB_FileMapping;0.1" /* dev */</td></tr> -</table><h2> -Enumerations</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a> { <a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb">PP_FILEMAPPROTECTION_READ</a> = 1u << 0, -<a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e">PP_FILEMAPPROTECTION_WRITE</a> = 1u << 1 - }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a> { <a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c">PP_FILEMAPFLAG_SHARED</a> = 1u << 0, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03">PP_FILEMAPFLAG_PRIVATE</a> = 1u << 1, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e">PP_FILEMAPFLAG_FIXED</a> = 1u << 2 - }</td></tr> -</table><h2> -Variables</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>This file defines methods for mapping and unmapping files into and out of memory. </p> -</div><hr /><h2>Define Documentation</h2> -<a class="anchor" id="a657d5d4684814f79fd2c764fd8aa540e"></a><!-- doxytag: member="ppb_file_mapping.h::PPB_FILEMAPPING_INTERFACE" ref="a657d5d4684814f79fd2c764fd8aa540e" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">#define <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">PPB_FILEMAPPING_INTERFACE</a>   "PPB_FileMapping;0.1" /* dev */</td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__mapping_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__mapping_8h__incl.png deleted file mode 100644 index 45abc54..0000000 --- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__file__mapping_8h__incl.png +++ /dev/null Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__udp__socket_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__udp__socket_8h.html index 130ae3d..b26a466 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__udp__socket_8h.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__udp__socket_8h.html
@@ -19,21 +19,26 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__2.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.1"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga03552c99ad9e2a408a988822f834f548">PPB_UDPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00">PP_UDPSOCKET_OPTION_BROADCAST</a> = 1, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57">PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</a> = 2, -<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3 +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3, +<br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c">PP_UDPSOCKET_OPTION_MULTICAST_LOOP</a> = 4, +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82">PP_UDPSOCKET_OPTION_MULTICAST_TTL</a> = 5 +<br /> }</td></tr> </table><h2> Variables</h2><table class="memberdecls"> @@ -47,19 +52,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="a756bacac14becc5cbc2efedcd3ccd509"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSOCKET_INTERFACE" ref="a756bacac14becc5cbc2efedcd3ccd509" args="" --> +<a class="anchor" id="ad6bc6ae5b1d72251b6b81fdd7d8009f7"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSOCKET_INTERFACE" ref="ad6bc6ae5b1d72251b6b81fdd7d8009f7" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a756bacac14becc5cbc2efedcd3ccd509">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.1"</td> +<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.2"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__decoder_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__decoder_8h.html index 212d41ab..51449aa 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__decoder_8h.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__decoder_8h.html
@@ -19,15 +19,15 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__1.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.0"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.1"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>This file defines the <code>PPB_VideoDecoder</code> interface. </p> @@ -37,19 +37,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="af814c8f0028bce254da6fb5c3e61a4d8"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VIDEODECODER_INTERFACE" ref="af814c8f0028bce254da6fb5c3e61a4d8" args="" --> +<a class="anchor" id="ac9994bddaa7ccc8f52799a00031d5441"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VIDEODECODER_INTERFACE" ref="ac9994bddaa7ccc8f52799a00031d5441" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.0"</td> +<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.1"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__encoder_8h.html b/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__encoder_8h.html new file mode 100644 index 0000000..7c900c39 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__encoder_8h.html
@@ -0,0 +1,61 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>ppb_video_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for ppb_video_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="ppb__video__encoder_8h__incl.png" border="0" usemap="#ppb__video__encoder_8h" alt="" /></div> +<map name="ppb__video__encoder_8h" id="ppb__video__encoder_8h"> +</map> +</div> +</div><h2> +Data Structures</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="struct_p_p_b___video_encoder__0__2.html#details">More...</a><br /></td></tr> +</table><h2> +Defines</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a>   "PPB_VideoEncoder;0.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">PPB_VIDEOENCODER_INTERFACE</a>   <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a></td></tr> +</table><h2> +Typedefs</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the <code>PPB_VideoEncoder</code> interface. </p> +</div><hr /><h2>Define Documentation</h2> +<a class="anchor" id="abdb2ab6ab0553f6b0086aee71996ea3d"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VIDEOENCODER_INTERFACE" ref="abdb2ab6ab0553f6b0086aee71996ea3d" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">PPB_VIDEOENCODER_INTERFACE</a>   <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +<a class="anchor" id="af8c3e2794a4f7f9cbd6c253cbacfe177"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VIDEOENCODER_INTERFACE" ref="af8c3e2794a4f7f9cbd6c253cbacfe177" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a>   "PPB_VideoEncoder;0.2"</td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__encoder_8h__incl.png new file mode 100644 index 0000000..6ecf7208 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/ppb__video__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___audio_bitstream_buffer.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___audio_bitstream_buffer.html new file mode 100644 index 0000000..8cdf217 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___audio_bitstream_buffer.html
@@ -0,0 +1,52 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_AudioBitstreamBuffer Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_AudioBitstreamBuffer" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html#ab76b8c0357d850c84ff417aa1282f3da">size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html#a888a0bc135ab6e5e434927309eb5fe9a">buffer</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Struct describing an audio bitstream buffer. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a888a0bc135ab6e5e434927309eb5fe9a"></a><!-- doxytag: member="PP_AudioBitstreamBuffer::buffer" ref="a888a0bc135ab6e5e434927309eb5fe9a" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void* <a class="el" href="struct_p_p___audio_bitstream_buffer.html#a888a0bc135ab6e5e434927309eb5fe9a">PP_AudioBitstreamBuffer::buffer</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The base address of the bitstream data. </p> +</div> +</div> +<a class="anchor" id="ab76b8c0357d850c84ff417aa1282f3da"></a><!-- doxytag: member="PP_AudioBitstreamBuffer::size" ref="ab76b8c0357d850c84ff417aa1282f3da" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_bitstream_buffer.html#ab76b8c0357d850c84ff417aa1282f3da">PP_AudioBitstreamBuffer::size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The size, in bytes, of the bitstream data. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___audio_profile_description.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___audio_profile_description.html new file mode 100644 index 0000000..ba55b78 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___audio_profile_description.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_AudioProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_AudioProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a4253ebb9ec2065525a4b9c948111d896">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a4806e98fc63b158b26b293c4de803667">max_channels</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a1a340d0676442d0dfad60219c6dd3886">sample_size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a266fce27c0c60cd5648ec331da9f04cf">sample_rate</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a3f77a750a3d903e565deae13d8d814b4">hardware_accelerated</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported audio profile information. </p> +<p>See the PPB_AudioEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a3f77a750a3d903e565deae13d8d814b4"></a><!-- doxytag: member="PP_AudioProfileDescription::hardware_accelerated" ref="a3f77a750a3d903e565deae13d8d814b4" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___audio_profile_description.html#a3f77a750a3d903e565deae13d8d814b4">PP_AudioProfileDescription::hardware_accelerated</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the profile is hardware accelerated. </p> +</div> +</div> +<a class="anchor" id="a4806e98fc63b158b26b293c4de803667"></a><!-- doxytag: member="PP_AudioProfileDescription::max_channels" ref="a4806e98fc63b158b26b293c4de803667" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a4806e98fc63b158b26b293c4de803667">PP_AudioProfileDescription::max_channels</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Maximum number of channels that can be encoded. </p> +</div> +</div> +<a class="anchor" id="a4253ebb9ec2065525a4b9c948111d896"></a><!-- doxytag: member="PP_AudioProfileDescription::profile" ref="a4253ebb9ec2065525a4b9c948111d896" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> <a class="el" href="struct_p_p___audio_profile_description.html#a4253ebb9ec2065525a4b9c948111d896">PP_AudioProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<a class="anchor" id="a266fce27c0c60cd5648ec331da9f04cf"></a><!-- doxytag: member="PP_AudioProfileDescription::sample_rate" ref="a266fce27c0c60cd5648ec331da9f04cf" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a266fce27c0c60cd5648ec331da9f04cf">PP_AudioProfileDescription::sample_rate</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Sampling rate that can be encoded. </p> +</div> +</div> +<a class="anchor" id="a1a340d0676442d0dfad60219c6dd3886"></a><!-- doxytag: member="PP_AudioProfileDescription::sample_size" ref="a1a340d0676442d0dfad60219c6dd3886" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a1a340d0676442d0dfad60219c6dd3886">PP_AudioProfileDescription::sample_size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Sample size. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___bitstream_buffer.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___bitstream_buffer.html new file mode 100644 index 0000000..a97c869 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___bitstream_buffer.html
@@ -0,0 +1,66 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_BitstreamBuffer Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_BitstreamBuffer" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#aaa6f173b3478e960f26d87ae417f5d09">size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#a864bd5618ebcdb6bb743e5699c0dff39">buffer</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#a4ae08468a70d30e5d8124d713f8e8c47">key_frame</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Struct describing a bitstream buffer. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a864bd5618ebcdb6bb743e5699c0dff39"></a><!-- doxytag: member="PP_BitstreamBuffer::buffer" ref="a864bd5618ebcdb6bb743e5699c0dff39" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void* <a class="el" href="struct_p_p___bitstream_buffer.html#a864bd5618ebcdb6bb743e5699c0dff39">PP_BitstreamBuffer::buffer</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The base address of the bitstream data. </p> +</div> +</div> +<a class="anchor" id="a4ae08468a70d30e5d8124d713f8e8c47"></a><!-- doxytag: member="PP_BitstreamBuffer::key_frame" ref="a4ae08468a70d30e5d8124d713f8e8c47" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___bitstream_buffer.html#a4ae08468a70d30e5d8124d713f8e8c47">PP_BitstreamBuffer::key_frame</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the buffer represents a key frame. </p> +</div> +</div> +<a class="anchor" id="aaa6f173b3478e960f26d87ae417f5d09"></a><!-- doxytag: member="PP_BitstreamBuffer::size" ref="aaa6f173b3478e960f26d87ae417f5d09" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___bitstream_buffer.html#aaa6f173b3478e960f26d87ae417f5d09">PP_BitstreamBuffer::size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The size, in bytes, of the bitstream data. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___video_profile_description.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___video_profile_description.html new file mode 100644 index 0000000..54ea6d9 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___video_profile_description.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_VideoProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_VideoProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa4cf8bf248f49de606d5bda97c5b4ae1">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa53694c107dc67256986b95e62ca13a2">max_resolution</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#a21f8d2e8f5b995afb27edd43667f3eed">max_framerate_numerator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa4b5113713acbb32d92145ac9f3a925f">max_framerate_denominator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#a10da7a8d059171fcf5bd907a6d9c0e60">hardware_accelerated</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported video profile information. </p> +<p>See the PPB_VideoEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a10da7a8d059171fcf5bd907a6d9c0e60"></a><!-- doxytag: member="PP_VideoProfileDescription::hardware_accelerated" ref="a10da7a8d059171fcf5bd907a6d9c0e60" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___video_profile_description.html#a10da7a8d059171fcf5bd907a6d9c0e60">PP_VideoProfileDescription::hardware_accelerated</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the profile is hardware accelerated. </p> +</div> +</div> +<a class="anchor" id="aa4b5113713acbb32d92145ac9f3a925f"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_denominator" ref="aa4b5113713acbb32d92145ac9f3a925f" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description.html#aa4b5113713acbb32d92145ac9f3a925f">PP_VideoProfileDescription::max_framerate_denominator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The denominator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="a21f8d2e8f5b995afb27edd43667f3eed"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_numerator" ref="a21f8d2e8f5b995afb27edd43667f3eed" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description.html#a21f8d2e8f5b995afb27edd43667f3eed">PP_VideoProfileDescription::max_framerate_numerator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The numerator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="aa53694c107dc67256986b95e62ca13a2"></a><!-- doxytag: member="PP_VideoProfileDescription::max_resolution" ref="aa53694c107dc67256986b95e62ca13a2" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> <a class="el" href="struct_p_p___video_profile_description.html#aa53694c107dc67256986b95e62ca13a2">PP_VideoProfileDescription::max_resolution</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Dimensions of the maximum resolution of video frames, in pixels. </p> +</div> +</div> +<a class="anchor" id="aa4cf8bf248f49de606d5bda97c5b4ae1"></a><!-- doxytag: member="PP_VideoProfileDescription::profile" ref="aa4cf8bf248f49de606d5bda97c5b4ae1" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> <a class="el" href="struct_p_p___video_profile_description.html#aa4cf8bf248f49de606d5bda97c5b4ae1">PP_VideoProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___video_profile_description__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___video_profile_description__0__1.html new file mode 100644 index 0000000..a6d7c86 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p___video_profile_description__0__1.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_VideoProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_VideoProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a97e76f7bc9c271fdd8b8964670711f65">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#ab3ffdab3497ff29df3d31e44c560f2f4">max_resolution</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a01c7a68c5b96c3d2cc048e35d82330dd">max_framerate_numerator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a5339510fd2f94fde1e83f81b9bd47aa8">max_framerate_denominator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a4d558d8ca3c8903544cb1f12c07d2a42">acceleration</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported video profile information. </p> +<p>See the PPB_VideoEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a4d558d8ca3c8903544cb1f12c07d2a42"></a><!-- doxytag: member="PP_VideoProfileDescription::acceleration" ref="a4d558d8ca3c8903544cb1f12c07d2a42" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#a4d558d8ca3c8903544cb1f12c07d2a42">PP_VideoProfileDescription::acceleration</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A value indicating if the profile is available in hardware, software, or both. </p> +</div> +</div> +<a class="anchor" id="a5339510fd2f94fde1e83f81b9bd47aa8"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_denominator" ref="a5339510fd2f94fde1e83f81b9bd47aa8" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description__0__1.html#a5339510fd2f94fde1e83f81b9bd47aa8">PP_VideoProfileDescription::max_framerate_denominator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The denominator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="a01c7a68c5b96c3d2cc048e35d82330dd"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_numerator" ref="a01c7a68c5b96c3d2cc048e35d82330dd" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description__0__1.html#a01c7a68c5b96c3d2cc048e35d82330dd">PP_VideoProfileDescription::max_framerate_numerator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The numerator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="ab3ffdab3497ff29df3d31e44c560f2f4"></a><!-- doxytag: member="PP_VideoProfileDescription::max_resolution" ref="ab3ffdab3497ff29df3d31e44c560f2f4" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#ab3ffdab3497ff29df3d31e44c560f2f4">PP_VideoProfileDescription::max_resolution</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Dimensions of the maximum resolution of video frames, in pixels. </p> +</div> +</div> +<a class="anchor" id="a97e76f7bc9c271fdd8b8964670711f65"></a><!-- doxytag: member="PP_VideoProfileDescription::profile" ref="a97e76f7bc9c271fdd8b8964670711f65" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#a97e76f7bc9c271fdd8b8964670711f65">PP_VideoProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_encoder__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_encoder__0__1.html new file mode 100644 index 0000000..1b01f3e --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___audio_encoder__0__1.html
@@ -0,0 +1,286 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PPB_AudioEncoder Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PPB_AudioEncoder" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a63e54ec7e63e940c59c1b365669a5002">IsAudioEncoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61">GetSupportedProfiles</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t channels, <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> input_sample_rate, <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> input_sample_size, <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a49a627f22227a877391f2f569a4490ff">GetNumberOfSamples</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f">GetBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3">Encode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529">GetBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80">RecycleBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, const struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac5a8cbc3578816a15f3418882b6b720c">RequestBitrateChange</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t bitrate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Audio encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110" title="Creates a new audio encoder resource.">Create()</a> to create a new audio encoder resource.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61" title="Gets an array of supported audio encoder profiles.">GetSupportedProfiles()</a> to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f" title="Gets a blank audio buffer (with metadata given by the Initialize() call) which can be filled with aud...">GetBuffer()</a> to get an empty buffer and fill it in, or get an audio buffer from another resource, e.g. <code>PPB_MediaStreamAudioTrack</code>.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3" title="Encodes an audio buffer.">Encode()</a> to push the audio buffer to the encoder. If an external buffer is pushed, wait for completion to recycle the buffer.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded buffers from the encoder.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available audio codecs vary by platform. All: opus. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="ad472829d0944505ce8cfb2a2b6308165"></a><!-- doxytag: member="PPB_AudioEncoder::Close" ref="ad472829d0944505ce8cfb2a2b6308165" args=")(PP_Resource audio_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165">PPB_AudioEncoder::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the audio encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the audio encoder closes it implicitly, so you are not required to call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165" title="Closes the audio encoder, and cancels any pending encodes.">Close()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a116d0908bcdd955e33e00cbd9ae04110"></a><!-- doxytag: member="PPB_AudioEncoder::Create" ref="a116d0908bcdd955e33e00cbd9ae04110" args=")(PP_Instance instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110">PPB_AudioEncoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Creates a new audio encoder resource. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the audio encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to an audio encoder if successful or 0 otherwise. </dd></dl> +</div> +</div> +<a class="anchor" id="a61e9304df6da6bbb97236805d702d0a3"></a><!-- doxytag: member="PPB_AudioEncoder::Encode" ref="a61e9304df6da6bbb97236805d702d0a3" args=")(PP_Resource audio_encoder, PP_Resource audio_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3">PPB_AudioEncoder::Encode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes an audio buffer. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_buffer</td><td>The <code>PPB_AudioBuffer</code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. Plugins that pass <code>PPB_AudioBuffer</code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a7386d14006ed634530d0ad2ecdb61529"></a><!-- doxytag: member="PPB_AudioEncoder::GetBitstreamBuffer" ref="a7386d14006ed634530d0ad2ecdb61529" args=")(PP_Resource audio_encoder, struct PP_AudioBitstreamBuffer *bitstream_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529">PPB_AudioEncoder::GetBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> containing encoded audio data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ac154730ff2248134c73d5155c4a7095f"></a><!-- doxytag: member="PPB_AudioEncoder::GetBuffer" ref="ac154730ff2248134c73d5155c4a7095f" args=")(PP_Resource audio_encoder, PP_Resource *audio_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f">PPB_AudioEncoder::GetBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank audio buffer (with metadata given by the <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> call) which can be filled with audio data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">audio_buffer</td><td>A blank <code>PPB_AudioBuffer</code> resource. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a49a627f22227a877391f2f569a4490ff"></a><!-- doxytag: member="PPB_AudioEncoder::GetNumberOfSamples" ref="a49a627f22227a877391f2f569a4490ff" args=")(PP_Resource audio_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a49a627f22227a877391f2f569a4490ff">PPB_AudioEncoder::GetNumberOfSamples</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of audio samples per channel that audio buffers must contain in order to be processed by the encoder. </p> +<p>This will be the number of samples per channels contained in buffers returned by <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f" title="Gets a blank audio buffer (with metadata given by the Initialize() call) which can be filled with aud...">GetBuffer()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of samples required, or an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a2ad5e2334abb35ede4c413e50e92ec61"></a><!-- doxytag: member="PPB_AudioEncoder::GetSupportedProfiles" ref="a2ad5e2334abb35ede4c413e50e92ec61" args=")(PP_Resource audio_encoder, struct PP_ArrayOutput output, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61">PPB_AudioEncoder::GetSupportedProfiles</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported audio encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output</td><td>A <code><a class="el" href="struct_p_p___array_output.html" title="A structure that defines a way for the browser to return arrays of data to the plugin.">PP_ArrayOutput</a></code> to receive the supported <code><a class="el" href="struct_p_p___audio_profile_description.html" title="Supported audio profile information.">PP_AudioProfileDescription</a></code> structs. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a676b09b0a98069daea08678a8c9e5d70"></a><!-- doxytag: member="PPB_AudioEncoder::Initialize" ref="a676b09b0a98069daea08678a8c9e5d70" args=")(PP_Resource audio_encoder, uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70">PPB_AudioEncoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t channels, <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> input_sample_rate, <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> input_sample_size, <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes an audio encoder resource. </p> +<p>The plugin should call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> successfully before calling any of the functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">channels</td><td>The number of audio channels to encode. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sampling_rate</td><td>The sampling rate of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sample_size</td><td>The sample size of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_AudioProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">initial_bitrate</td><td>The initial bitrate for the encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if audio encoding is not available, or the requested codec profile is not supported. </dd></dl> +</div> +</div> +<a class="anchor" id="a63e54ec7e63e940c59c1b365669a5002"></a><!-- doxytag: member="PPB_AudioEncoder::IsAudioEncoder" ref="a63e54ec7e63e940c59c1b365669a5002" args=")(PP_Resource resource)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a63e54ec7e63e940c59c1b365669a5002">PPB_AudioEncoder::IsAudioEncoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Determines if the given resource is an audio encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> identifying a resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_AudioEncoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> +</div> +</div> +<a class="anchor" id="a8046882d9584418d02e017130aa55d80"></a><!-- doxytag: member="PPB_AudioEncoder::RecycleBitstreamBuffer" ref="a8046882d9584418d02e017130aa55d80" args=")(PP_Resource audio_encoder, const struct PP_AudioBitstreamBuffer *bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80">PPB_AudioEncoder::RecycleBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, const struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ac5a8cbc3578816a15f3418882b6b720c"></a><!-- doxytag: member="PPB_AudioEncoder::RequestBitrateChange" ref="ac5a8cbc3578816a15f3418882b6b720c" args=")(PP_Resource audio_encoder, uint32_t bitrate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac5a8cbc3578816a15f3418882b6b720c">PPB_AudioEncoder::RequestBitrateChange</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t bitrate)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to the encoding bitrate. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="ppb__audio__encoder_8h.html">ppb_audio_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___compositor__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___compositor__0__1.html index 85fcb76..eae22619 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___compositor__0__1.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___compositor__0__1.html
@@ -50,7 +50,7 @@ <p>Creates a new <code>PPB_CompositorLayer</code> and adds it to the end of the layer stack. </p> <p>A <code>PP_Resource</code> containing the layer is returned. It is uninitialized, <code>SetColor()</code>, <code>SetTexture</code> or <code>SetImage</code> should be used to initialize it. The layer will appear above other pre-existing layers. If <code>ResetLayers</code> is called or the <code>PPB_Compositor</code> is released, the returned layer will be invalidated, and any further calls on the layer will return <code>PP_ERROR_BADRESOURCE</code>.</p> <p>param[in] compositor A <code>PP_Resource</code> corresponding to a compositor layer resource.</p> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor layer resource if sucessful or 0 otherwise. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor layer resource if successful or 0 otherwise. </dd></dl> </div> </div> <a class="anchor" id="a5082b0dce4a58032439bc3dd4ff741fd"></a><!-- doxytag: member="PPB_Compositor::CommitLayers" ref="a5082b0dce4a58032439bc3dd4ff741fd" args=")(PP_Resource compositor, struct PP_CompletionCallback cc)" --> @@ -91,7 +91,7 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor resource if sucessful or 0 otherwise. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor resource if successful or 0 otherwise. </dd></dl> </div> </div> <a class="anchor" id="a22fb77daabd3894db97ab1111d111a92"></a><!-- doxytag: member="PPB_Compositor::IsCompositor" ref="a22fb77daabd3894db97ab1111d111a92" args=")(PP_Resource resource)" -->
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___file_mapping__0__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___file_mapping__0__1.html deleted file mode 100644 index 64437048..0000000 --- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___file_mapping__0__1.html +++ /dev/null
@@ -1,98 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>PPB_FileMapping Struct Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<!-- doxytag: class="PPB_FileMapping" --><h2> -Data Fields</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb">Map</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d">Unmap</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const void *address, int64_t length, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int64_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0">GetMapPageSize</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. </p> -</div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ae479690b258985b51dda4d438b8156f0"></a><!-- doxytag: member="PPB_FileMapping::GetMapPageSize" ref="ae479690b258985b51dda4d438b8156f0" args=")(PP_Instance instance)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int64_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0">PPB_FileMapping::GetMapPageSize</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a> retrieves the size of pages that <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> uses. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>The size of pages that <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> uses. Returns 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="a425d8d5b11de51e8edf539ee13bac1fb"></a><!-- doxytag: member="PPB_FileMapping::Map" ref="a425d8d5b11de51e8edf539ee13bac1fb" args=")(PP_Instance instance, PP_Resource file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb">PPB_FileMapping::Map</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> maps the contents from an offset of the file into memory. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying one instance of a module. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">file_io</td><td>A <code>PPB_FileIO</code> <code>PP_Resource</code> corresponding to the file that should be mapped in to memory. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The number of bytes to map. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">map_protection</td><td>A bitfield containing values from <code>PP_FileMapProtection</code>, indicating what memory operations should be permitted on the mapped region. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">map_flags</td><td>A bitfield containing values from <code>PP_FileMapFlags</code>, providing options for the behavior of Map. If the region is to be writeable, then exactly one of <code>PP_FILEMAPFLAG_SHARED</code> or <code>PP_FILEMAPFLAG_PRIVATE</code> must be set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset into the file. Must be a multiple of the Map page size as returned by <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a>. </td></tr> -<tr><td class="paramdir"></td><td class="paramname">inout]</td><td>address The value of <code>*address</code>, if non-NULL, will be used as a hint to determine where in memory the file should be mapped. If the value is NULL, the host operating system will choose <code>address</code>. Upon <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> completing, <code>*address</code> will contain the actual memory location at which the file was mapped. If the plugin provides a non-NULL <code>*address</code>, it must be a multiple of the map page size as returned by <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a>. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a>.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<a class="anchor" id="a4fa72d6e6660e16ce1ff08453eff172d"></a><!-- doxytag: member="PPB_FileMapping::Unmap" ref="a4fa72d6e6660e16ce1ff08453eff172d" args=")(PP_Instance instance, const void *address, int64_t length, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d">PPB_FileMapping::Unmap</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const void *address, int64_t length, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d" title="Unmap() deletes the mapping of the specified address.">Unmap()</a> deletes the mapping of the specified address. </p> -<p>The specified address must have been retrieved with <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a>. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>The starting address of the address in memory to be unmapped. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the region to unmap. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d" title="Unmap() deletes the mapping of the specified address.">Unmap()</a>.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<hr />The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li> -</ul> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___u_d_p_socket__1__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___u_d_p_socket__1__1.html deleted file mode 100644 index 6307ad0..0000000 --- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___u_d_p_socket__1__1.html +++ /dev/null
@@ -1,211 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>PPB_UDPSocket Struct Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<!-- doxytag: class="PPB_UDPSocket" --><h2> -Data Fields</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>The <code>PPB_UDPSocket</code> interface provides UDP socket operations. </p> -<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> -</div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ab35f5cda2711b220a2b6c090b469d044"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="ab35f5cda2711b220a2b6c090b469d044" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Binds the socket to the given address. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>A <code>PPB_NetAddress</code> resource. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_ADDRESS_IN_USE</code> will be returned if the address is already in use. </dd></dl> -</div> -</div> -<a class="anchor" id="a9c349fbeb2a9fca70b8ecf0a860d2112"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="a9c349fbeb2a9fca70b8ecf0a860d2112" args=")(PP_Resource udp_socket)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Cancels all pending reads and writes, and closes the socket. </p> -<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code> again.</p> -<p>The socket is implicitly closed if it is destroyed, so you are not required to call this method.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -</table> -</dd> -</dl> -</div> -</div> -<a class="anchor" id="a687ffa461f068fae0e0cc6694b3157bd"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="a687ffa461f068fae0e0cc6694b3157bd" args=")(PP_Instance instance)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Creates a UDP socket resource. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying one instance of a module.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a UDP socket or 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="a33be83f9c8d91811c9ee20fd04ae9be3"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a33be83f9c8d91811c9ee20fd04ae9be3" args=")(PP_Resource udp_socket)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Gets the address that the socket is bound to. </p> -<p>The socket must be bound.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="a122be12f51d87e13cbe33bf30b3bef86"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a122be12f51d87e13cbe33bf30b3bef86" args=")(PP_Resource resource)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Determines if a given resource is a UDP socket. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> to check.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the input is a <code>PPB_UDPSocket</code> resource; <code>PP_FALSE</code> otherwise. </dd></dl> -</div> -</div> -<a class="anchor" id="aa15ebcb5bfc899d2d46f8f25266e4913"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="aa15ebcb5bfc899d2d46f8f25266e4913" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Receives data from the socket and stores the source address. </p> -<p>The socket must be bound.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer to store the received data on success. It must be at least as large as <code>num_bytes</code>. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">num_bytes</td><td>The number of bytes to receive. </td></tr> -<tr><td class="paramdir">[out]</td><td class="paramname">addr</td><td>A <code>PPB_NetAddress</code> resource to store the source address on success. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been received; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<a class="anchor" id="ad6b1bd2a28fdc4fa58b8872353524d38"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ad6b1bd2a28fdc4fa58b8872353524d38" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Sends data to a specific destination. </p> -<p>The socket must be bound.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer containing the data to send. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">num_bytes</td><td>The number of bytes to send. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>A <code>PPB_NetAddress</code> resource holding the destination address. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_INPROGRESS</code> will be returned if the socket is busy sending. The caller should wait until a pending send completes before retrying. </dd></dl> -</div> -</div> -<a class="anchor" id="a7107524b673568e4e69c63c43ecd0eec"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="a7107524b673568e4e69c63c43ecd0eec" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Sets a socket option on the UDP socket. </p> -<p>Please see the <code>PP_UDPSocket_Option</code> description for option names, value types and allowed values.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">name</td><td>The option to set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">value</td><td>The option value to set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<hr />The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="ppb__udp__socket_8h.html">ppb_udp_socket.h</a></li> -</ul> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___u_d_p_socket__1__2.html similarity index 63% copy from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html copy to native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___u_d_p_socket__1__2.html index 6307ad0..8e1b0e13 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___u_d_p_socket__1__2.html
@@ -12,25 +12,27 @@ <!-- doxytag: class="PPB_UDPSocket" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#abe2a2dc1170e9ea60f63656152b7b3ce">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a955e5c21c99668dc80fa54f8a12119de">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a2195768a7698776e83298b86b9670fa4">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae27417e3577d5dbb3a88efa7867df7b9">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ac0656c7002acbb1d9c4b17fb679f63df">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a3012f1d7f38fff9d45925e05850cfdb0">JoinGroup</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a5e46591a3a742ee1a9e3de81a76624d3">LeaveGroup</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>The <code>PPB_UDPSocket</code> interface provides UDP socket operations. </p> -<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> +<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ab35f5cda2711b220a2b6c090b469d044"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="ab35f5cda2711b220a2b6c090b469d044" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a07dad506a240b35c8ceb5dcd5f9e12ce"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="a07dad506a240b35c8ceb5dcd5f9e12ce" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -47,18 +49,18 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_ADDRESS_IN_USE</code> will be returned if the address is already in use. </dd></dl> </div> </div> -<a class="anchor" id="a9c349fbeb2a9fca70b8ecf0a860d2112"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="a9c349fbeb2a9fca70b8ecf0a860d2112" args=")(PP_Resource udp_socket)" --> +<a class="anchor" id="ae27417e3577d5dbb3a88efa7867df7b9"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="ae27417e3577d5dbb3a88efa7867df7b9" args=")(PP_Resource udp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae27417e3577d5dbb3a88efa7867df7b9">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> </tr> </table> </div> <div class="memdoc"> <p>Cancels all pending reads and writes, and closes the socket. </p> -<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code> again.</p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce" title="Binds the socket to the given address.">Bind()</a></code> again.</p> <p>The socket is implicitly closed if it is destroyed, so you are not required to call this method.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> @@ -68,12 +70,12 @@ </dl> </div> </div> -<a class="anchor" id="a687ffa461f068fae0e0cc6694b3157bd"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="a687ffa461f068fae0e0cc6694b3157bd" args=")(PP_Instance instance)" --> +<a class="anchor" id="abe2a2dc1170e9ea60f63656152b7b3ce"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="abe2a2dc1170e9ea60f63656152b7b3ce" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#abe2a2dc1170e9ea60f63656152b7b3ce">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -88,12 +90,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a UDP socket or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="a33be83f9c8d91811c9ee20fd04ae9be3"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a33be83f9c8d91811c9ee20fd04ae9be3" args=")(PP_Resource udp_socket)" --> +<a class="anchor" id="a2195768a7698776e83298b86b9670fa4"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a2195768a7698776e83298b86b9670fa4" args=")(PP_Resource udp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a2195768a7698776e83298b86b9670fa4">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> </tr> </table> </div> @@ -109,12 +111,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="a122be12f51d87e13cbe33bf30b3bef86"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a122be12f51d87e13cbe33bf30b3bef86" args=")(PP_Resource resource)" --> +<a class="anchor" id="a955e5c21c99668dc80fa54f8a12119de"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a955e5c21c99668dc80fa54f8a12119de" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a955e5c21c99668dc80fa54f8a12119de">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -129,12 +131,56 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the input is a <code>PPB_UDPSocket</code> resource; <code>PP_FALSE</code> otherwise. </dd></dl> </div> </div> -<a class="anchor" id="aa15ebcb5bfc899d2d46f8f25266e4913"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="aa15ebcb5bfc899d2d46f8f25266e4913" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a3012f1d7f38fff9d45925e05850cfdb0"></a><!-- doxytag: member="PPB_UDPSocket::JoinGroup" ref="a3012f1d7f38fff9d45925e05850cfdb0" args=")(PP_Resource udp_socket, PP_Resource group, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a3012f1d7f38fff9d45925e05850cfdb0">PPB_UDPSocket::JoinGroup</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Joins the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code>PPB_NetAddress</code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code>PP_Resource</code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a5e46591a3a742ee1a9e3de81a76624d3"></a><!-- doxytag: member="PPB_UDPSocket::LeaveGroup" ref="a5e46591a3a742ee1a9e3de81a76624d3" args=")(PP_Resource udp_socket, PP_Resource group, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a5e46591a3a742ee1a9e3de81a76624d3">PPB_UDPSocket::LeaveGroup</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Leaves the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code>PPB_NetAddress</code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code>PP_Resource</code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="afaf246c84eb76e033ee8794faa997af5"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="afaf246c84eb76e033ee8794faa997af5" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -154,12 +200,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been received; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> </div> </div> -<a class="anchor" id="ad6b1bd2a28fdc4fa58b8872353524d38"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ad6b1bd2a28fdc4fa58b8872353524d38" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ae6764f319a9af980dbb1ba5625a417be"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ae6764f319a9af980dbb1ba5625a417be" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -179,12 +225,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_INPROGRESS</code> will be returned if the socket is busy sending. The caller should wait until a pending send completes before retrying. </dd></dl> </div> </div> -<a class="anchor" id="a7107524b673568e4e69c63c43ecd0eec"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="a7107524b673568e4e69c63c43ecd0eec" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ac0656c7002acbb1d9c4b17fb679f63df"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="ac0656c7002acbb1d9c4b17fb679f63df" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ac0656c7002acbb1d9c4b17fb679f63df">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_decoder__1__0.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_decoder__1__1.html similarity index 71% rename from native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_decoder__1__0.html rename to native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_decoder__1__1.html index c8dd134..7eb7007 100644 --- a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_decoder__1__0.html +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_decoder__1__1.html
@@ -12,35 +12,35 @@ <!-- doxytag: class="PPB_VideoDecoder" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ae2329143c44bd5eaae507074c1fc0ec3">IsVideoDecoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366">Decode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e">GetPicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f">RecyclePicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e">Reset</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#aa32bb990160f3e1fbfa90a2f363c61bc">IsVideoDecoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, uint32_t min_picture_count, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd">Decode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c">GetPicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb">RecyclePicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0">Reset</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>Video decoder interface. </p> <p>Typical usage:</p> <ul> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c" title="Creates a new video decoder resource.">Create()</a> to create a new video decoder resource.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> to quickly stop the decoder (e.g. to implement Seek) and wait for the callback before restarting decoding at another point.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f" title="Creates a new video decoder resource.">Create()</a> to create a new video decoder resource.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> to quickly stop the decoder (e.g. to implement Seek) and wait for the callback before restarting decoding at another point.</li> <li>To destroy the decoder, the plugin should release all of its references to it. Any pending callbacks will abort before the decoder is destroyed.</li> </ul> <p>Available video codecs vary by platform. All: theora, vorbis, vp8. Chrome and ChromeOS: aac, h264. ChromeOS: mpeg4. </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="a81200f606c493c49a70190ca86ac135c"></a><!-- doxytag: member="PPB_VideoDecoder::Create" ref="a81200f606c493c49a70190ca86ac135c" args=")(PP_Instance instance)" --> +<a class="anchor" id="ab84df8254cf35702e09425b835b5958f"></a><!-- doxytag: member="PPB_VideoDecoder::Create" ref="ab84df8254cf35702e09425b835b5958f" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c">PPB_VideoDecoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f">PPB_VideoDecoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -55,45 +55,45 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a video decoder if successful or 0 otherwise. </dd></dl> </div> </div> -<a class="anchor" id="acc8662be4232325abc545d1ae8b79366"></a><!-- doxytag: member="PPB_VideoDecoder::Decode" ref="acc8662be4232325abc545d1ae8b79366" args=")(PP_Resource video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a5f87d174876dc480029275f94e4669cd"></a><!-- doxytag: member="PPB_VideoDecoder::Decode" ref="a5f87d174876dc480029275f94e4669cd" args=")(PP_Resource video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366">PPB_VideoDecoder::Decode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd">PPB_VideoDecoder::Decode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Decodes a bitstream buffer. </p> -<p>Copies |size| bytes of data from the plugin's |buffer|. The plugin should wait until the decoder signals completion by returning PP_OK or by running |callback| before calling <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> again.</p> +<p>Copies |size| bytes of data from the plugin's |buffer|. The plugin should wait until the decoder signals completion by returning PP_OK or by running |callback| before calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> again.</p> <p>In general, each bitstream buffer should contain a demuxed bitstream frame for the selected video codec. For example, H264 decoders expect to receive one AnnexB NAL unit, including the 4 byte start code prefix, while VP8 decoders expect to receive a bitstream frame without the IVF frame header.</p> -<p>If the call to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> eventually results in a picture, the |decode_id| parameter is copied into the returned picture. The plugin can use this to associate decoded pictures with <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> calls (e.g. to assign timestamps or frame numbers to pictures.) This value is opaque to the API so the plugin is free to pass any value.</p> +<p>If the call to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> eventually results in a picture, the |decode_id| parameter is copied into the returned picture. The plugin can use this to associate decoded pictures with <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> calls (e.g. to assign timestamps or frame numbers to pictures.) This value is opaque to the API so the plugin is free to pass any value.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">decode_id</td><td>An optional value, chosen by the plugin, that can be used to associate calls to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> with decoded pictures returned by <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a>. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">decode_id</td><td>An optional value, chosen by the plugin, that can be used to associate calls to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> with decoded pictures returned by <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a>. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Buffer size in bytes. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Starting address of buffer. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called on completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> or <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> call pending. Returns PP_ERROR_NOMEMORY if a bitstream buffer can't be created. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> is called while <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> is pending. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> or <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> call pending. Returns PP_ERROR_NOMEMORY if a bitstream buffer can't be created. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> is called while <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="adf3ea0876d1ba686266589a04532e86d"></a><!-- doxytag: member="PPB_VideoDecoder::Flush" ref="adf3ea0876d1ba686266589a04532e86d" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a40e2989df1005096fd6fc9832e078413"></a><!-- doxytag: member="PPB_VideoDecoder::Flush" ref="a40e2989df1005096fd6fc9832e078413" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d">PPB_VideoDecoder::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413">PPB_VideoDecoder::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Flushes the decoder. </p> -<p>The plugin should call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> when it reaches the end of its video stream in order to stop cleanly. The decoder will run any pending <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> call to completion. The plugin should make no further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Just before completion, any pending <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> call will complete by running its callback with result PP_ERROR_ABORTED to signal that no more pictures are available. Any pictures held by the plugin remain valid during and after the flush and should be recycled back to the decoder.</p> +<p>The plugin should call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> when it reaches the end of its video stream in order to stop cleanly. The decoder will run any pending <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> call to completion. The plugin should make no further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Just before completion, any pending <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> call will complete by running its callback with result PP_ERROR_ABORTED to signal that no more pictures are available. Any pictures held by the plugin remain valid during and after the flush and should be recycled back to the decoder.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> @@ -104,18 +104,18 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized. </dd></dl> </div> </div> -<a class="anchor" id="a2351fe0cf66513ee77df0c1a22306c3e"></a><!-- doxytag: member="PPB_VideoDecoder::GetPicture" ref="a2351fe0cf66513ee77df0c1a22306c3e" args=")(PP_Resource video_decoder, struct PP_VideoPicture *picture, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="adc8b4eb41199cdf96aaa55d9a2df0b6c"></a><!-- doxytag: member="PPB_VideoDecoder::GetPicture" ref="adc8b4eb41199cdf96aaa55d9a2df0b6c" args=")(PP_Resource video_decoder, struct PP_VideoPicture *picture, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e">PPB_VideoDecoder::GetPicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c">PPB_VideoDecoder::GetPicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Gets the next picture from the decoder. </p> -<p>The picture is valid after the decoder signals completion by returning PP_OK or running |callback|. The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> again after the decoder signals completion. When the plugin is finished using the picture, it should return it to the system by calling <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>.</p> +<p>The picture is valid after the decoder signals completion by returning PP_OK or running |callback|. The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> again after the decoder signals completion. When the plugin is finished using the picture, it should return it to the system by calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> @@ -124,40 +124,41 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="ad115b7705b740b771e7dd9acb2b36f16"></a><!-- doxytag: member="PPB_VideoDecoder::Initialize" ref="ad115b7705b740b771e7dd9acb2b36f16" args=")(PP_Resource video_decoder, PP_Resource graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a65fc7d77135a1c55eb77ad4f7fd1a8a8"></a><!-- doxytag: member="PPB_VideoDecoder::Initialize" ref="a65fc7d77135a1c55eb77ad4f7fd1a8a8" args=")(PP_Resource video_decoder, PP_Resource graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16">PPB_VideoDecoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8">PPB_VideoDecoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, uint32_t min_picture_count, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Initializes a video decoder resource. </p> -<p>This should be called after <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c" title="Creates a new video decoder resource.">Create()</a> and before any other functions.</p> +<p>This should be called after <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f" title="Creates a new video decoder resource.">Create()</a> and before any other functions.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">graphics3d_context</td><td>A <code>PPB_Graphics3D</code> resource to use during decoding. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">profile</td><td>A <code>PP_VideoProfile</code> specifying the video codec profile. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">min_picture_count</td><td>A count of pictures the plugin would like to have in flight. This is effectively the number of times the plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> and get a decoded frame without calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>. The decoder has its own internal minimum count, and will take the larger of its internal and this value. A client that doesn't care can therefore just pass in zero for this argument. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. Returns PP_ERROR_BADARGUMENT if the requested minimum picture count is unreasonably large. </dd></dl> </div> </div> -<a class="anchor" id="ae2329143c44bd5eaae507074c1fc0ec3"></a><!-- doxytag: member="PPB_VideoDecoder::IsVideoDecoder" ref="ae2329143c44bd5eaae507074c1fc0ec3" args=")(PP_Resource resource)" --> +<a class="anchor" id="aa32bb990160f3e1fbfa90a2f363c61bc"></a><!-- doxytag: member="PPB_VideoDecoder::IsVideoDecoder" ref="aa32bb990160f3e1fbfa90a2f363c61bc" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ae2329143c44bd5eaae507074c1fc0ec3">PPB_VideoDecoder::IsVideoDecoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#aa32bb990160f3e1fbfa90a2f363c61bc">PPB_VideoDecoder::IsVideoDecoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -172,12 +173,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_VideoDecoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> </div> </div> -<a class="anchor" id="ac7e6b42866d42eade96519f32755509f"></a><!-- doxytag: member="PPB_VideoDecoder::RecyclePicture" ref="ac7e6b42866d42eade96519f32755509f" args=")(PP_Resource video_decoder, const struct PP_VideoPicture *picture)" --> +<a class="anchor" id="ab0b4f4b781cf6c0b347832961a08b6bb"></a><!-- doxytag: member="PPB_VideoDecoder::RecyclePicture" ref="ab0b4f4b781cf6c0b347832961a08b6bb" args=")(PP_Resource video_decoder, const struct PP_VideoPicture *picture)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f">PPB_VideoDecoder::RecyclePicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb">PPB_VideoDecoder::RecyclePicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td> </tr> </table> </div> @@ -193,18 +194,18 @@ </dl> </div> </div> -<a class="anchor" id="aeb4704cfd86a4ad737af19e77f3ffd5e"></a><!-- doxytag: member="PPB_VideoDecoder::Reset" ref="aeb4704cfd86a4ad737af19e77f3ffd5e" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ad8151e35df062e82434fb1d6e0629fd0"></a><!-- doxytag: member="PPB_VideoDecoder::Reset" ref="ad8151e35df062e82434fb1d6e0629fd0" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e">PPB_VideoDecoder::Reset</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0">PPB_VideoDecoder::Reset</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Resets the decoder as quickly as possible. </p> -<p>The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> to skip to another position in the video stream. After <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> returns, any pending calls to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a>) abort, causing their callbacks to run with PP_ERROR_ABORTED. The plugin should not make further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Any pictures held by the plugin remain valid during and after the reset and should be recycled back to the decoder.</p> +<p>The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> to skip to another position in the video stream. After <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> returns, any pending calls to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a>) abort, causing their callbacks to run with PP_ERROR_ABORTED. The plugin should not make further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Any pictures held by the plugin remain valid during and after the reset and should be recycled back to the decoder.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_encoder__0__2.html b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_encoder__0__2.html new file mode 100644 index 0000000..de97a32 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/c/struct_p_p_b___video_encoder__0__2.html
@@ -0,0 +1,309 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PPB_VideoEncoder Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PPB_VideoEncoder" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9006f1c2d0d3fe9a71bb2343e22e679a">IsVideoEncoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#abe007473d19c6c82555799c0ecff0cc7">GetSupportedProfiles</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___enums.html#ga4e7cf746d8acbfa268db1f5ebe8061bf">PP_VideoFrame_Format</a> input_format, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *input_visible_size, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a468e94294b704c002a6532687bb53ed0">GetFramesRequired</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#adbd41c5b25729bbfb1ad90124d9e9528">GetFrameCodedSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *coded_size)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a">GetVideoFrame</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *video_frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9">Encode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_frame, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> force_keyframe, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4">GetBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a">RecycleBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, const struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#aa1a3fa20e5d8c56e420d169af6f02845">RequestEncodingParametersChange</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, uint32_t bitrate, uint32_t framerate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Video encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c" title="Creates a new video encoder resource.">Create()</a> to create a new video encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a" title="Gets a blank video frame which can be filled with video data and passed to the encoder.">GetVideoFrame()</a> to get a blank frame and fill it in, or get a video frame from another resource, e.g. <code>PPB_MediaStreamVideoTrack</code>.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9" title="Encodes a video frame.">Encode()</a> to push the video frame to the encoder. If an external frame is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded pictures from the encoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available video codecs vary by platform. All: vp8 (software). ChromeOS, depending on your device: h264 (hardware), vp8 (hardware) </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="afe91b697d39e41ca9c4b187e1f66749f"></a><!-- doxytag: member="PPB_VideoEncoder::Close" ref="afe91b697d39e41ca9c4b187e1f66749f" args=")(PP_Resource video_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f">PPB_VideoEncoder::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the video encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the video encoder closes it implicitly, so you are not required to call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f" title="Closes the video encoder, and cancels any pending encodes.">Close()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a94d87da92ccfb984cef497977d00d80c"></a><!-- doxytag: member="PPB_VideoEncoder::Create" ref="a94d87da92ccfb984cef497977d00d80c" args=")(PP_Instance instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c">PPB_VideoEncoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Creates a new video encoder resource. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the video encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a video encoder if successful or 0 otherwise. </dd></dl> +</div> +</div> +<a class="anchor" id="a873344d65a32d15426cd4424e76bb6d9"></a><!-- doxytag: member="PPB_VideoEncoder::Encode" ref="a873344d65a32d15426cd4424e76bb6d9" args=")(PP_Resource video_encoder, PP_Resource video_frame, PP_Bool force_keyframe, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9">PPB_VideoEncoder::Encode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_frame, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> force_keyframe, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes a video frame. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">video_frame</td><td>The <code>PPB_VideoFrame</code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">force_keyframe</td><td>A <code>PP_Bool> specifying whether the encoder should emit a key frame for this video frame. </code></td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td><code>A </code><code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. Plugins that pass <code>PPB_VideoFrame</code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code> An int32_t containing an error code from </code><code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a8b2b489462a35bdc6300bcf1fdadabe4"></a><!-- doxytag: member="PPB_VideoEncoder::GetBitstreamBuffer" ref="a8b2b489462a35bdc6300bcf1fdadabe4" args=")(PP_Resource video_encoder, struct PP_BitstreamBuffer *bitstream_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4">PPB_VideoEncoder::GetBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> containing encoded video data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="adbd41c5b25729bbfb1ad90124d9e9528"></a><!-- doxytag: member="PPB_VideoEncoder::GetFrameCodedSize" ref="adbd41c5b25729bbfb1ad90124d9e9528" args=")(PP_Resource video_encoder, struct PP_Size *coded_size)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#adbd41c5b25729bbfb1ad90124d9e9528">PPB_VideoEncoder::GetFrameCodedSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *coded_size)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the coded size of the video frames required by the encoder. </p> +<p>Coded size is the logical size of the input frames, in pixels. The encoder may have hardware alignment requirements that make this different from |input_visible_size|, as requested in the call to <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">coded_size</td><td>A <code><a class="el" href="struct_p_p___size.html" title="The PP_Size struct contains the size of a 2D rectangle.">PP_Size</a></code> to hold the coded size. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a468e94294b704c002a6532687bb53ed0"></a><!-- doxytag: member="PPB_VideoEncoder::GetFramesRequired" ref="a468e94294b704c002a6532687bb53ed0" args=")(PP_Resource video_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a468e94294b704c002a6532687bb53ed0">PPB_VideoEncoder::GetFramesRequired</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of input video frames that the encoder may hold while encoding. </p> +<p>If the plugin is providing the video frames, it should have at least this many available.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of frames required, or an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="abe007473d19c6c82555799c0ecff0cc7"></a><!-- doxytag: member="PPB_VideoEncoder::GetSupportedProfiles" ref="abe007473d19c6c82555799c0ecff0cc7" args=")(PP_Resource video_encoder, struct PP_ArrayOutput output, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#abe007473d19c6c82555799c0ecff0cc7">PPB_VideoEncoder::GetSupportedProfiles</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported video encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output</td><td>A <code><a class="el" href="struct_p_p___array_output.html" title="A structure that defines a way for the browser to return arrays of data to the plugin.">PP_ArrayOutput</a></code> to receive the supported <code><a class="el" href="struct_p_p___video_profile_description.html" title="Supported video profile information.">PP_VideoProfileDescription</a></code> structs. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a64a5b77b1130f13184b797828a49587a"></a><!-- doxytag: member="PPB_VideoEncoder::GetVideoFrame" ref="a64a5b77b1130f13184b797828a49587a" args=")(PP_Resource video_encoder, PP_Resource *video_frame, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a">PPB_VideoEncoder::GetVideoFrame</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *video_frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank video frame which can be filled with video data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">video_frame</td><td>A blank <code>PPB_VideoFrame</code> resource. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a9cd78deaf493477ca7ec96a6e6445561"></a><!-- doxytag: member="PPB_VideoEncoder::Initialize" ref="a9cd78deaf493477ca7ec96a6e6445561" args=")(PP_Resource video_encoder, PP_VideoFrame_Format input_format, const struct PP_Size *input_visible_size, PP_VideoProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561">PPB_VideoEncoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___enums.html#ga4e7cf746d8acbfa268db1f5ebe8061bf">PP_VideoFrame_Format</a> input_format, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *input_visible_size, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a video encoder resource. </p> +<p>The plugin should call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> successfully before calling any of the functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_format</td><td>The <code>PP_VideoFrame_Format</code> of the frames which will be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_visible_size</td><td>A <code><a class="el" href="struct_p_p___size.html" title="The PP_Size struct contains the size of a 2D rectangle.">PP_Size</a></code> specifying the dimensions of the visible part of the input frames. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_VideoProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video encoding is not available, or the requested codec profile is not supported. </dd></dl> +</div> +</div> +<a class="anchor" id="a9006f1c2d0d3fe9a71bb2343e22e679a"></a><!-- doxytag: member="PPB_VideoEncoder::IsVideoEncoder" ref="a9006f1c2d0d3fe9a71bb2343e22e679a" args=")(PP_Resource resource)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9006f1c2d0d3fe9a71bb2343e22e679a">PPB_VideoEncoder::IsVideoEncoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Determines if the given resource is a video encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> identifying a resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_VideoEncoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> +</div> +</div> +<a class="anchor" id="a072f3199019aa262fbdf42412678220a"></a><!-- doxytag: member="PPB_VideoEncoder::RecycleBitstreamBuffer" ref="a072f3199019aa262fbdf42412678220a" args=")(PP_Resource video_encoder, const struct PP_BitstreamBuffer *bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a">PPB_VideoEncoder::RecycleBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, const struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="aa1a3fa20e5d8c56e420d169af6f02845"></a><!-- doxytag: member="PPB_VideoEncoder::RequestEncodingParametersChange" ref="aa1a3fa20e5d8c56e420d169af6f02845" args=")(PP_Resource video_encoder, uint32_t bitrate, uint32_t framerate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#aa1a3fa20e5d8c56e420d169af6f02845">PPB_VideoEncoder::RequestEncodingParametersChange</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, uint32_t bitrate, uint32_t framerate)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to encoding parameters. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">framerate</td><td>The requested new framerate, in frames per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__encoder_8h.html b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__encoder_8h.html new file mode 100644 index 0000000..f04836a --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__encoder_8h.html
@@ -0,0 +1,32 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>audio_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for audio_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="audio__encoder_8h__incl.png" border="0" usemap="#audio__encoder_8h" alt="" /></div> +<map name="audio__encoder_8h" id="audio__encoder_8h"> +</map> +</div> +</div><h2> +Classes</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. <a href="classpp_1_1_audio_encoder.html#details">More...</a><br /></td></tr> +</table><h2> +Namespaces</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the API to create and use a AudioEncoder resource. </p> +</div></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/audio__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__encoder_8h__incl.png new file mode 100644 index 0000000..9eb1bf12 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/audio__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder-members.html new file mode 100644 index 0000000..9872974 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder-members.html
@@ -0,0 +1,39 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>Member List</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +This is the complete list of members for <a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a>, including all inherited members.<table> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">AudioEncoder</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a1b5126d5112082bfa782bf5423715030">AudioEncoder</a>(const InstanceHandle &instance)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td><code> [explicit]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#ac4a116ff790ce5dc1cc4847118aabc9d">AudioEncoder</a>(const AudioEncoder &other)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">Close</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">Encode</a>(const AudioBuffer &buffer, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">GetBitstreamBuffer</a>(const CompletionCallbackWithOutput< PP_AudioBitstreamBuffer > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">GetBuffer</a>(const CompletionCallbackWithOutput< AudioBuffer > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">GetNumberOfSamples</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">GetSupportedProfiles</a>(const CompletionCallbackWithOutput< std::vector< PP_AudioProfileDescription > > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">Initialize</a>(uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">RecycleBitstreamBuffer</a>(const PP_AudioBitstreamBuffer &bitstream_buffer)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">RequestBitrateChange</a>(uint32_t bitrate)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> +</table></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder.html new file mode 100644 index 0000000..525e399 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder.html
@@ -0,0 +1,381 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>pp::AudioEncoder Class Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="pp::AudioEncoder" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader"> +Inheritance diagram for pp::AudioEncoder:</div> +<div class="dyncontent"> +<div class="center"><img src="classpp_1_1_audio_encoder__inherit__graph.png" border="0" usemap="#pp_1_1_audio_encoder_inherit__map" alt="Inheritance graph" /></div> +<map name="pp_1_1_audio_encoder_inherit__map" id="pp_1_1_audio_encoder_inherit__map"> +<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="20,5,124,32"></area></map> +<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> +<p><a href="classpp_1_1_audio_encoder-members.html">List of all members.</a></p> +<h2> +Public Member Functions</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">AudioEncoder</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a1b5126d5112082bfa782bf5423715030">AudioEncoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#ac4a116ff790ce5dc1cc4847118aabc9d">AudioEncoder</a> (const <a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a> &other)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">GetSupportedProfiles</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_AudioProfileDescription > > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">Initialize</a> (uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">GetNumberOfSamples</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">GetBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">Encode</a> (const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &buffer, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">GetBitstreamBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_AudioBitstreamBuffer > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">RecycleBitstreamBuffer</a> (const PP_AudioBitstreamBuffer &bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">RequestBitrateChange</a> (uint32_t bitrate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">Close</a> ()</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call Create() to create a new audio encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687" title="Gets a blank audio frame which can be filled with audio data and passed to the encoder.">GetBuffer()</a> to get a blank frame and fill it in, or get an audio frame from another resource, e.g. <code>PPB_MediaStreamAudioTrack</code>.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19" title="Encodes an audio buffer.">Encode()</a> to push the audio buffer to the encoder. If an external buffer is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded buffers from the encoder.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available audio codecs vary by platform. All: opus. </p> +</div><hr /><h2>Constructor & Destructor Documentation</h2> +<a class="anchor" id="afaf804d519fc0f2370c2d011b4e68378"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="afaf804d519fc0f2370c2d011b4e68378" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code> object. </p> +</div> +</div> +<a class="anchor" id="a1b5126d5112082bfa782bf5423715030"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="a1b5126d5112082bfa782bf5423715030" args="(const InstanceHandle &instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> & </td> +<td class="paramname"><em>instance</em></td><td>)</td> +<td><code> [explicit]</code></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A constructor used to create a <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code> and associate it with the provided <code><a class="el" href="classpp_1_1_instance.html">Instance</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ac4a116ff790ce5dc1cc4847118aabc9d"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="ac4a116ff790ce5dc1cc4847118aabc9d" args="(const AudioEncoder &other)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a> & </td> +<td class="paramname"><em>other</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The copy constructor for <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code>. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr /><h2>Member Function Documentation</h2> +<a class="anchor" id="a5f5f533624660ca8561fea403da85f5b"></a><!-- doxytag: member="pp::AudioEncoder::Close" ref="a5f5f533624660ca8561fea403da85f5b" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">pp::AudioEncoder::Close</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the audio encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the audio encoder closes it implicitly, so you are not required to call <a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b" title="Closes the audio encoder, and cancels any pending encodes.">Close()</a>. </p> +</div> +</div> +<a class="anchor" id="a75278dc12dfcc3d000e47e17f014be19"></a><!-- doxytag: member="pp::AudioEncoder::Encode" ref="a75278dc12dfcc3d000e47e17f014be19" args="(const AudioBuffer &buffer, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">pp::AudioEncoder::Encode</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> & </td> +<td class="paramname"><em>buffer</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes an audio buffer. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_buffer</td><td>The <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion. Plugins that pass <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ad1a2c96562e2baa7a61d63fbb8a49999"></a><!-- doxytag: member="pp::AudioEncoder::GetBitstreamBuffer" ref="ad1a2c96562e2baa7a61d63fbb8a49999" args="(const CompletionCallbackWithOutput< PP_AudioBitstreamBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">pp::AudioEncoder::GetBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_AudioBitstreamBuffer > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the next bitstream buffer. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a113d4a018e987f2f5227c6e0dc8a7687"></a><!-- doxytag: member="pp::AudioEncoder::GetBuffer" ref="a113d4a018e987f2f5227c6e0dc8a7687" args="(const CompletionCallbackWithOutput< AudioBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">pp::AudioEncoder::GetBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank audio frame which can be filled with audio data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the blank <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a706b305dae8bc5f5e0bca4491c991d59"></a><!-- doxytag: member="pp::AudioEncoder::GetNumberOfSamples" ref="a706b305dae8bc5f5e0bca4491c991d59" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">pp::AudioEncoder::GetNumberOfSamples</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of audio samples per channel that audio buffers must contain in order to be processed by the encoder. </p> +<p>This will be the number of samples per channels contained in buffers returned by <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687" title="Gets a blank audio frame which can be filled with audio data and passed to the encoder.">GetBuffer()</a>.</p> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of samples required, or an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a34b94c7bb1f509f4b56bfe7349560669"></a><!-- doxytag: member="pp::AudioEncoder::GetSupportedProfiles" ref="a34b94c7bb1f509f4b56bfe7349560669" args="(const CompletionCallbackWithOutput< std::vector< PP_AudioProfileDescription > > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">pp::AudioEncoder::GetSupportedProfiles</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_AudioProfileDescription > > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported audio encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the PP_AudioProfileDescription structs.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a28aa43f8c92b387b81e7cf63219c2933"></a><!-- doxytag: member="pp::AudioEncoder::Initialize" ref="a28aa43f8c92b387b81e7cf63219c2933" args="(uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">pp::AudioEncoder::Initialize</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>channels</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioBuffer_SampleRate </td> +<td class="paramname"><em>input_sample_rate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioBuffer_SampleSize </td> +<td class="paramname"><em>input_sample_size</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioProfile </td> +<td class="paramname"><em>output_profile</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>initial_bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_HardwareAcceleration </td> +<td class="paramname"><em>acceleration</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a audio encoder resource. </p> +<p>This should be called after <a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669" title="Gets an array of supported audio encoder profiles.">GetSupportedProfiles()</a> and before any functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">channels</td><td>The number of audio channels to encode. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sampling_rate</td><td>The sampling rate of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sample_size</td><td>The sample size of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_AudioProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">initial_bitrate</td><td>The initial bitrate for the encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if audio encoding is not available, or the requested codec profile is not supported. Returns PP_ERROR_NOMEMORY if bitstream buffers can't be created. </dd></dl> +</div> +</div> +<a class="anchor" id="a9c5b90b6dbfd81154b28f402197184bc"></a><!-- doxytag: member="pp::AudioEncoder::RecycleBitstreamBuffer" ref="a9c5b90b6dbfd81154b28f402197184bc" args="(const PP_AudioBitstreamBuffer &bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">pp::AudioEncoder::RecycleBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const PP_AudioBitstreamBuffer & </td> +<td class="paramname"><em>bitstream_buffer</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A<code>PP_AudioBitstreamBuffer</code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="aa64ea3b0313335817833a72ceed96114"></a><!-- doxytag: member="pp::AudioEncoder::RequestBitrateChange" ref="aa64ea3b0313335817833a72ceed96114" args="(uint32_t bitrate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">pp::AudioEncoder::RequestBitrateChange</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>bitrate</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to the encoding bitrate. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this class was generated from the following file:<ul> +<li><a class="el" href="audio__encoder_8h.html">audio_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder__inherit__graph.png new file mode 100644 index 0000000..5b2e1e1 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_audio_encoder__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_instance.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_instance.html index c1426e0..3894b01 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_instance.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_instance.html
@@ -113,7 +113,7 @@ <div class="memdoc"> <p><a class="el" href="classpp_1_1_instance.html#a9773263ee281405030548fc224eeec08" title="AddPerInstanceObject() associates an instance with an interface, creating an object.">AddPerInstanceObject()</a> associates an instance with an interface, creating an object. </p> <p>Many optional interfaces are associated with a plugin instance. For example, the find in PPP_Find interface receives updates on a per-instance basis. This "per-instance" tracking allows such objects to associate themselves with an instance as "the" handler for that interface name.</p> -<p>In the case of the find example, the find object registers with its associated instance in its constructor and unregisters in its destructor. Then whenever it gets updates with a PP_Instance parameter, it can map back to the find object corresponding to that given PP_Instance by calling GetPerInstanceObject</p> +<p>In the case of the find example, the find object registers with its associated instance in its constructor and unregisters in its destructor. Then whenever it gets updates with a PP_Instance parameter, it can map back to the find object corresponding to that given PP_Instance by calling GetPerInstanceObject.</p> <p>This lookup is done on a per-interface-name basis. This means you can only have one object of a given interface name associated with an instance.</p> <p>If you are adding a handler for an additional interface, be sure to register with the module (AddPluginInterface) for your interface name to get the C calls in the first place.</p> <p>Refer to <a class="el" href="classpp_1_1_instance.html#a33c633189c7c321dac8e0c5dc6e67f5b" title="Refer to AddPerInstanceObject() for further information.">RemovePerInstanceObject()</a> and <a class="el" href="classpp_1_1_instance.html#a6dec498f1d49571be9fd40e23745327f" title="Look up an object previously associated with an instance.">GetPerInstanceObject()</a> for further information.</p>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html index 7845d8d..9e77949 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@ <div class="dyncontent"> <div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div> <map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map"> -<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,157,317,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,208,335,235"></area><area shape="rect" id="node7" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,259,297,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,309,300,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,360,315,387"></area><area shape="rect" id="node10" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,411,317,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,512,322,539"></area><area shape="rect" id="node13" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,563,316,589"></area><area shape="rect" id="node14" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,613,315,640"></area><area shape="rect" id="node20" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,664,357,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,765,325,792"></area><area shape="rect" id="node23" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,816,318,843"></area><area shape="rect" id="node24" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,867,317,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,917,331,944"></area><area shape="rect" id="node26" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,968,314,995"></area><area shape="rect" id="node27" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1019,317,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1069,315,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1120,330,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1171,335,1197"></area><area shape="rect" id="node31" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1221,325,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1272,319,1299"></area><area shape="rect" id="node33" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1323,295,1349"></area><area shape="rect" id="node34" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1373,315,1400"></area><area shape="rect" id="node15" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,512,560,539"></area><area shape="rect" id="node16" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,563,579,589"></area><area shape="rect" id="node17" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,613,570,640"></area><area shape="rect" id="node18" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,664,567,691"></area><area shape="rect" id="node19" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,715,568,741"></area></map> +<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map> <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> <p><a href="classpp_1_1_resource-members.html">List of all members.</a></p> <h2>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png index 68d3837b4..5fd5ac3 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_resource__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket-members.html index 2484890..4bd8553 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket-members.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket-members.html
@@ -18,6 +18,8 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#ae98c9decb3c3ea4ba1006943577b684d">GetBoundAddress</a>()</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a76a2e93f2fa01d0dce8d8216d53b4f44">IsAvailable</a>()</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td><code> [static]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">JoinGroup</a>(const NetAddress &group, const CompletionCallback callback)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">LeaveGroup</a>(const NetAddress &group, const CompletionCallback callback)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a72112f67b757bbbfaaf67ae3cfe2f602">operator=</a>(const UDPSocket &other)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">pp::Resource::operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket.html index c0bf3229..84f508f 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_u_d_p_socket.html
@@ -33,6 +33,8 @@ <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a657309cd3bc38cf28e25f4c71190d1a0">SendTo</a> (const char *buffer, int32_t num_bytes, const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &addr, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#aa1f03d8d0e7ef59c40724e2691f165f2">Close</a> ()</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a5ff91fd2342e534b57980c0c2e414251">SetOption</a> (PP_UDPSocket_Option name, const <a class="el" href="classpp_1_1_var.html">Var</a> &value, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">JoinGroup</a> (const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &group, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">LeaveGroup</a> (const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &group, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> callback)</td></tr> </table><h2> Static Public Member Functions</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a76a2e93f2fa01d0dce8d8216d53b4f44">IsAvailable</a> ()</td></tr> @@ -241,6 +243,76 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>true if the interface is available, false otherwise. </dd></dl> </div> </div> +<a class="anchor" id="a51bdeaeeef690d741850e7d691fa479d"></a><!-- doxytag: member="pp::UDPSocket::JoinGroup" ref="a51bdeaeeef690d741850e7d691fa479d" args="(const NetAddress &group, const CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">pp::UDPSocket::JoinGroup</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> & </td> +<td class="paramname"><em>group</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> </td> +<td class="paramname"><em>callback</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Joins the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a7efaa9eda9e58ffbd5f6b5c5c9e8b38c"></a><!-- doxytag: member="pp::UDPSocket::LeaveGroup" ref="a7efaa9eda9e58ffbd5f6b5c5c9e8b38c" args="(const NetAddress &group, const CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">pp::UDPSocket::LeaveGroup</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> & </td> +<td class="paramname"><em>group</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> </td> +<td class="paramname"><em>callback</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Leaves the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> <a class="anchor" id="a72112f67b757bbbfaaf67ae3cfe2f602"></a><!-- doxytag: member="pp::UDPSocket::operator=" ref="a72112f67b757bbbfaaf67ae3cfe2f602" args="(const UDPSocket &other)" --> <div class="memitem"> <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder-members.html index f383c8c..68a4c3e 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder-members.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder-members.html
@@ -16,7 +16,7 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366">Flush</a>(const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a">GetPicture</a>(const CompletionCallbackWithOutput< PP_VideoPicture > &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> -<tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">Initialize</a>(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">Initialize</a>(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder.html index a82fcda6..d05fd0a 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_decoder.html
@@ -24,7 +24,7 @@ <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#afc9613c960f58ff4c97804da4645cd64">VideoDecoder</a> ()</td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a5c7b1010b42e179cf51e55266eb1491a">VideoDecoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a0eec2949dd73ef6d52b6782cee3b427d">VideoDecoder</a> (const <a class="el" href="classpp_1_1_video_decoder.html">VideoDecoder</a> &other)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">Initialize</a> (const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">Initialize</a> (const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a2f1a48cf6d2f1854b20e6a747c9b03e3">Decode</a> (uint32_t decode_id, uint32_t size, const void *buffer, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a">GetPicture</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_VideoPicture > &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a7b9c4917ebd205572a0fe69a34f1bfd9">RecyclePicture</a> (const PP_VideoPicture &picture)</td></tr> @@ -36,7 +36,7 @@ <p>Typical usage:</p> <ul> <li>Call Create() to create a new video decoder resource.</li> -<li>Call <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> +<li>Call <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#a2f1a48cf6d2f1854b20e6a747c9b03e3" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> @@ -210,12 +210,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="classpp_1_1_video_decoder.html#aa05481906b07e929c9567bc22a48917a" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="classpp_1_1_video_decoder.html#aa05481906b07e929c9567bc22a48917a" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="a52d1b4e5b5427d3bfb263cdec051274e"></a><!-- doxytag: member="pp::VideoDecoder::Initialize" ref="a52d1b4e5b5427d3bfb263cdec051274e" args="(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const CompletionCallback &callback)" --> +<a class="anchor" id="a284c6a99f5c3ea83465f7eab81ca4ba8"></a><!-- doxytag: member="pp::VideoDecoder::Initialize" ref="a284c6a99f5c3ea83465f7eab81ca4ba8" args="(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const CompletionCallback &callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">pp::VideoDecoder::Initialize</a> </td> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">pp::VideoDecoder::Initialize</a> </td> <td>(</td> <td class="paramtype">const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> & </td> <td class="paramname"><em>graphics3d_context</em>, </td> @@ -235,6 +235,12 @@ <tr> <td class="paramkey"></td> <td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>min_picture_count</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> <td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> <td class="paramname"><em>callback</em> </td> </tr> @@ -253,11 +259,12 @@ <tr><td class="paramdir">[in]</td><td class="paramname">graphics3d_context</td><td>A <code>PPB_Graphics3D</code> resource to use during decoding. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">profile</td><td>A <code>PP_VideoProfile</code> specifying the video codec profile. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">min_picture_count</td><td>A count of pictures the plugin would like to have in flight. This is effectively the number of times the plugin can call <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> and get a decoded frame without calling <a class="el" href="classpp_1_1_video_decoder.html#a7b9c4917ebd205572a0fe69a34f1bfd9" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>. The decoder has its own internal minimum count, and will take the larger of its internal and this value. A client that doesn't care can therefore just pass in zero for this argument. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> </div> </div> <a class="anchor" id="a7b9c4917ebd205572a0fe69a34f1bfd9"></a><!-- doxytag: member="pp::VideoDecoder::RecyclePicture" ref="a7b9c4917ebd205572a0fe69a34f1bfd9" args="(const PP_VideoPicture &picture)" -->
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder-members.html new file mode 100644 index 0000000..1f9a454 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder-members.html
@@ -0,0 +1,40 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>Member List</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +This is the complete list of members for <a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a>, including all inherited members.<table> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">Close</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">Encode</a>(const VideoFrame &video_frame, bool force_keyframe, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">GetBitstreamBuffer</a>(const CompletionCallbackWithOutput< PP_BitstreamBuffer > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">GetFrameCodedSize</a>(Size *coded_size)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">GetFramesRequired</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">GetSupportedProfiles</a>(const CompletionCallbackWithOutput< std::vector< PP_VideoProfileDescription > > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">GetVideoFrame</a>(const CompletionCallbackWithOutput< VideoFrame > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">Initialize</a>(const PP_VideoFrame_Format &input_format, const Size &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">RecycleBitstreamBuffer</a>(const PP_BitstreamBuffer &bitstream_buffer)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">RequestEncodingParametersChange</a>(uint32_t bitrate, uint32_t framerate)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">VideoEncoder</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a479c6cbd73b497c98871d877ef9e0b29">VideoEncoder</a>(const InstanceHandle &instance)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td><code> [explicit]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ad9d09d444a0480153aa5086fda13f064">VideoEncoder</a>(const VideoEncoder &other)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> +</table></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder.html new file mode 100644 index 0000000..c653949 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder.html
@@ -0,0 +1,418 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>pp::VideoEncoder Class Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="pp::VideoEncoder" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader"> +Inheritance diagram for pp::VideoEncoder:</div> +<div class="dyncontent"> +<div class="center"><img src="classpp_1_1_video_encoder__inherit__graph.png" border="0" usemap="#pp_1_1_video_encoder_inherit__map" alt="Inheritance graph" /></div> +<map name="pp_1_1_video_encoder_inherit__map" id="pp_1_1_video_encoder_inherit__map"> +<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="20,5,124,32"></area></map> +<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> +<p><a href="classpp_1_1_video_encoder-members.html">List of all members.</a></p> +<h2> +Public Member Functions</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">VideoEncoder</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a479c6cbd73b497c98871d877ef9e0b29">VideoEncoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ad9d09d444a0480153aa5086fda13f064">VideoEncoder</a> (const <a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a> &other)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">GetSupportedProfiles</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_VideoProfileDescription > > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">Initialize</a> (const PP_VideoFrame_Format &input_format, const <a class="el" href="classpp_1_1_size.html">Size</a> &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">GetFramesRequired</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">GetFrameCodedSize</a> (<a class="el" href="classpp_1_1_size.html">Size</a> *coded_size)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">GetVideoFrame</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">Encode</a> (const <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> &video_frame, bool force_keyframe, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">GetBitstreamBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_BitstreamBuffer > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">RecycleBitstreamBuffer</a> (const PP_BitstreamBuffer &bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">RequestEncodingParametersChange</a> (uint32_t bitrate, uint32_t framerate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">Close</a> ()</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Video encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call Create() to create a new video encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2" title="Gets a blank video frame which can be filled with video data and passed to the encoder.">GetVideoFrame()</a> to get a blank frame and fill it in, or get a video frame from another resource, e.g. <code>PPB_MediaStreamVideoTrack</code>.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd" title="Encodes a video frame.">Encode()</a> to push the video frame to the encoder. If an external frame is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded pictures from the encoder.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available video codecs vary by platform. All: vp8 (software). ChromeOS, depending on your device: h264 (hardware), vp8 (hardware) </p> +</div><hr /><h2>Constructor & Destructor Documentation</h2> +<a class="anchor" id="a6a84b977ee05e00bb2c00519d1893d08"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="a6a84b977ee05e00bb2c00519d1893d08" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code> object. </p> +</div> +</div> +<a class="anchor" id="a479c6cbd73b497c98871d877ef9e0b29"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="a479c6cbd73b497c98871d877ef9e0b29" args="(const InstanceHandle &instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> & </td> +<td class="paramname"><em>instance</em></td><td>)</td> +<td><code> [explicit]</code></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A constructor used to create a <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code> and associate it with the provided <code><a class="el" href="classpp_1_1_instance.html">Instance</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ad9d09d444a0480153aa5086fda13f064"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="ad9d09d444a0480153aa5086fda13f064" args="(const VideoEncoder &other)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a> & </td> +<td class="paramname"><em>other</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The copy constructor for <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code>. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr /><h2>Member Function Documentation</h2> +<a class="anchor" id="a411036495143eb6484b668e2d26c1170"></a><!-- doxytag: member="pp::VideoEncoder::Close" ref="a411036495143eb6484b668e2d26c1170" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">pp::VideoEncoder::Close</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the video encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the video encoder closes it implicitly, so you are not required to call <a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170" title="Closes the video encoder, and cancels any pending encodes.">Close()</a>. </p> +</div> +</div> +<a class="anchor" id="a39755b4e3aee295d8ba509da9904e5cd"></a><!-- doxytag: member="pp::VideoEncoder::Encode" ref="a39755b4e3aee295d8ba509da9904e5cd" args="(const VideoFrame &video_frame, bool force_keyframe, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">pp::VideoEncoder::Encode</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> & </td> +<td class="paramname"><em>video_frame</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">bool </td> +<td class="paramname"><em>force_keyframe</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes a video frame. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_frame</td><td>The <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">force_keyframe</td><td>A <code>PP_Bool> specifying whether the encoder should emit a key frame for this video frame. </code></td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td><code>A </code><code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion. Plugins that pass <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code> An int32_t containing an error code from </code><code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a9c0861d91f7c93cb15cf917ca6d6cf95"></a><!-- doxytag: member="pp::VideoEncoder::GetBitstreamBuffer" ref="a9c0861d91f7c93cb15cf917ca6d6cf95" args="(const CompletionCallbackWithOutput< PP_BitstreamBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">pp::VideoEncoder::GetBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_BitstreamBuffer > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code>PP_BitstreamBuffer</code> containing encoded video data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the next bitstream buffer. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a2112ec6caf60385c1625b85e3697d777"></a><!-- doxytag: member="pp::VideoEncoder::GetFrameCodedSize" ref="a2112ec6caf60385c1625b85e3697d777" args="(Size *coded_size)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">pp::VideoEncoder::GetFrameCodedSize</a> </td> +<td>(</td> +<td class="paramtype"><a class="el" href="classpp_1_1_size.html">Size</a> * </td> +<td class="paramname"><em>coded_size</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the coded size of the video frames required by the encoder. </p> +<p>Coded size is the logical size of the input frames, in pixels. The encoder may have hardware alignment requirements that make this different from |input_visible_size|, as requested in the call to <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">coded_size</td><td>A <code><a class="el" href="classpp_1_1_size.html" title="A size of an object based on width and height.">Size</a></code> to hold the coded size.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ae673a5ebfed4fc3198a405cccecfbe54"></a><!-- doxytag: member="pp::VideoEncoder::GetFramesRequired" ref="ae673a5ebfed4fc3198a405cccecfbe54" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">pp::VideoEncoder::GetFramesRequired</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of input video frames that the encoder may hold while encoding. </p> +<p>If the plugin is providing the video frames, it should have at least this many available.</p> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of frames required, or an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a5c264d3b6ec0a5970cc1dee74dbfaf55"></a><!-- doxytag: member="pp::VideoEncoder::GetSupportedProfiles" ref="a5c264d3b6ec0a5970cc1dee74dbfaf55" args="(const CompletionCallbackWithOutput< std::vector< PP_VideoProfileDescription > > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">pp::VideoEncoder::GetSupportedProfiles</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_VideoProfileDescription > > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported video encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the PP_VideoProfileDescription structs.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a5c5fabe6a00afe6b8849bbc612183bb2"></a><!-- doxytag: member="pp::VideoEncoder::GetVideoFrame" ref="a5c5fabe6a00afe6b8849bbc612183bb2" args="(const CompletionCallbackWithOutput< VideoFrame > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">pp::VideoEncoder::GetVideoFrame</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank video frame which can be filled with video data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the blank <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="ad2c47c10cfe92a3bf41e204d326560c7"></a><!-- doxytag: member="pp::VideoEncoder::Initialize" ref="ad2c47c10cfe92a3bf41e204d326560c7" args="(const PP_VideoFrame_Format &input_format, const Size &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">pp::VideoEncoder::Initialize</a> </td> +<td>(</td> +<td class="paramtype">const PP_VideoFrame_Format & </td> +<td class="paramname"><em>input_format</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_size.html">Size</a> & </td> +<td class="paramname"><em>input_visible_size</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const PP_VideoProfile & </td> +<td class="paramname"><em>output_profile</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const uint32_t </td> +<td class="paramname"><em>initial_bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_HardwareAcceleration </td> +<td class="paramname"><em>acceleration</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a video encoder resource. </p> +<p>This should be called after <a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55" title="Gets an array of supported video encoder profiles.">GetSupportedProfiles()</a> and before any functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">input_format</td><td>The <code>PP_VideoFrame_Format</code> of the frames which will be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_visible_size</td><td>A <code><a class="el" href="classpp_1_1_size.html" title="A size of an object based on width and height.">Size</a></code> specifying the dimensions of the visible part of the input frames. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_VideoProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video encoding is not available, or the requested codec profile is not supported. Returns PP_ERROR_NOMEMORY if frame and bitstream buffers can't be created. </dd></dl> +</div> +</div> +<a class="anchor" id="a81aec23c26a3f9c16ff90efdc38b2895"></a><!-- doxytag: member="pp::VideoEncoder::RecycleBitstreamBuffer" ref="a81aec23c26a3f9c16ff90efdc38b2895" args="(const PP_BitstreamBuffer &bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">pp::VideoEncoder::RecycleBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const PP_BitstreamBuffer & </td> +<td class="paramname"><em>bitstream_buffer</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code>PP_BitstreamBuffer</code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a727159fe366c6ce146dce4c42a608fd7"></a><!-- doxytag: member="pp::VideoEncoder::RequestEncodingParametersChange" ref="a727159fe366c6ce146dce4c42a608fd7" args="(uint32_t bitrate, uint32_t framerate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">pp::VideoEncoder::RequestEncodingParametersChange</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>framerate</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to encoding parameters. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">framerate</td><td>The requested new framerate, in frames per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this class was generated from the following file:<ul> +<li><a class="el" href="video__encoder_8h.html">video_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder__inherit__graph.png b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder__inherit__graph.png new file mode 100644 index 0000000..14d3b23 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_video_encoder__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view-members.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view-members.html index faae169..a080677 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view-members.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view-members.html
@@ -30,7 +30,7 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#aebcd4ab8818a6e1dfe68e2c435823ad9">View</a>()</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td></td></tr> -<tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#a89cc79b6731f0e67d0821fe83b3e64fb">View</a>(PP_Resource view_resource)</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#a89cc79b6731f0e67d0821fe83b3e64fb">View</a>(PP_Resource view_resource)</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td><code> [explicit]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> </table></div><!-- contents --> </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view.html b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view.html index a415406..7f23b4d 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/classpp_1_1_view.html
@@ -60,7 +60,7 @@ <td>(</td> <td class="paramtype">PP_Resource </td> <td class="paramname"><em>view_resource</em></td><td>)</td> -<td></td> +<td><code> [explicit]</code></td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png b/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png index 6aebbb2..056cffd 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/inherit_graph_23.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html index 150ad2b..f1a43a2c 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/inherits.html
@@ -106,7 +106,7 @@ </td></tr> <tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#pp_1_1_resource" /> <map name="pp_1_1_resource" id="pp_1_1_resource"> -<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,689,109,716"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,157,317,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,208,335,235"></area><area shape="rect" id="node7" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,259,297,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,309,300,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,360,315,387"></area><area shape="rect" id="node10" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,411,317,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,512,322,539"></area><area shape="rect" id="node13" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,563,316,589"></area><area shape="rect" id="node14" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,613,315,640"></area><area shape="rect" id="node20" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,664,357,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,765,325,792"></area><area shape="rect" id="node23" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,816,318,843"></area><area shape="rect" id="node24" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,867,317,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,917,331,944"></area><area shape="rect" id="node26" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,968,314,995"></area><area shape="rect" id="node27" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1019,317,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1069,315,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1120,330,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1171,335,1197"></area><area shape="rect" id="node31" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1221,325,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1272,319,1299"></area><area shape="rect" id="node33" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1323,295,1349"></area><area shape="rect" id="node34" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1373,315,1400"></area><area shape="rect" id="node15" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,512,560,539"></area><area shape="rect" id="node16" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,563,579,589"></area><area shape="rect" id="node17" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,613,570,640"></area><area shape="rect" id="node18" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,664,567,691"></area><area shape="rect" id="node19" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,715,568,741"></area></map> +<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,740,109,767"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map> </td></tr> <tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#pp_1_1_size" /> <map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html index d04f649..e888367 100644 --- a/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/namespacepp.html
@@ -20,6 +20,8 @@ <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_config.html">AudioConfig</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">A 16 bit stereo <a class="el" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource.">AudioConfig</a> resource. <a href="classpp_1_1_audio_config.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. <a href="classpp_1_1_audio_encoder.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">This API enables you to implement and receive callbacks when Pepper operations complete asynchronously. <a href="classpp_1_1_completion_callback.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></td></tr> @@ -112,6 +114,8 @@ <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var_dictionary.html">VarDictionary</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html">VideoDecoder</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="classpp_1_1_video_decoder.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="classpp_1_1_video_encoder.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_view.html">View</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">This class represents the state of the view for an instance and contains functions for retrieving the current state of that view. <a href="classpp_1_1_view.html#details">More...</a><br /></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/video__encoder_8h.html b/native_client_sdk/doc_generated/pepper_dev/cpp/video__encoder_8h.html new file mode 100644 index 0000000..2de4073 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/video__encoder_8h.html
@@ -0,0 +1,32 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>video_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for video_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="video__encoder_8h__incl.png" border="0" usemap="#video__encoder_8h" alt="" /></div> +<map name="video__encoder_8h" id="video__encoder_8h"> +</map> +</div> +</div><h2> +Classes</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="classpp_1_1_video_encoder.html#details">More...</a><br /></td></tr> +</table><h2> +Namespaces</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the API to create and use a VideoEncoder resource. </p> +</div></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_dev/cpp/video__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_dev/cpp/video__encoder_8h__incl.png new file mode 100644 index 0000000..553cbab9 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_dev/cpp/video__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_dev/index.html b/native_client_sdk/doc_generated/pepper_dev/index.html index f71a18b3..d54498e 100644 --- a/native_client_sdk/doc_generated/pepper_dev/index.html +++ b/native_client_sdk/doc_generated/pepper_dev/index.html
@@ -2,8 +2,8 @@ <section id="pepper-api-reference-dev"> <h1 id="pepper-api-reference-dev">Pepper API Reference (Dev)</h1> -<p>This page lists the API for Pepper 42. Apps that use this API can -run in Chrome 42 or higher.</p> +<p>This page lists the API for Pepper 49. Apps that use this API can +run in Chrome 49 or higher.</p> <h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/c-api-dev.html#pepper-dev-c-index"><em>Pepper C API Reference</em></a></h2> <h2 id="id1"><a class="reference internal" href="/native-client/cpp-api-dev.html#pepper-dev-cpp-index"><em>Pepper C++ API Reference</em></a></h2> </section>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html b/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html index a088a1b..b08950b1 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/globals_defs.html
@@ -31,6 +31,9 @@ <li>PPB_AUDIOBUFFER_INTERFACE_0_1 : <a class="el" href="ppb__audio__buffer_8h.html#a4fddf6d285021552ba11f4460ba47445">ppb_audio_buffer.h</a> </li> +<li>PPB_AUDIOENCODER_INTERFACE_0_1 +: <a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">ppb_audio_encoder.h</a> +</li> <li>PPB_COMPOSITOR_INTERFACE_0_1 : <a class="el" href="ppb__compositor_8h.html#ac8b0ddbdff260dd5531525784556c045">ppb_compositor.h</a> </li> @@ -55,9 +58,6 @@ <li>PPB_FILEIO_INTERFACE_1_1 : <a class="el" href="ppb__file__io_8h.html#aee417de3562daef62dbf68ddc16a8477">ppb_file_io.h</a> </li> -<li>PPB_FILEMAPPING_INTERFACE_0_1 -: <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">ppb_file_mapping.h</a> -</li> <li>PPB_FILEREF_INTERFACE : <a class="el" href="ppb__file__ref_8h.html#a00615ce99f7d6774b0fc5c8f0326f0ba">ppb_file_ref.h</a> </li> @@ -244,8 +244,8 @@ <li>PPB_TCPSOCKET_INTERFACE : <a class="el" href="ppb__tcp__socket_8h.html#a29ecaef1552f19b223e6c93475d8788c">ppb_tcp_socket.h</a> </li> -<li>PPB_TCPSOCKET_INTERFACE_1_1 -: <a class="el" href="ppb__tcp__socket_8h.html#a12b0fabc454cb99a6d4c8352c6f22d71">ppb_tcp_socket.h</a> +<li>PPB_TCPSOCKET_INTERFACE_1_2 +: <a class="el" href="ppb__tcp__socket_8h.html#a2f1cedfee70f4bfe4c35849be53fd73f">ppb_tcp_socket.h</a> </li> <li>PPB_TEXTINPUTCONTROLLER_INTERFACE : <a class="el" href="ppb__text__input__controller_8h.html#a9a28f7fd2db84c2cd550ed272070c0ee">ppb_text_input_controller.h</a> @@ -262,8 +262,8 @@ <li>PPB_UDPSOCKET_INTERFACE : <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">ppb_udp_socket.h</a> </li> -<li>PPB_UDPSOCKET_INTERFACE_1_0 -: <a class="el" href="ppb__udp__socket_8h.html#aafc1aecb9a8f2c3f8eed80a93a77763c">ppb_udp_socket.h</a> +<li>PPB_UDPSOCKET_INTERFACE_1_2 +: <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">ppb_udp_socket.h</a> </li> <li>PPB_URLLOADER_INTERFACE : <a class="el" href="ppb__url__loader_8h.html#ae1fa8c5cdfccb7ea67e184b1e5e1009e">ppb_url_loader.h</a> @@ -310,8 +310,14 @@ <li>PPB_VIDEODECODER_INTERFACE : <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">ppb_video_decoder.h</a> </li> -<li>PPB_VIDEODECODER_INTERFACE_1_0 -: <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">ppb_video_decoder.h</a> +<li>PPB_VIDEODECODER_INTERFACE_1_1 +: <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">ppb_video_decoder.h</a> +</li> +<li>PPB_VIDEOENCODER_INTERFACE +: <a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">ppb_video_encoder.h</a> +</li> +<li>PPB_VIDEOENCODER_INTERFACE_0_2 +: <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">ppb_video_encoder.h</a> </li> <li>PPB_VIDEOFRAME_INTERFACE : <a class="el" href="ppb__video__frame_8h.html#ac161d8c49f583eda31622d9fc010cd0d">ppb_video_frame.h</a>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html b/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html index 237129e..f5d7907 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/group___enums.html
@@ -34,6 +34,9 @@ <a class="el" href="group___enums.html#gga4d50d27186f68b2de578e82162206feaa884e0f18fee1bae2472a15f6fb1d7e79">PP_VIDEOPROFILE_MAX</a> = PP_VIDEOPROFILE_VP9_ANY <br /> }</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> { <a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191">PP_AUDIOPROFILE_OPUS</a> = 0, +<a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77">PP_AUDIOPROFILE_MAX</a> = PP_AUDIOPROFILE_OPUS + }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> { <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5a6208cea63b7e6c1c8c9c67616df4ba85">PP_HARDWAREACCELERATION_ONLY</a> = 0, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5ad29490655cc25165817de26c5caff7ea">PP_HARDWAREACCELERATION_WITHFALLBACK</a> = 1, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5acf901685e6e14afe89e7d22ad35af4e1">PP_HARDWAREACCELERATION_NONE</a> = 2, @@ -189,13 +192,6 @@ <a class="el" href="group___enums.html#gga4c87e6dd19c1d49b66a9b37136a82e82a78c13cbbccebfa9c2b8b2f758397795c">PP_FILEOPENFLAG_APPEND</a> = 1 << 5 <br /> }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a> { <a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb">PP_FILEMAPPROTECTION_READ</a> = 1u << 0, -<a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e">PP_FILEMAPPROTECTION_WRITE</a> = 1u << 1 - }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a> { <a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c">PP_FILEMAPFLAG_SHARED</a> = 1u << 0, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03">PP_FILEMAPFLAG_PRIVATE</a> = 1u << 1, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e">PP_FILEMAPFLAG_FIXED</a> = 1u << 2 - }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadcb0a92e6ca510586c3f34088d35dc9f">PP_MakeDirectoryFlags</a> { <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fafeeef418b62780276c4671a57196ad3f">PP_MAKEDIRECTORYFLAG_NONE</a> = 0 << 0, <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fa5c7f89c8784c9d8abfaeae51d9cb84ba">PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS</a> = 1 << 0, <a class="el" href="group___enums.html#ggadcb0a92e6ca510586c3f34088d35dc9fa34dd5b5ba9af9e5c820d3c6e21fc2094">PP_MAKEDIRECTORYFLAG_EXCLUSIVE</a> = 1 << 1 @@ -373,10 +369,15 @@ <a class="el" href="group___enums.html#gga5fef49ee4c2cc6dcead825340da0f116ad4371ecdd1a6631a78d4721d83062394">PP_TEXTINPUT_TYPE_URL</a> = 7 <br /> }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00">PP_UDPSOCKET_OPTION_BROADCAST</a> = 1, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57">PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</a> = 2, -<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3 +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3, +<br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c">PP_UDPSOCKET_OPTION_MULTICAST_LOOP</a> = 4, +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82">PP_UDPSOCKET_OPTION_MULTICAST_TTL</a> = 5 +<br /> }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga41975630f0a4c49e47d4a21754f8402d">PP_URLRequestProperty</a> { <br />   <a class="el" href="group___enums.html#gga41975630f0a4c49e47d4a21754f8402da89e44812e771fed9df0ff8994690e44d">PP_URLREQUESTPROPERTY_URL</a> = 0, @@ -464,8 +465,6 @@ <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gaee750c350655f2fb0fe04c04029e0ff8">PP_AudioSampleRate</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gac39067c0883ec80b94290dd2a3bae440">PP_LogLevel</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga4c87e6dd19c1d49b66a9b37136a82e82">PP_FileOpenFlags</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadb4b8db19266831040fc604f73c83a25">PP_HostResolver_Flag</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga2ee7ad01799553e5f17bdaa35dd952ee">PP_ImageDataFormat</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gaca7296cfec99fcb6646b7144d1d6a0c5">PP_InputEvent_Type</a></td></tr> @@ -713,6 +712,27 @@ </dl> </div> </div> +<a class="anchor" id="gadadb1eaddb4ea71cb8620db1f4ce301e"></a><!-- doxytag: member="pp_codecs.h::PP_AudioProfile" ref="gadadb1eaddb4ea71cb8620db1f4ce301e" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">enum <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Audio profiles. </p> +<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> +<tr><td valign="top"><em><a class="anchor" id="ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191"></a><!-- doxytag: member="PP_AUDIOPROFILE_OPUS" ref="ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191" args="" -->PP_AUDIOPROFILE_OPUS</em> </td><td> +</td></tr> +<tr><td valign="top"><em><a class="anchor" id="ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77"></a><!-- doxytag: member="PP_AUDIOPROFILE_MAX" ref="ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77" args="" -->PP_AUDIOPROFILE_MAX</em> </td><td> +</td></tr> +</table> +</dd> +</dl> +</div> +</div> <a class="anchor" id="gaee750c350655f2fb0fe04c04029e0ff8"></a><!-- doxytag: member="ppb_audio_config.h::PP_AudioSampleRate" ref="gaee750c350655f2fb0fe04c04029e0ff8" args="" --> <div class="memitem"> <div class="memproto"> @@ -814,59 +834,6 @@ </dl> </div> </div> -<a class="anchor" id="ga47ce032e16d18ba6fc6c16bbe8939bad"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapFlags" ref="ga47ce032e16d18ba6fc6c16bbe8939bad" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">enum <a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>The PP_FileMapFlags contain flag values for use with Map(). </p> -<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c"></a><!-- doxytag: member="PP_FILEMAPFLAG_SHARED" ref="gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c" args="" -->PP_FILEMAPFLAG_SHARED</em> </td><td> -<p>Requests a shared mapping. </p> -<p>If this flag is set, changes written to the memory region will be reflected in the underlying file and will thus eventually be visible to other processes which have opened the file. The file may not actually be updated until Unmap() is called. This is only valid if the PPB_FileIO resource was opened with write permission. </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03"></a><!-- doxytag: member="PP_FILEMAPFLAG_PRIVATE" ref="gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03" args="" -->PP_FILEMAPFLAG_PRIVATE</em> </td><td> -<p>Requests a copy-on-write mapping. </p> -<p>If this flag is set, changes are not written to the underlying file, but only in the memory of the process (copy-on-write). </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e"></a><!-- doxytag: member="PP_FILEMAPFLAG_FIXED" ref="gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e" args="" -->PP_FILEMAPFLAG_FIXED</em> </td><td> -<p>Forces Map() to map the file contents at the provided |address|. </p> -<p>If Map() can not comply, Map() will fail. </p> -</td></tr> -</table> -</dd> -</dl> -</div> -</div> -<a class="anchor" id="ga07cb383dee51bc7e8e1f234068652668"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapProtection" ref="ga07cb383dee51bc7e8e1f234068652668" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">enum <a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>The PP_FileMapProtection values indicate the permissions requested for the file mapping. </p> -<p>These should be used in a uint32_t bitfield. </p> -<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> -<tr><td valign="top"><em><a class="anchor" id="gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb"></a><!-- doxytag: member="PP_FILEMAPPROTECTION_READ" ref="gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb" args="" -->PP_FILEMAPPROTECTION_READ</em> </td><td> -<p>Requests read access to the mapped address. </p> -</td></tr> -<tr><td valign="top"><em><a class="anchor" id="gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e"></a><!-- doxytag: member="PP_FILEMAPPROTECTION_WRITE" ref="gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e" args="" -->PP_FILEMAPPROTECTION_WRITE</em> </td><td> -<p>Requests write access to the mapped address. </p> -</td></tr> -</table> -</dd> -</dl> -</div> -</div> <a class="anchor" id="ga4c87e6dd19c1d49b66a9b37136a82e82"></a><!-- doxytag: member="ppb_file_io.h::PP_FileOpenFlags" ref="ga4c87e6dd19c1d49b66a9b37136a82e82" args="" --> <div class="memitem"> <div class="memproto"> @@ -1644,16 +1611,16 @@ <dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><em><a class="anchor" id="gga1557c0bbce8739a3418e6027a9c44e12a4b17558654d1df4452aa98f7d2609a10"></a><!-- doxytag: member="PP_TCPSOCKET_OPTION_NO_DELAY" ref="gga1557c0bbce8739a3418e6027a9c44e12a4b17558654d1df4452aa98f7d2609a10" args="" -->PP_TCPSOCKET_OPTION_NO_DELAY</em> </td><td> <p>Disables coalescing of small writes to make TCP segments, and instead delivers data immediately. </p> -<p>Value's type is <code>PP_VARTYPE_BOOL</code>. This option can only be set after a successful <code>Connect()</code> call. </p> +<p>Value's type is <code>PP_VARTYPE_BOOL</code>. On version 1.1 or earlier, this option can only be set after a successful <code>Connect()</code> call. On version 1.2 or later, there is no such limitation. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga1557c0bbce8739a3418e6027a9c44e12a61ce27ba7853d05f7af51be1bed5d1a6"></a><!-- doxytag: member="PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE" ref="gga1557c0bbce8739a3418e6027a9c44e12a61ce27ba7853d05f7af51be1bed5d1a6" args="" -->PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE</em> </td><td> <p>Specifies the total per-socket buffer space reserved for sends. </p> -<p>Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set after a successful <code>Connect()</code> call.</p> +<p>Value's type should be <code>PP_VARTYPE_INT32</code>. On version 1.1 or earlier, this option can only be set after a successful <code>Connect()</code> call. On version 1.2 or later, there is no such limitation.</p> <p>Note: This is only treated as a hint for the browser to set the buffer size. Even if <code>SetOption()</code> succeeds, the browser doesn't guarantee it will conform to the size. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga1557c0bbce8739a3418e6027a9c44e12aef57736e294acb30fb7b3b2f4a425f72"></a><!-- doxytag: member="PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE" ref="gga1557c0bbce8739a3418e6027a9c44e12aef57736e294acb30fb7b3b2f4a425f72" args="" -->PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE</em> </td><td> <p>Specifies the total per-socket buffer space reserved for receives. </p> -<p>Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set after a successful <code>Connect()</code> call.</p> +<p>Value's type should be <code>PP_VARTYPE_INT32</code>. On version 1.1 or earlier, this option can only be set after a successful <code>Connect()</code> call. On version 1.2 or later, there is no such limitation.</p> <p>Note: This is only treated as a hint for the browser to set the buffer size. Even if <code>SetOption()</code> succeeds, the browser doesn't guarantee it will conform to the size. </p> </td></tr> </table> @@ -1741,18 +1708,28 @@ </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_BROADCAST" ref="gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00" args="" -->PP_UDPSOCKET_OPTION_BROADCAST</em> </td><td> <p>Allows sending and receiving packets to and from broadcast addresses. </p> -<p>Value's type should be <code>PP_VARTYPE_BOOL</code>. This option can only be set before calling <code>Bind()</code>. </p> +<p>Value's type should be <code>PP_VARTYPE_BOOL</code>. On version 1.0, this option can only be set before calling <code>Bind()</code>. On version 1.1 or later, there is no such limitation. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57" args="" -->PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</em> </td><td> <p>Specifies the total per-socket buffer space reserved for sends. </p> -<p>Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set after a successful <code>Bind()</code> call.</p> +<p>Value's type should be <code>PP_VARTYPE_INT32</code>. On version 1.0, this option can only be set after a successful <code>Bind()</code> call. On version 1.1 or later, there is no such limitation.</p> <p>Note: This is only treated as a hint for the browser to set the buffer size. Even if <code>SetOption()</code> succeeds, the browser doesn't guarantee it will conform to the size. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64" args="" -->PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</em> </td><td> <p>Specifies the total per-socket buffer space reserved for receives. </p> -<p>Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set after a successful <code>Bind()</code> call.</p> +<p>Value's type should be <code>PP_VARTYPE_INT32</code>. On version 1.0, this option can only be set after a successful <code>Bind()</code> call. On version 1.1 or later, there is no such limitation.</p> <p>Note: This is only treated as a hint for the browser to set the buffer size. Even if <code>SetOption()</code> succeeds, the browser doesn't guarantee it will conform to the size. </p> </td></tr> +<tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_MULTICAST_LOOP" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c" args="" -->PP_UDPSOCKET_OPTION_MULTICAST_LOOP</em> </td><td> +<p>Specifies whether the packets sent from the host to the multicast group should be looped back to the host or not. </p> +<p>Value's type should be <code>PP_VARTYPE_BOOL</code>. This option can only be set before calling <code>Bind()</code>.</p> +<p>This is only supported in version 1.2 of the API (Chrome 43) and later. </p> +</td></tr> +<tr><td valign="top"><em><a class="anchor" id="gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82"></a><!-- doxytag: member="PP_UDPSOCKET_OPTION_MULTICAST_TTL" ref="gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82" args="" -->PP_UDPSOCKET_OPTION_MULTICAST_TTL</em> </td><td> +<p>Specifies the time-to-live for packets sent to the multicast group. </p> +<p>The value should be within 0 to 255 range. The default value is 1 and means that packets will not be routed beyond the local network. Value's type should be <code>PP_VARTYPE_INT32</code>. This option can only be set before calling <code>Bind()</code>.</p> +<p>This is only supported in version 1.2 of the API (Chrome 43) and later. </p> +</td></tr> </table> </dd> </dl> @@ -2178,30 +2155,6 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga47ce032e16d18ba6fc6c16bbe8939bad"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapFlags" ref="ga47ce032e16d18ba6fc6c16bbe8939bad" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> -<a class="anchor" id="ga07cb383dee51bc7e8e1f234068652668"></a><!-- doxytag: member="ppb_file_mapping.h::PP_FileMapProtection" ref="ga07cb383dee51bc7e8e1f234068652668" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> <a class="anchor" id="ga4c87e6dd19c1d49b66a9b37136a82e82"></a><!-- doxytag: member="ppb_file_io.h::PP_FileOpenFlags" ref="ga4c87e6dd19c1d49b66a9b37136a82e82" args="" --> <div class="memitem"> <div class="memproto">
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html b/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html index 1b8ec48..72f88bb 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/group___interfaces.html
@@ -16,6 +16,8 @@ <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_buffer__0__1.html">PPB_AudioBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_config__1__1.html">PPB_AudioConfig</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_AudioConfig</code> interface contains pointers to several functions for establishing your audio configuration within the browser. <a href="struct_p_p_b___audio_config__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Audio encoder interface. <a href="struct_p_p_b___audio_encoder__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___compositor__0__1.html">PPB_Compositor</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Defines the <code>PPB_Compositor</code> interface. <a href="struct_p_p_b___compositor__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___compositor_layer__0__2.html">PPB_CompositorLayer</a></td></tr> @@ -25,8 +27,6 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_Core</code> interface contains pointers to functions related to memory management, time, and threads on the browser. <a href="struct_p_p_b___core__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_i_o__1__1.html">PPB_FileIO</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_FileIO</code> struct is used to operate on a regular file (PP_FileType_Regular). <a href="struct_p_p_b___file_i_o__1__1.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. <a href="struct_p_p_b___file_mapping__0__1.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_ref__1__2.html">PPB_FileRef</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_FileRef</code> struct represents a "weak pointer" to a file in a file system. <a href="struct_p_p_b___file_ref__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_system__1__0.html">PPB_FileSystem</a></td></tr> @@ -90,12 +90,12 @@ <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___open_g_l_e_s2_query.html">PPB_OpenGLES2Query</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___open_g_l_e_s2_vertex_array_object__1__0.html">PPB_OpenGLES2VertexArrayObject</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___open_g_l_e_s2_vertex_array_object.html">PPB_OpenGLES2VertexArrayObject</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html">PPB_TCPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_TCPSocket</code> interface provides TCP socket operations. <a href="struct_p_p_b___t_c_p_socket__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_TCPSocket</code> interface provides TCP socket operations. <a href="struct_p_p_b___t_c_p_socket__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code>PPB_TextInputController</code> provides a set of functions for giving hints to the browser about the text input status of plugins, and functions for controlling input method editors (IMEs). <a href="struct_p_p_b___text_input_controller__1__0.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html">PPB_UDPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The <b>PPB_URLLoader</b> interface contains pointers to functions for loading URLs. <a href="struct_p_p_b___u_r_l_loader__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a></td></tr> @@ -109,8 +109,10 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_VarArrayBuffer</code> interface provides a way to interact with JavaScript ArrayBuffers, which represent a contiguous sequence of bytes. <a href="struct_p_p_b___var_array_buffer__1__0.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">A dictionary var contains key-value pairs with unique keys. <a href="struct_p_p_b___var_dictionary__1__0.html#details">More...</a><br /></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="struct_p_p_b___video_encoder__0__2.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code>PPB_View</code> represents the state of the view of an instance. <a href="struct_p_p_b___view__1__2.html#details">More...</a><br /></td></tr> @@ -166,10 +168,10 @@ <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___network_monitor__1__0.html">PPB_NetworkMonitor</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga873d8c5cd49f7b3c8ad5b4caabd1e8e6">PPB_NetworkMonitor</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___network_proxy__1__0.html">PPB_NetworkProxy</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf8338a682417267c8525446ef1de85b1">PPB_NetworkProxy</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html">PPB_TCPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga0f72e14a6cf9631bd733ded1f8ba4d9f">PPB_TCPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga68e25baffc8cfc72d6c636a3a6217aa0">PPB_TCPSocket</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___text_input_controller__1__0.html">PPB_TextInputController</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab387085f6044f3a0b1631d119d22a942">PPB_TextInputController</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf04d893ccf01c5d1cfcadee5fcc869d1">PPB_UDPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_r_l_loader__1__0.html">PPB_URLLoader</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga307f562a9e41991de7c80b75cd7f379c">PPB_URLLoader</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___u_r_l_request_info__1__0.html">PPB_URLRequestInfo</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad60387934d9e235d3d145ee5a1fb4e74">PPB_URLRequestInfo</a></td></tr> @@ -181,7 +183,8 @@ <a class="el" href="struct_p_p_b___var_array_buffer__1__0.html">PPB_VarArrayBuffer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gab26d5bb032f5438d02faf5bdf7b208cb">PPB_VarArrayBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <br class="typebreak" /> <a class="el" href="struct_p_p_b___var_dictionary__1__0.html">PPB_VarDictionary</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga69826004b5c32232c9639090f3e1db2e">PPB_VarDictionary</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_frame__0__1.html">PPB_VideoFrame</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaa76d004c840f6c4f64a0694e7c844ae9">PPB_VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___view__1__2.html">PPB_View</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga116e11e23c92c99094c9704d97636a67">PPB_View</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___web_socket__1__0.html">PPB_WebSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gad0e152d14cefb0b480228f3fc7070faf">PPB_WebSocket</a></td></tr> @@ -530,12 +533,12 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga0f72e14a6cf9631bd733ded1f8ba4d9f"></a><!-- doxytag: member="ppb_tcp_socket.h::PPB_TCPSocket" ref="ga0f72e14a6cf9631bd733ded1f8ba4d9f" args="" --> +<a class="anchor" id="ga68e25baffc8cfc72d6c636a3a6217aa0"></a><!-- doxytag: member="ppb_tcp_socket.h::PPB_TCPSocket" ref="ga68e25baffc8cfc72d6c636a3a6217aa0" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html">PPB_TCPSocket</a> <a class="el" href="group___interfaces.html#ga0f72e14a6cf9631bd733ded1f8ba4d9f">PPB_TCPSocket</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a> <a class="el" href="group___interfaces.html#ga68e25baffc8cfc72d6c636a3a6217aa0">PPB_TCPSocket</a></td> </tr> </table> </div> @@ -566,12 +569,12 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="gaf04d893ccf01c5d1cfcadee5fcc869d1"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSocket" ref="gaf04d893ccf01c5d1cfcadee5fcc869d1" args="" --> +<a class="anchor" id="gac45ce5bed449ca63680c4769663fd2b1"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSocket" ref="gac45ce5bed449ca63680c4769663fd2b1" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html">PPB_UDPSocket</a> <a class="el" href="group___interfaces.html#gaf04d893ccf01c5d1cfcadee5fcc869d1">PPB_UDPSocket</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> <a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td> </tr> </table> </div> @@ -662,12 +665,24 @@ <div class="memdoc"> </div> </div> -<a class="anchor" id="ga2b4555d8bd239fa28b60c42df75f7ce5"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VideoDecoder" ref="ga2b4555d8bd239fa28b60c42df75f7ce5" args="" --> +<a class="anchor" id="ga3bfb47f476c3153e5638265c17702ed9"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VideoDecoder" ref="ga3bfb47f476c3153e5638265c17702ed9" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> <a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> <a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +<a class="anchor" id="ga1a72f170f2aaa94cd41aa16949e27973"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VideoEncoder" ref="ga1a72f170f2aaa94cd41aa16949e27973" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> <a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/group___structs.html b/native_client_sdk/doc_generated/pepper_stable/c/group___structs.html index 1bf6366..1bbd2a7 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/group___structs.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/group___structs.html
@@ -17,6 +17,16 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported audio profile information. <a href="struct_p_p___audio_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a bitstream buffer. <a href="struct_p_p___bitstream_buffer.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing an audio bitstream buffer. <a href="struct_p_p___audio_bitstream_buffer.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> is a common mechanism for supporting potentially asynchronous calls in browser interfaces. <a href="struct_p_p___completion_callback.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___directory_entry.html">PP_DirectoryEntry</a></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h.html index c9cbed88..5e4b639 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h.html
@@ -23,6 +23,16 @@ <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_picture__0__1.html">PP_VideoPicture</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a decoded video picture. <a href="struct_p_p___video_picture__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html">PP_VideoProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported video profile information. <a href="struct_p_p___video_profile_description__0__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html">PP_AudioProfileDescription</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Supported audio profile information. <a href="struct_p_p___audio_profile_description.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing a bitstream buffer. <a href="struct_p_p___bitstream_buffer.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Struct describing an audio bitstream buffer. <a href="struct_p_p___audio_bitstream_buffer.html#details">More...</a><br /></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> { <br /> @@ -45,6 +55,9 @@ <a class="el" href="group___enums.html#gga4d50d27186f68b2de578e82162206feaa884e0f18fee1bae2472a15f6fb1d7e79">PP_VIDEOPROFILE_MAX</a> = PP_VIDEOPROFILE_VP9_ANY <br /> }</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> { <a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea7148c3f24ae9baffeae215261460a191">PP_AUDIOPROFILE_OPUS</a> = 0, +<a class="el" href="group___enums.html#ggadadb1eaddb4ea71cb8620db1f4ce301ea2d878bc8ba09116d5f62bb4965460e77">PP_AUDIOPROFILE_MAX</a> = PP_AUDIOPROFILE_OPUS + }</td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> { <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5a6208cea63b7e6c1c8c9c67616df4ba85">PP_HARDWAREACCELERATION_ONLY</a> = 0, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5ad29490655cc25165817de26c5caff7ea">PP_HARDWAREACCELERATION_WITHFALLBACK</a> = 1, <a class="el" href="group___enums.html#gga6a3fd7e22be02521243b52481afadae5acf901685e6e14afe89e7d22ad35af4e1">PP_HARDWAREACCELERATION_NONE</a> = 2,
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h__incl.png index e74f895..d5c4e9a 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h__incl.png +++ b/native_client_sdk/doc_generated/pepper_stable/c/pp__codecs_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__audio__encoder_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__audio__encoder_8h.html new file mode 100644 index 0000000..04270d5 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__audio__encoder_8h.html
@@ -0,0 +1,45 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>ppb_audio_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for ppb_audio_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="ppb__audio__encoder_8h__incl.png" border="0" usemap="#ppb__audio__encoder_8h" alt="" /></div> +<map name="ppb__audio__encoder_8h" id="ppb__audio__encoder_8h"> +</map> +</div> +</div><h2> +Data Structures</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html">PPB_AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Audio encoder interface. <a href="struct_p_p_b___audio_encoder__0__1.html#details">More...</a><br /></td></tr> +</table><h2> +Defines</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">PPB_AUDIOENCODER_INTERFACE</a>   "PPB_AudioEncoder;0.1" /* dev */</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the <code>PPB_AudioEncoder</code> interface. </p> +</div><hr /><h2>Define Documentation</h2> +<a class="anchor" id="a4c4871532f8ac42a5a98f9f0aaac27a6"></a><!-- doxytag: member="ppb_audio_encoder.h::PPB_AUDIOENCODER_INTERFACE" ref="a4c4871532f8ac42a5a98f9f0aaac27a6" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__audio__encoder_8h.html#a4c4871532f8ac42a5a98f9f0aaac27a6">PPB_AUDIOENCODER_INTERFACE</a>   "PPB_AudioEncoder;0.1" /* dev */</td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__audio__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/c/ppb__audio__encoder_8h__incl.png new file mode 100644 index 0000000..0e98fe6 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__audio__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__file__mapping_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__file__mapping_8h.html deleted file mode 100644 index c5aba956..0000000 --- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__file__mapping_8h.html +++ /dev/null
@@ -1,58 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>ppb_file_mapping.h File Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<div class="textblock"><div class="dynheader"> -Include dependency graph for ppb_file_mapping.h:</div> -<div class="dyncontent"> -<div class="center"><img src="ppb__file__mapping_8h__incl.png" border="0" usemap="#ppb__file__mapping_8h" alt="" /></div> -<map name="ppb__file__mapping_8h" id="ppb__file__mapping_8h"> -</map> -</div> -</div><h2> -Data Structures</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html">PPB_FileMapping</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. <a href="struct_p_p_b___file_mapping__0__1.html#details">More...</a><br /></td></tr> -</table><h2> -Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">PPB_FILEMAPPING_INTERFACE</a>   "PPB_FileMapping;0.1" /* dev */</td></tr> -</table><h2> -Enumerations</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a> { <a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668a88619572d7d081c4b657fd8087a164fb">PP_FILEMAPPROTECTION_READ</a> = 1u << 0, -<a class="el" href="group___enums.html#gga07cb383dee51bc7e8e1f234068652668aadebe6625bb49b575195f0d4d165c27e">PP_FILEMAPPROTECTION_WRITE</a> = 1u << 1 - }</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a> { <a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada9233097e19d068b7d4ad0ac00140d03c">PP_FILEMAPFLAG_SHARED</a> = 1u << 0, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939bada74f65f6fbedce77b36bda16beab65a03">PP_FILEMAPFLAG_PRIVATE</a> = 1u << 1, -<a class="el" href="group___enums.html#gga47ce032e16d18ba6fc6c16bbe8939badae37402f728fae4078d76a006d36bc26e">PP_FILEMAPFLAG_FIXED</a> = 1u << 2 - }</td></tr> -</table><h2> -Variables</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga07cb383dee51bc7e8e1f234068652668">PP_FileMapProtection</a></td></tr> -<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga47ce032e16d18ba6fc6c16bbe8939bad">PP_FileMapFlags</a></td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>This file defines methods for mapping and unmapping files into and out of memory. </p> -</div><hr /><h2>Define Documentation</h2> -<a class="anchor" id="a657d5d4684814f79fd2c764fd8aa540e"></a><!-- doxytag: member="ppb_file_mapping.h::PPB_FILEMAPPING_INTERFACE" ref="a657d5d4684814f79fd2c764fd8aa540e" args="" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">#define <a class="el" href="ppb__file__mapping_8h.html#a657d5d4684814f79fd2c764fd8aa540e">PPB_FILEMAPPING_INTERFACE</a>   "PPB_FileMapping;0.1" /* dev */</td> -</tr> -</table> -</div> -<div class="memdoc"> -</div> -</div> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__file__mapping_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/c/ppb__file__mapping_8h__incl.png deleted file mode 100644 index 45abc54..0000000 --- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__file__mapping_8h__incl.png +++ /dev/null Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__tcp__socket_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__tcp__socket_8h.html index 516526e55..ea5a225 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__tcp__socket_8h.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__tcp__socket_8h.html
@@ -19,15 +19,15 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html">PPB_TCPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_TCPSocket</code> interface provides TCP socket operations. <a href="struct_p_p_b___t_c_p_socket__1__1.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_TCPSocket</code> interface provides TCP socket operations. <a href="struct_p_p_b___t_c_p_socket__1__2.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__tcp__socket_8h.html#a12b0fabc454cb99a6d4c8352c6f22d71">PPB_TCPSOCKET_INTERFACE</a>   "PPB_TCPSocket;1.1"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__tcp__socket_8h.html#a29ecaef1552f19b223e6c93475d8788c">PPB_TCPSOCKET_INTERFACE</a>   <a class="el" href="ppb__tcp__socket_8h.html#a12b0fabc454cb99a6d4c8352c6f22d71">PPB_TCPSOCKET_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__tcp__socket_8h.html#a2f1cedfee70f4bfe4c35849be53fd73f">PPB_TCPSOCKET_INTERFACE</a>   "PPB_TCPSocket;1.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__tcp__socket_8h.html#a29ecaef1552f19b223e6c93475d8788c">PPB_TCPSOCKET_INTERFACE</a>   <a class="el" href="ppb__tcp__socket_8h.html#a2f1cedfee70f4bfe4c35849be53fd73f">PPB_TCPSOCKET_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html">PPB_TCPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga0f72e14a6cf9631bd733ded1f8ba4d9f">PPB_TCPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html">PPB_TCPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga68e25baffc8cfc72d6c636a3a6217aa0">PPB_TCPSocket</a></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1557c0bbce8739a3418e6027a9c44e12">PP_TCPSocket_Option</a> { <a class="el" href="group___enums.html#gga1557c0bbce8739a3418e6027a9c44e12a4b17558654d1df4452aa98f7d2609a10">PP_TCPSOCKET_OPTION_NO_DELAY</a> = 0, @@ -46,19 +46,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__tcp__socket_8h.html#a29ecaef1552f19b223e6c93475d8788c">PPB_TCPSOCKET_INTERFACE</a>   <a class="el" href="ppb__tcp__socket_8h.html#a12b0fabc454cb99a6d4c8352c6f22d71">PPB_TCPSOCKET_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__tcp__socket_8h.html#a29ecaef1552f19b223e6c93475d8788c">PPB_TCPSOCKET_INTERFACE</a>   <a class="el" href="ppb__tcp__socket_8h.html#a2f1cedfee70f4bfe4c35849be53fd73f">PPB_TCPSOCKET_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="a12b0fabc454cb99a6d4c8352c6f22d71"></a><!-- doxytag: member="ppb_tcp_socket.h::PPB_TCPSOCKET_INTERFACE" ref="a12b0fabc454cb99a6d4c8352c6f22d71" args="" --> +<a class="anchor" id="a2f1cedfee70f4bfe4c35849be53fd73f"></a><!-- doxytag: member="ppb_tcp_socket.h::PPB_TCPSOCKET_INTERFACE" ref="a2f1cedfee70f4bfe4c35849be53fd73f" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__tcp__socket_8h.html#a12b0fabc454cb99a6d4c8352c6f22d71">PPB_TCPSOCKET_INTERFACE</a>   "PPB_TCPSocket;1.1"</td> +<td class="memname">#define <a class="el" href="ppb__tcp__socket_8h.html#a2f1cedfee70f4bfe4c35849be53fd73f">PPB_TCPSOCKET_INTERFACE</a>   "PPB_TCPSocket;1.2"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__udp__socket_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__udp__socket_8h.html index 7cb5823..b26a466 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__udp__socket_8h.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__udp__socket_8h.html
@@ -19,21 +19,26 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html">PPB_UDPSocket</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">The <code>PPB_UDPSocket</code> interface provides UDP socket operations. <a href="struct_p_p_b___u_d_p_socket__1__2.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#aafc1aecb9a8f2c3f8eed80a93a77763c">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.0"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#aafc1aecb9a8f2c3f8eed80a93a77763c">PPB_UDPSOCKET_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gaf04d893ccf01c5d1cfcadee5fcc869d1">PPB_UDPSocket</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html">PPB_UDPSocket</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#gac45ce5bed449ca63680c4769663fd2b1">PPB_UDPSocket</a></td></tr> </table><h2> Enumerations</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, +<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> { <br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a79568403b8927bf98bea0f2d38469984">PP_UDPSOCKET_OPTION_ADDRESS_REUSE</a> = 0, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2aeceda8fe978a52382b96939de7707c00">PP_UDPSOCKET_OPTION_BROADCAST</a> = 1, <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a905f0adde2912a5db26883d45fb75d57">PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE</a> = 2, -<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3 +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a1264eb1d6d16eb3a074ee3d21ebb3b64">PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE</a> = 3, +<br /> +  <a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a0cde43fa32bc72658658f9a20c07194c">PP_UDPSOCKET_OPTION_MULTICAST_LOOP</a> = 4, +<a class="el" href="group___enums.html#gga1a8472fa3e7150615c45c38fa8c12ce2a29bfa5fc814589e4a5003a5d1c377b82">PP_UDPSOCKET_OPTION_MULTICAST_TTL</a> = 5 +<br /> }</td></tr> </table><h2> Variables</h2><table class="memberdecls"> @@ -47,19 +52,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#aafc1aecb9a8f2c3f8eed80a93a77763c">PPB_UDPSOCKET_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#a673aeb3fceb5ed977b7b8683f674cbfd">PPB_UDPSOCKET_INTERFACE</a>   <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="aafc1aecb9a8f2c3f8eed80a93a77763c"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSOCKET_INTERFACE" ref="aafc1aecb9a8f2c3f8eed80a93a77763c" args="" --> +<a class="anchor" id="ad6bc6ae5b1d72251b6b81fdd7d8009f7"></a><!-- doxytag: member="ppb_udp_socket.h::PPB_UDPSOCKET_INTERFACE" ref="ad6bc6ae5b1d72251b6b81fdd7d8009f7" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#aafc1aecb9a8f2c3f8eed80a93a77763c">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.0"</td> +<td class="memname">#define <a class="el" href="ppb__udp__socket_8h.html#ad6bc6ae5b1d72251b6b81fdd7d8009f7">PPB_UDPSOCKET_INTERFACE</a>   "PPB_UDPSocket;1.2"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__decoder_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__decoder_8h.html index 212d41ab..51449aa 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__decoder_8h.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__decoder_8h.html
@@ -19,15 +19,15 @@ </div><h2> Data Structures</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a></td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__0.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="struct_p_p_b___video_decoder__1__1.html#details">More...</a><br /></td></tr> </table><h2> Defines</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.0"</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.1"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a></td></tr> </table><h2> Typedefs</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__0.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga2b4555d8bd239fa28b60c42df75f7ce5">PPB_VideoDecoder</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_decoder__1__1.html">PPB_VideoDecoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga3bfb47f476c3153e5638265c17702ed9">PPB_VideoDecoder</a></td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>This file defines the <code>PPB_VideoDecoder</code> interface. </p> @@ -37,19 +37,19 @@ <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a></td> +<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ae369609aebfa745c1836ef92e9b76aa2">PPB_VIDEODECODER_INTERFACE</a>   <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a></td> </tr> </table> </div> <div class="memdoc"> </div> </div> -<a class="anchor" id="af814c8f0028bce254da6fb5c3e61a4d8"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VIDEODECODER_INTERFACE" ref="af814c8f0028bce254da6fb5c3e61a4d8" args="" --> +<a class="anchor" id="ac9994bddaa7ccc8f52799a00031d5441"></a><!-- doxytag: member="ppb_video_decoder.h::PPB_VIDEODECODER_INTERFACE" ref="ac9994bddaa7ccc8f52799a00031d5441" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#af814c8f0028bce254da6fb5c3e61a4d8">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.0"</td> +<td class="memname">#define <a class="el" href="ppb__video__decoder_8h.html#ac9994bddaa7ccc8f52799a00031d5441">PPB_VIDEODECODER_INTERFACE</a>   "PPB_VideoDecoder;1.1"</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__encoder_8h.html b/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__encoder_8h.html new file mode 100644 index 0000000..7c900c39 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__encoder_8h.html
@@ -0,0 +1,61 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>ppb_video_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for ppb_video_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="ppb__video__encoder_8h__incl.png" border="0" usemap="#ppb__video__encoder_8h" alt="" /></div> +<map name="ppb__video__encoder_8h" id="ppb__video__encoder_8h"> +</map> +</div> +</div><h2> +Data Structures</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="struct_p_p_b___video_encoder__0__2.html#details">More...</a><br /></td></tr> +</table><h2> +Defines</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a>   "PPB_VideoEncoder;0.2"</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">PPB_VIDEOENCODER_INTERFACE</a>   <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a></td></tr> +</table><h2> +Typedefs</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_p_p_b___video_encoder__0__2.html">PPB_VideoEncoder</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group___interfaces.html#ga1a72f170f2aaa94cd41aa16949e27973">PPB_VideoEncoder</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the <code>PPB_VideoEncoder</code> interface. </p> +</div><hr /><h2>Define Documentation</h2> +<a class="anchor" id="abdb2ab6ab0553f6b0086aee71996ea3d"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VIDEOENCODER_INTERFACE" ref="abdb2ab6ab0553f6b0086aee71996ea3d" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__video__encoder_8h.html#abdb2ab6ab0553f6b0086aee71996ea3d">PPB_VIDEOENCODER_INTERFACE</a>   <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +<a class="anchor" id="af8c3e2794a4f7f9cbd6c253cbacfe177"></a><!-- doxytag: member="ppb_video_encoder.h::PPB_VIDEOENCODER_INTERFACE" ref="af8c3e2794a4f7f9cbd6c253cbacfe177" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">#define <a class="el" href="ppb__video__encoder_8h.html#af8c3e2794a4f7f9cbd6c253cbacfe177">PPB_VIDEOENCODER_INTERFACE</a>   "PPB_VideoEncoder;0.2"</td> +</tr> +</table> +</div> +<div class="memdoc"> +</div> +</div> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__encoder_8h__incl.png new file mode 100644 index 0000000..6ecf7208 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/ppb__video__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___audio_bitstream_buffer.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___audio_bitstream_buffer.html new file mode 100644 index 0000000..8cdf217 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___audio_bitstream_buffer.html
@@ -0,0 +1,52 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_AudioBitstreamBuffer Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_AudioBitstreamBuffer" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html#ab76b8c0357d850c84ff417aa1282f3da">size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_bitstream_buffer.html#a888a0bc135ab6e5e434927309eb5fe9a">buffer</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Struct describing an audio bitstream buffer. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a888a0bc135ab6e5e434927309eb5fe9a"></a><!-- doxytag: member="PP_AudioBitstreamBuffer::buffer" ref="a888a0bc135ab6e5e434927309eb5fe9a" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void* <a class="el" href="struct_p_p___audio_bitstream_buffer.html#a888a0bc135ab6e5e434927309eb5fe9a">PP_AudioBitstreamBuffer::buffer</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The base address of the bitstream data. </p> +</div> +</div> +<a class="anchor" id="ab76b8c0357d850c84ff417aa1282f3da"></a><!-- doxytag: member="PP_AudioBitstreamBuffer::size" ref="ab76b8c0357d850c84ff417aa1282f3da" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_bitstream_buffer.html#ab76b8c0357d850c84ff417aa1282f3da">PP_AudioBitstreamBuffer::size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The size, in bytes, of the bitstream data. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___audio_profile_description.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___audio_profile_description.html new file mode 100644 index 0000000..ba55b78 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___audio_profile_description.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_AudioProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_AudioProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a4253ebb9ec2065525a4b9c948111d896">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a4806e98fc63b158b26b293c4de803667">max_channels</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a1a340d0676442d0dfad60219c6dd3886">sample_size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a266fce27c0c60cd5648ec331da9f04cf">sample_rate</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___audio_profile_description.html#a3f77a750a3d903e565deae13d8d814b4">hardware_accelerated</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported audio profile information. </p> +<p>See the PPB_AudioEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a3f77a750a3d903e565deae13d8d814b4"></a><!-- doxytag: member="PP_AudioProfileDescription::hardware_accelerated" ref="a3f77a750a3d903e565deae13d8d814b4" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___audio_profile_description.html#a3f77a750a3d903e565deae13d8d814b4">PP_AudioProfileDescription::hardware_accelerated</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the profile is hardware accelerated. </p> +</div> +</div> +<a class="anchor" id="a4806e98fc63b158b26b293c4de803667"></a><!-- doxytag: member="PP_AudioProfileDescription::max_channels" ref="a4806e98fc63b158b26b293c4de803667" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a4806e98fc63b158b26b293c4de803667">PP_AudioProfileDescription::max_channels</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Maximum number of channels that can be encoded. </p> +</div> +</div> +<a class="anchor" id="a4253ebb9ec2065525a4b9c948111d896"></a><!-- doxytag: member="PP_AudioProfileDescription::profile" ref="a4253ebb9ec2065525a4b9c948111d896" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> <a class="el" href="struct_p_p___audio_profile_description.html#a4253ebb9ec2065525a4b9c948111d896">PP_AudioProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<a class="anchor" id="a266fce27c0c60cd5648ec331da9f04cf"></a><!-- doxytag: member="PP_AudioProfileDescription::sample_rate" ref="a266fce27c0c60cd5648ec331da9f04cf" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a266fce27c0c60cd5648ec331da9f04cf">PP_AudioProfileDescription::sample_rate</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Sampling rate that can be encoded. </p> +</div> +</div> +<a class="anchor" id="a1a340d0676442d0dfad60219c6dd3886"></a><!-- doxytag: member="PP_AudioProfileDescription::sample_size" ref="a1a340d0676442d0dfad60219c6dd3886" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___audio_profile_description.html#a1a340d0676442d0dfad60219c6dd3886">PP_AudioProfileDescription::sample_size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Sample size. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___bitstream_buffer.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___bitstream_buffer.html new file mode 100644 index 0000000..a97c869 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___bitstream_buffer.html
@@ -0,0 +1,66 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_BitstreamBuffer Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_BitstreamBuffer" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#aaa6f173b3478e960f26d87ae417f5d09">size</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#a864bd5618ebcdb6bb743e5699c0dff39">buffer</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___bitstream_buffer.html#a4ae08468a70d30e5d8124d713f8e8c47">key_frame</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Struct describing a bitstream buffer. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a864bd5618ebcdb6bb743e5699c0dff39"></a><!-- doxytag: member="PP_BitstreamBuffer::buffer" ref="a864bd5618ebcdb6bb743e5699c0dff39" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void* <a class="el" href="struct_p_p___bitstream_buffer.html#a864bd5618ebcdb6bb743e5699c0dff39">PP_BitstreamBuffer::buffer</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The base address of the bitstream data. </p> +</div> +</div> +<a class="anchor" id="a4ae08468a70d30e5d8124d713f8e8c47"></a><!-- doxytag: member="PP_BitstreamBuffer::key_frame" ref="a4ae08468a70d30e5d8124d713f8e8c47" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___bitstream_buffer.html#a4ae08468a70d30e5d8124d713f8e8c47">PP_BitstreamBuffer::key_frame</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the buffer represents a key frame. </p> +</div> +</div> +<a class="anchor" id="aaa6f173b3478e960f26d87ae417f5d09"></a><!-- doxytag: member="PP_BitstreamBuffer::size" ref="aaa6f173b3478e960f26d87ae417f5d09" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___bitstream_buffer.html#aaa6f173b3478e960f26d87ae417f5d09">PP_BitstreamBuffer::size</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The size, in bytes, of the bitstream data. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___video_profile_description.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___video_profile_description.html new file mode 100644 index 0000000..54ea6d9 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___video_profile_description.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_VideoProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_VideoProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa4cf8bf248f49de606d5bda97c5b4ae1">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa53694c107dc67256986b95e62ca13a2">max_resolution</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#a21f8d2e8f5b995afb27edd43667f3eed">max_framerate_numerator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#aa4b5113713acbb32d92145ac9f3a925f">max_framerate_denominator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description.html#a10da7a8d059171fcf5bd907a6d9c0e60">hardware_accelerated</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported video profile information. </p> +<p>See the PPB_VideoEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a10da7a8d059171fcf5bd907a6d9c0e60"></a><!-- doxytag: member="PP_VideoProfileDescription::hardware_accelerated" ref="a10da7a8d059171fcf5bd907a6d9c0e60" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> <a class="el" href="struct_p_p___video_profile_description.html#a10da7a8d059171fcf5bd907a6d9c0e60">PP_VideoProfileDescription::hardware_accelerated</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Whether the profile is hardware accelerated. </p> +</div> +</div> +<a class="anchor" id="aa4b5113713acbb32d92145ac9f3a925f"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_denominator" ref="aa4b5113713acbb32d92145ac9f3a925f" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description.html#aa4b5113713acbb32d92145ac9f3a925f">PP_VideoProfileDescription::max_framerate_denominator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The denominator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="a21f8d2e8f5b995afb27edd43667f3eed"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_numerator" ref="a21f8d2e8f5b995afb27edd43667f3eed" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description.html#a21f8d2e8f5b995afb27edd43667f3eed">PP_VideoProfileDescription::max_framerate_numerator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The numerator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="aa53694c107dc67256986b95e62ca13a2"></a><!-- doxytag: member="PP_VideoProfileDescription::max_resolution" ref="aa53694c107dc67256986b95e62ca13a2" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> <a class="el" href="struct_p_p___video_profile_description.html#aa53694c107dc67256986b95e62ca13a2">PP_VideoProfileDescription::max_resolution</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Dimensions of the maximum resolution of video frames, in pixels. </p> +</div> +</div> +<a class="anchor" id="aa4cf8bf248f49de606d5bda97c5b4ae1"></a><!-- doxytag: member="PP_VideoProfileDescription::profile" ref="aa4cf8bf248f49de606d5bda97c5b4ae1" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> <a class="el" href="struct_p_p___video_profile_description.html#aa4cf8bf248f49de606d5bda97c5b4ae1">PP_VideoProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___video_profile_description__0__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___video_profile_description__0__1.html new file mode 100644 index 0000000..a6d7c86 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p___video_profile_description__0__1.html
@@ -0,0 +1,95 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PP_VideoProfileDescription Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PP_VideoProfileDescription" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a97e76f7bc9c271fdd8b8964670711f65">profile</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#ab3ffdab3497ff29df3d31e44c560f2f4">max_resolution</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a01c7a68c5b96c3d2cc048e35d82330dd">max_framerate_numerator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a5339510fd2f94fde1e83f81b9bd47aa8">max_framerate_denominator</a></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p___video_profile_description__0__1.html#a4d558d8ca3c8903544cb1f12c07d2a42">acceleration</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Supported video profile information. </p> +<p>See the PPB_VideoEncoder function GetSupportedProfiles() for more details. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="a4d558d8ca3c8903544cb1f12c07d2a42"></a><!-- doxytag: member="PP_VideoProfileDescription::acceleration" ref="a4d558d8ca3c8903544cb1f12c07d2a42" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#a4d558d8ca3c8903544cb1f12c07d2a42">PP_VideoProfileDescription::acceleration</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A value indicating if the profile is available in hardware, software, or both. </p> +</div> +</div> +<a class="anchor" id="a5339510fd2f94fde1e83f81b9bd47aa8"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_denominator" ref="a5339510fd2f94fde1e83f81b9bd47aa8" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description__0__1.html#a5339510fd2f94fde1e83f81b9bd47aa8">PP_VideoProfileDescription::max_framerate_denominator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The denominator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="a01c7a68c5b96c3d2cc048e35d82330dd"></a><!-- doxytag: member="PP_VideoProfileDescription::max_framerate_numerator" ref="a01c7a68c5b96c3d2cc048e35d82330dd" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">uint32_t <a class="el" href="struct_p_p___video_profile_description__0__1.html#a01c7a68c5b96c3d2cc048e35d82330dd">PP_VideoProfileDescription::max_framerate_numerator</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The numerator of the maximum frame rate. </p> +</div> +</div> +<a class="anchor" id="ab3ffdab3497ff29df3d31e44c560f2f4"></a><!-- doxytag: member="PP_VideoProfileDescription::max_resolution" ref="ab3ffdab3497ff29df3d31e44c560f2f4" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">struct <a class="el" href="struct_p_p___size.html">PP_Size</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#ab3ffdab3497ff29df3d31e44c560f2f4">PP_VideoProfileDescription::max_resolution</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Dimensions of the maximum resolution of video frames, in pixels. </p> +</div> +</div> +<a class="anchor" id="a97e76f7bc9c271fdd8b8964670711f65"></a><!-- doxytag: member="PP_VideoProfileDescription::profile" ref="a97e76f7bc9c271fdd8b8964670711f65" args="" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> <a class="el" href="struct_p_p___video_profile_description__0__1.html#a97e76f7bc9c271fdd8b8964670711f65">PP_VideoProfileDescription::profile</a></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The codec profile. </p> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="pp__codecs_8h.html">pp_codecs.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___audio_encoder__0__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___audio_encoder__0__1.html new file mode 100644 index 0000000..1b01f3e --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___audio_encoder__0__1.html
@@ -0,0 +1,286 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PPB_AudioEncoder Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PPB_AudioEncoder" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a63e54ec7e63e940c59c1b365669a5002">IsAudioEncoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61">GetSupportedProfiles</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t channels, <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> input_sample_rate, <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> input_sample_size, <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a49a627f22227a877391f2f569a4490ff">GetNumberOfSamples</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f">GetBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3">Encode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529">GetBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80">RecycleBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, const struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac5a8cbc3578816a15f3418882b6b720c">RequestBitrateChange</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t bitrate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Audio encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110" title="Creates a new audio encoder resource.">Create()</a> to create a new audio encoder resource.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61" title="Gets an array of supported audio encoder profiles.">GetSupportedProfiles()</a> to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f" title="Gets a blank audio buffer (with metadata given by the Initialize() call) which can be filled with aud...">GetBuffer()</a> to get an empty buffer and fill it in, or get an audio buffer from another resource, e.g. <code>PPB_MediaStreamAudioTrack</code>.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3" title="Encodes an audio buffer.">Encode()</a> to push the audio buffer to the encoder. If an external buffer is pushed, wait for completion to recycle the buffer.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded buffers from the encoder.</li> +<li>Call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available audio codecs vary by platform. All: opus. </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="ad472829d0944505ce8cfb2a2b6308165"></a><!-- doxytag: member="PPB_AudioEncoder::Close" ref="ad472829d0944505ce8cfb2a2b6308165" args=")(PP_Resource audio_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165">PPB_AudioEncoder::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the audio encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the audio encoder closes it implicitly, so you are not required to call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ad472829d0944505ce8cfb2a2b6308165" title="Closes the audio encoder, and cancels any pending encodes.">Close()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a116d0908bcdd955e33e00cbd9ae04110"></a><!-- doxytag: member="PPB_AudioEncoder::Create" ref="a116d0908bcdd955e33e00cbd9ae04110" args=")(PP_Instance instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a116d0908bcdd955e33e00cbd9ae04110">PPB_AudioEncoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Creates a new audio encoder resource. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the audio encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to an audio encoder if successful or 0 otherwise. </dd></dl> +</div> +</div> +<a class="anchor" id="a61e9304df6da6bbb97236805d702d0a3"></a><!-- doxytag: member="PPB_AudioEncoder::Encode" ref="a61e9304df6da6bbb97236805d702d0a3" args=")(PP_Resource audio_encoder, PP_Resource audio_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a61e9304df6da6bbb97236805d702d0a3">PPB_AudioEncoder::Encode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes an audio buffer. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_buffer</td><td>The <code>PPB_AudioBuffer</code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. Plugins that pass <code>PPB_AudioBuffer</code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a7386d14006ed634530d0ad2ecdb61529"></a><!-- doxytag: member="PPB_AudioEncoder::GetBitstreamBuffer" ref="a7386d14006ed634530d0ad2ecdb61529" args=")(PP_Resource audio_encoder, struct PP_AudioBitstreamBuffer *bitstream_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529">PPB_AudioEncoder::GetBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> containing encoded audio data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a7386d14006ed634530d0ad2ecdb61529" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ac154730ff2248134c73d5155c4a7095f"></a><!-- doxytag: member="PPB_AudioEncoder::GetBuffer" ref="ac154730ff2248134c73d5155c4a7095f" args=")(PP_Resource audio_encoder, PP_Resource *audio_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f">PPB_AudioEncoder::GetBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *audio_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank audio buffer (with metadata given by the <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> call) which can be filled with audio data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">audio_buffer</td><td>A blank <code>PPB_AudioBuffer</code> resource. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a49a627f22227a877391f2f569a4490ff"></a><!-- doxytag: member="PPB_AudioEncoder::GetNumberOfSamples" ref="a49a627f22227a877391f2f569a4490ff" args=")(PP_Resource audio_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a49a627f22227a877391f2f569a4490ff">PPB_AudioEncoder::GetNumberOfSamples</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of audio samples per channel that audio buffers must contain in order to be processed by the encoder. </p> +<p>This will be the number of samples per channels contained in buffers returned by <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac154730ff2248134c73d5155c4a7095f" title="Gets a blank audio buffer (with metadata given by the Initialize() call) which can be filled with aud...">GetBuffer()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of samples required, or an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a2ad5e2334abb35ede4c413e50e92ec61"></a><!-- doxytag: member="PPB_AudioEncoder::GetSupportedProfiles" ref="a2ad5e2334abb35ede4c413e50e92ec61" args=")(PP_Resource audio_encoder, struct PP_ArrayOutput output, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a2ad5e2334abb35ede4c413e50e92ec61">PPB_AudioEncoder::GetSupportedProfiles</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported audio encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output</td><td>A <code><a class="el" href="struct_p_p___array_output.html" title="A structure that defines a way for the browser to return arrays of data to the plugin.">PP_ArrayOutput</a></code> to receive the supported <code><a class="el" href="struct_p_p___audio_profile_description.html" title="Supported audio profile information.">PP_AudioProfileDescription</a></code> structs. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a676b09b0a98069daea08678a8c9e5d70"></a><!-- doxytag: member="PPB_AudioEncoder::Initialize" ref="a676b09b0a98069daea08678a8c9e5d70" args=")(PP_Resource audio_encoder, uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70">PPB_AudioEncoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t channels, <a class="el" href="group___enums.html#ga78757d4be14d14d17708071a9466afbd">PP_AudioBuffer_SampleRate</a> input_sample_rate, <a class="el" href="group___enums.html#ga2ba5c3a8eed23fa49a73b218b1bce044">PP_AudioBuffer_SampleSize</a> input_sample_size, <a class="el" href="group___enums.html#gadadb1eaddb4ea71cb8620db1f4ce301e">PP_AudioProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes an audio encoder resource. </p> +<p>The plugin should call <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a676b09b0a98069daea08678a8c9e5d70" title="Initializes an audio encoder resource.">Initialize()</a> successfully before calling any of the functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">channels</td><td>The number of audio channels to encode. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sampling_rate</td><td>The sampling rate of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sample_size</td><td>The sample size of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_AudioProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">initial_bitrate</td><td>The initial bitrate for the encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if audio encoding is not available, or the requested codec profile is not supported. </dd></dl> +</div> +</div> +<a class="anchor" id="a63e54ec7e63e940c59c1b365669a5002"></a><!-- doxytag: member="PPB_AudioEncoder::IsAudioEncoder" ref="a63e54ec7e63e940c59c1b365669a5002" args=")(PP_Resource resource)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a63e54ec7e63e940c59c1b365669a5002">PPB_AudioEncoder::IsAudioEncoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Determines if the given resource is an audio encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> identifying a resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_AudioEncoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> +</div> +</div> +<a class="anchor" id="a8046882d9584418d02e017130aa55d80"></a><!-- doxytag: member="PPB_AudioEncoder::RecycleBitstreamBuffer" ref="a8046882d9584418d02e017130aa55d80" args=")(PP_Resource audio_encoder, const struct PP_AudioBitstreamBuffer *bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#a8046882d9584418d02e017130aa55d80">PPB_AudioEncoder::RecycleBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, const struct <a class="el" href="struct_p_p___audio_bitstream_buffer.html">PP_AudioBitstreamBuffer</a> *bitstream_buffer)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ac5a8cbc3578816a15f3418882b6b720c"></a><!-- doxytag: member="PPB_AudioEncoder::RequestBitrateChange" ref="ac5a8cbc3578816a15f3418882b6b720c" args=")(PP_Resource audio_encoder, uint32_t bitrate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___audio_encoder__0__1.html#ac5a8cbc3578816a15f3418882b6b720c">PPB_AudioEncoder::RequestBitrateChange</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> audio_encoder, uint32_t bitrate)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to the encoding bitrate. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="ppb__audio__encoder_8h.html">ppb_audio_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___compositor__0__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___compositor__0__1.html index 85fcb76..eae22619 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___compositor__0__1.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___compositor__0__1.html
@@ -50,7 +50,7 @@ <p>Creates a new <code>PPB_CompositorLayer</code> and adds it to the end of the layer stack. </p> <p>A <code>PP_Resource</code> containing the layer is returned. It is uninitialized, <code>SetColor()</code>, <code>SetTexture</code> or <code>SetImage</code> should be used to initialize it. The layer will appear above other pre-existing layers. If <code>ResetLayers</code> is called or the <code>PPB_Compositor</code> is released, the returned layer will be invalidated, and any further calls on the layer will return <code>PP_ERROR_BADRESOURCE</code>.</p> <p>param[in] compositor A <code>PP_Resource</code> corresponding to a compositor layer resource.</p> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor layer resource if sucessful or 0 otherwise. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor layer resource if successful or 0 otherwise. </dd></dl> </div> </div> <a class="anchor" id="a5082b0dce4a58032439bc3dd4ff741fd"></a><!-- doxytag: member="PPB_Compositor::CommitLayers" ref="a5082b0dce4a58032439bc3dd4ff741fd" args=")(PP_Resource compositor, struct PP_CompletionCallback cc)" --> @@ -91,7 +91,7 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor resource if sucessful or 0 otherwise. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> containing the compositor resource if successful or 0 otherwise. </dd></dl> </div> </div> <a class="anchor" id="a22fb77daabd3894db97ab1111d111a92"></a><!-- doxytag: member="PPB_Compositor::IsCompositor" ref="a22fb77daabd3894db97ab1111d111a92" args=")(PP_Resource resource)" -->
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___file_mapping__0__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___file_mapping__0__1.html deleted file mode 100644 index 64437048..0000000 --- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___file_mapping__0__1.html +++ /dev/null
@@ -1,98 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>PPB_FileMapping Struct Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<!-- doxytag: class="PPB_FileMapping" --><h2> -Data Fields</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb">Map</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d">Unmap</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const void *address, int64_t length, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int64_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0">GetMapPageSize</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>PPB_FileMapping contains functions for mapping and unmapping files into and out of memory. </p> -</div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ae479690b258985b51dda4d438b8156f0"></a><!-- doxytag: member="PPB_FileMapping::GetMapPageSize" ref="ae479690b258985b51dda4d438b8156f0" args=")(PP_Instance instance)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int64_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0">PPB_FileMapping::GetMapPageSize</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a> retrieves the size of pages that <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> uses. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>The size of pages that <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> uses. Returns 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="a425d8d5b11de51e8edf539ee13bac1fb"></a><!-- doxytag: member="PPB_FileMapping::Map" ref="a425d8d5b11de51e8edf539ee13bac1fb" args=")(PP_Instance instance, PP_Resource file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb">PPB_FileMapping::Map</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void **address, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> maps the contents from an offset of the file into memory. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying one instance of a module. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">file_io</td><td>A <code>PPB_FileIO</code> <code>PP_Resource</code> corresponding to the file that should be mapped in to memory. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The number of bytes to map. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">map_protection</td><td>A bitfield containing values from <code>PP_FileMapProtection</code>, indicating what memory operations should be permitted on the mapped region. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">map_flags</td><td>A bitfield containing values from <code>PP_FileMapFlags</code>, providing options for the behavior of Map. If the region is to be writeable, then exactly one of <code>PP_FILEMAPFLAG_SHARED</code> or <code>PP_FILEMAPFLAG_PRIVATE</code> must be set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset into the file. Must be a multiple of the Map page size as returned by <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a>. </td></tr> -<tr><td class="paramdir"></td><td class="paramname">inout]</td><td>address The value of <code>*address</code>, if non-NULL, will be used as a hint to determine where in memory the file should be mapped. If the value is NULL, the host operating system will choose <code>address</code>. Upon <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a> completing, <code>*address</code> will contain the actual memory location at which the file was mapped. If the plugin provides a non-NULL <code>*address</code>, it must be a multiple of the map page size as returned by <a class="el" href="struct_p_p_b___file_mapping__0__1.html#ae479690b258985b51dda4d438b8156f0" title="GetMapPageSize() retrieves the size of pages that Map() uses.">GetMapPageSize()</a>. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a>.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<a class="anchor" id="a4fa72d6e6660e16ce1ff08453eff172d"></a><!-- doxytag: member="PPB_FileMapping::Unmap" ref="a4fa72d6e6660e16ce1ff08453eff172d" args=")(PP_Instance instance, const void *address, int64_t length, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d">PPB_FileMapping::Unmap</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance, const void *address, int64_t length, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p><a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d" title="Unmap() deletes the mapping of the specified address.">Unmap()</a> deletes the mapping of the specified address. </p> -<p>The specified address must have been retrieved with <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a425d8d5b11de51e8edf539ee13bac1fb" title="Map() maps the contents from an offset of the file into memory.">Map()</a>. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>The starting address of the address in memory to be unmapped. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the region to unmap. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion of <a class="el" href="struct_p_p_b___file_mapping__0__1.html#a4fa72d6e6660e16ce1ff08453eff172d" title="Unmap() deletes the mapping of the specified address.">Unmap()</a>.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<hr />The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="ppb__file__mapping_8h.html">ppb_file_mapping.h</a></li> -</ul> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___t_c_p_socket__1__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___t_c_p_socket__1__2.html similarity index 80% rename from native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___t_c_p_socket__1__1.html rename to native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___t_c_p_socket__1__2.html index d9d5a0d2..7b0a919 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___t_c_p_socket__1__1.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___t_c_p_socket__1__2.html
@@ -12,29 +12,29 @@ <!-- doxytag: class="PPB_TCPSocket" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a615cb349fbe99e25ae09078091c87b43">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#afe32ae060181370e12c93c206964a58f">IsTCPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#aae9a2f9ced445ca28a21721a0df5c567">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a1d12313b4681e48fa6f9b789d26414cb">Connect</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab64edd222b040500767f5c9182358b68">GetLocalAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#af28b600fcdf657ca31dd2e9218a774e1">GetRemoteAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab4bd707da2d9d2136c59a08b3de2ce32">Read</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, char *buffer, int32_t bytes_to_read, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#adea2cbc4e8487f2f26c2126983f9c856">Write</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, const char *buffer, int32_t bytes_to_write, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#af3b28d2bf3f44d89e434e158854bea69">Listen</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, int32_t backlog, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a444d931c7fbb40e47cca8c55d57250f7">Accept</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *accepted_tcp_socket, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#afc2d9d7577df96bd0ac8f3cc6f503266">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab64ed8f1f7b4c3dce8d3493fb894ea0d">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___enums.html#ga1557c0bbce8739a3418e6027a9c44e12">PP_TCPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a889fb7b3263304ef5057cd541a197312">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a5355f00c99cd7fb9563eb9987a73a3c5">IsTCPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aeb78a27cd902e93c557a0015812237f9">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad107b3d5541072b14e2b8acc836b3939">Connect</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a5916aca75506efccaa2905bb758421a2">GetLocalAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#abb362a218eef33522ea9b508d482a015">GetRemoteAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aac72febd03fe6e6e5adafcfd2b24a8b1">Read</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, char *buffer, int32_t bytes_to_read, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ac798b76c497f00231bd592ebdb584042">Write</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, const char *buffer, int32_t bytes_to_write, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#acffd2f5faddf094ccd9638128167259d">Listen</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, int32_t backlog, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad9b1525032df05cf446f7d7c27c6145a">Accept</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *accepted_tcp_socket, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a6ca1887389cfaf357054e016adf7fc77">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aa42176651e65cf589fc310c0b2ed5751">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___enums.html#ga1557c0bbce8739a3418e6027a9c44e12">PP_TCPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>The <code>PPB_TCPSocket</code> interface provides TCP socket operations. </p> -<p>Permissions: Apps permission <code>socket</code> with subrule <code>tcp-connect</code> is required for <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a1d12313b4681e48fa6f9b789d26414cb" title="Connects the socket to the given address.">Connect()</a></code>; subrule <code>tcp-listen</code> is required for <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#af3b28d2bf3f44d89e434e158854bea69" title="Starts listening.">Listen()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> +<p>Permissions: Apps permission <code>socket</code> with subrule <code>tcp-connect</code> is required for <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad107b3d5541072b14e2b8acc836b3939" title="Connects the socket to the given address.">Connect()</a></code>; subrule <code>tcp-listen</code> is required for <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#acffd2f5faddf094ccd9638128167259d" title="Starts listening.">Listen()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="a444d931c7fbb40e47cca8c55d57250f7"></a><!-- doxytag: member="PPB_TCPSocket::Accept" ref="a444d931c7fbb40e47cca8c55d57250f7" args=")(PP_Resource tcp_socket, PP_Resource *accepted_tcp_socket, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ad9b1525032df05cf446f7d7c27c6145a"></a><!-- doxytag: member="PPB_TCPSocket::Accept" ref="ad9b1525032df05cf446f7d7c27c6145a" args=")(PP_Resource tcp_socket, PP_Resource *accepted_tcp_socket, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a444d931c7fbb40e47cca8c55d57250f7">PPB_TCPSocket::Accept</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *accepted_tcp_socket, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad9b1525032df05cf446f7d7c27c6145a">PPB_TCPSocket::Accept</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *accepted_tcp_socket, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -55,12 +55,12 @@ </dd></dl> </div> </div> -<a class="anchor" id="aae9a2f9ced445ca28a21721a0df5c567"></a><!-- doxytag: member="PPB_TCPSocket::Bind" ref="aae9a2f9ced445ca28a21721a0df5c567" args=")(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="aeb78a27cd902e93c557a0015812237f9"></a><!-- doxytag: member="PPB_TCPSocket::Bind" ref="aeb78a27cd902e93c557a0015812237f9" args=")(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#aae9a2f9ced445ca28a21721a0df5c567">PPB_TCPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aeb78a27cd902e93c557a0015812237f9">PPB_TCPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -82,18 +82,18 @@ </dd></dl> </div> </div> -<a class="anchor" id="afc2d9d7577df96bd0ac8f3cc6f503266"></a><!-- doxytag: member="PPB_TCPSocket::Close" ref="afc2d9d7577df96bd0ac8f3cc6f503266" args=")(PP_Resource tcp_socket)" --> +<a class="anchor" id="a6ca1887389cfaf357054e016adf7fc77"></a><!-- doxytag: member="PPB_TCPSocket::Close" ref="a6ca1887389cfaf357054e016adf7fc77" args=")(PP_Resource tcp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#afc2d9d7577df96bd0ac8f3cc6f503266">PPB_TCPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a6ca1887389cfaf357054e016adf7fc77">PPB_TCPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td> </tr> </table> </div> <div class="memdoc"> <p>Cancels all pending operations and closes the socket. </p> -<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output buffer pointers passed into previous <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab4bd707da2d9d2136c59a08b3de2ce32" title="Reads data from the socket.">Read()</a></code> or <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a444d931c7fbb40e47cca8c55d57250f7" title="Accepts a connection.">Accept()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a1d12313b4681e48fa6f9b789d26414cb" title="Connects the socket to the given address.">Connect()</a></code> or <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#af3b28d2bf3f44d89e434e158854bea69" title="Starts listening.">Listen()</a></code> again.</p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output buffer pointers passed into previous <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aac72febd03fe6e6e5adafcfd2b24a8b1" title="Reads data from the socket.">Read()</a></code> or <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad9b1525032df05cf446f7d7c27c6145a" title="Accepts a connection.">Accept()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad107b3d5541072b14e2b8acc836b3939" title="Connects the socket to the given address.">Connect()</a></code> or <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#acffd2f5faddf094ccd9638128167259d" title="Starts listening.">Listen()</a></code> again.</p> <p>The socket is implicitly closed if it is destroyed, so you are not required to call this method.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> @@ -103,12 +103,12 @@ </dl> </div> </div> -<a class="anchor" id="a1d12313b4681e48fa6f9b789d26414cb"></a><!-- doxytag: member="PPB_TCPSocket::Connect" ref="a1d12313b4681e48fa6f9b789d26414cb" args=")(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ad107b3d5541072b14e2b8acc836b3939"></a><!-- doxytag: member="PPB_TCPSocket::Connect" ref="ad107b3d5541072b14e2b8acc836b3939" args=")(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a1d12313b4681e48fa6f9b789d26414cb">PPB_TCPSocket::Connect</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad107b3d5541072b14e2b8acc836b3939">PPB_TCPSocket::Connect</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -131,15 +131,15 @@ <li><code>PP_ERROR_CONNECTION_TIMEDOUT</code>: the connection attempt timed out.</li> </ul> </dd></dl> -<p>Since version 1.1, if the socket is listening/connected or has a pending listen/connect request, <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a1d12313b4681e48fa6f9b789d26414cb" title="Connects the socket to the given address.">Connect()</a></code> will fail without starting a connection attempt; otherwise, any failure during the connection attempt will cause the socket to be closed. </p> +<p>Since version 1.1, if the socket is listening/connected or has a pending listen/connect request, <code><a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ad107b3d5541072b14e2b8acc836b3939" title="Connects the socket to the given address.">Connect()</a></code> will fail without starting a connection attempt; otherwise, any failure during the connection attempt will cause the socket to be closed. </p> </div> </div> -<a class="anchor" id="a615cb349fbe99e25ae09078091c87b43"></a><!-- doxytag: member="PPB_TCPSocket::Create" ref="a615cb349fbe99e25ae09078091c87b43" args=")(PP_Instance instance)" --> +<a class="anchor" id="a889fb7b3263304ef5057cd541a197312"></a><!-- doxytag: member="PPB_TCPSocket::Create" ref="a889fb7b3263304ef5057cd541a197312" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#a615cb349fbe99e25ae09078091c87b43">PPB_TCPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a889fb7b3263304ef5057cd541a197312">PPB_TCPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -154,12 +154,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a TCP socket or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="ab64edd222b040500767f5c9182358b68"></a><!-- doxytag: member="PPB_TCPSocket::GetLocalAddress" ref="ab64edd222b040500767f5c9182358b68" args=")(PP_Resource tcp_socket)" --> +<a class="anchor" id="a5916aca75506efccaa2905bb758421a2"></a><!-- doxytag: member="PPB_TCPSocket::GetLocalAddress" ref="a5916aca75506efccaa2905bb758421a2" args=")(PP_Resource tcp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab64edd222b040500767f5c9182358b68">PPB_TCPSocket::GetLocalAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a5916aca75506efccaa2905bb758421a2">PPB_TCPSocket::GetLocalAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td> </tr> </table> </div> @@ -174,12 +174,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="af28b600fcdf657ca31dd2e9218a774e1"></a><!-- doxytag: member="PPB_TCPSocket::GetRemoteAddress" ref="af28b600fcdf657ca31dd2e9218a774e1" args=")(PP_Resource tcp_socket)" --> +<a class="anchor" id="abb362a218eef33522ea9b508d482a015"></a><!-- doxytag: member="PPB_TCPSocket::GetRemoteAddress" ref="abb362a218eef33522ea9b508d482a015" args=")(PP_Resource tcp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#af28b600fcdf657ca31dd2e9218a774e1">PPB_TCPSocket::GetRemoteAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#abb362a218eef33522ea9b508d482a015">PPB_TCPSocket::GetRemoteAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket)</td> </tr> </table> </div> @@ -194,12 +194,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="afe32ae060181370e12c93c206964a58f"></a><!-- doxytag: member="PPB_TCPSocket::IsTCPSocket" ref="afe32ae060181370e12c93c206964a58f" args=")(PP_Resource resource)" --> +<a class="anchor" id="a5355f00c99cd7fb9563eb9987a73a3c5"></a><!-- doxytag: member="PPB_TCPSocket::IsTCPSocket" ref="a5355f00c99cd7fb9563eb9987a73a3c5" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#afe32ae060181370e12c93c206964a58f">PPB_TCPSocket::IsTCPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#a5355f00c99cd7fb9563eb9987a73a3c5">PPB_TCPSocket::IsTCPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -214,12 +214,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the input is a <code>PPB_TCPSocket</code> resource; <code>PP_FALSE</code> otherwise. </dd></dl> </div> </div> -<a class="anchor" id="af3b28d2bf3f44d89e434e158854bea69"></a><!-- doxytag: member="PPB_TCPSocket::Listen" ref="af3b28d2bf3f44d89e434e158854bea69" args=")(PP_Resource tcp_socket, int32_t backlog, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="acffd2f5faddf094ccd9638128167259d"></a><!-- doxytag: member="PPB_TCPSocket::Listen" ref="acffd2f5faddf094ccd9638128167259d" args=")(PP_Resource tcp_socket, int32_t backlog, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#af3b28d2bf3f44d89e434e158854bea69">PPB_TCPSocket::Listen</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, int32_t backlog, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#acffd2f5faddf094ccd9638128167259d">PPB_TCPSocket::Listen</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, int32_t backlog, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -241,12 +241,12 @@ </dd></dl> </div> </div> -<a class="anchor" id="ab4bd707da2d9d2136c59a08b3de2ce32"></a><!-- doxytag: member="PPB_TCPSocket::Read" ref="ab4bd707da2d9d2136c59a08b3de2ce32" args=")(PP_Resource tcp_socket, char *buffer, int32_t bytes_to_read, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="aac72febd03fe6e6e5adafcfd2b24a8b1"></a><!-- doxytag: member="PPB_TCPSocket::Read" ref="aac72febd03fe6e6e5adafcfd2b24a8b1" args=")(PP_Resource tcp_socket, char *buffer, int32_t bytes_to_read, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab4bd707da2d9d2136c59a08b3de2ce32">PPB_TCPSocket::Read</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, char *buffer, int32_t bytes_to_read, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aac72febd03fe6e6e5adafcfd2b24a8b1">PPB_TCPSocket::Read</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, char *buffer, int32_t bytes_to_read, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -265,12 +265,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been read, 0 means that end-of-file was reached; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> </div> </div> -<a class="anchor" id="ab64ed8f1f7b4c3dce8d3493fb894ea0d"></a><!-- doxytag: member="PPB_TCPSocket::SetOption" ref="ab64ed8f1f7b4c3dce8d3493fb894ea0d" args=")(PP_Resource tcp_socket, PP_TCPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="aa42176651e65cf589fc310c0b2ed5751"></a><!-- doxytag: member="PPB_TCPSocket::SetOption" ref="aa42176651e65cf589fc310c0b2ed5751" args=")(PP_Resource tcp_socket, PP_TCPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#ab64ed8f1f7b4c3dce8d3493fb894ea0d">PPB_TCPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___enums.html#ga1557c0bbce8739a3418e6027a9c44e12">PP_TCPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#aa42176651e65cf589fc310c0b2ed5751">PPB_TCPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, <a class="el" href="group___enums.html#ga1557c0bbce8739a3418e6027a9c44e12">PP_TCPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -289,12 +289,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> </div> </div> -<a class="anchor" id="adea2cbc4e8487f2f26c2126983f9c856"></a><!-- doxytag: member="PPB_TCPSocket::Write" ref="adea2cbc4e8487f2f26c2126983f9c856" args=")(PP_Resource tcp_socket, const char *buffer, int32_t bytes_to_write, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ac798b76c497f00231bd592ebdb584042"></a><!-- doxytag: member="PPB_TCPSocket::Write" ref="ac798b76c497f00231bd592ebdb584042" args=")(PP_Resource tcp_socket, const char *buffer, int32_t bytes_to_write, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__1.html#adea2cbc4e8487f2f26c2126983f9c856">PPB_TCPSocket::Write</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, const char *buffer, int32_t bytes_to_write, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___t_c_p_socket__1__2.html#ac798b76c497f00231bd592ebdb584042">PPB_TCPSocket::Write</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> tcp_socket, const char *buffer, int32_t bytes_to_write, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___u_d_p_socket__1__0.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___u_d_p_socket__1__0.html deleted file mode 100644 index 1fe7d5b..0000000 --- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___u_d_p_socket__1__0.html +++ /dev/null
@@ -1,211 +0,0 @@ -{{+bindTo:partials.standard_nacl_api}} -<h1>PPB_UDPSocket Struct Reference</h1> -<div id="doxygen-ref"> -{{- dummy div to appease doxygen -}} - <div> -<!-- Generated by Doxygen 1.7.6.1 --> - - -</div> -<!--header--> -<div class="contents"> -<!-- doxytag: class="PPB_UDPSocket" --><h2> -Data Fields</h2><table class="memberdecls"> - -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a48dfac97beb8bef209ea79efaf5b0c32">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a90de8c0e342ab04bc6d2439b2e0543a5">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a0cae18760f8e9c4f06f160edab542c46">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#aa71b3888a2edf12c7bccd69d4ddcbbb6">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a6f7b8cb60ad4279ac52feba6acca9cc2">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a9b78201046b292b6292f0d5bf55d3f76">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a8b34e95d8f1ca113f2c806fb9b64d3e9">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a3def770b12177d3fa8faf36e184cc528">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -</table> -<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> -<div class="textblock"><p>The <code>PPB_UDPSocket</code> interface provides UDP socket operations. </p> -<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a0cae18760f8e9c4f06f160edab542c46" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a9b78201046b292b6292f0d5bf55d3f76" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> -</div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="a0cae18760f8e9c4f06f160edab542c46"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="a0cae18760f8e9c4f06f160edab542c46" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a0cae18760f8e9c4f06f160edab542c46">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Binds the socket to the given address. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>A <code>PPB_NetAddress</code> resource. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_ADDRESS_IN_USE</code> will be returned if the address is already in use. </dd></dl> -</div> -</div> -<a class="anchor" id="a8b34e95d8f1ca113f2c806fb9b64d3e9"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="a8b34e95d8f1ca113f2c806fb9b64d3e9" args=")(PP_Resource udp_socket)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a8b34e95d8f1ca113f2c806fb9b64d3e9">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Cancels all pending reads and writes, and closes the socket. </p> -<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a6f7b8cb60ad4279ac52feba6acca9cc2" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a0cae18760f8e9c4f06f160edab542c46" title="Binds the socket to the given address.">Bind()</a></code> again.</p> -<p>The socket is implicitly closed if it is destroyed, so you are not required to call this method.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -</table> -</dd> -</dl> -</div> -</div> -<a class="anchor" id="a48dfac97beb8bef209ea79efaf5b0c32"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="a48dfac97beb8bef209ea79efaf5b0c32" args=")(PP_Instance instance)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a48dfac97beb8bef209ea79efaf5b0c32">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Creates a UDP socket resource. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying one instance of a module.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a UDP socket or 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="aa71b3888a2edf12c7bccd69d4ddcbbb6"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="aa71b3888a2edf12c7bccd69d4ddcbbb6" args=")(PP_Resource udp_socket)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#aa71b3888a2edf12c7bccd69d4ddcbbb6">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Gets the address that the socket is bound to. </p> -<p>The socket must be bound.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> -</div> -</div> -<a class="anchor" id="a90de8c0e342ab04bc6d2439b2e0543a5"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a90de8c0e342ab04bc6d2439b2e0543a5" args=")(PP_Resource resource)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a90de8c0e342ab04bc6d2439b2e0543a5">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Determines if a given resource is a UDP socket. </p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> to check.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the input is a <code>PPB_UDPSocket</code> resource; <code>PP_FALSE</code> otherwise. </dd></dl> -</div> -</div> -<a class="anchor" id="a6f7b8cb60ad4279ac52feba6acca9cc2"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="a6f7b8cb60ad4279ac52feba6acca9cc2" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a6f7b8cb60ad4279ac52feba6acca9cc2">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Receives data from the socket and stores the source address. </p> -<p>The socket must be bound.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer to store the received data on success. It must be at least as large as <code>num_bytes</code>. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">num_bytes</td><td>The number of bytes to receive. </td></tr> -<tr><td class="paramdir">[out]</td><td class="paramname">addr</td><td>A <code>PPB_NetAddress</code> resource to store the source address on success. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been received; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<a class="anchor" id="a9b78201046b292b6292f0d5bf55d3f76"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="a9b78201046b292b6292f0d5bf55d3f76" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a9b78201046b292b6292f0d5bf55d3f76">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Sends data to a specific destination. </p> -<p>The socket must be bound.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer containing the data to send. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">num_bytes</td><td>The number of bytes to send. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>A <code>PPB_NetAddress</code> resource holding the destination address. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. </dd></dl> -</div> -</div> -<a class="anchor" id="a3def770b12177d3fa8faf36e184cc528"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="a3def770b12177d3fa8faf36e184cc528" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> -<div class="memitem"> -<div class="memproto"> -<table class="memname"> -<tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__0.html#a3def770b12177d3fa8faf36e184cc528">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> -</tr> -</table> -</div> -<div class="memdoc"> -<p>Sets a socket option on the UDP socket. </p> -<p>Please see the <code>PP_UDPSocket_Option</code> description for option names, value types and allowed values.</p> -<dl class="params"><dt><b>Parameters:</b></dt><dd> -<table class="params"> -<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">name</td><td>The option to set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">value</td><td>The option value to set. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> -</table> -</dd> -</dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> -</div> -</div> -<hr />The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="ppb__udp__socket_8h.html">ppb_udp_socket.h</a></li> -</ul> -</div><!-- contents --> -</div> -{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___u_d_p_socket__1__2.html similarity index 63% copy from native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html copy to native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___u_d_p_socket__1__2.html index 6307ad0..8e1b0e13 100644 --- a/native_client_sdk/doc_generated/pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___u_d_p_socket__1__2.html
@@ -12,25 +12,27 @@ <!-- doxytag: class="PPB_UDPSocket" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#abe2a2dc1170e9ea60f63656152b7b3ce">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a955e5c21c99668dc80fa54f8a12119de">IsUDPSocket</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce">Bind</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a2195768a7698776e83298b86b9670fa4">GetBoundAddress</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5">RecvFrom</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be">SendTo</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae27417e3577d5dbb3a88efa7867df7b9">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ac0656c7002acbb1d9c4b17fb679f63df">SetOption</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a3012f1d7f38fff9d45925e05850cfdb0">JoinGroup</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a5e46591a3a742ee1a9e3de81a76624d3">LeaveGroup</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>The <code>PPB_UDPSocket</code> interface provides UDP socket operations. </p> -<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> +<p>Permissions: Apps permission <code>socket</code> with subrule <code>udp-bind</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce" title="Binds the socket to the given address.">Bind()</a></code>; subrule <code>udp-send-to</code> is required for <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be" title="Sends data to a specific destination.">SendTo()</a></code>. For more details about network communication permissions, please see: <a href="http://developer.chrome.com/apps/app_network.html">http://developer.chrome.com/apps/app_network.html</a> </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="ab35f5cda2711b220a2b6c090b469d044"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="ab35f5cda2711b220a2b6c090b469d044" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a07dad506a240b35c8ceb5dcd5f9e12ce"></a><!-- doxytag: member="PPB_UDPSocket::Bind" ref="a07dad506a240b35c8ceb5dcd5f9e12ce" args=")(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce">PPB_UDPSocket::Bind</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -47,18 +49,18 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_ADDRESS_IN_USE</code> will be returned if the address is already in use. </dd></dl> </div> </div> -<a class="anchor" id="a9c349fbeb2a9fca70b8ecf0a860d2112"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="a9c349fbeb2a9fca70b8ecf0a860d2112" args=")(PP_Resource udp_socket)" --> +<a class="anchor" id="ae27417e3577d5dbb3a88efa7867df7b9"></a><!-- doxytag: member="PPB_UDPSocket::Close" ref="ae27417e3577d5dbb3a88efa7867df7b9" args=")(PP_Resource udp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a9c349fbeb2a9fca70b8ecf0a860d2112">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae27417e3577d5dbb3a88efa7867df7b9">PPB_UDPSocket::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> </tr> </table> </div> <div class="memdoc"> <p>Cancels all pending reads and writes, and closes the socket. </p> -<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ab35f5cda2711b220a2b6c090b469d044" title="Binds the socket to the given address.">Bind()</a></code> again.</p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. After a call to this method, no output parameters passed into previous <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5" title="Receives data from the socket and stores the source address.">RecvFrom()</a></code> calls will be accessed. It is not valid to call <code><a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a07dad506a240b35c8ceb5dcd5f9e12ce" title="Binds the socket to the given address.">Bind()</a></code> again.</p> <p>The socket is implicitly closed if it is destroyed, so you are not required to call this method.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> @@ -68,12 +70,12 @@ </dl> </div> </div> -<a class="anchor" id="a687ffa461f068fae0e0cc6694b3157bd"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="a687ffa461f068fae0e0cc6694b3157bd" args=")(PP_Instance instance)" --> +<a class="anchor" id="abe2a2dc1170e9ea60f63656152b7b3ce"></a><!-- doxytag: member="PPB_UDPSocket::Create" ref="abe2a2dc1170e9ea60f63656152b7b3ce" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a687ffa461f068fae0e0cc6694b3157bd">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#abe2a2dc1170e9ea60f63656152b7b3ce">PPB_UDPSocket::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -88,12 +90,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a UDP socket or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="a33be83f9c8d91811c9ee20fd04ae9be3"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a33be83f9c8d91811c9ee20fd04ae9be3" args=")(PP_Resource udp_socket)" --> +<a class="anchor" id="a2195768a7698776e83298b86b9670fa4"></a><!-- doxytag: member="PPB_UDPSocket::GetBoundAddress" ref="a2195768a7698776e83298b86b9670fa4" args=")(PP_Resource udp_socket)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a33be83f9c8d91811c9ee20fd04ae9be3">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a2195768a7698776e83298b86b9670fa4">PPB_UDPSocket::GetBoundAddress</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket)</td> </tr> </table> </div> @@ -109,12 +111,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PPB_NetAddress</code> resource on success or 0 on failure. </dd></dl> </div> </div> -<a class="anchor" id="a122be12f51d87e13cbe33bf30b3bef86"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a122be12f51d87e13cbe33bf30b3bef86" args=")(PP_Resource resource)" --> +<a class="anchor" id="a955e5c21c99668dc80fa54f8a12119de"></a><!-- doxytag: member="PPB_UDPSocket::IsUDPSocket" ref="a955e5c21c99668dc80fa54f8a12119de" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a122be12f51d87e13cbe33bf30b3bef86">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a955e5c21c99668dc80fa54f8a12119de">PPB_UDPSocket::IsUDPSocket</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -129,12 +131,56 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the input is a <code>PPB_UDPSocket</code> resource; <code>PP_FALSE</code> otherwise. </dd></dl> </div> </div> -<a class="anchor" id="aa15ebcb5bfc899d2d46f8f25266e4913"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="aa15ebcb5bfc899d2d46f8f25266e4913" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a3012f1d7f38fff9d45925e05850cfdb0"></a><!-- doxytag: member="PPB_UDPSocket::JoinGroup" ref="a3012f1d7f38fff9d45925e05850cfdb0" args=")(PP_Resource udp_socket, PP_Resource group, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#aa15ebcb5bfc899d2d46f8f25266e4913">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a3012f1d7f38fff9d45925e05850cfdb0">PPB_UDPSocket::JoinGroup</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Joins the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code>PPB_NetAddress</code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code>PP_Resource</code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a5e46591a3a742ee1a9e3de81a76624d3"></a><!-- doxytag: member="PPB_UDPSocket::LeaveGroup" ref="a5e46591a3a742ee1a9e3de81a76624d3" args=")(PP_Resource udp_socket, PP_Resource group, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#a5e46591a3a742ee1a9e3de81a76624d3">PPB_UDPSocket::LeaveGroup</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> group, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Leaves the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code>PPB_NetAddress</code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">udp_socket</td><td>A <code>PP_Resource</code> corresponding to a UDP socket. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code>PP_Resource</code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="afaf246c84eb76e033ee8794faa997af5"></a><!-- doxytag: member="PPB_UDPSocket::RecvFrom" ref="afaf246c84eb76e033ee8794faa997af5" args=")(PP_Resource udp_socket, char *buffer, int32_t num_bytes, PP_Resource *addr, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#afaf246c84eb76e033ee8794faa997af5">PPB_UDPSocket::RecvFrom</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -154,12 +200,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been received; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> </div> </div> -<a class="anchor" id="ad6b1bd2a28fdc4fa58b8872353524d38"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ad6b1bd2a28fdc4fa58b8872353524d38" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ae6764f319a9af980dbb1ba5625a417be"></a><!-- doxytag: member="PPB_UDPSocket::SendTo" ref="ae6764f319a9af980dbb1ba5625a417be" args=")(PP_Resource udp_socket, const char *buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#ad6b1bd2a28fdc4fa58b8872353524d38">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ae6764f319a9af980dbb1ba5625a417be">PPB_UDPSocket::SendTo</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, const char *buffer, int32_t num_bytes, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> addr, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> @@ -179,12 +225,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_INPROGRESS</code> will be returned if the socket is busy sending. The caller should wait until a pending send completes before retrying. </dd></dl> </div> </div> -<a class="anchor" id="a7107524b673568e4e69c63c43ecd0eec"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="a7107524b673568e4e69c63c43ecd0eec" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ac0656c7002acbb1d9c4b17fb679f63df"></a><!-- doxytag: member="PPB_UDPSocket::SetOption" ref="ac0656c7002acbb1d9c4b17fb679f63df" args=")(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__1.html#a7107524b673568e4e69c63c43ecd0eec">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___u_d_p_socket__1__2.html#ac0656c7002acbb1d9c4b17fb679f63df">PPB_UDPSocket::SetOption</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> udp_socket, <a class="el" href="group___enums.html#ga1a8472fa3e7150615c45c38fa8c12ce2">PP_UDPSocket_Option</a> name, struct <a class="el" href="struct_p_p___var.html">PP_Var</a> value, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_decoder__1__0.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_decoder__1__1.html similarity index 71% rename from native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_decoder__1__0.html rename to native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_decoder__1__1.html index c8dd134..7eb7007 100644 --- a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_decoder__1__0.html +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_decoder__1__1.html
@@ -12,35 +12,35 @@ <!-- doxytag: class="PPB_VideoDecoder" --><h2> Data Fields</h2><table class="memberdecls"> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ae2329143c44bd5eaae507074c1fc0ec3">IsVideoDecoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366">Decode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e">GetPicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f">RecyclePicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e">Reset</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#aa32bb990160f3e1fbfa90a2f363c61bc">IsVideoDecoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, uint32_t min_picture_count, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd">Decode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c">GetPicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb">RecyclePicture</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413">Flush</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0">Reset</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> </table> <hr /><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><p>Video decoder interface. </p> <p>Typical usage:</p> <ul> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c" title="Creates a new video decoder resource.">Create()</a> to create a new video decoder resource.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> -<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> to quickly stop the decoder (e.g. to implement Seek) and wait for the callback before restarting decoding at another point.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f" title="Creates a new video decoder resource.">Create()</a> to create a new video decoder resource.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> +<li>Call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> to quickly stop the decoder (e.g. to implement Seek) and wait for the callback before restarting decoding at another point.</li> <li>To destroy the decoder, the plugin should release all of its references to it. Any pending callbacks will abort before the decoder is destroyed.</li> </ul> <p>Available video codecs vary by platform. All: theora, vorbis, vp8. Chrome and ChromeOS: aac, h264. ChromeOS: mpeg4. </p> </div><hr /><h2>Field Documentation</h2> -<a class="anchor" id="a81200f606c493c49a70190ca86ac135c"></a><!-- doxytag: member="PPB_VideoDecoder::Create" ref="a81200f606c493c49a70190ca86ac135c" args=")(PP_Instance instance)" --> +<a class="anchor" id="ab84df8254cf35702e09425b835b5958f"></a><!-- doxytag: member="PPB_VideoDecoder::Create" ref="ab84df8254cf35702e09425b835b5958f" args=")(PP_Instance instance)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c">PPB_VideoDecoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f">PPB_VideoDecoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> </tr> </table> </div> @@ -55,45 +55,45 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a video decoder if successful or 0 otherwise. </dd></dl> </div> </div> -<a class="anchor" id="acc8662be4232325abc545d1ae8b79366"></a><!-- doxytag: member="PPB_VideoDecoder::Decode" ref="acc8662be4232325abc545d1ae8b79366" args=")(PP_Resource video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a5f87d174876dc480029275f94e4669cd"></a><!-- doxytag: member="PPB_VideoDecoder::Decode" ref="a5f87d174876dc480029275f94e4669cd" args=")(PP_Resource video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366">PPB_VideoDecoder::Decode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd">PPB_VideoDecoder::Decode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, uint32_t decode_id, uint32_t size, const void *buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Decodes a bitstream buffer. </p> -<p>Copies |size| bytes of data from the plugin's |buffer|. The plugin should wait until the decoder signals completion by returning PP_OK or by running |callback| before calling <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> again.</p> +<p>Copies |size| bytes of data from the plugin's |buffer|. The plugin should wait until the decoder signals completion by returning PP_OK or by running |callback| before calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> again.</p> <p>In general, each bitstream buffer should contain a demuxed bitstream frame for the selected video codec. For example, H264 decoders expect to receive one AnnexB NAL unit, including the 4 byte start code prefix, while VP8 decoders expect to receive a bitstream frame without the IVF frame header.</p> -<p>If the call to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> eventually results in a picture, the |decode_id| parameter is copied into the returned picture. The plugin can use this to associate decoded pictures with <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> calls (e.g. to assign timestamps or frame numbers to pictures.) This value is opaque to the API so the plugin is free to pass any value.</p> +<p>If the call to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> eventually results in a picture, the |decode_id| parameter is copied into the returned picture. The plugin can use this to associate decoded pictures with <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> calls (e.g. to assign timestamps or frame numbers to pictures.) This value is opaque to the API so the plugin is free to pass any value.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> -<tr><td class="paramdir">[in]</td><td class="paramname">decode_id</td><td>An optional value, chosen by the plugin, that can be used to associate calls to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> with decoded pictures returned by <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a>. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">decode_id</td><td>An optional value, chosen by the plugin, that can be used to associate calls to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> with decoded pictures returned by <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a>. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Buffer size in bytes. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>Starting address of buffer. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called on completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> or <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> call pending. Returns PP_ERROR_NOMEMORY if a bitstream buffer can't be created. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> is called while <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> is pending. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> or <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> call pending. Returns PP_ERROR_NOMEMORY if a bitstream buffer can't be created. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> is called while <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="adf3ea0876d1ba686266589a04532e86d"></a><!-- doxytag: member="PPB_VideoDecoder::Flush" ref="adf3ea0876d1ba686266589a04532e86d" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a40e2989df1005096fd6fc9832e078413"></a><!-- doxytag: member="PPB_VideoDecoder::Flush" ref="a40e2989df1005096fd6fc9832e078413" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d">PPB_VideoDecoder::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413">PPB_VideoDecoder::Flush</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Flushes the decoder. </p> -<p>The plugin should call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> when it reaches the end of its video stream in order to stop cleanly. The decoder will run any pending <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> call to completion. The plugin should make no further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Just before completion, any pending <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> call will complete by running its callback with result PP_ERROR_ABORTED to signal that no more pictures are available. Any pictures held by the plugin remain valid during and after the flush and should be recycled back to the decoder.</p> +<p>The plugin should call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> when it reaches the end of its video stream in order to stop cleanly. The decoder will run any pending <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> call to completion. The plugin should make no further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Just before completion, any pending <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> call will complete by running its callback with result PP_ERROR_ABORTED to signal that no more pictures are available. Any pictures held by the plugin remain valid during and after the flush and should be recycled back to the decoder.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> @@ -104,18 +104,18 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized. </dd></dl> </div> </div> -<a class="anchor" id="a2351fe0cf66513ee77df0c1a22306c3e"></a><!-- doxytag: member="PPB_VideoDecoder::GetPicture" ref="a2351fe0cf66513ee77df0c1a22306c3e" args=")(PP_Resource video_decoder, struct PP_VideoPicture *picture, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="adc8b4eb41199cdf96aaa55d9a2df0b6c"></a><!-- doxytag: member="PPB_VideoDecoder::GetPicture" ref="adc8b4eb41199cdf96aaa55d9a2df0b6c" args=")(PP_Resource video_decoder, struct PP_VideoPicture *picture, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e">PPB_VideoDecoder::GetPicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c">PPB_VideoDecoder::GetPicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Gets the next picture from the decoder. </p> -<p>The picture is valid after the decoder signals completion by returning PP_OK or running |callback|. The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> again after the decoder signals completion. When the plugin is finished using the picture, it should return it to the system by calling <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>.</p> +<p>The picture is valid after the decoder signals completion by returning PP_OK or running |callback|. The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> again after the decoder signals completion. When the plugin is finished using the picture, it should return it to the system by calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> @@ -124,40 +124,41 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#adf3ea0876d1ba686266589a04532e86d" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a40e2989df1005096fd6fc9832e078413" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="ad115b7705b740b771e7dd9acb2b36f16"></a><!-- doxytag: member="PPB_VideoDecoder::Initialize" ref="ad115b7705b740b771e7dd9acb2b36f16" args=")(PP_Resource video_decoder, PP_Resource graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="a65fc7d77135a1c55eb77ad4f7fd1a8a8"></a><!-- doxytag: member="PPB_VideoDecoder::Initialize" ref="a65fc7d77135a1c55eb77ad4f7fd1a8a8" args=")(PP_Resource video_decoder, PP_Resource graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16">PPB_VideoDecoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8">PPB_VideoDecoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> graphics3d_context, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> profile, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, uint32_t min_picture_count, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Initializes a video decoder resource. </p> -<p>This should be called after <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a81200f606c493c49a70190ca86ac135c" title="Creates a new video decoder resource.">Create()</a> and before any other functions.</p> +<p>This should be called after <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab84df8254cf35702e09425b835b5958f" title="Creates a new video decoder resource.">Create()</a> and before any other functions.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">graphics3d_context</td><td>A <code>PPB_Graphics3D</code> resource to use during decoding. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">profile</td><td>A <code>PP_VideoProfile</code> specifying the video codec profile. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">min_picture_count</td><td>A count of pictures the plugin would like to have in flight. This is effectively the number of times the plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a> and get a decoded frame without calling <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>. The decoder has its own internal minimum count, and will take the larger of its internal and this value. A client that doesn't care can therefore just pass in zero for this argument. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ad115b7705b740b771e7dd9acb2b36f16" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a65fc7d77135a1c55eb77ad4f7fd1a8a8" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. Returns PP_ERROR_BADARGUMENT if the requested minimum picture count is unreasonably large. </dd></dl> </div> </div> -<a class="anchor" id="ae2329143c44bd5eaae507074c1fc0ec3"></a><!-- doxytag: member="PPB_VideoDecoder::IsVideoDecoder" ref="ae2329143c44bd5eaae507074c1fc0ec3" args=")(PP_Resource resource)" --> +<a class="anchor" id="aa32bb990160f3e1fbfa90a2f363c61bc"></a><!-- doxytag: member="PPB_VideoDecoder::IsVideoDecoder" ref="aa32bb990160f3e1fbfa90a2f363c61bc" args=")(PP_Resource resource)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ae2329143c44bd5eaae507074c1fc0ec3">PPB_VideoDecoder::IsVideoDecoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#aa32bb990160f3e1fbfa90a2f363c61bc">PPB_VideoDecoder::IsVideoDecoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> </tr> </table> </div> @@ -172,12 +173,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_VideoDecoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> </div> </div> -<a class="anchor" id="ac7e6b42866d42eade96519f32755509f"></a><!-- doxytag: member="PPB_VideoDecoder::RecyclePicture" ref="ac7e6b42866d42eade96519f32755509f" args=")(PP_Resource video_decoder, const struct PP_VideoPicture *picture)" --> +<a class="anchor" id="ab0b4f4b781cf6c0b347832961a08b6bb"></a><!-- doxytag: member="PPB_VideoDecoder::RecyclePicture" ref="ab0b4f4b781cf6c0b347832961a08b6bb" args=")(PP_Resource video_decoder, const struct PP_VideoPicture *picture)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">void(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f">PPB_VideoDecoder::RecyclePicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb">PPB_VideoDecoder::RecyclePicture</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, const struct <a class="el" href="struct_p_p___video_picture.html">PP_VideoPicture</a> *picture)</td> </tr> </table> </div> @@ -193,18 +194,18 @@ </dl> </div> </div> -<a class="anchor" id="aeb4704cfd86a4ad737af19e77f3ffd5e"></a><!-- doxytag: member="PPB_VideoDecoder::Reset" ref="aeb4704cfd86a4ad737af19e77f3ffd5e" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> +<a class="anchor" id="ad8151e35df062e82434fb1d6e0629fd0"></a><!-- doxytag: member="PPB_VideoDecoder::Reset" ref="ad8151e35df062e82434fb1d6e0629fd0" args=")(PP_Resource video_decoder, struct PP_CompletionCallback callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e">PPB_VideoDecoder::Reset</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0">PPB_VideoDecoder::Reset</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_decoder, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> </tr> </table> </div> <div class="memdoc"> <p>Resets the decoder as quickly as possible. </p> -<p>The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> to skip to another position in the video stream. After <a class="el" href="struct_p_p_b___video_decoder__1__0.html#aeb4704cfd86a4ad737af19e77f3ffd5e" title="Resets the decoder as quickly as possible.">Reset()</a> returns, any pending calls to <a class="el" href="struct_p_p_b___video_decoder__1__0.html#acc8662be4232325abc545d1ae8b79366" title="Decodes a bitstream buffer.">Decode()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__0.html#a2351fe0cf66513ee77df0c1a22306c3e" title="Gets the next picture from the decoder.">GetPicture()</a>) abort, causing their callbacks to run with PP_ERROR_ABORTED. The plugin should not make further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__0.html#ac7e6b42866d42eade96519f32755509f" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Any pictures held by the plugin remain valid during and after the reset and should be recycled back to the decoder.</p> +<p>The plugin can call <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> to skip to another position in the video stream. After <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ad8151e35df062e82434fb1d6e0629fd0" title="Resets the decoder as quickly as possible.">Reset()</a> returns, any pending calls to <a class="el" href="struct_p_p_b___video_decoder__1__1.html#a5f87d174876dc480029275f94e4669cd" title="Decodes a bitstream buffer.">Decode()</a> and <a class="el" href="struct_p_p_b___video_decoder__1__1.html#adc8b4eb41199cdf96aaa55d9a2df0b6c" title="Gets the next picture from the decoder.">GetPicture()</a>) abort, causing their callbacks to run with PP_ERROR_ABORTED. The plugin should not make further calls to the decoder other than <a class="el" href="struct_p_p_b___video_decoder__1__1.html#ab0b4f4b781cf6c0b347832961a08b6bb" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a> until the decoder signals completion by running |callback|. Any pictures held by the plugin remain valid during and after the reset and should be recycled back to the decoder.</p> <dl class="params"><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramdir">[in]</td><td class="paramname">video_decoder</td><td>A <code>PP_Resource</code> identifying the video decoder. </td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_encoder__0__2.html b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_encoder__0__2.html new file mode 100644 index 0000000..de97a32 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/c/struct_p_p_b___video_encoder__0__2.html
@@ -0,0 +1,309 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>PPB_VideoEncoder Struct Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="PPB_VideoEncoder" --><h2> +Data Fields</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c">Create</a> )(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9006f1c2d0d3fe9a71bb2343e22e679a">IsVideoEncoder</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#abe007473d19c6c82555799c0ecff0cc7">GetSupportedProfiles</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561">Initialize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___enums.html#ga4e7cf746d8acbfa268db1f5ebe8061bf">PP_VideoFrame_Format</a> input_format, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *input_visible_size, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a468e94294b704c002a6532687bb53ed0">GetFramesRequired</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#adbd41c5b25729bbfb1ad90124d9e9528">GetFrameCodedSize</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *coded_size)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a">GetVideoFrame</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *video_frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9">Encode</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_frame, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> force_keyframe, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4">GetBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a">RecycleBitstreamBuffer</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, const struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#aa1a3fa20e5d8c56e420d169af6f02845">RequestEncodingParametersChange</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, uint32_t bitrate, uint32_t framerate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f">Close</a> )(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Video encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c" title="Creates a new video encoder resource.">Create()</a> to create a new video encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a" title="Gets a blank video frame which can be filled with video data and passed to the encoder.">GetVideoFrame()</a> to get a blank frame and fill it in, or get a video frame from another resource, e.g. <code>PPB_MediaStreamVideoTrack</code>.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9" title="Encodes a video frame.">Encode()</a> to push the video frame to the encoder. If an external frame is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded pictures from the encoder.</li> +<li>Call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available video codecs vary by platform. All: vp8 (software). ChromeOS, depending on your device: h264 (hardware), vp8 (hardware) </p> +</div><hr /><h2>Field Documentation</h2> +<a class="anchor" id="afe91b697d39e41ca9c4b187e1f66749f"></a><!-- doxytag: member="PPB_VideoEncoder::Close" ref="afe91b697d39e41ca9c4b187e1f66749f" args=")(PP_Resource video_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f">PPB_VideoEncoder::Close</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the video encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the video encoder closes it implicitly, so you are not required to call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#afe91b697d39e41ca9c4b187e1f66749f" title="Closes the video encoder, and cancels any pending encodes.">Close()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a94d87da92ccfb984cef497977d00d80c"></a><!-- doxytag: member="PPB_VideoEncoder::Create" ref="a94d87da92ccfb984cef497977d00d80c" args=")(PP_Instance instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a>(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a94d87da92ccfb984cef497977d00d80c">PPB_VideoEncoder::Create</a>)(<a class="el" href="group___typedefs.html#ga89b662403e6a687bb914b80114c0d19d">PP_Instance</a> instance)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Creates a new video encoder resource. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>A <code>PP_Instance</code> identifying the instance with the video encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A <code>PP_Resource</code> corresponding to a video encoder if successful or 0 otherwise. </dd></dl> +</div> +</div> +<a class="anchor" id="a873344d65a32d15426cd4424e76bb6d9"></a><!-- doxytag: member="PPB_VideoEncoder::Encode" ref="a873344d65a32d15426cd4424e76bb6d9" args=")(PP_Resource video_encoder, PP_Resource video_frame, PP_Bool force_keyframe, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a873344d65a32d15426cd4424e76bb6d9">PPB_VideoEncoder::Encode</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_frame, <a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a> force_keyframe, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes a video frame. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">video_frame</td><td>The <code>PPB_VideoFrame</code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">force_keyframe</td><td>A <code>PP_Bool> specifying whether the encoder should emit a key frame for this video frame. </code></td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td><code>A </code><code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. Plugins that pass <code>PPB_VideoFrame</code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code> An int32_t containing an error code from </code><code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a8b2b489462a35bdc6300bcf1fdadabe4"></a><!-- doxytag: member="PPB_VideoEncoder::GetBitstreamBuffer" ref="a8b2b489462a35bdc6300bcf1fdadabe4" args=")(PP_Resource video_encoder, struct PP_BitstreamBuffer *bitstream_buffer, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4">PPB_VideoEncoder::GetBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> containing encoded video data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a8b2b489462a35bdc6300bcf1fdadabe4" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="adbd41c5b25729bbfb1ad90124d9e9528"></a><!-- doxytag: member="PPB_VideoEncoder::GetFrameCodedSize" ref="adbd41c5b25729bbfb1ad90124d9e9528" args=")(PP_Resource video_encoder, struct PP_Size *coded_size)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#adbd41c5b25729bbfb1ad90124d9e9528">PPB_VideoEncoder::GetFrameCodedSize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *coded_size)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the coded size of the video frames required by the encoder. </p> +<p>Coded size is the logical size of the input frames, in pixels. The encoder may have hardware alignment requirements that make this different from |input_visible_size|, as requested in the call to <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">coded_size</td><td>A <code><a class="el" href="struct_p_p___size.html" title="The PP_Size struct contains the size of a 2D rectangle.">PP_Size</a></code> to hold the coded size. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a468e94294b704c002a6532687bb53ed0"></a><!-- doxytag: member="PPB_VideoEncoder::GetFramesRequired" ref="a468e94294b704c002a6532687bb53ed0" args=")(PP_Resource video_encoder)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a468e94294b704c002a6532687bb53ed0">PPB_VideoEncoder::GetFramesRequired</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of input video frames that the encoder may hold while encoding. </p> +<p>If the plugin is providing the video frames, it should have at least this many available.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of frames required, or an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="abe007473d19c6c82555799c0ecff0cc7"></a><!-- doxytag: member="PPB_VideoEncoder::GetSupportedProfiles" ref="abe007473d19c6c82555799c0ecff0cc7" args=")(PP_Resource video_encoder, struct PP_ArrayOutput output, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#abe007473d19c6c82555799c0ecff0cc7">PPB_VideoEncoder::GetSupportedProfiles</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, struct <a class="el" href="struct_p_p___array_output.html">PP_ArrayOutput</a> output, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported video encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output</td><td>A <code><a class="el" href="struct_p_p___array_output.html" title="A structure that defines a way for the browser to return arrays of data to the plugin.">PP_ArrayOutput</a></code> to receive the supported <code><a class="el" href="struct_p_p___video_profile_description.html" title="Supported video profile information.">PP_VideoProfileDescription</a></code> structs. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a64a5b77b1130f13184b797828a49587a"></a><!-- doxytag: member="PPB_VideoEncoder::GetVideoFrame" ref="a64a5b77b1130f13184b797828a49587a" args=")(PP_Resource video_encoder, PP_Resource *video_frame, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a64a5b77b1130f13184b797828a49587a">PPB_VideoEncoder::GetVideoFrame</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> *video_frame, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank video frame which can be filled with video data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[out]</td><td class="paramname">video_frame</td><td>A blank <code>PPB_VideoFrame</code> resource. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_FAILED if <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a9cd78deaf493477ca7ec96a6e6445561"></a><!-- doxytag: member="PPB_VideoEncoder::Initialize" ref="a9cd78deaf493477ca7ec96a6e6445561" args=")(PP_Resource video_encoder, PP_VideoFrame_Format input_format, const struct PP_Size *input_visible_size, PP_VideoProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, struct PP_CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561">PPB_VideoEncoder::Initialize</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, <a class="el" href="group___enums.html#ga4e7cf746d8acbfa268db1f5ebe8061bf">PP_VideoFrame_Format</a> input_format, const struct <a class="el" href="struct_p_p___size.html">PP_Size</a> *input_visible_size, <a class="el" href="group___enums.html#ga4d50d27186f68b2de578e82162206fea">PP_VideoProfile</a> output_profile, uint32_t initial_bitrate, <a class="el" href="group___enums.html#ga6a3fd7e22be02521243b52481afadae5">PP_HardwareAcceleration</a> acceleration, struct <a class="el" href="struct_p_p___completion_callback.html">PP_CompletionCallback</a> callback)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a video encoder resource. </p> +<p>The plugin should call <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9cd78deaf493477ca7ec96a6e6445561" title="Initializes a video encoder resource.">Initialize()</a> successfully before calling any of the functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_format</td><td>The <code>PP_VideoFrame_Format</code> of the frames which will be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_visible_size</td><td>A <code><a class="el" href="struct_p_p___size.html" title="The PP_Size struct contains the size of a 2D rectangle.">PP_Size</a></code> specifying the dimensions of the visible part of the input frames. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_VideoProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="struct_p_p___completion_callback.html" title="PP_CompletionCallback is a common mechanism for supporting potentially asynchronous calls in browser ...">PP_CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code><a class="el" href="pp__errors_8h.html" title="This file defines an enumeration of all PPAPI error codes.">pp_errors.h</a></code>. Returns PP_ERROR_NOTSUPPORTED if video encoding is not available, or the requested codec profile is not supported. </dd></dl> +</div> +</div> +<a class="anchor" id="a9006f1c2d0d3fe9a71bb2343e22e679a"></a><!-- doxytag: member="PPB_VideoEncoder::IsVideoEncoder" ref="a9006f1c2d0d3fe9a71bb2343e22e679a" args=")(PP_Resource resource)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="group___enums.html#ga4f272d99be14aacafe08dfd4ef830918">PP_Bool</a>(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a9006f1c2d0d3fe9a71bb2343e22e679a">PPB_VideoEncoder::IsVideoEncoder</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> resource)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Determines if the given resource is a video encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">resource</td><td>A <code>PP_Resource</code> identifying a resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code>PP_TRUE</code> if the resource is a <code>PPB_VideoEncoder</code>, <code>PP_FALSE</code> if the resource is invalid or some other type. </dd></dl> +</div> +</div> +<a class="anchor" id="a072f3199019aa262fbdf42412678220a"></a><!-- doxytag: member="PPB_VideoEncoder::RecycleBitstreamBuffer" ref="a072f3199019aa262fbdf42412678220a" args=")(PP_Resource video_encoder, const struct PP_BitstreamBuffer *bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#a072f3199019aa262fbdf42412678220a">PPB_VideoEncoder::RecycleBitstreamBuffer</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, const struct <a class="el" href="struct_p_p___bitstream_buffer.html">PP_BitstreamBuffer</a> *bitstream_buffer)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code><a class="el" href="struct_p_p___bitstream_buffer.html" title="Struct describing a bitstream buffer.">PP_BitstreamBuffer</a></code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="aa1a3fa20e5d8c56e420d169af6f02845"></a><!-- doxytag: member="PPB_VideoEncoder::RequestEncodingParametersChange" ref="aa1a3fa20e5d8c56e420d169af6f02845" args=")(PP_Resource video_encoder, uint32_t bitrate, uint32_t framerate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void(* <a class="el" href="struct_p_p_b___video_encoder__0__2.html#aa1a3fa20e5d8c56e420d169af6f02845">PPB_VideoEncoder::RequestEncodingParametersChange</a>)(<a class="el" href="group___typedefs.html#gafdc3895ee80f4750d0d95ae1b677e9b7">PP_Resource</a> video_encoder, uint32_t bitrate, uint32_t framerate)</td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to encoding parameters. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_encoder</td><td>A <code>PP_Resource</code> identifying the video encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">framerate</td><td>The requested new framerate, in frames per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this struct was generated from the following file:<ul> +<li><a class="el" href="ppb__video__encoder_8h.html">ppb_video_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/audio__encoder_8h.html b/native_client_sdk/doc_generated/pepper_stable/cpp/audio__encoder_8h.html new file mode 100644 index 0000000..f04836a --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/audio__encoder_8h.html
@@ -0,0 +1,32 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>audio_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for audio_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="audio__encoder_8h__incl.png" border="0" usemap="#audio__encoder_8h" alt="" /></div> +<map name="audio__encoder_8h" id="audio__encoder_8h"> +</map> +</div> +</div><h2> +Classes</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. <a href="classpp_1_1_audio_encoder.html#details">More...</a><br /></td></tr> +</table><h2> +Namespaces</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the API to create and use a AudioEncoder resource. </p> +</div></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/audio__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/cpp/audio__encoder_8h__incl.png new file mode 100644 index 0000000..9eb1bf12 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/audio__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder-members.html new file mode 100644 index 0000000..9872974 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder-members.html
@@ -0,0 +1,39 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>Member List</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +This is the complete list of members for <a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a>, including all inherited members.<table> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">AudioEncoder</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a1b5126d5112082bfa782bf5423715030">AudioEncoder</a>(const InstanceHandle &instance)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td><code> [explicit]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#ac4a116ff790ce5dc1cc4847118aabc9d">AudioEncoder</a>(const AudioEncoder &other)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">Close</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">Encode</a>(const AudioBuffer &buffer, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">GetBitstreamBuffer</a>(const CompletionCallbackWithOutput< PP_AudioBitstreamBuffer > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">GetBuffer</a>(const CompletionCallbackWithOutput< AudioBuffer > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">GetNumberOfSamples</a>()</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">GetSupportedProfiles</a>(const CompletionCallbackWithOutput< std::vector< PP_AudioProfileDescription > > &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">Initialize</a>(uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">RecycleBitstreamBuffer</a>(const PP_AudioBitstreamBuffer &bitstream_buffer)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">RequestBitrateChange</a>(uint32_t bitrate)</td><td><a class="el" href="classpp_1_1_audio_encoder.html">pp::AudioEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> +</table></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder.html new file mode 100644 index 0000000..525e399 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder.html
@@ -0,0 +1,381 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>pp::AudioEncoder Class Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="pp::AudioEncoder" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader"> +Inheritance diagram for pp::AudioEncoder:</div> +<div class="dyncontent"> +<div class="center"><img src="classpp_1_1_audio_encoder__inherit__graph.png" border="0" usemap="#pp_1_1_audio_encoder_inherit__map" alt="Inheritance graph" /></div> +<map name="pp_1_1_audio_encoder_inherit__map" id="pp_1_1_audio_encoder_inherit__map"> +<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="20,5,124,32"></area></map> +<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> +<p><a href="classpp_1_1_audio_encoder-members.html">List of all members.</a></p> +<h2> +Public Member Functions</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">AudioEncoder</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a1b5126d5112082bfa782bf5423715030">AudioEncoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#ac4a116ff790ce5dc1cc4847118aabc9d">AudioEncoder</a> (const <a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a> &other)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">GetSupportedProfiles</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_AudioProfileDescription > > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">Initialize</a> (uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">GetNumberOfSamples</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">GetBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">Encode</a> (const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> &buffer, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">GetBitstreamBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_AudioBitstreamBuffer > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">RecycleBitstreamBuffer</a> (const PP_AudioBitstreamBuffer &bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">RequestBitrateChange</a> (uint32_t bitrate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">Close</a> ()</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call Create() to create a new audio encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687" title="Gets a blank audio frame which can be filled with audio data and passed to the encoder.">GetBuffer()</a> to get a blank frame and fill it in, or get an audio frame from another resource, e.g. <code>PPB_MediaStreamAudioTrack</code>.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19" title="Encodes an audio buffer.">Encode()</a> to push the audio buffer to the encoder. If an external buffer is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded buffers from the encoder.</li> +<li>Call <a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available audio codecs vary by platform. All: opus. </p> +</div><hr /><h2>Constructor & Destructor Documentation</h2> +<a class="anchor" id="afaf804d519fc0f2370c2d011b4e68378"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="afaf804d519fc0f2370c2d011b4e68378" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code> object. </p> +</div> +</div> +<a class="anchor" id="a1b5126d5112082bfa782bf5423715030"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="a1b5126d5112082bfa782bf5423715030" args="(const InstanceHandle &instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> & </td> +<td class="paramname"><em>instance</em></td><td>)</td> +<td><code> [explicit]</code></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A constructor used to create a <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code> and associate it with the provided <code><a class="el" href="classpp_1_1_instance.html">Instance</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ac4a116ff790ce5dc1cc4847118aabc9d"></a><!-- doxytag: member="pp::AudioEncoder::AudioEncoder" ref="ac4a116ff790ce5dc1cc4847118aabc9d" args="(const AudioEncoder &other)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_audio_encoder.html#afaf804d519fc0f2370c2d011b4e68378">pp::AudioEncoder::AudioEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a> & </td> +<td class="paramname"><em>other</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The copy constructor for <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface.">AudioEncoder</a></code>. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr /><h2>Member Function Documentation</h2> +<a class="anchor" id="a5f5f533624660ca8561fea403da85f5b"></a><!-- doxytag: member="pp::AudioEncoder::Close" ref="a5f5f533624660ca8561fea403da85f5b" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b">pp::AudioEncoder::Close</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the audio encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the audio encoder closes it implicitly, so you are not required to call <a class="el" href="classpp_1_1_audio_encoder.html#a5f5f533624660ca8561fea403da85f5b" title="Closes the audio encoder, and cancels any pending encodes.">Close()</a>. </p> +</div> +</div> +<a class="anchor" id="a75278dc12dfcc3d000e47e17f014be19"></a><!-- doxytag: member="pp::AudioEncoder::Encode" ref="a75278dc12dfcc3d000e47e17f014be19" args="(const AudioBuffer &buffer, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a75278dc12dfcc3d000e47e17f014be19">pp::AudioEncoder::Encode</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> & </td> +<td class="paramname"><em>buffer</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes an audio buffer. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_buffer</td><td>The <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion. Plugins that pass <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ad1a2c96562e2baa7a61d63fbb8a49999"></a><!-- doxytag: member="pp::AudioEncoder::GetBitstreamBuffer" ref="ad1a2c96562e2baa7a61d63fbb8a49999" args="(const CompletionCallbackWithOutput< PP_AudioBitstreamBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999">pp::AudioEncoder::GetBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_AudioBitstreamBuffer > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the next bitstream buffer. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="classpp_1_1_audio_encoder.html#ad1a2c96562e2baa7a61d63fbb8a49999" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a113d4a018e987f2f5227c6e0dc8a7687"></a><!-- doxytag: member="pp::AudioEncoder::GetBuffer" ref="a113d4a018e987f2f5227c6e0dc8a7687" args="(const CompletionCallbackWithOutput< AudioBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687">pp::AudioEncoder::GetBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a> > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank audio frame which can be filled with audio data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the blank <code><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></code> resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a706b305dae8bc5f5e0bca4491c991d59"></a><!-- doxytag: member="pp::AudioEncoder::GetNumberOfSamples" ref="a706b305dae8bc5f5e0bca4491c991d59" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a706b305dae8bc5f5e0bca4491c991d59">pp::AudioEncoder::GetNumberOfSamples</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of audio samples per channel that audio buffers must contain in order to be processed by the encoder. </p> +<p>This will be the number of samples per channels contained in buffers returned by <a class="el" href="classpp_1_1_audio_encoder.html#a113d4a018e987f2f5227c6e0dc8a7687" title="Gets a blank audio frame which can be filled with audio data and passed to the encoder.">GetBuffer()</a>.</p> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of samples required, or an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a34b94c7bb1f509f4b56bfe7349560669"></a><!-- doxytag: member="pp::AudioEncoder::GetSupportedProfiles" ref="a34b94c7bb1f509f4b56bfe7349560669" args="(const CompletionCallbackWithOutput< std::vector< PP_AudioProfileDescription > > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669">pp::AudioEncoder::GetSupportedProfiles</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_AudioProfileDescription > > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported audio encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933" title="Initializes a audio encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the PP_AudioProfileDescription structs.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a28aa43f8c92b387b81e7cf63219c2933"></a><!-- doxytag: member="pp::AudioEncoder::Initialize" ref="a28aa43f8c92b387b81e7cf63219c2933" args="(uint32_t channels, PP_AudioBuffer_SampleRate input_sample_rate, PP_AudioBuffer_SampleSize input_sample_size, PP_AudioProfile output_profile, uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_audio_encoder.html#a28aa43f8c92b387b81e7cf63219c2933">pp::AudioEncoder::Initialize</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>channels</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioBuffer_SampleRate </td> +<td class="paramname"><em>input_sample_rate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioBuffer_SampleSize </td> +<td class="paramname"><em>input_sample_size</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_AudioProfile </td> +<td class="paramname"><em>output_profile</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>initial_bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_HardwareAcceleration </td> +<td class="paramname"><em>acceleration</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a audio encoder resource. </p> +<p>This should be called after <a class="el" href="classpp_1_1_audio_encoder.html#a34b94c7bb1f509f4b56bfe7349560669" title="Gets an array of supported audio encoder profiles.">GetSupportedProfiles()</a> and before any functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">channels</td><td>The number of audio channels to encode. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sampling_rate</td><td>The sampling rate of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_sample_size</td><td>The sample size of the input audio buffer. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_AudioProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">initial_bitrate</td><td>The initial bitrate for the encoder. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if audio encoding is not available, or the requested codec profile is not supported. Returns PP_ERROR_NOMEMORY if bitstream buffers can't be created. </dd></dl> +</div> +</div> +<a class="anchor" id="a9c5b90b6dbfd81154b28f402197184bc"></a><!-- doxytag: member="pp::AudioEncoder::RecycleBitstreamBuffer" ref="a9c5b90b6dbfd81154b28f402197184bc" args="(const PP_AudioBitstreamBuffer &bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#a9c5b90b6dbfd81154b28f402197184bc">pp::AudioEncoder::RecycleBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const PP_AudioBitstreamBuffer & </td> +<td class="paramname"><em>bitstream_buffer</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A<code>PP_AudioBitstreamBuffer</code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="aa64ea3b0313335817833a72ceed96114"></a><!-- doxytag: member="pp::AudioEncoder::RequestBitrateChange" ref="aa64ea3b0313335817833a72ceed96114" args="(uint32_t bitrate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_audio_encoder.html#aa64ea3b0313335817833a72ceed96114">pp::AudioEncoder::RequestBitrateChange</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>bitrate</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to the encoding bitrate. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">audio_encoder</td><td>A <code>PP_Resource</code> identifying the audio encoder. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this class was generated from the following file:<ul> +<li><a class="el" href="audio__encoder_8h.html">audio_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder__inherit__graph.png b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder__inherit__graph.png new file mode 100644 index 0000000..5b2e1e1 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_audio_encoder__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_instance.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_instance.html index c1426e0..3894b01 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_instance.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_instance.html
@@ -113,7 +113,7 @@ <div class="memdoc"> <p><a class="el" href="classpp_1_1_instance.html#a9773263ee281405030548fc224eeec08" title="AddPerInstanceObject() associates an instance with an interface, creating an object.">AddPerInstanceObject()</a> associates an instance with an interface, creating an object. </p> <p>Many optional interfaces are associated with a plugin instance. For example, the find in PPP_Find interface receives updates on a per-instance basis. This "per-instance" tracking allows such objects to associate themselves with an instance as "the" handler for that interface name.</p> -<p>In the case of the find example, the find object registers with its associated instance in its constructor and unregisters in its destructor. Then whenever it gets updates with a PP_Instance parameter, it can map back to the find object corresponding to that given PP_Instance by calling GetPerInstanceObject</p> +<p>In the case of the find example, the find object registers with its associated instance in its constructor and unregisters in its destructor. Then whenever it gets updates with a PP_Instance parameter, it can map back to the find object corresponding to that given PP_Instance by calling GetPerInstanceObject.</p> <p>This lookup is done on a per-interface-name basis. This means you can only have one object of a given interface name associated with an instance.</p> <p>If you are adding a handler for an additional interface, be sure to register with the module (AddPluginInterface) for your interface name to get the C calls in the first place.</p> <p>Refer to <a class="el" href="classpp_1_1_instance.html#a33c633189c7c321dac8e0c5dc6e67f5b" title="Refer to AddPerInstanceObject() for further information.">RemovePerInstanceObject()</a> and <a class="el" href="classpp_1_1_instance.html#a6dec498f1d49571be9fd40e23745327f" title="Look up an object previously associated with an instance.">GetPerInstanceObject()</a> for further information.</p>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html index 7845d8d..9e77949 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource.html
@@ -15,7 +15,7 @@ <div class="dyncontent"> <div class="center"><img src="classpp_1_1_resource__inherit__graph.png" border="0" usemap="#pp_1_1_resource_inherit__map" alt="Inheritance graph" /></div> <map name="pp_1_1_resource_inherit__map" id="pp_1_1_resource_inherit__map"> -<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,157,317,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,208,335,235"></area><area shape="rect" id="node7" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,259,297,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,309,300,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,360,315,387"></area><area shape="rect" id="node10" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,411,317,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,512,322,539"></area><area shape="rect" id="node13" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,563,316,589"></area><area shape="rect" id="node14" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,613,315,640"></area><area shape="rect" id="node20" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,664,357,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,765,325,792"></area><area shape="rect" id="node23" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,816,318,843"></area><area shape="rect" id="node24" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,867,317,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,917,331,944"></area><area shape="rect" id="node26" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,968,314,995"></area><area shape="rect" id="node27" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1019,317,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1069,315,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1120,330,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1171,335,1197"></area><area shape="rect" id="node31" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1221,325,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1272,319,1299"></area><area shape="rect" id="node33" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1323,295,1349"></area><area shape="rect" id="node34" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1373,315,1400"></area><area shape="rect" id="node15" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,512,560,539"></area><area shape="rect" id="node16" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,563,579,589"></area><area shape="rect" id="node17" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,613,570,640"></area><area shape="rect" id="node18" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,664,567,691"></area><area shape="rect" id="node19" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,715,568,741"></area></map> +<area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map> <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> <p><a href="classpp_1_1_resource-members.html">List of all members.</a></p> <h2>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png index 68d3837b4..5fd5ac3 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_resource__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket-members.html index 2484890..4bd8553 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket-members.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket-members.html
@@ -18,6 +18,8 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#ae98c9decb3c3ea4ba1006943577b684d">GetBoundAddress</a>()</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a76a2e93f2fa01d0dce8d8216d53b4f44">IsAvailable</a>()</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td><code> [static]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">JoinGroup</a>(const NetAddress &group, const CompletionCallback callback)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">LeaveGroup</a>(const NetAddress &group, const CompletionCallback callback)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_u_d_p_socket.html#a72112f67b757bbbfaaf67ae3cfe2f602">operator=</a>(const UDPSocket &other)</td><td><a class="el" href="classpp_1_1_u_d_p_socket.html">pp::UDPSocket</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">pp::Resource::operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket.html index e864cb5..84f508f 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_u_d_p_socket.html
@@ -33,6 +33,8 @@ <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a657309cd3bc38cf28e25f4c71190d1a0">SendTo</a> (const char *buffer, int32_t num_bytes, const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &addr, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#aa1f03d8d0e7ef59c40724e2691f165f2">Close</a> ()</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a5ff91fd2342e534b57980c0c2e414251">SetOption</a> (PP_UDPSocket_Option name, const <a class="el" href="classpp_1_1_var.html">Var</a> &value, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">JoinGroup</a> (const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &group, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">LeaveGroup</a> (const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> &group, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> callback)</td></tr> </table><h2> Static Public Member Functions</h2><table class="memberdecls"> <tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_u_d_p_socket.html#a76a2e93f2fa01d0dce8d8216d53b4f44">IsAvailable</a> ()</td></tr> @@ -241,6 +243,76 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>true if the interface is available, false otherwise. </dd></dl> </div> </div> +<a class="anchor" id="a51bdeaeeef690d741850e7d691fa479d"></a><!-- doxytag: member="pp::UDPSocket::JoinGroup" ref="a51bdeaeeef690d741850e7d691fa479d" args="(const NetAddress &group, const CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_u_d_p_socket.html#a51bdeaeeef690d741850e7d691fa479d">pp::UDPSocket::JoinGroup</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> & </td> +<td class="paramname"><em>group</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> </td> +<td class="paramname"><em>callback</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Joins the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a7efaa9eda9e58ffbd5f6b5c5c9e8b38c"></a><!-- doxytag: member="pp::UDPSocket::LeaveGroup" ref="a7efaa9eda9e58ffbd5f6b5c5c9e8b38c" args="(const NetAddress &group, const CompletionCallback callback)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_u_d_p_socket.html#a7efaa9eda9e58ffbd5f6b5c5c9e8b38c">pp::UDPSocket::LeaveGroup</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_net_address.html">NetAddress</a> & </td> +<td class="paramname"><em>group</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> </td> +<td class="paramname"><em>callback</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Leaves the multicast group with address specified by <code>group</code> parameter, which is expected to be a <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> object. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">group</td><td>A <code><a class="el" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address.">NetAddress</a></code> corresponding to the network address of the multicast group. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> <a class="anchor" id="a72112f67b757bbbfaaf67ae3cfe2f602"></a><!-- doxytag: member="pp::UDPSocket::operator=" ref="a72112f67b757bbbfaaf67ae3cfe2f602" args="(const UDPSocket &other)" --> <div class="memitem"> <div class="memproto"> @@ -356,7 +428,7 @@ </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code>pp_errors.h</code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>A non-negative number on success to indicate how many bytes have been sent; otherwise, an error code from <code>pp_errors.h</code>. <code>PP_ERROR_NOACCESS</code> will be returned if the caller doesn't have required permissions. <code>PP_ERROR_INPROGRESS</code> will be returned if the socket is busy sending. The caller should wait until a pending send completes before retrying. </dd></dl> </div> </div> <a class="anchor" id="a5ff91fd2342e534b57980c0c2e414251"></a><!-- doxytag: member="pp::UDPSocket::SetOption" ref="a5ff91fd2342e534b57980c0c2e414251" args="(PP_UDPSocket_Option name, const Var &value, const CompletionCallback &callback)" -->
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder-members.html index f383c8c..68a4c3e 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder-members.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder-members.html
@@ -16,7 +16,7 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366">Flush</a>(const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a">GetPicture</a>(const CompletionCallbackWithOutput< PP_VideoPicture > &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> -<tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">Initialize</a>(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">Initialize</a>(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const CompletionCallback &callback)</td><td><a class="el" href="classpp_1_1_video_decoder.html">pp::VideoDecoder</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder.html index a82fcda6..d05fd0a 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_decoder.html
@@ -24,7 +24,7 @@ <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#afc9613c960f58ff4c97804da4645cd64">VideoDecoder</a> ()</td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a5c7b1010b42e179cf51e55266eb1491a">VideoDecoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a0eec2949dd73ef6d52b6782cee3b427d">VideoDecoder</a> (const <a class="el" href="classpp_1_1_video_decoder.html">VideoDecoder</a> &other)</td></tr> -<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">Initialize</a> (const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">Initialize</a> (const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a2f1a48cf6d2f1854b20e6a747c9b03e3">Decode</a> (uint32_t decode_id, uint32_t size, const void *buffer, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a">GetPicture</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_VideoPicture > &callback)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html#a7b9c4917ebd205572a0fe69a34f1bfd9">RecyclePicture</a> (const PP_VideoPicture &picture)</td></tr> @@ -36,7 +36,7 @@ <p>Typical usage:</p> <ul> <li>Call Create() to create a new video decoder resource.</li> -<li>Call <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> +<li>Call <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8" title="Initializes a video decoder resource.">Initialize()</a> to initialize it with a 3d graphics context and the desired codec profile.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#a2f1a48cf6d2f1854b20e6a747c9b03e3" title="Decodes a bitstream buffer.">Decode()</a> continuously (waiting for each previous call to complete) to push bitstream buffers to the decoder.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> continuously (waiting for each previous call to complete) to pull decoded pictures from the decoder.</li> <li>Call <a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366" title="Flushes the decoder.">Flush()</a> to signal end of stream to the decoder and perform shutdown when it completes.</li> @@ -210,12 +210,12 @@ <dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if the decoder isn't initialized or if a <a class="el" href="classpp_1_1_video_decoder.html#aa05481906b07e929c9567bc22a48917a" title="Resets the decoder as quickly as possible.">Reset()</a> call is pending. Returns PP_ERROR_INPROGRESS if there is another <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> call pending. Returns PP_ERROR_ABORTED when <a class="el" href="classpp_1_1_video_decoder.html#aa05481906b07e929c9567bc22a48917a" title="Resets the decoder as quickly as possible.">Reset()</a> is called, or if a call to <a class="el" href="classpp_1_1_video_decoder.html#adb59ebce58f83b1c27e9c427596fb366" title="Flushes the decoder.">Flush()</a> completes while <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> is pending. </dd></dl> </div> </div> -<a class="anchor" id="a52d1b4e5b5427d3bfb263cdec051274e"></a><!-- doxytag: member="pp::VideoDecoder::Initialize" ref="a52d1b4e5b5427d3bfb263cdec051274e" args="(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, const CompletionCallback &callback)" --> +<a class="anchor" id="a284c6a99f5c3ea83465f7eab81ca4ba8"></a><!-- doxytag: member="pp::VideoDecoder::Initialize" ref="a284c6a99f5c3ea83465f7eab81ca4ba8" args="(const Graphics3D &graphics3d_context, PP_VideoProfile profile, PP_HardwareAcceleration acceleration, uint32_t min_picture_count, const CompletionCallback &callback)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> -<td class="memname">int32_t <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e">pp::VideoDecoder::Initialize</a> </td> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8">pp::VideoDecoder::Initialize</a> </td> <td>(</td> <td class="paramtype">const <a class="el" href="classpp_1_1_graphics3_d.html">Graphics3D</a> & </td> <td class="paramname"><em>graphics3d_context</em>, </td> @@ -235,6 +235,12 @@ <tr> <td class="paramkey"></td> <td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>min_picture_count</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> <td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> <td class="paramname"><em>callback</em> </td> </tr> @@ -253,11 +259,12 @@ <tr><td class="paramdir">[in]</td><td class="paramname">graphics3d_context</td><td>A <code>PPB_Graphics3D</code> resource to use during decoding. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">profile</td><td>A <code>PP_VideoProfile</code> specifying the video codec profile. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">min_picture_count</td><td>A count of pictures the plugin would like to have in flight. This is effectively the number of times the plugin can call <a class="el" href="classpp_1_1_video_decoder.html#aec1a1bc95b8d3eea64b942af48dff02a" title="Gets the next picture from the decoder.">GetPicture()</a> and get a decoded frame without calling <a class="el" href="classpp_1_1_video_decoder.html#a7b9c4917ebd205572a0fe69a34f1bfd9" title="Recycles a picture that the plugin has received from the decoder.">RecyclePicture()</a>. The decoder has its own internal minimum count, and will take the larger of its internal and this value. A client that doesn't care can therefore just pass in zero for this argument. </td></tr> <tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code>PP_CompletionCallback</code> to be called upon completion.</td></tr> </table> </dd> </dl> -<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="classpp_1_1_video_decoder.html#a52d1b4e5b5427d3bfb263cdec051274e" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video decoding is not available, or the requested profile is not supported. In this case, the client may call <a class="el" href="classpp_1_1_video_decoder.html#a284c6a99f5c3ea83465f7eab81ca4ba8" title="Initializes a video decoder resource.">Initialize()</a> again with different parameters to find a good configuration. </dd></dl> </div> </div> <a class="anchor" id="a7b9c4917ebd205572a0fe69a34f1bfd9"></a><!-- doxytag: member="pp::VideoDecoder::RecyclePicture" ref="a7b9c4917ebd205572a0fe69a34f1bfd9" args="(const PP_VideoPicture &picture)" -->
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder-members.html new file mode 100644 index 0000000..1f9a454 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder-members.html
@@ -0,0 +1,40 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>Member List</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +This is the complete list of members for <a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a>, including all inherited members.<table> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ad4016f37d3022863ca0188acb26ac9c4">Clear</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">Close</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a81b9246381bdddacca3ac25f6ded2bfd">detach</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">Encode</a>(const VideoFrame &video_frame, bool force_keyframe, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">GetBitstreamBuffer</a>(const CompletionCallbackWithOutput< PP_BitstreamBuffer > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">GetFrameCodedSize</a>(Size *coded_size)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">GetFramesRequired</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">GetSupportedProfiles</a>(const CompletionCallbackWithOutput< std::vector< PP_VideoProfileDescription > > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">GetVideoFrame</a>(const CompletionCallbackWithOutput< VideoFrame > &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">Initialize</a>(const PP_VideoFrame_Format &input_format, const Size &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9">is_null</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#aaf808a98bdaa7998d82e19514aa87423">operator=</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a3eda014529127a818df8d5bb5ec2fdf0">PassRefFromConstructor</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a46a6123de0b007ad3fcb6f666534ccb4">pp_resource</a>() const </td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [inline]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">RecycleBitstreamBuffer</a>(const PP_BitstreamBuffer &bitstream_buffer)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">RequestEncodingParametersChange</a>(uint32_t bitrate, uint32_t framerate)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a56679e93a58101c8dce5dc510811a094">Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#ab0f664099ca06367180f220ea7e0b831">Resource</a>(const Resource &other)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">VideoEncoder</a>()</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#a479c6cbd73b497c98871d877ef9e0b29">VideoEncoder</a>(const InstanceHandle &instance)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td><code> [explicit]</code></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_video_encoder.html#ad9d09d444a0480153aa5086fda13f064">VideoEncoder</a>(const VideoEncoder &other)</td><td><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> +</table></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder.html new file mode 100644 index 0000000..c653949 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder.html
@@ -0,0 +1,418 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>pp::VideoEncoder Class Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + + +</div> +<!--header--> +<div class="contents"> +<!-- doxytag: class="pp::VideoEncoder" --><!-- doxytag: inherits="pp::Resource" --><div class="dynheader"> +Inheritance diagram for pp::VideoEncoder:</div> +<div class="dyncontent"> +<div class="center"><img src="classpp_1_1_video_encoder__inherit__graph.png" border="0" usemap="#pp_1_1_video_encoder_inherit__map" alt="Inheritance graph" /></div> +<map name="pp_1_1_video_encoder_inherit__map" id="pp_1_1_video_encoder_inherit__map"> +<area shape="rect" id="node2" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="20,5,124,32"></area></map> +<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div> +<p><a href="classpp_1_1_video_encoder-members.html">List of all members.</a></p> +<h2> +Public Member Functions</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">VideoEncoder</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a479c6cbd73b497c98871d877ef9e0b29">VideoEncoder</a> (const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> &instance)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ad9d09d444a0480153aa5086fda13f064">VideoEncoder</a> (const <a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a> &other)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">GetSupportedProfiles</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_VideoProfileDescription > > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">Initialize</a> (const PP_VideoFrame_Format &input_format, const <a class="el" href="classpp_1_1_size.html">Size</a> &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">GetFramesRequired</a> ()</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">GetFrameCodedSize</a> (<a class="el" href="classpp_1_1_size.html">Size</a> *coded_size)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">GetVideoFrame</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">Encode</a> (const <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> &video_frame, bool force_keyframe, const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">GetBitstreamBuffer</a> (const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_BitstreamBuffer > &cc)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">RecycleBitstreamBuffer</a> (const PP_BitstreamBuffer &bitstream_buffer)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">RequestEncodingParametersChange</a> (uint32_t bitrate, uint32_t framerate)</td></tr> +<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">Close</a> ()</td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>Video encoder interface. </p> +<p>Typical usage:</p> +<ul> +<li>Call Create() to create a new video encoder resource.</li> +<li>Call GetSupportedFormats() to determine which codecs and profiles are available.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> to initialize the encoder for a supported profile.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2" title="Gets a blank video frame which can be filled with video data and passed to the encoder.">GetVideoFrame()</a> to get a blank frame and fill it in, or get a video frame from another resource, e.g. <code>PPB_MediaStreamVideoTrack</code>.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd" title="Encodes a video frame.">Encode()</a> to push the video frame to the encoder. If an external frame is pushed, wait for completion to recycle the frame.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> continuously (waiting for each previous call to complete) to pull encoded pictures from the encoder.</li> +<li>Call <a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895" title="Recycles a bitstream buffer back to the encoder.">RecycleBitstreamBuffer()</a> after consuming the data in the bitstream buffer.</li> +<li>To destroy the encoder, the plugin should release all of its references to it. Any pending callbacks will abort before the encoder is destroyed.</li> +</ul> +<p>Available video codecs vary by platform. All: vp8 (software). ChromeOS, depending on your device: h264 (hardware), vp8 (hardware) </p> +</div><hr /><h2>Constructor & Destructor Documentation</h2> +<a class="anchor" id="a6a84b977ee05e00bb2c00519d1893d08"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="a6a84b977ee05e00bb2c00519d1893d08" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Default constructor for creating an <a class="el" href="classpp_1_1_resource.html#a859068e34cdc2dc0b78754c255323aa9" title="This functions determines if this resource is invalid or uninitialized.">is_null()</a> <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code> object. </p> +</div> +</div> +<a class="anchor" id="a479c6cbd73b497c98871d877ef9e0b29"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="a479c6cbd73b497c98871d877ef9e0b29" args="(const InstanceHandle &instance)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_instance_handle.html">InstanceHandle</a> & </td> +<td class="paramname"><em>instance</em></td><td>)</td> +<td><code> [explicit]</code></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>A constructor used to create a <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code> and associate it with the provided <code><a class="el" href="classpp_1_1_instance.html">Instance</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">instance</td><td>The instance with which this resource will be associated. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="ad9d09d444a0480153aa5086fda13f064"></a><!-- doxytag: member="pp::VideoEncoder::VideoEncoder" ref="ad9d09d444a0480153aa5086fda13f064" args="(const VideoEncoder &other)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname"><a class="el" href="classpp_1_1_video_encoder.html#a6a84b977ee05e00bb2c00519d1893d08">pp::VideoEncoder::VideoEncoder</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a> & </td> +<td class="paramname"><em>other</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>The copy constructor for <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code>. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">other</td><td>A reference to a <code><a class="el" href="classpp_1_1_video_encoder.html" title="Video encoder interface.">VideoEncoder</a></code>. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr /><h2>Member Function Documentation</h2> +<a class="anchor" id="a411036495143eb6484b668e2d26c1170"></a><!-- doxytag: member="pp::VideoEncoder::Close" ref="a411036495143eb6484b668e2d26c1170" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170">pp::VideoEncoder::Close</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Closes the video encoder, and cancels any pending encodes. </p> +<p>Any pending callbacks will still run, reporting <code>PP_ERROR_ABORTED</code> . It is not valid to call any encoder functions after a call to this method. <b>Note:</b> Destroying the video encoder closes it implicitly, so you are not required to call <a class="el" href="classpp_1_1_video_encoder.html#a411036495143eb6484b668e2d26c1170" title="Closes the video encoder, and cancels any pending encodes.">Close()</a>. </p> +</div> +</div> +<a class="anchor" id="a39755b4e3aee295d8ba509da9904e5cd"></a><!-- doxytag: member="pp::VideoEncoder::Encode" ref="a39755b4e3aee295d8ba509da9904e5cd" args="(const VideoFrame &video_frame, bool force_keyframe, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a39755b4e3aee295d8ba509da9904e5cd">pp::VideoEncoder::Encode</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> & </td> +<td class="paramname"><em>video_frame</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">bool </td> +<td class="paramname"><em>force_keyframe</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Encodes a video frame. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">video_frame</td><td>The <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> to be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">force_keyframe</td><td>A <code>PP_Bool> specifying whether the encoder should emit a key frame for this video frame. </code></td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td><code>A </code><code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion. Plugins that pass <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> resources owned by other resources should wait for completion before reusing them.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd><code> An int32_t containing an error code from </code><code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a9c0861d91f7c93cb15cf917ca6d6cf95"></a><!-- doxytag: member="pp::VideoEncoder::GetBitstreamBuffer" ref="a9c0861d91f7c93cb15cf917ca6d6cf95" args="(const CompletionCallbackWithOutput< PP_BitstreamBuffer > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95">pp::VideoEncoder::GetBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< PP_BitstreamBuffer > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the next encoded bitstream buffer from the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[out]</td><td class="paramname">bitstream_buffer</td><td>A <code>PP_BitstreamBuffer</code> containing encoded video data. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the next bitstream buffer. The plugin can call GetBitstreamBuffer from the callback in order to continuously "pull" bitstream buffers from the encoder.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. Returns PP_ERROR_INPROGRESS if a prior call to <a class="el" href="classpp_1_1_video_encoder.html#a9c0861d91f7c93cb15cf917ca6d6cf95" title="Gets the next encoded bitstream buffer from the encoder.">GetBitstreamBuffer()</a> has not completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a2112ec6caf60385c1625b85e3697d777"></a><!-- doxytag: member="pp::VideoEncoder::GetFrameCodedSize" ref="a2112ec6caf60385c1625b85e3697d777" args="(Size *coded_size)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a2112ec6caf60385c1625b85e3697d777">pp::VideoEncoder::GetFrameCodedSize</a> </td> +<td>(</td> +<td class="paramtype"><a class="el" href="classpp_1_1_size.html">Size</a> * </td> +<td class="paramname"><em>coded_size</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the coded size of the video frames required by the encoder. </p> +<p>Coded size is the logical size of the input frames, in pixels. The encoder may have hardware alignment requirements that make this different from |input_visible_size|, as requested in the call to <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">coded_size</td><td>A <code><a class="el" href="classpp_1_1_size.html" title="A size of an object based on width and height.">Size</a></code> to hold the coded size.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing a result code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="ae673a5ebfed4fc3198a405cccecfbe54"></a><!-- doxytag: member="pp::VideoEncoder::GetFramesRequired" ref="ae673a5ebfed4fc3198a405cccecfbe54" args="()" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#ae673a5ebfed4fc3198a405cccecfbe54">pp::VideoEncoder::GetFramesRequired</a> </td> +<td>(</td> +<td class="paramname"></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets the number of input video frames that the encoder may hold while encoding. </p> +<p>If the plugin is providing the video frames, it should have at least this many available.</p> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing the number of frames required, or an error code from <code>pp_errors.h</code>. Returns PP_ERROR_FAILED if <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a> has not successfully completed. </dd></dl> +</div> +</div> +<a class="anchor" id="a5c264d3b6ec0a5970cc1dee74dbfaf55"></a><!-- doxytag: member="pp::VideoEncoder::GetSupportedProfiles" ref="a5c264d3b6ec0a5970cc1dee74dbfaf55" args="(const CompletionCallbackWithOutput< std::vector< PP_VideoProfileDescription > > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55">pp::VideoEncoder::GetSupportedProfiles</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< std::vector< PP_VideoProfileDescription > > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets an array of supported video encoder profiles. </p> +<p>These can be used to choose a profile before calling <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7" title="Initializes a video encoder resource.">Initialize()</a>.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the PP_VideoProfileDescription structs.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>If >= 0, the number of supported profiles returned, otherwise an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="a5c5fabe6a00afe6b8849bbc612183bb2"></a><!-- doxytag: member="pp::VideoEncoder::GetVideoFrame" ref="a5c5fabe6a00afe6b8849bbc612183bb2" args="(const CompletionCallbackWithOutput< VideoFrame > &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#a5c5fabe6a00afe6b8849bbc612183bb2">pp::VideoEncoder::GetVideoFrame</a> </td> +<td>(</td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a>< <a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a> > & </td> +<td class="paramname"><em>cc</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Gets a blank video frame which can be filled with video data and passed to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback_with_output.html" title="A CompletionCallbackWithOutput defines a completion callback that additionally stores a pointer to so...">CompletionCallbackWithOutput</a></code> to be called upon completion with the blank <code><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></code> resource.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. </dd></dl> +</div> +</div> +<a class="anchor" id="ad2c47c10cfe92a3bf41e204d326560c7"></a><!-- doxytag: member="pp::VideoEncoder::Initialize" ref="ad2c47c10cfe92a3bf41e204d326560c7" args="(const PP_VideoFrame_Format &input_format, const Size &input_visible_size, const PP_VideoProfile &output_profile, const uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const CompletionCallback &cc)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">int32_t <a class="el" href="classpp_1_1_video_encoder.html#ad2c47c10cfe92a3bf41e204d326560c7">pp::VideoEncoder::Initialize</a> </td> +<td>(</td> +<td class="paramtype">const PP_VideoFrame_Format & </td> +<td class="paramname"><em>input_format</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_size.html">Size</a> & </td> +<td class="paramname"><em>input_visible_size</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const PP_VideoProfile & </td> +<td class="paramname"><em>output_profile</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const uint32_t </td> +<td class="paramname"><em>initial_bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">PP_HardwareAcceleration </td> +<td class="paramname"><em>acceleration</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">const <a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a> & </td> +<td class="paramname"><em>cc</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Initializes a video encoder resource. </p> +<p>This should be called after <a class="el" href="classpp_1_1_video_encoder.html#a5c264d3b6ec0a5970cc1dee74dbfaf55" title="Gets an array of supported video encoder profiles.">GetSupportedProfiles()</a> and before any functions below.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">input_format</td><td>The <code>PP_VideoFrame_Format</code> of the frames which will be encoded. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">input_visible_size</td><td>A <code><a class="el" href="classpp_1_1_size.html" title="A size of an object based on width and height.">Size</a></code> specifying the dimensions of the visible part of the input frames. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">output_profile</td><td>A <code>PP_VideoProfile</code> specifying the codec profile of the encoded output stream. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">acceleration</td><td>A <code>PP_HardwareAcceleration</code> specifying whether to use a hardware accelerated or a software implementation. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">callback</td><td>A <code><a class="el" href="classpp_1_1_completion_callback.html" title="This API enables you to implement and receive callbacks when Pepper operations complete asynchronousl...">CompletionCallback</a></code> to be called upon completion.</td></tr> +</table> +</dd> +</dl> +<dl class="return"><dt><b>Returns:</b></dt><dd>An int32_t containing an error code from <code>pp_errors.h</code>. Returns PP_ERROR_NOTSUPPORTED if video encoding is not available, or the requested codec profile is not supported. Returns PP_ERROR_NOMEMORY if frame and bitstream buffers can't be created. </dd></dl> +</div> +</div> +<a class="anchor" id="a81aec23c26a3f9c16ff90efdc38b2895"></a><!-- doxytag: member="pp::VideoEncoder::RecycleBitstreamBuffer" ref="a81aec23c26a3f9c16ff90efdc38b2895" args="(const PP_BitstreamBuffer &bitstream_buffer)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a81aec23c26a3f9c16ff90efdc38b2895">pp::VideoEncoder::RecycleBitstreamBuffer</a> </td> +<td>(</td> +<td class="paramtype">const PP_BitstreamBuffer & </td> +<td class="paramname"><em>bitstream_buffer</em></td><td>)</td> +<td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Recycles a bitstream buffer back to the encoder. </p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitstream_buffer</td><td>A <code>PP_BitstreamBuffer</code> that is no longer needed by the plugin. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<a class="anchor" id="a727159fe366c6ce146dce4c42a608fd7"></a><!-- doxytag: member="pp::VideoEncoder::RequestEncodingParametersChange" ref="a727159fe366c6ce146dce4c42a608fd7" args="(uint32_t bitrate, uint32_t framerate)" --> +<div class="memitem"> +<div class="memproto"> +<table class="memname"> +<tr> +<td class="memname">void <a class="el" href="classpp_1_1_video_encoder.html#a727159fe366c6ce146dce4c42a608fd7">pp::VideoEncoder::RequestEncodingParametersChange</a> </td> +<td>(</td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>bitrate</em>, </td> +</tr> +<tr> +<td class="paramkey"></td> +<td></td> +<td class="paramtype">uint32_t </td> +<td class="paramname"><em>framerate</em> </td> +</tr> +<tr> +<td></td> +<td>)</td> +<td></td><td></td> +</tr> +</table> +</div> +<div class="memdoc"> +<p>Requests a change to encoding parameters. </p> +<p>This is only a request, fulfilled on a best-effort basis.</p> +<dl class="params"><dt><b>Parameters:</b></dt><dd> +<table class="params"> +<tr><td class="paramdir">[in]</td><td class="paramname">bitrate</td><td>The requested new bitrate, in bits per second. </td></tr> +<tr><td class="paramdir">[in]</td><td class="paramname">framerate</td><td>The requested new framerate, in frames per second. </td></tr> +</table> +</dd> +</dl> +</div> +</div> +<hr />The documentation for this class was generated from the following file:<ul> +<li><a class="el" href="video__encoder_8h.html">video_encoder.h</a></li> +</ul> +</div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder__inherit__graph.png b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder__inherit__graph.png new file mode 100644 index 0000000..14d3b23 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_video_encoder__inherit__graph.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view-members.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view-members.html index faae169..a080677 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view-members.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view-members.html
@@ -30,7 +30,7 @@ <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a555de93fdf4793f7db1183bf71d20580">Resource</a>(PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [explicit, protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a907d3d6b7e292587c8cb9ff30d0a418d">Resource</a>(PassRef, PP_Resource resource)</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [protected]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#aebcd4ab8818a6e1dfe68e2c435823ad9">View</a>()</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td></td></tr> -<tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#a89cc79b6731f0e67d0821fe83b3e64fb">View</a>(PP_Resource view_resource)</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td></td></tr> +<tr class="memlist"><td><a class="el" href="classpp_1_1_view.html#a89cc79b6731f0e67d0821fe83b3e64fb">View</a>(PP_Resource view_resource)</td><td><a class="el" href="classpp_1_1_view.html">pp::View</a></td><td><code> [explicit]</code></td></tr> <tr class="memlist"><td><a class="el" href="classpp_1_1_resource.html#a081165265e2bd8217eaa2be2aeeb3aa3">~Resource</a>()</td><td><a class="el" href="classpp_1_1_resource.html">pp::Resource</a></td><td><code> [virtual]</code></td></tr> </table></div><!-- contents --> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view.html b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view.html index a415406..7f23b4d 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/classpp_1_1_view.html
@@ -60,7 +60,7 @@ <td>(</td> <td class="paramtype">PP_Resource </td> <td class="paramname"><em>view_resource</em></td><td>)</td> -<td></td> +<td><code> [explicit]</code></td> </tr> </table> </div>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png b/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png index 6aebbb2..056cffd 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/inherit_graph_23.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html b/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html index 150ad2b..f1a43a2c 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/inherits.html
@@ -106,7 +106,7 @@ </td></tr> <tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#pp_1_1_resource" /> <map name="pp_1_1_resource" id="pp_1_1_resource"> -<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,689,109,716"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,157,317,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,208,335,235"></area><area shape="rect" id="node7" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,259,297,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,309,300,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,360,315,387"></area><area shape="rect" id="node10" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,411,317,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,512,322,539"></area><area shape="rect" id="node13" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,563,316,589"></area><area shape="rect" id="node14" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,613,315,640"></area><area shape="rect" id="node20" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,664,357,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,765,325,792"></area><area shape="rect" id="node23" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,816,318,843"></area><area shape="rect" id="node24" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,867,317,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,917,331,944"></area><area shape="rect" id="node26" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,968,314,995"></area><area shape="rect" id="node27" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1019,317,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1069,315,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1120,330,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1171,335,1197"></area><area shape="rect" id="node31" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1221,325,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1272,319,1299"></area><area shape="rect" id="node33" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1323,295,1349"></area><area shape="rect" id="node34" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1373,315,1400"></area><area shape="rect" id="node15" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,512,560,539"></area><area shape="rect" id="node16" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,563,579,589"></area><area shape="rect" id="node17" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,613,570,640"></area><area shape="rect" id="node18" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,664,567,691"></area><area shape="rect" id="node19" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,715,568,741"></area></map> +<area shape="rect" id="node1" href="classpp_1_1_resource.html" title="A reference counted module resource." alt="" coords="5,740,109,767"></area><area shape="rect" id="node2" href="classpp_1_1_audio.html" title="An audio resource." alt="" coords="216,5,299,32"></area><area shape="rect" id="node3" href="classpp_1_1_audio_buffer.html" title="pp::AudioBuffer" alt="" coords="197,56,317,83"></area><area shape="rect" id="node4" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource." alt="" coords="196,107,319,133"></area><area shape="rect" id="node5" href="classpp_1_1_audio_encoder.html" title="Audio encoder interface." alt="" coords="190,157,325,184"></area><area shape="rect" id="node6" href="classpp_1_1_compositor.html" title="The Compositor interface is used for setting CompositorLayer layers to the Chromium compositor for co..." alt="" coords="197,208,317,235"></area><area shape="rect" id="node7" href="classpp_1_1_compositor_layer.html" title="pp::CompositorLayer" alt="" coords="180,259,335,285"></area><area shape="rect" id="node8" href="classpp_1_1_file_i_o.html" title="The FileIO class represents a regular file." alt="" coords="218,309,297,336"></area><area shape="rect" id="node9" href="classpp_1_1_file_ref.html" title='The FileRef class represents a "weak pointer" to a file in a file system.' alt="" coords="215,360,300,387"></area><area shape="rect" id="node10" href="classpp_1_1_file_system.html" title="The FileSystem class identifies the file system type associated with a file." alt="" coords="200,411,315,437"></area><area shape="rect" id="node11" href="classpp_1_1_graphics2_d.html" title="pp::Graphics2D" alt="" coords="197,461,317,488"></area><area shape="rect" id="node12" href="classpp_1_1_graphics3_d.html" title="This class represents a 3D rendering context in the browser." alt="" coords="197,512,317,539"></area><area shape="rect" id="node13" href="classpp_1_1_host_resolver.html" title="The HostResolver class supports host name resolution." alt="" coords="193,563,322,589"></area><area shape="rect" id="node14" href="classpp_1_1_image_data.html" title="pp::ImageData" alt="" coords="199,613,316,640"></area><area shape="rect" id="node15" href="classpp_1_1_input_event.html" title="This class represents an input event resource." alt="" coords="200,664,315,691"></area><area shape="rect" id="node21" href="classpp_1_1_media_stream_audio_track.html" title="The MediaStreamAudioTrack class contains methods for receiving audio buffers from a MediaStream audio..." alt="" coords="157,715,357,741"></area><area shape="rect" id="node22" href="classpp_1_1_media_stream_video_track.html" title="The MediaStreamVideoTrack class contains methods for receiving video frames from a MediaStream video ..." alt="" coords="157,765,357,792"></area><area shape="rect" id="node23" href="classpp_1_1_message_loop.html" title="A message loop allows PPAPI calls to be issued on a thread." alt="" coords="190,816,325,843"></area><area shape="rect" id="node24" href="classpp_1_1_net_address.html" title="The NetAddress class represents a network address." alt="" coords="197,867,318,893"></area><area shape="rect" id="node25" href="classpp_1_1_network_list.html" title="pp::NetworkList" alt="" coords="197,917,317,944"></area><area shape="rect" id="node26" href="classpp_1_1_network_monitor.html" title="pp::NetworkMonitor" alt="" coords="184,968,331,995"></area><area shape="rect" id="node27" href="classpp_1_1_t_c_p_socket.html" title="The TCPSocket class provides TCP socket operations." alt="" coords="201,1019,314,1045"></area><area shape="rect" id="node28" href="classpp_1_1_u_d_p_socket.html" title="The UDPSocket class provides UDP socket operations." alt="" coords="198,1069,317,1096"></area><area shape="rect" id="node29" href="classpp_1_1_u_r_l_loader.html" title="URLLoader provides an API for loading URLs." alt="" coords="200,1120,315,1147"></area><area shape="rect" id="node30" href="classpp_1_1_u_r_l_request_info.html" title="URLRequestInfo provides an API for creating and manipulating URL requests." alt="" coords="185,1171,330,1197"></area><area shape="rect" id="node31" href="classpp_1_1_u_r_l_response_info.html" title="URLResponseInfo provides an API for examining URL responses." alt="" coords="180,1221,335,1248"></area><area shape="rect" id="node32" href="classpp_1_1_video_decoder.html" title="Video decoder interface." alt="" coords="189,1272,325,1299"></area><area shape="rect" id="node33" href="classpp_1_1_video_encoder.html" title="Video encoder interface." alt="" coords="190,1323,325,1349"></area><area shape="rect" id="node34" href="classpp_1_1_video_frame.html" title="pp::VideoFrame" alt="" coords="196,1373,319,1400"></area><area shape="rect" id="node35" href="classpp_1_1_view.html" title="This class represents the state of the view for an instance and contains functions for retrieving the..." alt="" coords="220,1424,295,1451"></area><area shape="rect" id="node36" href="classpp_1_1_web_socket.html" title="The WebSocket class providing bi-directional, full-duplex, communications over a single TCP socket..." alt="" coords="199,1475,315,1501"></area><area shape="rect" id="node16" href="classpp_1_1_i_m_e_input_event.html" title="pp::IMEInputEvent" alt="" coords="424,563,560,589"></area><area shape="rect" id="node17" href="classpp_1_1_keyboard_input_event.html" title="pp::KeyboardInputEvent" alt="" coords="405,613,579,640"></area><area shape="rect" id="node18" href="classpp_1_1_mouse_input_event.html" title="This class handles mouse events." alt="" coords="414,664,570,691"></area><area shape="rect" id="node19" href="classpp_1_1_touch_input_event.html" title="pp::TouchInputEvent" alt="" coords="417,715,567,741"></area><area shape="rect" id="node20" href="classpp_1_1_wheel_input_event.html" title="pp::WheelInputEvent" alt="" coords="416,765,568,792"></area></map> </td></tr> <tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#pp_1_1_size" /> <map name="pp_1_1_size" id="pp_1_1_size">
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html b/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html index d04f649..e888367 100644 --- a/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/namespacepp.html
@@ -20,6 +20,8 @@ <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_buffer.html">AudioBuffer</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_config.html">AudioConfig</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">A 16 bit stereo <a class="el" href="classpp_1_1_audio_config.html" title="A 16 bit stereo AudioConfig resource.">AudioConfig</a> resource. <a href="classpp_1_1_audio_config.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_audio_encoder.html">AudioEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="classpp_1_1_audio.html" title="An audio resource.">Audio</a> encoder interface. <a href="classpp_1_1_audio_encoder.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback.html">CompletionCallback</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">This API enables you to implement and receive callbacks when Pepper operations complete asynchronously. <a href="classpp_1_1_completion_callback.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_completion_callback_with_output.html">CompletionCallbackWithOutput</a></td></tr> @@ -112,6 +114,8 @@ <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_var_dictionary.html">VarDictionary</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_decoder.html">VideoDecoder</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Video decoder interface. <a href="classpp_1_1_video_decoder.html#details">More...</a><br /></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html">VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="classpp_1_1_video_encoder.html#details">More...</a><br /></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_frame.html">VideoFrame</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_view.html">View</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">This class represents the state of the view for an instance and contains functions for retrieving the current state of that view. <a href="classpp_1_1_view.html#details">More...</a><br /></td></tr>
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/video__encoder_8h.html b/native_client_sdk/doc_generated/pepper_stable/cpp/video__encoder_8h.html new file mode 100644 index 0000000..2de4073 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/video__encoder_8h.html
@@ -0,0 +1,32 @@ +{{+bindTo:partials.standard_nacl_api}} +<h1>video_encoder.h File Reference</h1> +<div id="doxygen-ref"> +{{- dummy div to appease doxygen -}} + <div> +<!-- Generated by Doxygen 1.7.6.1 --> + + +</div> +<!--header--> +<div class="contents"> +<div class="textblock"><div class="dynheader"> +Include dependency graph for video_encoder.h:</div> +<div class="dyncontent"> +<div class="center"><img src="video__encoder_8h__incl.png" border="0" usemap="#video__encoder_8h" alt="" /></div> +<map name="video__encoder_8h" id="video__encoder_8h"> +</map> +</div> +</div><h2> +Classes</h2><table class="memberdecls"> + +<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classpp_1_1_video_encoder.html">pp::VideoEncoder</a></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Video encoder interface. <a href="classpp_1_1_video_encoder.html#details">More...</a><br /></td></tr> +</table><h2> +Namespaces</h2><table class="memberdecls"> +<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepp.html">pp</a></td></tr> +</table> +<hr /><a name="details" id="details"></a><h2>Detailed Description</h2> +<div class="textblock"><p>This file defines the API to create and use a VideoEncoder resource. </p> +</div></div><!-- contents --> +</div> +{{/partials.standard_nacl_api}}
diff --git a/native_client_sdk/doc_generated/pepper_stable/cpp/video__encoder_8h__incl.png b/native_client_sdk/doc_generated/pepper_stable/cpp/video__encoder_8h__incl.png new file mode 100644 index 0000000..553cbab9 --- /dev/null +++ b/native_client_sdk/doc_generated/pepper_stable/cpp/video__encoder_8h__incl.png Binary files differ
diff --git a/native_client_sdk/doc_generated/pepper_stable/index.html b/native_client_sdk/doc_generated/pepper_stable/index.html index c25f5c0b..305070b 100644 --- a/native_client_sdk/doc_generated/pepper_stable/index.html +++ b/native_client_sdk/doc_generated/pepper_stable/index.html
@@ -2,8 +2,8 @@ <section id="pepper-api-reference-stable"> <h1 id="pepper-api-reference-stable">Pepper API Reference (Stable)</h1> -<p>This page lists the API for Pepper 40. Apps that use this API can -run in Chrome 40 or higher.</p> +<p>This page lists the API for Pepper 47. Apps that use this API can +run in Chrome 47 or higher.</p> <h2 id="pepper-c-api-reference"><a class="reference internal" href="/native-client/c-api.html#pepper-stable-c-index"><em>Pepper C API Reference</em></a></h2> <h2 id="id1"><a class="reference internal" href="/native-client/cpp-api.html#pepper-stable-cpp-index"><em>Pepper C++ API Reference</em></a></h2> </section>
diff --git a/native_client_sdk/doc_generated/sdk/download.html b/native_client_sdk/doc_generated/sdk/download.html index e2380da2..6052da14 100644 --- a/native_client_sdk/doc_generated/sdk/download.html +++ b/native_client_sdk/doc_generated/sdk/download.html
@@ -116,7 +116,6 @@ pepper_36 (beta) pepper_37 (dev) pepper_canary (canary) - bionic_canary (canary) </pre> <p>The sample output above shows that several bundles are available for download, and that you have already installed the latest revision of the @@ -178,7 +177,6 @@ pepper_36 (beta) pepper_37 (dev) pepper_canary (canary) - bionic_canary (canary) </pre> <p>If you run <code>naclsdk update</code> now, it warns you with a message similar to this:</p>
diff --git a/native_client_sdk/src/doc/c-api-beta.rst b/native_client_sdk/src/doc/c-api-beta.rst index cf32ab7..0cb54d4 100644 --- a/native_client_sdk/src/doc/c-api-beta.rst +++ b/native_client_sdk/src/doc/c-api-beta.rst
@@ -7,8 +7,8 @@ Pepper C API Reference (Beta) ########################################## -This page lists the C API for Pepper 41. Apps that use this API can -run in Chrome 41 or higher. +This page lists the C API for Pepper 48. Apps that use this API can +run in Chrome 48 or higher. `Interfaces <pepper_beta/c/group___interfaces.html>`__ ============================================================= @@ -18,6 +18,8 @@ * `PPB_AudioConfig <pepper_beta/c/struct_p_p_b___audio_config__1__1.html>`__ + * `PPB_AudioEncoder <pepper_beta/c/struct_p_p_b___audio_encoder__0__1.html>`__ + * `PPB_Compositor <pepper_beta/c/struct_p_p_b___compositor__0__1.html>`__ * `PPB_CompositorLayer <pepper_beta/c/struct_p_p_b___compositor_layer__0__2.html>`__ @@ -28,8 +30,6 @@ * `PPB_FileIO <pepper_beta/c/struct_p_p_b___file_i_o__1__1.html>`__ - * `PPB_FileMapping <pepper_beta/c/struct_p_p_b___file_mapping__0__1.html>`__ - * `PPB_FileRef <pepper_beta/c/struct_p_p_b___file_ref__1__2.html>`__ * `PPB_FileSystem <pepper_beta/c/struct_p_p_b___file_system__1__0.html>`__ @@ -114,7 +114,7 @@ * `PPB_TouchInputEvent <pepper_beta/c/struct_p_p_b___touch_input_event__1__0.html>`__ - * `PPB_UDPSocket <pepper_beta/c/struct_p_p_b___u_d_p_socket__1__1.html>`__ + * `PPB_UDPSocket <pepper_beta/c/struct_p_p_b___u_d_p_socket__1__2.html>`__ * `PPB_URLLoader <pepper_beta/c/struct_p_p_b___u_r_l_loader__1__0.html>`__ @@ -130,7 +130,9 @@ * `PPB_VarDictionary <pepper_beta/c/struct_p_p_b___var_dictionary__1__0.html>`__ - * `PPB_VideoDecoder <pepper_beta/c/struct_p_p_b___video_decoder__1__0.html>`__ + * `PPB_VideoDecoder <pepper_beta/c/struct_p_p_b___video_decoder__1__1.html>`__ + + * `PPB_VideoEncoder <pepper_beta/c/struct_p_p_b___video_encoder__0__2.html>`__ * `PPB_VideoFrame <pepper_beta/c/struct_p_p_b___video_frame__0__1.html>`__ @@ -157,6 +159,12 @@ ========================================================== * `PP_ArrayOutput <pepper_beta/c/struct_p_p___array_output.html>`__ + * `PP_AudioBitstreamBuffer <pepper_beta/c/struct_p_p___audio_bitstream_buffer.html>`__ + + * `PP_AudioProfileDescription <pepper_beta/c/struct_p_p___audio_profile_description.html>`__ + + * `PP_BitstreamBuffer <pepper_beta/c/struct_p_p___bitstream_buffer.html>`__ + * `PP_CompletionCallback <pepper_beta/c/struct_p_p___completion_callback.html>`__ * `PP_DirectoryEntry <pepper_beta/c/struct_p_p___directory_entry.html>`__ @@ -203,6 +211,10 @@ * `PP_VideoPicture <pepper_beta/c/struct_p_p___video_picture__0__1.html>`__ + * `PP_VideoProfileDescription <pepper_beta/c/struct_p_p___video_profile_description.html>`__ + + * `PP_VideoProfileDescription <pepper_beta/c/struct_p_p___video_profile_description__0__1.html>`__ + * `PP_VarValue <pepper_beta/c/union_p_p___var_value.html>`__ @@ -266,6 +278,8 @@ * `ppb_audio_config.h <pepper_beta/c/ppb__audio__config_8h.html>`__ + * `ppb_audio_encoder.h <pepper_beta/c/ppb__audio__encoder_8h.html>`__ + * `ppb_compositor.h <pepper_beta/c/ppb__compositor_8h.html>`__ * `ppb_compositor_layer.h <pepper_beta/c/ppb__compositor__layer_8h.html>`__ @@ -276,8 +290,6 @@ * `ppb_file_io.h <pepper_beta/c/ppb__file__io_8h.html>`__ - * `ppb_file_mapping.h <pepper_beta/c/ppb__file__mapping_8h.html>`__ - * `ppb_file_ref.h <pepper_beta/c/ppb__file__ref_8h.html>`__ * `ppb_file_system.h <pepper_beta/c/ppb__file__system_8h.html>`__ @@ -342,6 +354,8 @@ * `ppb_video_decoder.h <pepper_beta/c/ppb__video__decoder_8h.html>`__ + * `ppb_video_encoder.h <pepper_beta/c/ppb__video__encoder_8h.html>`__ + * `ppb_video_frame.h <pepper_beta/c/ppb__video__frame_8h.html>`__ * `ppb_view.h <pepper_beta/c/ppb__view_8h.html>`__
diff --git a/native_client_sdk/src/doc/c-api-dev.rst b/native_client_sdk/src/doc/c-api-dev.rst index 41f5886..b37509e 100644 --- a/native_client_sdk/src/doc/c-api-dev.rst +++ b/native_client_sdk/src/doc/c-api-dev.rst
@@ -7,8 +7,8 @@ Pepper C API Reference (Dev) ########################################## -This page lists the C API for Pepper 42. Apps that use this API can -run in Chrome 42 or higher. +This page lists the C API for Pepper 49. Apps that use this API can +run in Chrome 49 or higher. `Interfaces <pepper_dev/c/group___interfaces.html>`__ ============================================================= @@ -18,6 +18,8 @@ * `PPB_AudioConfig <pepper_dev/c/struct_p_p_b___audio_config__1__1.html>`__ + * `PPB_AudioEncoder <pepper_dev/c/struct_p_p_b___audio_encoder__0__1.html>`__ + * `PPB_Compositor <pepper_dev/c/struct_p_p_b___compositor__0__1.html>`__ * `PPB_CompositorLayer <pepper_dev/c/struct_p_p_b___compositor_layer__0__2.html>`__ @@ -28,8 +30,6 @@ * `PPB_FileIO <pepper_dev/c/struct_p_p_b___file_i_o__1__1.html>`__ - * `PPB_FileMapping <pepper_dev/c/struct_p_p_b___file_mapping__0__1.html>`__ - * `PPB_FileRef <pepper_dev/c/struct_p_p_b___file_ref__1__2.html>`__ * `PPB_FileSystem <pepper_dev/c/struct_p_p_b___file_system__1__0.html>`__ @@ -114,7 +114,7 @@ * `PPB_TouchInputEvent <pepper_dev/c/struct_p_p_b___touch_input_event__1__0.html>`__ - * `PPB_UDPSocket <pepper_dev/c/struct_p_p_b___u_d_p_socket__1__1.html>`__ + * `PPB_UDPSocket <pepper_dev/c/struct_p_p_b___u_d_p_socket__1__2.html>`__ * `PPB_URLLoader <pepper_dev/c/struct_p_p_b___u_r_l_loader__1__0.html>`__ @@ -130,7 +130,9 @@ * `PPB_VarDictionary <pepper_dev/c/struct_p_p_b___var_dictionary__1__0.html>`__ - * `PPB_VideoDecoder <pepper_dev/c/struct_p_p_b___video_decoder__1__0.html>`__ + * `PPB_VideoDecoder <pepper_dev/c/struct_p_p_b___video_decoder__1__1.html>`__ + + * `PPB_VideoEncoder <pepper_dev/c/struct_p_p_b___video_encoder__0__2.html>`__ * `PPB_VideoFrame <pepper_dev/c/struct_p_p_b___video_frame__0__1.html>`__ @@ -157,6 +159,12 @@ ========================================================== * `PP_ArrayOutput <pepper_dev/c/struct_p_p___array_output.html>`__ + * `PP_AudioBitstreamBuffer <pepper_dev/c/struct_p_p___audio_bitstream_buffer.html>`__ + + * `PP_AudioProfileDescription <pepper_dev/c/struct_p_p___audio_profile_description.html>`__ + + * `PP_BitstreamBuffer <pepper_dev/c/struct_p_p___bitstream_buffer.html>`__ + * `PP_CompletionCallback <pepper_dev/c/struct_p_p___completion_callback.html>`__ * `PP_DirectoryEntry <pepper_dev/c/struct_p_p___directory_entry.html>`__ @@ -203,6 +211,10 @@ * `PP_VideoPicture <pepper_dev/c/struct_p_p___video_picture__0__1.html>`__ + * `PP_VideoProfileDescription <pepper_dev/c/struct_p_p___video_profile_description.html>`__ + + * `PP_VideoProfileDescription <pepper_dev/c/struct_p_p___video_profile_description__0__1.html>`__ + * `PP_VarValue <pepper_dev/c/union_p_p___var_value.html>`__ @@ -266,6 +278,8 @@ * `ppb_audio_config.h <pepper_dev/c/ppb__audio__config_8h.html>`__ + * `ppb_audio_encoder.h <pepper_dev/c/ppb__audio__encoder_8h.html>`__ + * `ppb_compositor.h <pepper_dev/c/ppb__compositor_8h.html>`__ * `ppb_compositor_layer.h <pepper_dev/c/ppb__compositor__layer_8h.html>`__ @@ -276,8 +290,6 @@ * `ppb_file_io.h <pepper_dev/c/ppb__file__io_8h.html>`__ - * `ppb_file_mapping.h <pepper_dev/c/ppb__file__mapping_8h.html>`__ - * `ppb_file_ref.h <pepper_dev/c/ppb__file__ref_8h.html>`__ * `ppb_file_system.h <pepper_dev/c/ppb__file__system_8h.html>`__ @@ -342,6 +354,8 @@ * `ppb_video_decoder.h <pepper_dev/c/ppb__video__decoder_8h.html>`__ + * `ppb_video_encoder.h <pepper_dev/c/ppb__video__encoder_8h.html>`__ + * `ppb_video_frame.h <pepper_dev/c/ppb__video__frame_8h.html>`__ * `ppb_view.h <pepper_dev/c/ppb__view_8h.html>`__
diff --git a/native_client_sdk/src/doc/c-api.rst b/native_client_sdk/src/doc/c-api.rst index 1844cfa..0ce774f 100644 --- a/native_client_sdk/src/doc/c-api.rst +++ b/native_client_sdk/src/doc/c-api.rst
@@ -7,8 +7,8 @@ Pepper C API Reference (Stable) ########################################## -This page lists the C API for Pepper 40. Apps that use this API can -run in Chrome 40 or higher. +This page lists the C API for Pepper 47. Apps that use this API can +run in Chrome 47 or higher. `Interfaces <pepper_stable/c/group___interfaces.html>`__ ============================================================= @@ -18,6 +18,8 @@ * `PPB_AudioConfig <pepper_stable/c/struct_p_p_b___audio_config__1__1.html>`__ + * `PPB_AudioEncoder <pepper_stable/c/struct_p_p_b___audio_encoder__0__1.html>`__ + * `PPB_Compositor <pepper_stable/c/struct_p_p_b___compositor__0__1.html>`__ * `PPB_CompositorLayer <pepper_stable/c/struct_p_p_b___compositor_layer__0__2.html>`__ @@ -28,8 +30,6 @@ * `PPB_FileIO <pepper_stable/c/struct_p_p_b___file_i_o__1__1.html>`__ - * `PPB_FileMapping <pepper_stable/c/struct_p_p_b___file_mapping__0__1.html>`__ - * `PPB_FileRef <pepper_stable/c/struct_p_p_b___file_ref__1__2.html>`__ * `PPB_FileSystem <pepper_stable/c/struct_p_p_b___file_system__1__0.html>`__ @@ -108,13 +108,13 @@ * `PPB_OpenGLES2VertexArrayObject <pepper_stable/c/struct_p_p_b___open_g_l_e_s2_vertex_array_object__1__0.html>`__ - * `PPB_TCPSocket <pepper_stable/c/struct_p_p_b___t_c_p_socket__1__1.html>`__ + * `PPB_TCPSocket <pepper_stable/c/struct_p_p_b___t_c_p_socket__1__2.html>`__ * `PPB_TextInputController <pepper_stable/c/struct_p_p_b___text_input_controller__1__0.html>`__ * `PPB_TouchInputEvent <pepper_stable/c/struct_p_p_b___touch_input_event__1__0.html>`__ - * `PPB_UDPSocket <pepper_stable/c/struct_p_p_b___u_d_p_socket__1__0.html>`__ + * `PPB_UDPSocket <pepper_stable/c/struct_p_p_b___u_d_p_socket__1__2.html>`__ * `PPB_URLLoader <pepper_stable/c/struct_p_p_b___u_r_l_loader__1__0.html>`__ @@ -130,7 +130,9 @@ * `PPB_VarDictionary <pepper_stable/c/struct_p_p_b___var_dictionary__1__0.html>`__ - * `PPB_VideoDecoder <pepper_stable/c/struct_p_p_b___video_decoder__1__0.html>`__ + * `PPB_VideoDecoder <pepper_stable/c/struct_p_p_b___video_decoder__1__1.html>`__ + + * `PPB_VideoEncoder <pepper_stable/c/struct_p_p_b___video_encoder__0__2.html>`__ * `PPB_VideoFrame <pepper_stable/c/struct_p_p_b___video_frame__0__1.html>`__ @@ -157,6 +159,12 @@ ========================================================== * `PP_ArrayOutput <pepper_stable/c/struct_p_p___array_output.html>`__ + * `PP_AudioBitstreamBuffer <pepper_stable/c/struct_p_p___audio_bitstream_buffer.html>`__ + + * `PP_AudioProfileDescription <pepper_stable/c/struct_p_p___audio_profile_description.html>`__ + + * `PP_BitstreamBuffer <pepper_stable/c/struct_p_p___bitstream_buffer.html>`__ + * `PP_CompletionCallback <pepper_stable/c/struct_p_p___completion_callback.html>`__ * `PP_DirectoryEntry <pepper_stable/c/struct_p_p___directory_entry.html>`__ @@ -203,6 +211,10 @@ * `PP_VideoPicture <pepper_stable/c/struct_p_p___video_picture__0__1.html>`__ + * `PP_VideoProfileDescription <pepper_stable/c/struct_p_p___video_profile_description.html>`__ + + * `PP_VideoProfileDescription <pepper_stable/c/struct_p_p___video_profile_description__0__1.html>`__ + * `PP_VarValue <pepper_stable/c/union_p_p___var_value.html>`__ @@ -266,6 +278,8 @@ * `ppb_audio_config.h <pepper_stable/c/ppb__audio__config_8h.html>`__ + * `ppb_audio_encoder.h <pepper_stable/c/ppb__audio__encoder_8h.html>`__ + * `ppb_compositor.h <pepper_stable/c/ppb__compositor_8h.html>`__ * `ppb_compositor_layer.h <pepper_stable/c/ppb__compositor__layer_8h.html>`__ @@ -276,8 +290,6 @@ * `ppb_file_io.h <pepper_stable/c/ppb__file__io_8h.html>`__ - * `ppb_file_mapping.h <pepper_stable/c/ppb__file__mapping_8h.html>`__ - * `ppb_file_ref.h <pepper_stable/c/ppb__file__ref_8h.html>`__ * `ppb_file_system.h <pepper_stable/c/ppb__file__system_8h.html>`__ @@ -342,6 +354,8 @@ * `ppb_video_decoder.h <pepper_stable/c/ppb__video__decoder_8h.html>`__ + * `ppb_video_encoder.h <pepper_stable/c/ppb__video__encoder_8h.html>`__ + * `ppb_video_frame.h <pepper_stable/c/ppb__video__frame_8h.html>`__ * `ppb_view.h <pepper_stable/c/ppb__view_8h.html>`__
diff --git a/native_client_sdk/src/doc/cpp-api-beta.rst b/native_client_sdk/src/doc/cpp-api-beta.rst index ded3e2f5..555e35b 100644 --- a/native_client_sdk/src/doc/cpp-api-beta.rst +++ b/native_client_sdk/src/doc/cpp-api-beta.rst
@@ -7,8 +7,8 @@ Pepper C++ API Reference (Beta) ############################################ -This page lists the C++ API for Pepper 41. Apps that use this API can -run in Chrome 41 or higher. +This page lists the C++ API for Pepper 48. Apps that use this API can +run in Chrome 48 or higher. `Classes <pepper_beta/cpp/inherits.html>`__ ================================================== @@ -18,6 +18,8 @@ * `AudioConfig <pepper_beta/cpp/classpp_1_1_audio_config.html>`__ + * `AudioEncoder <pepper_beta/cpp/classpp_1_1_audio_encoder.html>`__ + * `CompletionCallback <pepper_beta/cpp/classpp_1_1_completion_callback.html>`__ * `CompletionCallbackFactory <pepper_beta/cpp/classpp_1_1_completion_callback_factory.html>`__ @@ -126,6 +128,8 @@ * `VideoDecoder <pepper_beta/cpp/classpp_1_1_video_decoder.html>`__ + * `VideoEncoder <pepper_beta/cpp/classpp_1_1_video_encoder.html>`__ + * `VideoFrame <pepper_beta/cpp/classpp_1_1_video_frame.html>`__ * `View <pepper_beta/cpp/classpp_1_1_view.html>`__ @@ -145,6 +149,8 @@ * `audio_config.h <pepper_beta/cpp/audio__config_8h.html>`__ + * `audio_encoder.h <pepper_beta/cpp/audio__encoder_8h.html>`__ + * `completion_callback.h <pepper_beta/cpp/completion__callback_8h.html>`__ * `completion_callback_factory.h <pepper_beta/cpp/completion__callback__factory_8h.html>`__ @@ -243,6 +249,8 @@ * `video_decoder.h <pepper_beta/cpp/video__decoder_8h.html>`__ + * `video_encoder.h <pepper_beta/cpp/video__encoder_8h.html>`__ + * `video_frame.h <pepper_beta/cpp/video__frame_8h.html>`__ * `view.h <pepper_beta/cpp/view_8h.html>`__
diff --git a/native_client_sdk/src/doc/cpp-api-dev.rst b/native_client_sdk/src/doc/cpp-api-dev.rst index cf678d8..e0211f7 100644 --- a/native_client_sdk/src/doc/cpp-api-dev.rst +++ b/native_client_sdk/src/doc/cpp-api-dev.rst
@@ -7,8 +7,8 @@ Pepper C++ API Reference (Dev) ############################################ -This page lists the C++ API for Pepper 42. Apps that use this API can -run in Chrome 42 or higher. +This page lists the C++ API for Pepper 49. Apps that use this API can +run in Chrome 49 or higher. `Classes <pepper_dev/cpp/inherits.html>`__ ================================================== @@ -18,6 +18,8 @@ * `AudioConfig <pepper_dev/cpp/classpp_1_1_audio_config.html>`__ + * `AudioEncoder <pepper_dev/cpp/classpp_1_1_audio_encoder.html>`__ + * `CompletionCallback <pepper_dev/cpp/classpp_1_1_completion_callback.html>`__ * `CompletionCallbackFactory <pepper_dev/cpp/classpp_1_1_completion_callback_factory.html>`__ @@ -126,6 +128,8 @@ * `VideoDecoder <pepper_dev/cpp/classpp_1_1_video_decoder.html>`__ + * `VideoEncoder <pepper_dev/cpp/classpp_1_1_video_encoder.html>`__ + * `VideoFrame <pepper_dev/cpp/classpp_1_1_video_frame.html>`__ * `View <pepper_dev/cpp/classpp_1_1_view.html>`__ @@ -145,6 +149,8 @@ * `audio_config.h <pepper_dev/cpp/audio__config_8h.html>`__ + * `audio_encoder.h <pepper_dev/cpp/audio__encoder_8h.html>`__ + * `completion_callback.h <pepper_dev/cpp/completion__callback_8h.html>`__ * `completion_callback_factory.h <pepper_dev/cpp/completion__callback__factory_8h.html>`__ @@ -243,6 +249,8 @@ * `video_decoder.h <pepper_dev/cpp/video__decoder_8h.html>`__ + * `video_encoder.h <pepper_dev/cpp/video__encoder_8h.html>`__ + * `video_frame.h <pepper_dev/cpp/video__frame_8h.html>`__ * `view.h <pepper_dev/cpp/view_8h.html>`__
diff --git a/native_client_sdk/src/doc/cpp-api.rst b/native_client_sdk/src/doc/cpp-api.rst index 3e13ab3b..b3782744 100644 --- a/native_client_sdk/src/doc/cpp-api.rst +++ b/native_client_sdk/src/doc/cpp-api.rst
@@ -7,8 +7,8 @@ Pepper C++ API Reference (Stable) ############################################ -This page lists the C++ API for Pepper 40. Apps that use this API can -run in Chrome 40 or higher. +This page lists the C++ API for Pepper 47. Apps that use this API can +run in Chrome 47 or higher. `Classes <pepper_stable/cpp/inherits.html>`__ ================================================== @@ -18,6 +18,8 @@ * `AudioConfig <pepper_stable/cpp/classpp_1_1_audio_config.html>`__ + * `AudioEncoder <pepper_stable/cpp/classpp_1_1_audio_encoder.html>`__ + * `CompletionCallback <pepper_stable/cpp/classpp_1_1_completion_callback.html>`__ * `CompletionCallbackFactory <pepper_stable/cpp/classpp_1_1_completion_callback_factory.html>`__ @@ -126,6 +128,8 @@ * `VideoDecoder <pepper_stable/cpp/classpp_1_1_video_decoder.html>`__ + * `VideoEncoder <pepper_stable/cpp/classpp_1_1_video_encoder.html>`__ + * `VideoFrame <pepper_stable/cpp/classpp_1_1_video_frame.html>`__ * `View <pepper_stable/cpp/classpp_1_1_view.html>`__ @@ -145,6 +149,8 @@ * `audio_config.h <pepper_stable/cpp/audio__config_8h.html>`__ + * `audio_encoder.h <pepper_stable/cpp/audio__encoder_8h.html>`__ + * `completion_callback.h <pepper_stable/cpp/completion__callback_8h.html>`__ * `completion_callback_factory.h <pepper_stable/cpp/completion__callback__factory_8h.html>`__ @@ -243,6 +249,8 @@ * `video_decoder.h <pepper_stable/cpp/video__decoder_8h.html>`__ + * `video_encoder.h <pepper_stable/cpp/video__encoder_8h.html>`__ + * `video_frame.h <pepper_stable/cpp/video__frame_8h.html>`__ * `view.h <pepper_stable/cpp/view_8h.html>`__
diff --git a/native_client_sdk/src/doc/doxygen/generate_docs.py b/native_client_sdk/src/doc/doxygen/generate_docs.py index 13316ef..4cc475d 100755 --- a/native_client_sdk/src/doc/doxygen/generate_docs.py +++ b/native_client_sdk/src/doc/doxygen/generate_docs.py
@@ -200,6 +200,18 @@ 'script_dirname': SCRIPT_DIR}) +def CheckDoxygenVersion(doxygen): + version = subprocess.check_output([doxygen, '--version']).strip() + url = 'http://ftp.stack.nl/pub/users/dimitri/doxygen-1.7.6.1.linux.bin.tar.gz' + if version != '1.7.6.1': + print 'Doxygen version 1.7.6.1 is required' + print 'The version being used (%s) is version %s' % (doxygen, version) + print 'The simplest way to grab this version is to download it directly:' + print url + print 'Then either add it to your $PATH or set $DOXYGEN to point to binary.' + sys.exit(1) + + def RunDoxygen(out_dirname, doxyfile): Trace('Removing old output directory %s' % out_dirname) RemoveDir(out_dirname) @@ -208,6 +220,7 @@ os.makedirs(out_dirname) doxygen = os.environ.get('DOXYGEN', 'doxygen') + CheckDoxygenVersion(doxygen) cmd = [doxygen, doxyfile] Trace('Running Doxygen:\n %s' % ' '.join(cmd)) subprocess.check_call(cmd)
diff --git a/native_client_sdk/src/doc/pepper_beta/index.rst b/native_client_sdk/src/doc/pepper_beta/index.rst index 8752eb1..e20bc353 100644 --- a/native_client_sdk/src/doc/pepper_beta/index.rst +++ b/native_client_sdk/src/doc/pepper_beta/index.rst
@@ -9,8 +9,8 @@ Pepper API Reference (Beta) ######################################## -This page lists the API for Pepper 41. Apps that use this API can -run in Chrome 41 or higher. +This page lists the API for Pepper 48. Apps that use this API can +run in Chrome 48 or higher. :ref:`Pepper C API Reference <pepper_beta_c_index>` ===========================================================
diff --git a/native_client_sdk/src/doc/pepper_dev/index.rst b/native_client_sdk/src/doc/pepper_dev/index.rst index 4269e59..4ce9ab31 100644 --- a/native_client_sdk/src/doc/pepper_dev/index.rst +++ b/native_client_sdk/src/doc/pepper_dev/index.rst
@@ -9,8 +9,8 @@ Pepper API Reference (Dev) ######################################## -This page lists the API for Pepper 42. Apps that use this API can -run in Chrome 42 or higher. +This page lists the API for Pepper 49. Apps that use this API can +run in Chrome 49 or higher. :ref:`Pepper C API Reference <pepper_dev_c_index>` ===========================================================
diff --git a/native_client_sdk/src/doc/pepper_stable/index.rst b/native_client_sdk/src/doc/pepper_stable/index.rst index 158fac42..66266dd 100644 --- a/native_client_sdk/src/doc/pepper_stable/index.rst +++ b/native_client_sdk/src/doc/pepper_stable/index.rst
@@ -9,8 +9,8 @@ Pepper API Reference (Stable) ######################################## -This page lists the API for Pepper 40. Apps that use this API can -run in Chrome 40 or higher. +This page lists the API for Pepper 47. Apps that use this API can +run in Chrome 47 or higher. :ref:`Pepper C API Reference <pepper_stable_c_index>` ===========================================================
diff --git a/net/BUILD.gn b/net/BUILD.gn index c5dfe54..8ca7cdf 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1254,10 +1254,10 @@ "tools/quic/quic_simple_server.h", "tools/quic/quic_simple_server_packet_writer.cc", "tools/quic/quic_simple_server_packet_writer.h", + "tools/quic/quic_simple_server_stream.cc", + "tools/quic/quic_simple_server_stream.h", "tools/quic/quic_spdy_client_stream.cc", "tools/quic/quic_spdy_client_stream.h", - "tools/quic/quic_spdy_server_stream.cc", - "tools/quic/quic_spdy_server_stream.h", "tools/quic/quic_time_wait_list_manager.cc", "tools/quic/quic_time_wait_list_manager.h", "tools/quic/synchronous_host_resolver.cc", @@ -1582,11 +1582,12 @@ # 'test_data_files': [ # 'data/certificate_policies_unittest/', # 'data/name_constraints_unittest/', + # 'data/parse_certificate_unittest/', # 'data/ssl/certificates/', # 'data/test.html', # 'data/url_request_unittest/', + # 'data/verify_certificate_chain_unittest/', # 'data/verify_name_match_unittest/names/', - # 'data/parse_certificate_unittest/', # ], # 'test_data_prefix': 'net', # },
diff --git a/net/android/java/src/org/chromium/net/ProxyChangeListener.java b/net/android/java/src/org/chromium/net/ProxyChangeListener.java index 7df2d3b..f1362d3 100644 --- a/net/android/java/src/org/chromium/net/ProxyChangeListener.java +++ b/net/android/java/src/org/chromium/net/ProxyChangeListener.java
@@ -112,7 +112,7 @@ final String getExclusionList = "getExclusionList"; String className; String proxyInfo; - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { className = "android.net.ProxyProperties"; proxyInfo = "proxy"; } else { @@ -134,20 +134,21 @@ int port = (Integer) getPortMethod.invoke(props); String[] exclusionList; - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { String s = (String) getExclusionListMethod.invoke(props); exclusionList = s.split(","); } else { exclusionList = (String[]) getExclusionListMethod.invoke(props); } // TODO(xunjieli): rewrite this once the API is public. - if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Method getPacFileUrlMethod = cls.getDeclaredMethod(getPacFileUrl); String pacFileUrl = (String) getPacFileUrlMethod.invoke(props); if (!TextUtils.isEmpty(pacFileUrl)) { return new ProxyConfig(host, port, pacFileUrl, exclusionList); } - } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Method getPacFileUrlMethod = cls.getDeclaredMethod(getPacFileUrl); Uri pacFileUrl = (Uri) getPacFileUrlMethod.invoke(props); if (!Uri.EMPTY.equals(pacFileUrl)) {
diff --git a/net/base/net_util.cc b/net/base/net_util.cc index e29fa5c5..d318e8c 100644 --- a/net/base/net_util.cc +++ b/net/base/net_util.cc
@@ -27,7 +27,6 @@ #include "base/basictypes.h" #include "base/json/string_escape.h" #include "base/logging.h" -#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -35,12 +34,12 @@ #include "base/sys_byteorder.h" #include "base/values.h" #include "net/base/address_list.h" +#include "net/base/escape.h" #include "net/base/ip_address_number.h" #include "net/base/net_module.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/base/url_util.h" #include "net/grit/net_resources.h" -#include "net/http/http_content_disposition.h" #include "url/gurl.h" #include "url/third_party/mozilla/url_parse.h" #include "url/url_canon.h"
diff --git a/net/base/net_util.h b/net/base/net_util.h index b4185417..c8e1ef7 100644 --- a/net/base/net_util.h +++ b/net/base/net_util.h
@@ -7,22 +7,21 @@ #include "build/build_config.h" -#if defined(OS_WIN) -#include <windows.h> -#include <ws2tcpip.h> -#elif defined(OS_POSIX) -#include <sys/types.h> +#if defined(OS_POSIX) #include <sys/socket.h> +#include <sys/types.h> +#elif defined(OS_WIN) +#include <winsock2.h> +#include <ws2tcpip.h> #endif +#include <stdint.h> #include <string> #include <vector> -#include "base/basictypes.h" #include "base/strings/string16.h" -#include "base/strings/utf_offset_string_conversions.h" -#include "net/base/escape.h" -#include "net/base/network_change_notifier.h" +#include "base/strings/string_piece.h" +#include "net/base/net_export.h" class GURL; @@ -32,7 +31,6 @@ namespace url { struct CanonHostInfo; -struct Parsed; } namespace net {
diff --git a/net/base/net_util_icu.cc b/net/base/net_util_icu.cc index c174c92..62766c1 100644 --- a/net/base/net_util_icu.cc +++ b/net/base/net_util_icu.cc
@@ -8,6 +8,7 @@ #include "base/json/string_escape.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" #include "net/base/escape.h" namespace net {
diff --git a/net/cert/internal/signature_algorithm.cc b/net/cert/internal/signature_algorithm.cc index 468fa16..d36eebe6 100644 --- a/net/cert/internal/signature_algorithm.cc +++ b/net/cert/internal/signature_algorithm.cc
@@ -540,10 +540,6 @@ : mgf1_hash_(mgf1_hash), salt_length_(salt_length) { } -bool RsaPssParameters::Equals(const RsaPssParameters* other) const { - return mgf1_hash_ == other->mgf1_hash_ && salt_length_ == other->salt_length_; -} - SignatureAlgorithm::~SignatureAlgorithm() { } @@ -611,34 +607,6 @@ make_scoped_ptr(new RsaPssParameters(mgf1_hash, salt_length)))); } -bool SignatureAlgorithm::Equals(const SignatureAlgorithm& other) const { - if (algorithm_ != other.algorithm_) - return false; - - if (digest_ != other.digest_) - return false; - - // Check that the parameters are equal. - switch (algorithm_) { - case SignatureAlgorithmId::RsaPss: { - const RsaPssParameters* params1 = ParamsForRsaPss(); - const RsaPssParameters* params2 = other.ParamsForRsaPss(); - if (!params1 || !params2 || !params1->Equals(params2)) - return false; - break; - } - - // There shouldn't be any parameters. - case SignatureAlgorithmId::RsaPkcs1: - case SignatureAlgorithmId::Ecdsa: - if (params_ || other.params_) - return false; - break; - } - - return true; -} - const RsaPssParameters* SignatureAlgorithm::ParamsForRsaPss() const { if (algorithm_ == SignatureAlgorithmId::RsaPss) return static_cast<RsaPssParameters*>(params_.get());
diff --git a/net/cert/internal/signature_algorithm.h b/net/cert/internal/signature_algorithm.h index 9ecf252..5d8141a 100644 --- a/net/cert/internal/signature_algorithm.h +++ b/net/cert/internal/signature_algorithm.h
@@ -53,8 +53,6 @@ public: RsaPssParameters(DigestAlgorithm mgf1_hash, uint32_t salt_length); - bool Equals(const RsaPssParameters* other) const; - DigestAlgorithm mgf1_hash() const { return mgf1_hash_; } uint32_t salt_length() const { return salt_length_; } @@ -84,10 +82,6 @@ DigestAlgorithm mgf1_hash, uint32_t salt_length); - // Returns true if |*this| is equivalent to |other|. This compares both the - // algorithm ID and each parameter for equality. - bool Equals(const SignatureAlgorithm& other) const WARN_UNUSED_RESULT; - // The following methods retrieve the parameters for the signature algorithm. // // The correct parameters should be chosen based on the algorithm ID. For
diff --git a/net/cert/internal/signature_algorithm_unittest.cc b/net/cert/internal/signature_algorithm_unittest.cc index 8cc5517..32f5a0f 100644 --- a/net/cert/internal/signature_algorithm_unittest.cc +++ b/net/cert/internal/signature_algorithm_unittest.cc
@@ -485,106 +485,6 @@ ASSERT_FALSE(ParseDer(kData, &algorithm)); } -// Tests that two RSA algorithms with different digests are not equal. -TEST(SignatureAlgorithmTest, EqualsRsaWithDifferentDigest) { - scoped_ptr<SignatureAlgorithm> alg1 = - SignatureAlgorithm::CreateRsaPkcs1(DigestAlgorithm::Sha1); - - scoped_ptr<SignatureAlgorithm> alg2 = - SignatureAlgorithm::CreateRsaPkcs1(DigestAlgorithm::Sha256); - - ASSERT_FALSE(alg1->Equals(*alg2)); -} - -// Tests that two ECDSA algorithms with different digests are not equal. -TEST(SignatureAlgorithmTest, EqualsEcdsaWithDifferentDigest) { - scoped_ptr<SignatureAlgorithm> alg1 = - SignatureAlgorithm::CreateEcdsa(DigestAlgorithm::Sha1); - - scoped_ptr<SignatureAlgorithm> alg2 = - SignatureAlgorithm::CreateEcdsa(DigestAlgorithm::Sha256); - - ASSERT_FALSE(alg1->Equals(*alg2)); -} - -// Tests that an ECDSA algorithm is not equal to an RSA algorithm (even though -// digests match). -TEST(SignatureAlgorithmTest, EqualsEcdsaNotEqualRsa) { - scoped_ptr<SignatureAlgorithm> alg1 = - SignatureAlgorithm::CreateEcdsa(DigestAlgorithm::Sha256); - - scoped_ptr<SignatureAlgorithm> alg2 = - SignatureAlgorithm::CreateRsaPkcs1(DigestAlgorithm::Sha256); - - ASSERT_FALSE(alg1->Equals(*alg2)); -} - -// Tests that two identical ECDSA algorithms are equal - both use SHA-256. -TEST(SignatureAlgorithmTest, EqualsEcdsaMatch) { - scoped_ptr<SignatureAlgorithm> alg1 = - SignatureAlgorithm::CreateEcdsa(DigestAlgorithm::Sha256); - - scoped_ptr<SignatureAlgorithm> alg2 = - SignatureAlgorithm::CreateEcdsa(DigestAlgorithm::Sha256); - - ASSERT_TRUE(alg1->Equals(*alg2)); -} - -// Tests that two identical RSA algorithms are equal - both use SHA-512 -TEST(SignatureAlgorithmTest, EqualsRsaPkcs1Match) { - scoped_ptr<SignatureAlgorithm> alg1 = - SignatureAlgorithm::CreateRsaPkcs1(DigestAlgorithm::Sha512); - - scoped_ptr<SignatureAlgorithm> alg2 = - SignatureAlgorithm::CreateRsaPkcs1(DigestAlgorithm::Sha512); - - ASSERT_TRUE(alg1->Equals(*alg2)); -} - -// Tests that two RSASSA-PSS algorithms are equal. -TEST(SignatureAlgorithmTest, EqualsRsaPssMatch) { - scoped_ptr<SignatureAlgorithm> alg1 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha256, DigestAlgorithm::Sha1, 21); - - scoped_ptr<SignatureAlgorithm> alg2 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha256, DigestAlgorithm::Sha1, 21); - - ASSERT_TRUE(alg1->Equals(*alg2)); -} - -// Tests that two RSASSA-PSS algorithms with different hashes are not equal. -TEST(SignatureAlgorithmTest, EqualsRsaPssWithDifferentDigest) { - scoped_ptr<SignatureAlgorithm> alg1 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha1, DigestAlgorithm::Sha1, 20); - - scoped_ptr<SignatureAlgorithm> alg2 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha256, DigestAlgorithm::Sha1, 20); - - ASSERT_FALSE(alg1->Equals(*alg2)); -} - -// Tests that two RSASSA-PSS algorithms with different mask gens are not equal. -TEST(SignatureAlgorithmTest, EqualsRsaPssWithDifferentMaskGen) { - scoped_ptr<SignatureAlgorithm> alg1 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha256, DigestAlgorithm::Sha1, 20); - - scoped_ptr<SignatureAlgorithm> alg2 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha256, DigestAlgorithm::Sha256, 20); - - ASSERT_FALSE(alg1->Equals(*alg2)); -} - -// Tests that two RSASSA-PSS algorithms with different salts -TEST(SignatureAlgorithmTest, EqualsRsaPssWithDifferentSalt) { - scoped_ptr<SignatureAlgorithm> alg1 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha1, DigestAlgorithm::Sha1, 20); - - scoped_ptr<SignatureAlgorithm> alg2 = SignatureAlgorithm::CreateRsaPss( - DigestAlgorithm::Sha1, DigestAlgorithm::Sha1, 16); - - ASSERT_FALSE(alg1->Equals(*alg2)); -} - // Tests that the parmeters returned for an ECDSA algorithm are null for // non-ECDSA algorithms. TEST(SignatureAlgorithmTest, ParamsAreNullForWrongTypeEcdsa) {
diff --git a/net/cert/internal/verify_certificate_chain.cc b/net/cert/internal/verify_certificate_chain.cc new file mode 100644 index 0000000..9dbc511 --- /dev/null +++ b/net/cert/internal/verify_certificate_chain.cc
@@ -0,0 +1,537 @@ +// 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 "net/cert/internal/verify_certificate_chain.h" + +#include "base/logging.h" +#include "net/cert/internal/parse_certificate.h" +#include "net/cert/internal/signature_algorithm.h" +#include "net/cert/internal/signature_policy.h" +#include "net/cert/internal/verify_signed_data.h" +#include "net/der/input.h" + +namespace net { + +namespace { + +// TODO(eroman): Move into net/der (duplicated from test_helpers.cc). +static der::Input InputFromString(const std::string* s) { + return der::Input(reinterpret_cast<const uint8_t*>(s->data()), s->size()); +} + +// Map from OID to ParsedExtension. +using ExtensionsMap = std::map<der::Input, ParsedExtension>; + +// Describes all parsed properties of a certificate that are relevant for +// certificate verification. +struct FullyParsedCert { + ParsedCertificate cert; + ParsedTbsCertificate tbs; + + scoped_ptr<SignatureAlgorithm> signature_algorithm; + + // Standard extensions that were parsed. + bool has_basic_constraints = false; + ParsedBasicConstraints basic_constraints; + + bool has_key_usage = false; + der::BitString key_usage; + + // The remaining extensions (excludes the standard ones above). + ExtensionsMap unconsumed_extensions; +}; + +// Removes the extension with OID |oid| from |unconsumed_extensions| and fills +// |extension| with the matching extension value. If there was no extension +// matching |oid| then returns |false|. +WARN_UNUSED_RESULT bool ConsumeExtension(const der::Input& oid, + ExtensionsMap* unconsumed_extensions, + ParsedExtension* extension) { + auto it = unconsumed_extensions->find(oid); + if (it == unconsumed_extensions->end()) + return false; + + *extension = it->second; + unconsumed_extensions->erase(it); + return true; +} + +// Returns true if the certificate does not contain any unconsumed _critical_ +// extensions. +WARN_UNUSED_RESULT bool VerifyNoUnconsumedCriticalExtensions( + const FullyParsedCert& cert) { + for (const auto& entry : cert.unconsumed_extensions) { + if (entry.second.critical) + return false; + } + return true; +} + +// Parses an X.509 Certificate fully (including the TBSCertificate and +// standard extensions), saving all the properties to |out_|. +WARN_UNUSED_RESULT bool FullyParseCertificate(const der::Input& cert_tlv, + FullyParsedCert* out) { + // Parse the outer Certificate. + if (!ParseCertificate(cert_tlv, &out->cert)) + return false; + + // Parse the signature algorithm contained in the Certificate (there is + // another one in the TBSCertificate, which is checked later by + // VerifySignatureAlgorithmsMatch) + out->signature_algorithm = + SignatureAlgorithm::CreateFromDer(out->cert.signature_algorithm_tlv); + if (!out->signature_algorithm) + return false; + + // Parse the TBSCertificate. + if (!ParseTbsCertificate(out->cert.tbs_certificate_tlv, &out->tbs)) + return false; + + // Reset state relating to extensions (which may not get overwritten). This is + // just a precaution, since in practice |out| will already be default + // initialize. + out->has_basic_constraints = false; + out->has_key_usage = false; + out->unconsumed_extensions.clear(); + + // Parse the standard X.509 extensions and remove them from + // |unconsumed_extensions|. + if (out->tbs.has_extensions) { + // ParseExtensions() ensures there are no duplicates, and maps the (unique) + // OID to the extension value. + if (!ParseExtensions(out->tbs.extensions_tlv, &out->unconsumed_extensions)) + return false; + + ParsedExtension extension; + + // Basic constraints. + if (ConsumeExtension(BasicConstraintsOid(), &out->unconsumed_extensions, + &extension)) { + out->has_basic_constraints = true; + if (!ParseBasicConstraints(extension.value, &out->basic_constraints)) + return false; + } + + // KeyUsage. + if (ConsumeExtension(KeyUsageOid(), &out->unconsumed_extensions, + &extension)) { + out->has_key_usage = true; + if (!ParseKeyUsage(extension.value, &out->key_usage)) + return false; + } + } + + return true; +} + +// Returns true if |name1| matches |name2|. +WARN_UNUSED_RESULT bool NameMatches(const der::Input& name1, + const der::Input& name2) { + // TODO(eroman): Should account for normalization (i.e. call + // VerifyNameMatches() instead). + return name1.Equals(name2); +} + +// Returns true if |cert| was self-issued. The definition of self-issuance +// comes from RFC 5280 section 6.1: +// +// A certificate is self-issued if the same DN appears in the subject +// and issuer fields (the two DNs are the same if they match according +// to the rules specified in Section 7.1). In general, the issuer and +// subject of the certificates that make up a path are different for +// each certificate. However, a CA may issue a certificate to itself to +// support key rollover or changes in certificate policies. These +// self-issued certificates are not counted when evaluating path length +// or name constraints. +WARN_UNUSED_RESULT bool IsSelfIssued(const FullyParsedCert& cert) { + return NameMatches(cert.tbs.subject_tlv, cert.tbs.issuer_tlv); +} + +// Finds a trust anchor that matches |name| in |trust_store| or returns +// nullptr. The returned pointer references data in |trust_store|. +// +// TODO(eroman): This implementation is linear in the size of the trust store, +// and also presumes that all names are unique. In practice it is possible to +// have multiple SPKIs with the same name. Also this mechanism of +// searching is fairly primitive, and does not take advantage of other +// properties like the authority key id. +WARN_UNUSED_RESULT const TrustAnchor* FindTrustAnchorByName( + const TrustStore& trust_store, + const der::Input& name) { + for (const auto& anchor : trust_store.anchors) { + if (NameMatches(name, InputFromString(&anchor.name))) + return &anchor; + } + return nullptr; +} + +// Returns true if |cert| is valid at time |time|. +// +// The certificate's validity requirements are described by RFC 5280 section +// 4.1.2.5: +// +// The validity period for a certificate is the period of time from +// notBefore through notAfter, inclusive. +WARN_UNUSED_RESULT bool VerifyTimeValidity(const FullyParsedCert& cert, + const der::GeneralizedTime time) { + return !(time < cert.tbs.validity_not_before) && + !(cert.tbs.validity_not_after < time); +} + +// Returns true if |signature_algorithm_tlv| is a valid algorithm encoding for +// RSA with SHA1. +WARN_UNUSED_RESULT bool IsRsaWithSha1SignatureAlgorithm( + const der::Input& signature_algorithm_tlv) { + scoped_ptr<SignatureAlgorithm> algorithm = + SignatureAlgorithm::CreateFromDer(signature_algorithm_tlv); + + return algorithm && + algorithm->algorithm() == SignatureAlgorithmId::RsaPkcs1 && + algorithm->digest() == DigestAlgorithm::Sha1; +} + +// Returns true if |cert| has internally consistent signature algorithms. +// +// X.509 certificates contain two different signature algorithms: +// (1) The signatureAlgorithm field of Certificate +// (2) The signature field of TBSCertificate +// +// According to RFC 5280 section 4.1.1.2 and 4.1.2.3 these two fields must be +// equal: +// +// This field MUST contain the same algorithm identifier as the +// signature field in the sequence tbsCertificate (Section 4.1.2.3). +// +// The spec is not explicit about what "the same algorithm identifier" means. +// Our interpretation is that the two DER-encoded fields must be byte-for-byte +// identical. +// +// In practice however there are certificates which use different encodings for +// specifying RSA with SHA1 (different OIDs). This is special-cased for +// compatibility sake. +WARN_UNUSED_RESULT bool VerifySignatureAlgorithmsMatch( + const FullyParsedCert& cert) { + const der::Input& alg1_tlv = cert.cert.signature_algorithm_tlv; + const der::Input& alg2_tlv = cert.tbs.signature_algorithm_tlv; + + // Ensure that the two DER-encoded signature algorithms are byte-for-byte + // equal, but make a compatibility concession for RSA with SHA1. + return alg1_tlv.Equals(alg2_tlv) || + (IsRsaWithSha1SignatureAlgorithm(alg1_tlv) && + IsRsaWithSha1SignatureAlgorithm(alg2_tlv)); +} + +// This function corresponds to RFC 5280 section 6.1.3's "Basic Certificate +// Processing" procedure. +WARN_UNUSED_RESULT bool BasicCertificateProcessing( + const FullyParsedCert& cert, + const SignaturePolicy* signature_policy, + const der::GeneralizedTime& time, + const der::Input& working_spki, + const der::Input& working_issuer_name) { + // Check that the signature algorithms in Certificate vs TBSCertificate + // match. This isn't part of RFC 5280 section 6.1.3, but is mandated by + // sections 4.1.1.2 and 4.1.2.3. + if (!VerifySignatureAlgorithmsMatch(cert)) + return false; + + // Verify the digital signature using the previous certificate's (or trust + // anchor's) key (RFC 5280 section 6.1.3 step a.1). + if (!VerifySignedData( + *cert.signature_algorithm, cert.cert.tbs_certificate_tlv, + cert.cert.signature_value, working_spki, signature_policy)) { + return false; + } + + // Check the time range for the certificate's validity, ensuring it is valid + // at |time|. + // (RFC 5280 section 6.1.3 step a.2) + if (!VerifyTimeValidity(cert, time)) + return false; + + // TODO(eroman): Check revocation (RFC 5280 section 6.1.3 step a.3) + + // Verify the certificate's issuer name matches the issuing certificate's (or + // trust anchor's) subject name. (RFC 5280 section 6.1.3 step a.4) + if (!NameMatches(cert.tbs.issuer_tlv, working_issuer_name)) + return false; + + // TODO(eroman): Steps b-f are omitted, as policy/name constraints are not yet + // implemented. + + return true; +} + +// This function corresponds to RFC 5280 section 6.1.4's "Preparation for +// Certificate i+1" procedure. |cert| is expected to be an intermediary. +WARN_UNUSED_RESULT bool PrepareForNextCertificate( + const FullyParsedCert& cert, + size_t* max_path_length_ptr, + der::Input* working_spki, + der::Input* working_issuer_name) { + // TODO(eroman): Steps a-b are omitted, as policy/name constraints are not yet + // implemented. + + // From RFC 5280 section 6.1.4 step c: + // + // Assign the certificate subject name to working_issuer_name. + *working_issuer_name = cert.tbs.subject_tlv; + + // From RFC 5280 section 6.1.4 step d: + // + // Assign the certificate subjectPublicKey to working_public_key. + *working_spki = cert.tbs.spki_tlv; + + // Note that steps e and f are omitted as they are handled by + // the assignment to |working_spki| above. See the definition + // of |working_spki|. + + // TODO(eroman): Steps g-j are omitted as policy/name constraints are not yet + // implemented. + + // From RFC 5280 section 6.1.4 step k: + // + // If certificate i is a version 3 certificate, verify that the + // basicConstraints extension is present and that cA is set to + // TRUE. (If certificate i is a version 1 or version 2 + // certificate, then the application MUST either verify that + // certificate i is a CA certificate through out-of-band means + // or reject the certificate. Conforming implementations may + // choose to reject all version 1 and version 2 intermediate + // certificates.) + // + // This code implicitly rejects non version 3 intermediaries, since they + // can't contain a BasicConstraints extension. + if (!cert.has_basic_constraints || !cert.basic_constraints.is_ca) + return false; + + // From RFC 5280 section 6.1.4 step l: + // + // If the certificate was not self-issued, verify that + // max_path_length is greater than zero and decrement + // max_path_length by 1. + if (!IsSelfIssued(cert)) { + if (*max_path_length_ptr == 0) + return false; + --(*max_path_length_ptr); + } + + // From RFC 5280 section 6.1.4 step m: + // + // If pathLenConstraint is present in the certificate and is + // less than max_path_length, set max_path_length to the value + // of pathLenConstraint. + if (cert.basic_constraints.has_path_len && + cert.basic_constraints.path_len < *max_path_length_ptr) { + *max_path_length_ptr = cert.basic_constraints.path_len; + } + + // From RFC 5280 section 6.1.4 step n: + // + // If a key usage extension is present, verify that the + // keyCertSign bit is set. + if (cert.has_key_usage && + !cert.key_usage.AssertsBit(KEY_USAGE_BIT_KEY_CERT_SIGN)) { + return false; + } + + // From RFC 5280 section 6.1.4 step o: + // + // Recognize and process any other critical extension present in + // the certificate. Process any other recognized non-critical + // extension present in the certificate that is relevant to path + // processing. + if (!VerifyNoUnconsumedCriticalExtensions(cert)) + return false; + + return true; +} + +// Checks that if the target certificate has properties that only a CA should +// have (keyCertSign, CA=true, pathLenConstraint), then its other properties +// are consistent with being a CA. +// +// This follows from some requirements in RFC 5280 section 4.2.1.9. In +// particular: +// +// CAs MUST NOT include the pathLenConstraint field unless the cA +// boolean is asserted and the key usage extension asserts the +// keyCertSign bit. +// +// And: +// +// If the cA boolean is not asserted, then the keyCertSign bit in the key +// usage extension MUST NOT be asserted. +// +// TODO(eroman): Strictly speaking the first requirement is on CAs and not the +// certificate client, so could be skipped. +// +// TODO(eroman): I don't believe Firefox enforces the keyCertSign restriction +// for compatibility reasons. Investigate if we need to similarly relax this +// constraint. +WARN_UNUSED_RESULT bool VerifyTargetCertHasConsistentCaBits( + const FullyParsedCert& cert) { + // Check if the certificate contains any property specific to CAs. + bool has_ca_property = + (cert.has_basic_constraints && + (cert.basic_constraints.is_ca || cert.basic_constraints.has_path_len)) || + (cert.has_key_usage && + cert.key_usage.AssertsBit(KEY_USAGE_BIT_KEY_CERT_SIGN)); + + // If it "looks" like a CA because it has a CA-only property, then check that + // it sets ALL the properties expected of a CA. + if (has_ca_property) { + return cert.has_basic_constraints && cert.basic_constraints.is_ca && + (!cert.has_key_usage || + cert.key_usage.AssertsBit(KEY_USAGE_BIT_KEY_CERT_SIGN)); + } + + return true; +} + +// This function corresponds with RFC 5280 section 6.1.5's "Wrap-Up Procedure". +// It does processing for the final certificate (the target cert). +WARN_UNUSED_RESULT bool WrapUp(const FullyParsedCert& cert) { + // TODO(eroman): Steps a-c are omitted as policy/name constraints are not yet + // implemented. + + // Note step c-e are omitted the verification function does + // not output the working public key. + + // From RFC 5280 section 6.1.5 step f: + // + // Recognize and process any other critical extension present in + // the certificate n. Process any other recognized non-critical + // extension present in certificate n that is relevant to path + // processing. + // + // Note that this is duplicated by PrepareForNextCertificate() so as to + // directly match the procedures in RFC 5280's section 6.1. + if (!VerifyNoUnconsumedCriticalExtensions(cert)) + return false; + + // TODO(eroman): Step g is omitted, as policy constraints are not yet + // implemented. + + // The following check is NOT part of RFC 5280 6.1.5's "Wrap-Up Procedure", + // however is implied by RFC 5280 section 4.2.1.9. + if (!VerifyTargetCertHasConsistentCaBits(cert)) + return false; + + return true; +} + +} // namespace + +TrustAnchor::~TrustAnchor() {} + +TrustStore::TrustStore() {} +TrustStore::~TrustStore() {} + +// This implementation is structured to mimic the description of certificate +// path verification given by RFC 5280 section 6.1. +bool VerifyCertificateChain(const std::vector<der::Input>& certs_der, + const TrustStore& trust_store, + const SignaturePolicy* signature_policy, + const der::GeneralizedTime& time) { + // An empty chain is necessarily invalid. + if (certs_der.empty()) + return false; + + // |working_spki| is an amalgamation of 3 separate variables from RFC 5280: + // * working_public_key + // * working_public_key_algorithm + // * working_public_key_parameters + // + // They are combined for simplicity since the signature verification takes an + // SPKI, and the parameter inheritence is not applicable for the supported + // key types. + // + // An approximate explanation of |working_spki| is this description from RFC + // 5280 section 6.1.2: + // + // working_public_key: the public key used to verify the + // signature of a certificate. The working_public_key is + // initialized from the trusted public key provided in the trust + // anchor information. + der::Input working_spki; + + // |working_issuer_name| corresponds with the same named variable in RFC 5280 + // section 6.1.2: + // + // working_issuer_name: the issuer distinguished name expected + // in the next certificate in the chain. The + // working_issuer_name is initialized to the trusted issuer name + // provided in the trust anchor information. + der::Input working_issuer_name; + + // |max_path_length| corresponds with the same named variable in RFC 5280 + // section 6.1.2: + // + // max_path_length: this integer is initialized to n, is + // decremented for each non-self-issued certificate in the path, + // and may be reduced to the value in the path length constraint + // field within the basic constraints extension of a CA + // certificate. + size_t max_path_length = certs_der.size(); + + // Iterate over all the certificates in the reverse direction: starting from + // the trust anchor and progressing towards the target certificate. + // + // Note that |i| uses 0-based indexing whereas in RFC 5280 it is 1-based. + // + // * i=0 : Certificate signed by a trust anchor. + // * i=N-1 : Target certificate. + for (size_t i = 0; i < certs_der.size(); ++i) { + const size_t index_into_certs_der = certs_der.size() - i - 1; + const bool is_target_cert = index_into_certs_der == 0; + + // Parse the current certificate into |cert|. + FullyParsedCert cert; + const der::Input& cert_der = certs_der[index_into_certs_der]; + if (!FullyParseCertificate(cert_der, &cert)) + return false; + + // When processing the first certificate, initialize |working_spki| + // and |working_issuer_name| to the trust anchor per RFC 5280 section 6.1.2. + // This is done inside the loop in order to have access to the parsed + // certificate. + if (i == 0) { + const TrustAnchor* trust_anchor = + FindTrustAnchorByName(trust_store, cert.tbs.issuer_tlv); + if (!trust_anchor) + return false; + working_spki = InputFromString(&trust_anchor->spki); + working_issuer_name = InputFromString(&trust_anchor->name); + } + + // Per RFC 5280 section 6.1: + // * Do basic processing for each certificate + // * If it is the last certificate in the path (target certificate) + // - Then run "Wrap up" + // - Otherwise run "Prepare for Next cert" + if (!BasicCertificateProcessing(cert, signature_policy, time, working_spki, + working_issuer_name)) { + return false; + } + if (!is_target_cert) { + if (!PrepareForNextCertificate(cert, &max_path_length, &working_spki, + &working_issuer_name)) { + return false; + } + } else { + if (!WrapUp(cert)) + return false; + } + } + + // TODO(eroman): RFC 5280 forbids duplicate certificates per section 6.1: + // + // A certificate MUST NOT appear more than once in a prospective + // certification path. + + return true; +} + +} // namespace net
diff --git a/net/cert/internal/verify_certificate_chain.h b/net/cert/internal/verify_certificate_chain.h new file mode 100644 index 0000000..c0f8a2a --- /dev/null +++ b/net/cert/internal/verify_certificate_chain.h
@@ -0,0 +1,87 @@ +// 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 NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_ +#define NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_ + +#include <stdint.h> + +#include <string> +#include <vector> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "net/base/net_export.h" + +namespace net { + +namespace der { +class Input; +struct GeneralizedTime; +} + +class SignaturePolicy; + +struct NET_EXPORT TrustAnchor { + ~TrustAnchor(); + + // DER-encoded SubjectPublicKeyInfo for the trusted key. + std::string spki; + + // DER-encoded "Name" corresponding to the key. + std::string name; +}; + +// A very simple implementation of a TrustStore, which contains mappings from +// names to trusted public keys. +struct NET_EXPORT TrustStore { + TrustStore(); + ~TrustStore(); + + std::vector<TrustAnchor> anchors; +}; + +// VerifyCertificateChain() verifies a certificate path (chain) based on the +// rules in RFC 5280. +// +// WARNING: This implementation is in progress, and is currently +// incomplete. DO NOT USE IT unless its limitations are acceptable for your use. +// +// --------- +// Inputs +// --------- +// +// cert_chain: +// A non-empty chain of N DER-encoded certificates, listed in the +// "forward" direction. +// +// * cert_chain[0] is the target certificate to verify. +// * cert_chain[i+1] holds the certificate that issued cert_chain[i]. +// * cert_chain[N-1] must have been issued by a trust anchor +// +// trust_store: +// Contains the set of trusted public keys (and their names). +// +// signature_policy: +// The policy to use when verifying signatures (what hash algorithms are +// allowed, what length keys, what named curves, etc). +// +// time: +// The UTC time to use for expiration checks. +// +// --------- +// Outputs +// --------- +// +// Returns true if the target certificate can be verified. +NET_EXPORT bool VerifyCertificateChain(const std::vector<der::Input>& certs_der, + const TrustStore& trust_store, + const SignaturePolicy* signature_policy, + const der::GeneralizedTime& time) + WARN_UNUSED_RESULT; + +} // namespace net + +#endif // NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_
diff --git a/net/cert/internal/verify_certificate_chain_unittest.cc b/net/cert/internal/verify_certificate_chain_unittest.cc new file mode 100644 index 0000000..96a2d8c --- /dev/null +++ b/net/cert/internal/verify_certificate_chain_unittest.cc
@@ -0,0 +1,238 @@ +// 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 "net/cert/internal/verify_certificate_chain.h" + +#include "base/base_paths.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "net/cert/internal/parse_certificate.h" +#include "net/cert/internal/signature_policy.h" +#include "net/cert/internal/test_helpers.h" +#include "net/cert/pem_tokenizer.h" +#include "net/der/input.h" +#include "testing/gtest/include/gtest/gtest.h" + +// TODO(eroman): Because VerifySignedData() is only implemented for BoringSSL +// these tests also depend on BoringSSL. +#if defined(USE_OPENSSL) + +namespace net { + +namespace { + +// Reads a data file from the unit-test data. +std::string ReadTestFileToString(const std::string& file_name) { + // Compute the full path, relative to the src/ directory. + base::FilePath src_root; + PathService::Get(base::DIR_SOURCE_ROOT, &src_root); + base::FilePath filepath = src_root.AppendASCII( + std::string("net/data/verify_certificate_chain_unittest/") + file_name); + + // Read the full contents of the file. + std::string file_data; + if (!base::ReadFileToString(filepath, &file_data)) { + ADD_FAILURE() << "Couldn't read file: " << filepath.value(); + return std::string(); + } + + return file_data; +} + +// Adds the certificate |cert_der| as a trust anchor to |trust_store|. +void AddCertificateToTrustStore(const std::string& cert_der, + TrustStore* trust_store) { + ParsedCertificate cert; + ASSERT_TRUE(ParseCertificate(InputFromString(&cert_der), &cert)); + + ParsedTbsCertificate tbs; + ASSERT_TRUE(ParseTbsCertificate(cert.tbs_certificate_tlv, &tbs)); + TrustAnchor anchor = {tbs.spki_tlv.AsString(), tbs.subject_tlv.AsString()}; + trust_store->anchors.push_back(anchor); +} + +// Reads a test case from |file_name|. Test cases are comprised of a +// certificate chain, trust store, a timestamp to validate at, and the +// expected result of verification. +void ReadTestFromFile(const std::string& file_name, + std::vector<std::string>* chain, + TrustStore* trust_store, + der::GeneralizedTime* time, + bool* verify_result) { + chain->clear(); + *trust_store = TrustStore(); + + std::string file_data = ReadTestFileToString(file_name); + + std::vector<std::string> pem_headers; + + const char kCertificateHeader[] = "CERTIFICATE"; + const char kTrustedCertificateHeader[] = "TRUSTED_CERTIFICATE"; + const char kTimeHeader[] = "TIME"; + const char kResultHeader[] = "VERIFY_RESULT"; + + pem_headers.push_back(kCertificateHeader); + pem_headers.push_back(kTrustedCertificateHeader); + pem_headers.push_back(kTimeHeader); + pem_headers.push_back(kResultHeader); + + bool has_time = false; + bool has_result = false; + + PEMTokenizer pem_tokenizer(file_data, pem_headers); + while (pem_tokenizer.GetNext()) { + const std::string& block_type = pem_tokenizer.block_type(); + const std::string& block_data = pem_tokenizer.data(); + + if (block_type == kCertificateHeader) { + chain->push_back(block_data); + } else if (block_type == kTrustedCertificateHeader) { + AddCertificateToTrustStore(block_data, trust_store); + } else if (block_type == kTimeHeader) { + ASSERT_FALSE(has_time) << "Duplicate " << kTimeHeader; + has_time = true; + ASSERT_TRUE(der::ParseUTCTime(InputFromString(&block_data), time)); + } else if (block_type == kResultHeader) { + ASSERT_FALSE(has_result) << "Duplicate " << kResultHeader; + ASSERT_TRUE(block_data == "SUCCESS" || block_data == "FAIL") + << "Unrecognized result: " << block_data; + has_result = true; + *verify_result = block_data == "SUCCESS"; + } + } + + ASSERT_TRUE(has_time); + ASSERT_TRUE(has_result); +} + +void RunTest(const char* file_name) { + std::vector<std::string> chain; + TrustStore trust_store; + der::GeneralizedTime time; + bool expected_result; + + ReadTestFromFile(file_name, &chain, &trust_store, &time, &expected_result); + + std::vector<der::Input> input_chain; + for (const auto& cert_str : chain) + input_chain.push_back(InputFromString(&cert_str)); + + SimpleSignaturePolicy signature_policy(2048); + + bool result = + VerifyCertificateChain(input_chain, trust_store, &signature_policy, time); + + ASSERT_EQ(expected_result, result); +} + +TEST(VerifyCertificateChainTest, TargetAndIntermediary) { + RunTest("target-and-intermediary.pem"); +} + +TEST(VerifyCertificateChainTest, UnknownRoot) { + RunTest("unknown-root.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediaryLacksBasicConstraints) { + RunTest("intermediary-lacks-basic-constraints.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediaryBasicConstraintsCaFalse) { + RunTest("intermediary-basic-constraints-ca-false.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediaryBasicConstraintsNotCritical) { + RunTest("intermediary-basic-constraints-not-critical.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediaryLacksSigningKeyUsage) { + RunTest("intermediary-lacks-signing-key-usage.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediaryUnknownCriticalExtension) { + RunTest("intermediary-unknown-critical-extension.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediaryUnknownNonCriticalExtension) { + RunTest("intermediary-unknown-non-critical-extension.pem"); +} + +TEST(VerifyCertificateChainTest, ViolatesBasicConstraintsPathlen0) { + RunTest("violates-basic-constraints-pathlen-0.pem"); +} + +TEST(VerifyCertificateChainTest, BasicConstraintsPathlen0SelfIssued) { + RunTest("basic-constraints-pathlen-0-self-issued.pem"); +} + +TEST(VerifyCertificateChainTest, TargetSignedWithMd5) { + RunTest("target-signed-with-md5.pem"); +} + +TEST(VerifyCertificateChainTest, IntermediarySignedWithMd5) { + RunTest("intermediary-signed-with-md5.pem"); +} + +TEST(VerifyCertificateChainTest, TargetWrongSignature) { + RunTest("target-wrong-signature.pem"); +} + +TEST(VerifyCertificateChainTest, TargetSignedBy512bitRsa) { + RunTest("target-signed-by-512bit-rsa.pem"); +} + +TEST(VerifyCertificateChainTest, TargetSignedUsingEcdsa) { + RunTest("target-signed-using-ecdsa.pem"); +} + +TEST(VerifyCertificateChainTest, ExpiredIntermediary) { + RunTest("expired-intermediary.pem"); +} + +TEST(VerifyCertificateChainTest, ExpiredTarget) { + RunTest("expired-target.pem"); +} + +TEST(VerifyCertificateChainTest, ExpiredTargetNotBefore) { + RunTest("expired-target-notBefore.pem"); +} + +TEST(VerifyCertificateChainTest, TargetNotEndEntity) { + RunTest("target-not-end-entity.pem"); +} + +TEST(VerifyCertificateChainTest, TargetHasKeyCertSignButNotCa) { + RunTest("target-has-keycertsign-but-not-ca.pem"); +} + +TEST(VerifyCertificateChainTest, TargetHasPathlenButNotCa) { + RunTest("target-has-pathlen-but-not-ca.pem"); +} + +TEST(VerifyCertificateChainTest, TargetUnknownCriticalExtension) { + RunTest("target-unknown-critical-extension.pem"); +} + +// Tests that verifying a chain with no certificates fails. +TEST(VerifyCertificateChainTest, EmptyChainIsInvalid) { + TrustStore trust_store; + der::GeneralizedTime time; + std::vector<der::Input> chain; + SimpleSignaturePolicy signature_policy(2048); + + ASSERT_FALSE( + VerifyCertificateChain(chain, trust_store, &signature_policy, time)); +} + +// TODO(eroman): Add test that invalidate validity dates where the day or month +// ordinal not in range, like "March 39, 2016" are rejected. + +} // namespace + +} // namespace net + +#endif
diff --git a/net/data/verify_certificate_chain_unittest/README b/net/data/verify_certificate_chain_unittest/README new file mode 100644 index 0000000..11cc4cb --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/README
@@ -0,0 +1,29 @@ +This directory contains test data for verifying certificate chains. + +It contains the following types of files: + +=============================== +generate-*.py +=============================== + +Generates the file for an individual test case. If the python file was +named generate-XXX.py, then the corresponding output will be named +XXX.pem. + +=============================== +generate-all.sh +=============================== + +Runs all of the generate-*.py scripts and does some cleanup. + +=============================== +*.pem +=============================== + +These files descibe a test case for certificate chain verification. + +The input file is a PEM file with blocks for: + * The trust store + * The certificate chain (target certificate and all intermediaries) + * The timestamp to use when verifying + * The expected result of verification (success or fail)
diff --git a/net/data/verify_certificate_chain_unittest/basic-constraints-pathlen-0-self-issued.pem b/net/data/verify_certificate_chain_unittest/basic-constraints-pathlen-0-self-issued.pem new file mode 100644 index 0000000..5ed112630 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/basic-constraints-pathlen-0-self-issued.pem
@@ -0,0 +1,370 @@ +[Created by: generate-basic-constraints-pathlen-0-self-issued.py] + +Certificate chain with 2 intermediaries. The first intermediary has a basic +constraints path length of 0. The second one is self-issued so does not count +against the path length. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cc:d5:1f:2f:97:16:d6:23:ca:d5:a1:c1:97:42: + 2b:7e:3e:7f:45:44:70:b9:8d:81:76:be:b4:69:56: + 78:a9:14:10:69:ad:60:8e:ed:80:b2:a2:f9:85:d6: + fe:4c:81:d0:30:8e:c8:75:48:29:48:b9:ad:9f:a9: + 83:b6:4f:c7:ba:40:f9:d5:66:9f:f9:51:48:72:0d: + 95:38:65:da:41:8a:91:4a:e1:34:d6:1c:a0:0b:ee: + 4d:07:69:0c:74:87:58:79:1b:e5:7b:51:ae:19:36: + b2:6a:a6:89:81:30:bd:51:c1:7f:99:86:63:78:48: + a6:8e:74:f6:5f:cc:fb:3f:12:ac:2e:e7:a8:75:15: + b7:5b:37:dd:ce:54:68:ae:0d:ad:80:13:b5:d7:06: + 98:39:a9:67:f9:fb:c1:7f:e0:f6:6b:14:f3:d3:b4: + f4:33:2c:41:9e:69:63:de:b3:f9:cd:4e:f8:58:98: + dd:6f:9b:9a:b7:82:19:c1:01:c9:2d:fb:d3:5a:48: + 5f:e4:e5:c5:6e:5f:b1:3b:31:49:65:f0:0d:46:a5: + 33:fb:57:23:fc:ca:17:51:72:fc:5a:f7:7c:44:74: + 24:3b:cc:54:2c:e3:d4:8b:e9:9c:13:da:78:58:a1: + d8:00:19:30:ee:3d:29:fb:2b:7a:79:b8:69:f2:3b: + d3:19 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 6D:49:C7:0A:DE:44:7C:B7:07:ED:87:EF:41:DE:5D:12:91:28:3D:1C + X509v3 Authority Key Identifier: + keyid:31:9F:A3:DB:EA:90:94:EB:3D:93:39:9F:BA:8A:05:7E:2C:94:23:9B + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 34:51:df:38:e9:c2:df:c6:2c:01:00:7e:a1:4b:5e:d1:43:8a: + d7:4e:ff:49:5d:17:e7:bd:e2:3c:cd:43:63:4d:a9:05:97:bf: + 76:e2:8d:90:d2:dd:ea:6b:4c:e3:1e:c1:7b:8b:35:5a:24:cc: + d8:b2:9a:12:07:d2:66:fa:fd:3c:79:b4:a7:d7:cb:69:af:07: + f7:9d:66:34:ee:ed:22:1f:7d:58:9e:e1:49:90:88:95:1e:27: + 2a:3d:dc:a9:b9:1d:2b:1f:88:b9:0c:89:a1:bc:dd:25:97:b9: + 32:0e:02:86:fa:a3:2c:cd:8e:29:e5:68:12:3b:5b:bf:0e:cc: + 25:ad:06:ef:77:26:d7:b4:84:cf:ba:00:55:c4:f0:95:39:88: + ff:22:f8:a5:89:8a:d2:31:aa:e7:98:76:02:19:bd:04:bc:5c: + 26:be:5e:eb:96:2b:f6:a2:cf:13:3e:a1:82:92:63:c0:13:bc: + b6:f9:06:fb:77:c3:0f:cd:39:b1:af:43:b5:9d:fc:64:d4:bd: + d0:81:5c:06:fb:8b:0e:c5:59:0b:07:d6:a7:8b:a9:8e:b3:6b: + f5:ed:9b:ea:ea:f7:6f:ea:2b:02:df:62:92:ae:98:fb:45:ca: + bc:1c:6b:eb:6d:33:e3:0e:32:0f:0d:e3:7f:5c:ef:e3:1b:c2: + f6:fc:99:a4 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM1R8v +lxbWI8rVocGXQit+Pn9FRHC5jYF2vrRpVnipFBBprWCO7YCyovmF1v5MgdAwjsh1 +SClIua2fqYO2T8e6QPnVZp/5UUhyDZU4ZdpBipFK4TTWHKAL7k0HaQx0h1h5G+V7 +Ua4ZNrJqpomBML1RwX+ZhmN4SKaOdPZfzPs/Eqwu56h1FbdbN93OVGiuDa2AE7XX +Bpg5qWf5+8F/4PZrFPPTtPQzLEGeaWPes/nNTvhYmN1vm5q3ghnBAckt+9NaSF/k +5cVuX7E7MUll8A1GpTP7VyP8yhdRcvxa93xEdCQ7zFQs49SL6ZwT2nhYodgAGTDu +PSn7K3p5uGnyO9MZAgMBAAGjgekwgeYwHQYDVR0OBBYEFG1JxwreRHy3B+2H70He +XRKRKD0cMB8GA1UdIwQYMBaAFDGfo9vqkJTrPZM5n7qKBX4slCObMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEANFHfOOnC38YsAQB+oUte +0UOK107/SV0X573iPM1DY02pBZe/duKNkNLd6mtM4x7Be4s1WiTM2LKaEgfSZvr9 +PHm0p9fLaa8H951mNO7tIh99WJ7hSZCIlR4nKj3cqbkdKx+IuQyJobzdJZe5Mg4C +hvqjLM2OKeVoEjtbvw7MJa0G73cm17SEz7oAVcTwlTmI/yL4pYmK0jGq55h2Ahm9 +BLxcJr5e65Yr9qLPEz6hgpJjwBO8tvkG+3fDD805sa9DtZ38ZNS90IFcBvuLDsVZ +CwfWp4upjrNr9e2b6ur3b+orAt9ikq6Y+0XKvBxr620z4w4yDw3jf1zv4xvC9vyZ +pA== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e6:56:91:e6:27:53:a1:d7:64:56:d8:c8:57:b7: + 55:7c:89:a2:b4:9d:ab:72:f0:bc:03:35:16:53:77: + 7e:ef:bf:0b:f5:91:d5:de:ae:bb:ae:ae:3a:53:00: + ec:80:3b:a0:2b:d3:6a:ae:0c:d0:4c:a1:24:b2:b4: + 77:de:ad:81:0f:70:f8:f4:dc:f8:c7:6e:f8:54:29: + 84:3a:b8:83:f4:95:22:80:ae:71:b0:dd:4e:ba:82: + 87:80:d1:c7:f3:ad:a7:45:c5:db:47:3c:8e:84:31: + bc:c6:bd:29:77:70:39:78:f4:3b:5e:ae:8f:d9:44: + 6b:1a:1d:cb:f9:7b:84:14:7c:5b:b8:82:3c:ed:47: + 16:c6:4e:2b:75:5a:1b:b4:5d:0c:0a:2f:55:b6:48: + 87:a1:25:a2:a9:5b:e4:a8:f9:bc:70:24:92:07:7f: + 5b:94:83:3b:44:78:65:cb:62:0c:30:fa:cf:f1:f7: + 20:9e:76:c8:52:78:8b:f8:30:62:f0:66:28:8a:7f: + ba:74:12:f8:05:ef:29:d8:17:cb:8a:95:61:fc:af: + 58:d2:e2:86:d7:8c:fb:3b:56:28:8d:e4:d9:27:48: + b6:c1:fc:9a:4e:d4:24:b8:68:c3:32:5d:65:30:6e: + a3:9e:b9:bf:6e:a7:3b:b4:3d:2e:5d:13:a1:28:4e: + a4:0d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 31:9F:A3:DB:EA:90:94:EB:3D:93:39:9F:BA:8A:05:7E:2C:94:23:9B + X509v3 Authority Key Identifier: + keyid:73:4C:95:45:4C:3B:F6:7E:7B:92:30:C9:AC:30:51:E7:7D:21:D2:BF + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Signature Algorithm: sha256WithRSAEncryption + 0d:7d:a3:df:40:cd:02:79:b5:69:5d:c5:a7:eb:bc:87:95:c3: + 17:fc:73:dd:59:a8:c2:d3:67:71:15:09:7a:9b:f8:01:5d:a0: + d2:a3:e5:37:1d:f5:f3:2c:fd:8d:8e:e7:6c:ca:01:2a:83:a8: + 00:c9:65:26:8e:ab:0b:13:91:9c:00:9a:a3:60:44:8c:82:0f: + 04:1e:74:b1:c6:4f:a6:da:37:70:16:35:03:92:f2:04:ab:c8: + 21:97:a8:b4:e3:bf:bf:67:9e:ce:c3:24:df:6a:cc:43:d6:ea: + 59:89:b7:3e:1c:de:ed:ab:99:ec:26:60:3b:b7:84:4b:e0:1a: + b7:be:6d:20:7b:f4:88:a2:bf:95:3f:6e:7a:fa:ea:e1:55:72: + 88:ae:67:b3:13:1a:3a:1f:07:16:1d:84:fd:e5:e3:1e:90:ec: + dc:d2:ce:73:c0:50:19:69:10:dc:c7:db:91:46:f4:50:52:87: + 94:6e:ce:ef:a6:20:57:d2:ad:36:95:1e:94:7f:a3:8f:d9:0d: + 99:dd:8f:e3:2a:b2:2b:69:a0:f7:26:4e:cd:f2:f1:cf:05:14: + 31:3d:aa:71:01:dd:42:24:19:62:5c:00:1b:98:ac:7d:45:f2: + e6:14:dd:2e:10:06:74:39:61:6d:b9:3c:68:c1:e7:3d:b6:3d: + e1:75:c9:fd +-----BEGIN CERTIFICATE----- +MIIDiDCCAnCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjAXMRUwEwYD +VQQDDAxJbnRlcm1lZGlhcnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDmVpHmJ1Oh12RW2MhXt1V8iaK0naty8LwDNRZTd37vvwv1kdXerruurjpTAOyA +O6Ar02quDNBMoSSytHferYEPcPj03PjHbvhUKYQ6uIP0lSKArnGw3U66goeA0cfz +radFxdtHPI6EMbzGvSl3cDl49Dtero/ZRGsaHcv5e4QUfFu4gjztRxbGTit1Whu0 +XQwKL1W2SIehJaKpW+So+bxwJJIHf1uUgztEeGXLYgww+s/x9yCedshSeIv4MGLw +ZiiKf7p0EvgF7ynYF8uKlWH8r1jS4obXjPs7ViiN5NknSLbB/JpO1CS4aMMyXWUw +bqOeub9upzu0PS5dE6EoTqQNAgMBAAGjgd4wgdswHQYDVR0OBBYEFDGfo9vqkJTr +PZM5n7qKBX4slCObMB8GA1UdIwQYMBaAFHNMlUVMO/Z+e5IwyawwUed9IdK/MD8G +CCsGAQUFBwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0lu +dGVybWVkaWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3It +Y3JsL0ludGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQI +MAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBAA19o99AzQJ5tWldxafrvIeVwxf8 +c91ZqMLTZ3EVCXqb+AFdoNKj5Tcd9fMs/Y2O52zKASqDqADJZSaOqwsTkZwAmqNg +RIyCDwQedLHGT6baN3AWNQOS8gSryCGXqLTjv79nns7DJN9qzEPW6lmJtz4c3u2r +mewmYDu3hEvgGre+bSB79Iiiv5U/bnr66uFVcoiuZ7MTGjofBxYdhP3l4x6Q7NzS +znPAUBlpENzH25FG9FBSh5Ruzu+mIFfSrTaVHpR/o4/ZDZndj+MqsitpoPcmTs3y +8c8FFDE9qnEB3UIkGWJcABuYrH1F8uYU3S4QBnQ5YW25PGjB5z22PeF1yf0= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c9:30:53:c1:b9:0f:27:7a:39:3d:39:c4:a3:7c: + 96:bb:0e:e4:d9:fd:10:76:98:36:62:fc:33:7c:02: + 47:6c:6f:2e:d2:61:aa:d5:e3:86:67:a2:ef:93:a3: + fd:15:83:1c:27:90:f3:81:4a:41:f2:e6:e6:be:26: + 9a:b0:77:1d:e5:8a:97:2d:a7:87:6b:80:49:26:0e: + da:48:36:ba:eb:71:6a:cb:b4:82:66:42:fd:58:5f: + bc:c9:18:30:ee:2f:0c:28:81:e7:36:b9:76:da:55: + 8c:7a:cf:a9:1f:04:c6:6e:42:ea:d3:83:c6:8d:04: + 26:9e:11:8a:c6:cd:25:c7:4a:58:d1:98:86:b5:37: + 9c:3e:68:2e:17:4d:81:85:f3:d4:7d:65:e7:0f:86: + 8a:c9:d0:2d:fc:4f:c7:40:2a:ef:48:ab:2e:4c:2e: + b6:1c:81:4e:73:73:e9:cc:d4:ef:94:b1:17:2c:70: + 64:b0:4c:ad:87:cf:45:13:c2:67:46:d1:c6:b3:61: + 8d:77:af:4f:1c:b6:4f:b6:d9:2b:3c:4c:5f:72:23: + 77:c7:85:65:1d:85:48:28:06:34:b4:f0:bd:a9:76: + 7a:65:60:59:d6:f6:26:f6:85:99:7b:84:16:5e:91: + 8d:f9:90:b8:75:d3:4a:77:6a:1f:f8:ed:66:67:22: + 64:4b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 73:4C:95:45:4C:3B:F6:7E:7B:92:30:C9:AC:30:51:E7:7D:21:D2:BF + X509v3 Authority Key Identifier: + keyid:DE:10:87:7A:48:75:9E:50:89:F1:AE:40:E0:BF:BA:5F:D8:63:77:9B + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Signature Algorithm: sha256WithRSAEncryption + 3f:40:c5:c8:06:d9:35:27:63:63:e7:9c:08:1d:ee:ef:e3:b6: + 11:a7:a2:4f:b0:bf:8b:14:2f:16:6f:47:f5:0b:d8:3d:98:7a: + 03:7d:30:0c:85:11:80:a6:ff:fc:99:dd:a0:31:d6:fb:bf:4f: + 09:49:64:ca:8a:34:3d:56:c3:72:b0:08:e2:b8:12:95:1e:70: + 4f:3f:5b:1e:70:6f:06:f0:78:77:90:3b:d1:54:83:f2:b1:8e: + 7e:25:d3:f7:21:66:8b:a9:c4:f7:f6:bb:a9:7a:3b:e0:99:4c: + 94:b7:45:3a:fe:61:74:0a:70:de:a0:d6:c1:c4:dd:59:0e:cc: + 81:d1:ad:da:99:1d:83:b3:e2:3a:7b:8f:5c:3a:25:52:3e:40: + 5a:96:00:71:e6:f3:5d:9c:6a:54:be:0f:24:8e:8b:3a:14:37: + 6a:72:0b:41:e6:06:d1:b2:3d:f9:a2:bb:d7:6e:f1:ac:70:08: + 62:e7:f2:82:df:fb:85:e4:99:b9:cf:84:9a:34:55:e5:e8:39: + a9:e7:e3:79:54:07:c9:6b:1d:33:aa:30:d3:ea:7b:32:07:0f: + 23:34:10:fa:58:17:ad:e0:62:c8:ce:d6:0f:db:34:0c:a3:a9: + f9:09:05:c6:25:d9:ce:e5:52:0a:5c:8a:f3:c9:44:72:45:71: + 6d:5c:fc:d1 +-----BEGIN CERTIFICATE----- +MIIDcDCCAligAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyTBTwbkP +J3o5PTnEo3yWuw7k2f0Qdpg2YvwzfAJHbG8u0mGq1eOGZ6Lvk6P9FYMcJ5DzgUpB +8ubmviaasHcd5YqXLaeHa4BJJg7aSDa663Fqy7SCZkL9WF+8yRgw7i8MKIHnNrl2 +2lWMes+pHwTGbkLq04PGjQQmnhGKxs0lx0pY0ZiGtTecPmguF02BhfPUfWXnD4aK +ydAt/E/HQCrvSKsuTC62HIFOc3PpzNTvlLEXLHBksEyth89FE8JnRtHGs2GNd69P +HLZPttkrPExfciN3x4VlHYVIKAY0tPC9qXZ6ZWBZ1vYm9oWZe4QWXpGN+ZC4ddNK +d2of+O1mZyJkSwIDAQABo4HOMIHLMB0GA1UdDgQWBBRzTJVFTDv2fnuSMMmsMFHn +fSHSvzAfBgNVHSMEGDAWgBTeEId6SHWeUInxrkDgv7pf2GN3mzA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQELBQAD +ggEBAD9AxcgG2TUnY2PnnAgd7u/jthGnok+wv4sULxZvR/UL2D2YegN9MAyFEYCm +//yZ3aAx1vu/TwlJZMqKND1Ww3KwCOK4EpUecE8/Wx5wbwbweHeQO9FUg/Kxjn4l +0/chZoupxPf2u6l6O+CZTJS3RTr+YXQKcN6g1sHE3VkOzIHRrdqZHYOz4jp7j1w6 +JVI+QFqWAHHm812calS+DySOizoUN2pyC0HmBtGyPfmiu9du8axwCGLn8oLf+4Xk +mbnPhJo0VeXoOann43lUB8lrHTOqMNPqezIHDyM0EPpYF63gYsjO1g/bNAyjqfkJ +BcYl2c7lUgpcivPJRHJFcW1c/NE= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a8:11:83:b7:cc:88:e9:4c:69:28:ad:6a:95:83: + 6a:1c:28:52:d2:02:21:00:93:f0:82:8e:fc:b8:fb: + b9:44:e2:43:e9:fe:3f:7e:0c:01:a6:9f:12:fc:09: + fc:66:44:03:b4:66:78:3c:36:05:37:00:6e:87:54: + ff:61:95:ab:37:88:a0:6e:f7:8f:c2:ea:8d:e5:bf: + 4c:21:21:1d:74:22:dd:93:52:b3:66:d7:97:33:b9: + cb:ab:8e:38:59:52:e7:f0:5c:09:50:ad:c9:e0:e1: + 18:d7:cc:4a:d7:2b:41:cd:91:8c:a2:b0:25:d6:6c: + d2:7d:e8:fa:20:3f:c8:aa:15:b9:77:b6:da:ac:86: + f8:21:52:2e:f9:e7:b6:d5:65:fd:23:ba:2f:5b:1b: + c6:62:76:00:f1:74:4b:e2:d9:9a:d3:67:03:71:d4: + 93:af:93:4d:4f:82:da:1c:ba:a5:a9:0f:25:6b:54: + dd:63:8c:3e:34:75:32:9e:c8:99:44:fd:f0:47:6d: + 98:45:3c:75:b5:ac:0b:eb:d6:30:6a:a1:6c:67:14: + ee:62:72:93:fe:bc:4c:e8:10:a2:3c:66:33:1c:49: + e8:dc:2f:c9:a4:64:17:88:a0:1c:a4:b0:ff:9c:8f: + c4:c6:18:1d:0c:55:62:a9:3b:f6:bc:53:16:62:82: + 49:c5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + DE:10:87:7A:48:75:9E:50:89:F1:AE:40:E0:BF:BA:5F:D8:63:77:9B + X509v3 Authority Key Identifier: + keyid:DE:10:87:7A:48:75:9E:50:89:F1:AE:40:E0:BF:BA:5F:D8:63:77:9B + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 27:c0:50:82:2b:1b:71:84:c6:12:ea:45:ed:21:b8:fd:7c:08: + 68:ec:de:4a:1b:98:3b:ce:e9:a1:9e:42:9a:e0:f4:e2:09:a6: + 5c:98:33:16:5b:65:6b:fc:b9:9b:26:90:e1:86:58:1f:0a:7e: + 7e:0d:7d:4e:0e:8b:93:04:b9:84:f0:e8:a3:7f:34:e2:ab:f5: + d5:bb:46:b7:df:a0:3a:81:8c:56:48:02:95:8f:06:cb:f2:cd: + 2a:39:c6:12:5a:9d:62:e9:a9:49:55:4d:e9:17:c2:97:3d:81: + 12:76:d8:68:18:f6:7e:a6:c4:52:a9:85:4c:83:38:94:2b:df: + dd:39:bb:cf:e1:9e:4e:e1:a0:eb:63:8a:c0:6e:99:01:65:78: + b5:ca:ab:2a:90:86:c5:5e:53:62:57:89:14:c1:41:8f:e6:9a: + 60:97:e4:5c:5b:fa:28:9c:9f:e3:55:ed:42:36:b6:d0:8d:f3: + 0c:cf:6e:87:38:aa:98:91:a9:1f:48:2a:c7:27:49:04:d6:d6: + f8:33:c9:d0:e2:b7:87:00:9a:1f:63:af:5b:ac:70:7e:96:9f: + b0:3b:e5:a3:f8:04:b6:f8:2c:38:54:21:06:51:33:32:78:80: + 17:59:83:95:66:65:1d:b5:5b:f2:1b:3e:6d:9e:98:c2:09:f3: + ec:52:20:5b +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgRg7fMiOlMaSitapWD +ahwoUtICIQCT8IKO/Lj7uUTiQ+n+P34MAaafEvwJ/GZEA7RmeDw2BTcAbodU/2GV +qzeIoG73j8LqjeW/TCEhHXQi3ZNSs2bXlzO5y6uOOFlS5/BcCVCtyeDhGNfMStcr +Qc2RjKKwJdZs0n3o+iA/yKoVuXe22qyG+CFSLvnnttVl/SO6L1sbxmJ2APF0S+LZ +mtNnA3HUk6+TTU+C2hy6pakPJWtU3WOMPjR1Mp7ImUT98EdtmEU8dbWsC+vWMGqh +bGcU7mJyk/68TOgQojxmMxxJ6NwvyaRkF4igHKSw/5yPxMYYHQxVYqk79rxTFmKC +ScUCAwEAAaOByzCByDAdBgNVHQ4EFgQU3hCHekh1nlCJ8a5A4L+6X9hjd5swHwYD +VR0jBBgwFoAU3hCHekh1nlCJ8a5A4L+6X9hjd5swNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAnwFCCKxtx +hMYS6kXtIbj9fAho7N5KG5g7zumhnkKa4PTiCaZcmDMWW2Vr/LmbJpDhhlgfCn5+ +DX1ODouTBLmE8OijfzTiq/XVu0a336A6gYxWSAKVjwbL8s0qOcYSWp1i6alJVU3p +F8KXPYESdthoGPZ+psRSqYVMgziUK9/dObvP4Z5O4aDrY4rAbpkBZXi1yqsqkIbF +XlNiV4kUwUGP5ppgl+RcW/oonJ/jVe1CNrbQjfMMz26HOKqYkakfSCrHJ0kE1tb4 +M8nQ4reHAJofY69brHB+lp+wO+Wj+AS2+Cw4VCEGUTMyeIAXWYOVZmUdtVvyGz5t +npjCCfPsUiBb +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +U1VDQ0VTUw== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/common.py b/net/data/verify_certificate_chain_unittest/common.py new file mode 100755 index 0000000..c7e98d1 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/common.py
@@ -0,0 +1,417 @@ +#!/usr/bin/python +# 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. + +"""Set of helpers to generate signed X.509v3 certificates. + +This works by shelling out calls to the 'openssl req' and 'openssl ca' +commands, and passing the appropriate command line flags and configuration file +(.cnf). +""" + +import base64 +import os +import shutil +import subprocess +import sys + +import openssl_conf + +# Enum for the "type" of certificate that is to be created. This is used to +# select sane defaults for the .cnf file and command line flags, but they can +# all be overridden. +TYPE_CA = 2 +TYPE_END_ENTITY = 3 + +# January 1st, 2015 midnight UTC +JANUARY_1_2015_UTC = '150101120000Z' + +# January 1st, 2016 midnight UTC +JANUARY_1_2016_UTC = '160101120000Z' + +# March 2nd, 2015 midnight UTC +DEFAULT_TIME = '150302120000Z' + +# Counter used to generate unique (but readable) path names. +g_cur_path_id = 0 + +# Output paths used: +# - g_out_dir: where any temporary files (keys, cert req, signing db etc) are +# saved to. +# - g_out_pem: the path to the final output (which is a .pem file) +# +# See init() for how these are assigned, based on the name of the calling +# script. +g_out_dir = None +g_out_pem = None + + +def GetUniquePathId(name): + """Returns a base filename that contains 'name', but is unique to the output + directory""" + global g_cur_path_id + + path_id = g_cur_path_id + g_cur_path_id += 1 + + # Use a short and clean name for the first use of this name. + if path_id == 0: + return name + + # Otherwise append the count to make it unique. + return '%s_%d' % (name, path_id) + + +class Certificate(object): + """Helper for building an X.509 certificate.""" + + def __init__(self, name, cert_type, issuer): + # The name will be used for the subject's CN, and also as a component of + # the temporary filenames to help with debugging. + self.name = name + self.path_id = GetUniquePathId(name) + + # The issuer is also a Certificate object. Passing |None| means it is a + # self-signed certificate. + self.issuer = issuer + if issuer is None: + self.issuer = self + + # The config contains all the OpenSSL options that will be passed via a + # .cnf file. Set up defaults. + self.config = openssl_conf.Config() + self.init_config() + + # Some settings need to be passed as flags rather than in the .cnf file. + # Technically these can be set though a .cnf, however doing so makes it + # sticky to the issuing certificate, rather than selecting it per + # subordinate certificate. + self.validity_flags = [] + self.md_flags = [] + + # By default OpenSSL will use the current time for the start time. Instead + # default to using a fixed timestamp for more predictabl results each time + # the certificates are re-generated. + self.set_validity_range(JANUARY_1_2015_UTC, JANUARY_1_2016_UTC) + + # Use SHA-256 when THIS certificate is signed (setting it in the + # configuration would instead set the hash to use when signing other + # certificates with this one). + self.set_signature_hash('sha256') + + # Set appropriate key usages and basic constraints. For flexibility in + # testing (since want to generate some flawed certificates) these are set + # on a per-certificate basis rather than automatically when signing. + if cert_type == TYPE_END_ENTITY: + self.get_extensions().set_property('keyUsage', + 'critical,digitalSignature,keyEncipherment') + self.get_extensions().set_property('extendedKeyUsage', + 'serverAuth,clientAuth') + else: + self.get_extensions().set_property('keyUsage', + 'critical,keyCertSign,cRLSign') + self.get_extensions().set_property('basicConstraints', 'critical,CA:true') + + # Tracks whether the PEM file for this certificate has been written (since + # generation is done lazily). + self.finalized = False + + # Initialize any files that will be needed if this certificate is used to + # sign other certificates. Starts off serial numbers at 1, and will + # increment them for each signed certificate. + write_string_to_file('01\n', self.get_serial_path()) + write_string_to_file('', self.get_database_path()) + + + def generate_rsa_key(self, size_bits): + """Generates an RSA private key for the certificate.""" + subprocess.check_call( + ['openssl', 'genrsa', '-out', self.get_key_path(), str(size_bits)]) + + + def generate_ec_key(self, named_curve): + """Generates an EC private key for the certificate. |named_curve| can be + something like secp384r1""" + subprocess.check_call( + ['openssl', 'ecparam', '-out', self.get_key_path(), + '-name', named_curve, '-genkey']) + + + def set_validity_range(self, start_date, end_date): + """Sets the Validity notBefore and notAfter properties for the + certificate""" + self.validity_flags = ['-startdate', start_date, '-enddate', end_date] + + + def set_signature_hash(self, md): + """Sets the hash function that will be used when signing this certificate. + Can be sha1, sha256, sha512, md5, etc.""" + self.md_flags = ['-md', md] + + + def get_extensions(self): + return self.config.get_section('req_ext') + + + def get_path(self, suffix): + """Forms a path to an output file for this certificate, containing the + indicated suffix. The certificate's name will be used as its basis.""" + return os.path.join(g_out_dir, '%s%s' % (self.path_id, suffix)) + + + def get_key_path(self): + return self.get_path('.key') + + + def get_cert_path(self): + return self.get_path('.pem') + + + def get_serial_path(self): + return self.get_path('.serial') + + + def get_csr_path(self): + return self.get_path('.csr') + + + def get_database_path(self): + return self.get_path('.db') + + + def get_config_path(self): + return self.get_path('.cnf') + + + def get_cert_pem(self): + # Finish generating a .pem file for the certificate. + self.finalize() + + # Read the certificate data. + with open(self.get_cert_path(), 'r') as f: + return f.read() + + + def finalize(self): + """Finishes the certificate creation process. This generates any needed + key, creates and signs the CSR. On completion the resulting PEM file can be + found at self.get_cert_path()""" + + if self.finalized: + return # Already finalized, no work needed. + + self.finalized = True + + # Ensure that the issuer has been "finalized", since its outputs need to be + # accessible. Note that self.issuer could be the same as self. + self.issuer.finalize() + + # Ensure the certificate has a key. Callers have the option to generate a + # different type of key, but if that was not done default to a new 2048-bit + # RSA key. + if not os.path.isfile(self.get_key_path()): + self.generate_rsa_key(2048) + + # Serialize the config to a file. + self.config.write_to_file(self.get_config_path()) + + # Create a CSR. + subprocess.check_call( + ['openssl', 'req', '-new', + '-key', self.get_key_path(), + '-out', self.get_csr_path(), + '-config', self.get_config_path()]) + + cmd = ['openssl', 'ca', '-batch', '-in', + self.get_csr_path(), '-out', self.get_cert_path(), '-config', + self.issuer.get_config_path()] + + if self.issuer == self: + cmd.append('-selfsign') + + # Add in any extra flags. + cmd.extend(self.validity_flags) + cmd.extend(self.md_flags) + + # Run the 'openssl ca' command. + subprocess.check_call(cmd) + + + def init_config(self): + """Initializes default properties in the certificate .cnf file that are + generic enough to work for all certificates (but can be overridden later). + """ + + # -------------------------------------- + # 'req' section + # -------------------------------------- + + section = self.config.get_section('req') + + section.set_property('encrypt_key', 'no') + section.set_property('utf8', 'yes') + section.set_property('string_mask', 'utf8only') + section.set_property('prompt', 'no') + section.set_property('distinguished_name', 'req_dn') + section.set_property('req_extensions', 'req_ext') + + # -------------------------------------- + # 'req_dn' section + # -------------------------------------- + + # This section describes the certificate subject's distinguished name. + + section = self.config.get_section('req_dn') + section.set_property('commonName', '"%s"' % (self.name)) + + # -------------------------------------- + # 'req_ext' section + # -------------------------------------- + + # This section describes the certificate's extensions. + + section = self.config.get_section('req_ext') + section.set_property('subjectKeyIdentifier', 'hash') + + # -------------------------------------- + # SECTIONS FOR CAs + # -------------------------------------- + + # The following sections are used by the 'openssl ca' and relate to the + # signing operation. They are not needed for end-entity certificate + # configurations, but only if this certifiate will be used to sign other + # certificates. + + # -------------------------------------- + # 'ca' section + # -------------------------------------- + + section = self.config.get_section('ca') + section.set_property('default_ca', 'root_ca') + + section = self.config.get_section('root_ca') + section.set_property('certificate', self.get_cert_path()) + section.set_property('private_key', self.get_key_path()) + section.set_property('new_certs_dir', g_out_dir) + section.set_property('serial', self.get_serial_path()) + section.set_property('database', self.get_database_path()) + section.set_property('unique_subject', 'no') + + # These will get overridden via command line flags. + section.set_property('default_days', '365') + section.set_property('default_md', 'sha256') + + section.set_property('policy', 'policy_anything') + section.set_property('email_in_dn', 'no') + section.set_property('preserve', 'yes') + section.set_property('name_opt', 'multiline,-esc_msb,utf8') + section.set_property('cert_opt', 'ca_default') + section.set_property('copy_extensions', 'copy') + section.set_property('x509_extensions', 'signing_ca_ext') + section.set_property('default_crl_days', '30') + section.set_property('crl_extensions', 'crl_ext') + + section = self.config.get_section('policy_anything') + section.set_property('domainComponent', 'optional') + section.set_property('countryName', 'optional') + section.set_property('stateOrProvinceName', 'optional') + section.set_property('localityName', 'optional') + section.set_property('organizationName', 'optional') + section.set_property('organizationalUnitName', 'optional') + section.set_property('commonName', 'optional') + section.set_property('emailAddress', 'optional') + + section = self.config.get_section('signing_ca_ext') + section.set_property('subjectKeyIdentifier', 'hash') + section.set_property('authorityKeyIdentifier', 'keyid:always') + section.set_property('authorityInfoAccess', '@issuer_info') + section.set_property('crlDistributionPoints', '@crl_info') + + section = self.config.get_section('issuer_info') + section.set_property('caIssuers;URI.0', + 'http://url-for-aia/%s.cer' % (self.name)) + + section = self.config.get_section('crl_info') + section.set_property('URI.0', 'http://url-for-crl/%s.crl' % (self.name)) + + section = self.config.get_section('crl_ext') + section.set_property('authorityKeyIdentifier', 'keyid:always') + section.set_property('authorityInfoAccess', '@issuer_info') + + +def data_to_pem(block_header, block_data): + return '-----BEGIN %s-----\n%s\n-----END %s-----\n' % (block_header, + base64.b64encode(block_data), block_header) + + +def write_test_file(description, chain, trusted_certs, utc_time, verify_result): + """Writes a test file that contains all the inputs necessary to run a + verification on a certificate chain""" + + # Prepend the script name that generated the file to the description. + test_data = '[Created by: %s]\n\n%s\n' % (sys.argv[0], description) + + # Write the certificate chain to the output file. + for cert in chain: + test_data += '\n' + cert.get_cert_pem() + + # Write the trust store. + for cert in trusted_certs: + cert_data = cert.get_cert_pem() + # Use a different block type in the .pem file. + cert_data = cert_data.replace('CERTIFICATE', 'TRUSTED_CERTIFICATE') + test_data += '\n' + cert_data + + test_data += '\n' + data_to_pem('TIME', utc_time) + + verify_result_string = 'SUCCESS' if verify_result else 'FAIL' + test_data += '\n' + data_to_pem('VERIFY_RESULT', verify_result_string) + + write_string_to_file(test_data, g_out_pem) + + +def write_string_to_file(data, path): + with open(path, 'w') as f: + f.write(data) + + +def init(invoking_script_path): + """Creates an output directory to contain all the temporary files that may be + created, as well as determining the path for the final output. These paths + are all based off of the name of the calling script. + """ + + global g_out_dir + global g_out_pem + + # Base the output name off of the invoking script's name. + out_name = os.path.splitext(os.path.basename(invoking_script_path))[0] + + # Strip the leading 'generate-' + if out_name.startswith('generate-'): + out_name = out_name[9:] + + # Use an output directory with the same name as the invoking script. + g_out_dir = os.path.join('out', out_name) + + # Ensure the output directory exists and is empty. + sys.stdout.write('Creating output directory: %s\n' % (g_out_dir)) + shutil.rmtree(g_out_dir, True) + os.makedirs(g_out_dir) + + g_out_pem = os.path.join('%s.pem' % (out_name)) + + +def create_self_signed_root_certificate(name): + return Certificate(name, TYPE_CA, None) + + +def create_intermediary_certificate(name, issuer): + return Certificate(name, TYPE_CA, issuer) + + +def create_end_entity_certificate(name, issuer): + return Certificate(name, TYPE_END_ENTITY, issuer) + +init(sys.argv[0])
diff --git a/net/data/verify_certificate_chain_unittest/expired-intermediary.pem b/net/data/verify_certificate_chain_unittest/expired-intermediary.pem new file mode 100644 index 0000000..f0bad52 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/expired-intermediary.pem
@@ -0,0 +1,280 @@ +[Created by: generate-expired-intermediary.py] + +Certificate chain with 1 intermediary, where the intermediary is expired +(violates validity.notAfter). Verification is expected to fail. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b4:33:49:77:46:22:00:7b:a3:98:45:15:f7:e4: + 40:bc:c7:d1:86:bf:05:3b:c7:57:d7:12:e4:b0:aa: + 58:38:e7:bb:2f:1a:54:91:a8:78:39:d1:bd:67:5c: + c6:d5:08:44:d0:98:7e:7f:69:03:2a:5d:cd:f9:51: + 13:44:50:62:c4:ca:44:3e:1d:ea:bc:fd:eb:21:57: + e2:cd:85:3d:fe:70:e1:e8:92:c4:5f:68:67:4e:53: + 96:6b:02:59:39:31:c9:8b:fe:71:17:b3:b7:14:77: + 1b:89:b4:f8:ec:c5:b1:53:dd:42:ca:40:cd:14:c0: + 8a:b7:f6:32:72:16:d0:37:72:de:62:9f:49:e5:c3: + 2e:22:bc:a0:04:a7:d5:11:56:54:9f:7f:0e:92:f3: + 7a:88:bb:74:2e:19:3f:02:9e:69:fa:b4:bd:57:38: + 3d:19:99:48:f4:c1:07:57:91:52:db:63:dc:8b:0c: + ca:74:85:1a:cd:f1:8c:3f:b9:9f:61:44:31:f8:86: + ef:c1:ff:31:e7:fb:cd:7a:59:30:b2:8b:9c:5e:71: + 41:04:11:96:e4:8a:a7:8e:0e:58:76:ac:0f:1c:eb: + 1e:dc:0f:01:4f:ad:4e:29:ba:9b:40:7f:f5:c8:51: + 0c:8b:a9:19:01:51:c3:23:71:25:19:be:0c:10:ea: + 46:75 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 77:E8:2F:D7:FB:5C:C4:E2:A0:B9:44:4F:B4:A7:15:35:41:B6:C8:C3 + X509v3 Authority Key Identifier: + keyid:8C:5E:B2:DE:2B:9F:31:B1:26:55:4D:45:E8:E7:23:87:58:5B:83:D1 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 96:9d:3f:9e:85:d1:f5:b1:b8:42:a6:13:92:77:ea:af:0a:3e: + f1:2e:73:e5:db:55:e5:08:d9:54:35:67:ed:0c:7a:ec:b4:a6: + 3b:6e:7b:db:44:82:36:84:65:6e:f0:95:bc:a2:10:f3:73:39: + 41:ae:3d:2b:dc:de:3f:9b:8a:bc:67:83:75:83:dd:67:b1:96: + fc:79:0f:ca:89:73:7f:48:83:55:f5:e5:dd:b3:fd:8d:8c:1c: + c1:7f:41:fd:db:ac:59:33:58:0e:01:cb:8d:d9:c0:7d:bd:e0: + a1:1e:ce:cb:eb:a1:c8:97:05:4d:4d:28:26:f6:eb:1a:7d:20: + 3a:d5:a9:9c:12:2d:b4:56:42:ab:fa:4d:f4:50:68:62:e5:94: + 2c:9c:e7:83:25:db:d7:8b:40:2d:d7:ba:b8:f4:fe:f4:88:76: + 5d:b9:a0:6d:ee:ba:82:a1:33:42:3a:e4:10:77:30:9b:60:c2: + c7:8b:cd:9e:29:00:0c:2d:01:a1:eb:1b:ce:41:6a:c7:91:79: + ff:64:f4:fe:2e:20:34:c6:6e:8a:4b:82:be:09:6b:17:94:aa: + cb:75:82:3a:b4:03:16:8a:52:4e:3a:92:a3:85:fd:db:a2:e8: + e7:a3:8c:bf:85:7e:6b:2d:7a:53:1d:db:49:1e:30:d0:8d:99: + 06:f8:95:3a +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0M0l3 +RiIAe6OYRRX35EC8x9GGvwU7x1fXEuSwqlg457svGlSRqHg50b1nXMbVCETQmH5/ +aQMqXc35URNEUGLEykQ+Heq8/eshV+LNhT3+cOHoksRfaGdOU5ZrAlk5McmL/nEX +s7cUdxuJtPjsxbFT3ULKQM0UwIq39jJyFtA3ct5in0nlwy4ivKAEp9URVlSffw6S +83qIu3QuGT8Cnmn6tL1XOD0ZmUj0wQdXkVLbY9yLDMp0hRrN8Yw/uZ9hRDH4hu/B +/zHn+816WTCyi5xecUEEEZbkiqeODlh2rA8c6x7cDwFPrU4puptAf/XIUQyLqRkB +UcMjcSUZvgwQ6kZ1AgMBAAGjgekwgeYwHQYDVR0OBBYEFHfoL9f7XMTioLlET7Sn +FTVBtsjDMB8GA1UdIwQYMBaAFIxest4rnzGxJlVNRejnI4dYW4PRMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAlp0/noXR9bG4QqYTknfq +rwo+8S5z5dtV5QjZVDVn7Qx67LSmO25720SCNoRlbvCVvKIQ83M5Qa49K9zeP5uK +vGeDdYPdZ7GW/HkPyolzf0iDVfXl3bP9jYwcwX9B/dusWTNYDgHLjdnAfb3goR7O +y+uhyJcFTU0oJvbrGn0gOtWpnBIttFZCq/pN9FBoYuWULJzngyXb14tALde6uPT+ +9Ih2Xbmgbe66gqEzQjrkEHcwm2DCx4vNnikADC0BoesbzkFqx5F5/2T0/i4gNMZu +ikuCvglrF5Sqy3WCOrQDFopSTjqSo4X926Lo56OMv4V+ay16Ux3bSR4w0I2ZBviV +Og== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ab:a7:65:bb:25:26:49:f5:55:58:4e:25:97:97: + 19:be:89:c0:d7:29:77:db:32:59:71:e5:92:4c:6e: + c3:9c:29:73:65:a7:60:ba:a6:59:06:25:28:df:90: + ec:d7:fb:b9:fd:67:f4:0a:e2:2f:9c:e6:0d:77:77: + 12:60:e7:57:71:08:ba:87:50:30:a0:5f:d6:02:0c: + 9a:64:6c:fb:cf:f7:6b:12:ce:09:98:27:d9:15:46: + 00:14:58:63:08:e1:58:7f:98:5d:86:09:6b:59:78: + 69:c1:74:5b:6e:a4:fc:b0:d7:64:30:e6:50:7a:3a: + 98:fd:48:ed:b9:d3:b2:04:5a:f6:67:c8:50:f2:bb: + 2a:49:4c:82:2c:9c:1a:ab:5c:e8:0d:7b:ae:2b:5f: + 4f:77:90:4a:c9:63:cd:0f:07:1d:63:23:7f:e6:6b: + 16:f8:70:f1:43:ac:4c:e0:72:05:36:0e:3f:62:ed: + 71:61:8f:e1:7c:8b:16:7d:9c:99:e1:18:d4:8e:52: + 14:07:3b:49:7e:5d:06:ac:6b:34:63:6c:86:c5:8a: + fb:f0:e5:a3:aa:40:4f:35:da:4b:31:c6:a0:7e:49: + c1:47:22:19:5b:2d:c3:07:ac:25:fe:e8:97:4c:e1: + 59:59:2c:6b:bd:96:ee:b5:67:ca:03:1d:a7:e1:8e: + 19:a3 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 8C:5E:B2:DE:2B:9F:31:B1:26:55:4D:45:E8:E7:23:87:58:5B:83:D1 + X509v3 Authority Key Identifier: + keyid:15:EB:EA:C0:58:73:9E:53:97:FB:86:13:F2:7A:4E:1C:E1:91:7C:C5 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 0e:32:41:5f:b0:5f:c7:3e:3e:d7:54:43:2c:7d:d5:49:a0:2f: + 90:d6:70:2e:f4:d6:a7:13:15:83:3b:44:a0:c2:d8:d8:01:0b: + b0:37:ec:14:39:e5:85:99:de:80:f6:da:11:b4:31:5a:66:86: + f0:e8:ac:ad:d6:ac:4a:eb:49:4f:af:59:cc:c5:ca:e7:09:8c: + 98:e1:b7:86:c1:46:c3:85:34:7a:89:72:0b:0a:f5:e7:41:ac: + 6d:9c:78:ff:d6:ba:fc:86:f3:39:b9:77:44:f4:2f:f4:c0:5e: + b2:93:01:9e:85:8d:a8:58:dc:cd:77:37:40:28:0c:d7:42:19: + f5:bc:a0:e9:ea:f6:a1:42:6a:1f:d3:d6:01:b0:8e:ef:49:97: + 7a:d5:8b:37:28:96:95:00:dd:4c:6c:05:5a:59:fd:14:bd:69: + ae:03:c3:8b:47:ea:8e:48:92:4c:c9:bc:9c:b7:07:bd:e4:5e: + 6c:d3:e1:51:57:45:b2:79:bf:7e:22:c1:d5:65:a8:50:db:51: + 13:28:8e:02:2c:d2:19:09:69:16:6d:60:40:23:44:5b:38:4a: + a4:a1:61:27:ec:36:95:81:2e:5c:ac:f1:13:39:f5:d0:d5:3a: + 94:82:8f:c8:41:da:e8:a4:0e:19:a8:6d:19:6c:fb:29:39:74: + af:48:01:e2 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq6dluyUm +SfVVWE4ll5cZvonA1yl32zJZceWSTG7DnClzZadguqZZBiUo35Ds1/u5/Wf0CuIv +nOYNd3cSYOdXcQi6h1AwoF/WAgyaZGz7z/drEs4JmCfZFUYAFFhjCOFYf5hdhglr +WXhpwXRbbqT8sNdkMOZQejqY/UjtudOyBFr2Z8hQ8rsqSUyCLJwaq1zoDXuuK19P +d5BKyWPNDwcdYyN/5msW+HDxQ6xM4HIFNg4/Yu1xYY/hfIsWfZyZ4RjUjlIUBztJ +fl0GrGs0Y2yGxYr78OWjqkBPNdpLMcagfknBRyIZWy3DB6wl/uiXTOFZWSxrvZbu +tWfKAx2n4Y4ZowIDAQABo4HLMIHIMB0GA1UdDgQWBBSMXrLeK58xsSZVTUXo5yOH +WFuD0TAfBgNVHSMEGDAWgBQV6+rAWHOeU5f7hhPyek4c4ZF8xTA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AA4yQV+wX8c+PtdUQyx91UmgL5DWcC701qcTFYM7RKDC2NgBC7A37BQ55YWZ3oD2 +2hG0MVpmhvDorK3WrErrSU+vWczFyucJjJjht4bBRsOFNHqJcgsK9edBrG2ceP/W +uvyG8zm5d0T0L/TAXrKTAZ6FjahY3M13N0AoDNdCGfW8oOnq9qFCah/T1gGwju9J +l3rVizcolpUA3UxsBVpZ/RS9aa4Dw4tH6o5IkkzJvJy3B73kXmzT4VFXRbJ5v34i +wdVlqFDbURMojgIs0hkJaRZtYEAjRFs4SqShYSfsNpWBLlys8RM59dDVOpSCj8hB +2uikDhmobRls+yk5dK9IAeI= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ca:63:ce:f6:f5:87:1c:17:7d:20:6c:eb:25:52: + 83:6a:00:1b:c4:76:25:c4:5e:e0:0e:eb:dc:c2:86: + 9f:84:9a:b2:da:cd:05:7f:5b:ad:e0:11:3a:f9:c5: + a9:97:96:77:9c:4a:3c:3d:e8:c2:fe:f0:e5:f4:1f: + c2:bd:cb:33:89:fa:a0:61:c2:85:c1:ea:8b:ec:97: + f4:5d:dc:cf:bd:45:c8:5d:a9:0d:8e:7a:b0:53:67: + 8b:37:bd:67:20:f0:e3:fd:20:5d:7e:e8:df:90:ba: + 0a:59:b3:08:fb:42:45:ae:83:89:b8:50:93:09:66: + ac:a3:7a:fe:b3:ee:ad:0c:fd:c3:a0:ab:3b:1a:49: + 4f:bb:2e:8a:0a:61:ae:99:40:15:79:9a:63:a9:f3: + e0:50:98:eb:11:7d:06:56:85:43:50:8d:9c:1f:a5: + c3:6e:17:6b:f3:07:3a:8a:ce:c2:4f:71:84:eb:c3: + ca:91:1c:71:96:57:14:93:15:f7:93:b6:39:4e:9e: + 99:8e:2b:e0:47:ad:86:ff:d4:7f:a4:b1:5b:3f:08: + 03:84:95:8f:2a:ff:0c:33:22:28:3e:e8:12:53:5d: + 10:3b:86:24:61:1b:85:a8:97:ad:b1:2f:d2:a0:5a: + 5f:51:49:7c:ab:4f:4b:4a:43:da:2f:4a:46:6a:c9: + 12:d5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 15:EB:EA:C0:58:73:9E:53:97:FB:86:13:F2:7A:4E:1C:E1:91:7C:C5 + X509v3 Authority Key Identifier: + keyid:15:EB:EA:C0:58:73:9E:53:97:FB:86:13:F2:7A:4E:1C:E1:91:7C:C5 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 35:78:42:b8:84:7a:f4:0a:9d:ab:2f:a2:95:a7:6a:f5:14:ee: + b7:5a:f4:36:43:22:ef:f7:39:c4:85:ff:eb:e4:24:47:c2:04: + ac:af:25:a5:04:68:64:a3:41:23:fe:a6:99:d2:2a:95:51:60: + 2a:97:31:31:01:a0:83:2c:d8:fe:81:5f:dc:2d:3f:5a:5c:6f: + 2f:df:43:57:61:35:a2:e3:d9:56:f0:26:7d:74:15:3f:24:07: + 1a:cd:49:d9:d0:2f:94:5b:d8:ae:da:f4:93:fa:7a:34:25:20: + a1:d0:ef:d2:1e:c3:eb:b5:63:49:c6:4c:a1:2f:11:d6:5b:88: + a8:89:b0:e6:22:92:3f:d2:a9:26:ad:32:85:e4:98:14:3c:9e: + 4d:9e:49:62:f9:88:25:bd:e0:0d:72:d0:dc:cc:55:b7:bc:38: + 58:70:6b:cb:e0:ce:6b:1a:f8:3a:b6:33:0f:21:0d:d1:80:e1: + 5f:2a:ca:b0:29:e0:e0:17:af:4a:39:bb:cc:29:97:30:08:64: + 26:d9:ba:0b:1f:17:a3:41:e3:0f:a2:d1:cd:21:a1:4e:40:ee: + 3d:c3:20:4a:6d:c4:35:3c:10:f1:f8:76:f8:04:da:7f:17:22: + 6a:de:fe:59:24:04:06:e8:57:f1:6b:f8:4d:63:17:c3:0e:dc: + 3b:26:f3:e2 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMpjzvb1hxwXfSBs6yVS +g2oAG8R2JcRe4A7r3MKGn4SastrNBX9breAROvnFqZeWd5xKPD3owv7w5fQfwr3L +M4n6oGHChcHqi+yX9F3cz71FyF2pDY56sFNnize9ZyDw4/0gXX7o35C6ClmzCPtC +Ra6DibhQkwlmrKN6/rPurQz9w6CrOxpJT7suigphrplAFXmaY6nz4FCY6xF9BlaF +Q1CNnB+lw24Xa/MHOorOwk9xhOvDypEccZZXFJMV95O2OU6emY4r4Eethv/Uf6Sx +Wz8IA4SVjyr/DDMiKD7oElNdEDuGJGEbhaiXrbEv0qBaX1FJfKtPS0pD2i9KRmrJ +EtUCAwEAAaOByzCByDAdBgNVHQ4EFgQUFevqwFhznlOX+4YT8npOHOGRfMUwHwYD +VR0jBBgwFoAUFevqwFhznlOX+4YT8npOHOGRfMUwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA1eEK4hHr0 +Cp2rL6KVp2r1FO63WvQ2QyLv9znEhf/r5CRHwgSsryWlBGhko0Ej/qaZ0iqVUWAq +lzExAaCDLNj+gV/cLT9aXG8v30NXYTWi49lW8CZ9dBU/JAcazUnZ0C+UW9iu2vST ++no0JSCh0O/SHsPrtWNJxkyhLxHWW4ioibDmIpI/0qkmrTKF5JgUPJ5Nnkli+Ygl +veANctDczFW3vDhYcGvL4M5rGvg6tjMPIQ3RgOFfKsqwKeDgF69KObvMKZcwCGQm +2boLHxejQeMPotHNIaFOQO49wyBKbcQ1PBDx+Hb4BNp/FyJq3v5ZJAQG6Ffxa/hN +YxfDDtw7JvPi +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTYwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem b/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem new file mode 100644 index 0000000..e531d94 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem
@@ -0,0 +1,280 @@ +[Created by: generate-expired-target-notBefore.py] + +Certificate chain with 1 intermediary, where the target is expired (violates +validity.notBefore). Verification is expected to fail. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e0:ba:cf:dc:e5:4a:42:65:18:58:f0:f8:21:32: + 87:ad:b6:d8:ff:96:c7:54:50:9c:6c:ff:f8:ef:1a: + 3a:46:57:8b:9f:8d:f3:ea:a3:f8:37:eb:57:73:bb: + cb:0e:bf:2f:b1:2e:7e:0f:10:d8:93:be:20:41:f0: + 6d:5c:ce:52:20:10:13:37:c5:fb:88:1a:72:e2:f4: + 0a:d2:14:43:21:ae:5f:7e:0f:3e:95:53:38:56:f3: + ab:b3:67:e0:b7:d9:f0:07:98:b0:50:7c:9c:05:9f: + a7:ef:ec:85:cd:e5:ab:22:a3:f1:55:b9:96:5b:c0: + 50:7d:8f:1b:37:a8:cf:40:5d:1f:be:6d:48:bc:22: + e4:65:ea:15:79:1c:9f:e2:7d:58:25:01:15:ac:7b: + 50:6f:53:4e:ed:14:d9:02:55:8d:84:35:34:bc:46: + 11:b3:27:5e:27:47:79:8d:f2:df:d1:43:df:73:19: + e8:06:11:ee:55:87:4b:11:d8:6d:53:12:47:8d:87: + f7:6b:e3:d9:a1:aa:8d:8f:81:ad:dd:6f:52:ce:39: + 97:28:83:63:39:3c:e4:f0:b1:93:4c:82:44:b6:2a: + 7e:fe:c5:7b:9a:f3:01:35:9c:e0:de:d5:0d:ee:b1: + e9:04:f6:bf:74:94:83:56:bb:3d:57:01:56:f9:24: + 2f:e5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + C3:8F:E4:91:5B:59:E5:5A:12:DF:C4:31:8B:24:14:1F:CE:B1:8B:33 + X509v3 Authority Key Identifier: + keyid:22:8D:DE:5E:4F:B1:54:9D:71:73:E9:6B:39:85:BB:08:D8:87:CA:D0 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 59:d5:11:a5:3a:be:47:f7:57:74:59:36:de:85:9f:e1:c4:17: + e9:03:98:69:f7:c8:f0:b2:49:f6:ff:96:0e:06:4d:e0:1e:4b: + b6:09:67:17:28:a6:3f:56:f5:8b:fe:03:0e:b1:76:a9:6d:7d: + 07:22:03:ae:df:92:a9:0a:94:96:d9:86:8d:55:34:05:c6:3e: + bb:59:c3:a1:84:da:f8:76:4e:cd:42:09:be:d0:72:18:8f:07: + f3:8a:04:27:81:05:0a:1a:13:a7:ce:ee:c1:a5:43:b5:a1:64: + c5:78:84:4c:fd:02:d7:3b:33:b3:ff:13:32:c3:1f:15:55:92: + 74:93:21:4c:c9:fd:a9:33:a1:a6:00:5a:ec:42:31:d2:98:58: + 8e:f3:12:32:3b:3f:96:58:19:a3:6b:fc:40:68:45:80:60:85: + 30:b3:50:d2:52:74:9c:7f:01:b9:8a:22:8f:60:18:c5:4f:04: + 0c:10:7e:ff:da:d6:8f:93:f2:80:a0:b3:3e:61:82:8a:c2:a6: + a7:6e:e1:85:76:ef:d3:64:ac:41:37:df:9f:1b:51:ac:8b:c6: + 42:e9:54:57:16:fc:ab:cc:79:b3:5e:6e:84:36:3a:67:fa:bd: + 8d:c8:b6:1e:a5:c2:af:41:7b:8a:5a:72:5d:bb:87:c8:8d:1e: + 51:06:44:ab +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDgus/c +5UpCZRhY8PghMoetttj/lsdUUJxs//jvGjpGV4ufjfPqo/g361dzu8sOvy+xLn4P +ENiTviBB8G1czlIgEBM3xfuIGnLi9ArSFEMhrl9+Dz6VUzhW86uzZ+C32fAHmLBQ +fJwFn6fv7IXN5asio/FVuZZbwFB9jxs3qM9AXR++bUi8IuRl6hV5HJ/ifVglARWs +e1BvU07tFNkCVY2ENTS8RhGzJ14nR3mN8t/RQ99zGegGEe5Vh0sR2G1TEkeNh/dr +49mhqo2Pga3db1LOOZcog2M5POTwsZNMgkS2Kn7+xXua8wE1nODe1Q3usekE9r90 +lINWuz1XAVb5JC/lAgMBAAGjgekwgeYwHQYDVR0OBBYEFMOP5JFbWeVaEt/EMYsk +FB/OsYszMB8GA1UdIwQYMBaAFCKN3l5PsVSdcXPpazmFuwjYh8rQMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAWdURpTq+R/dXdFk23oWf +4cQX6QOYaffI8LJJ9v+WDgZN4B5LtglnFyimP1b1i/4DDrF2qW19ByIDrt+SqQqU +ltmGjVU0BcY+u1nDoYTa+HZOzUIJvtByGI8H84oEJ4EFChoTp87uwaVDtaFkxXiE +TP0C1zszs/8TMsMfFVWSdJMhTMn9qTOhpgBa7EIx0phYjvMSMjs/llgZo2v8QGhF +gGCFMLNQ0lJ0nH8BuYoij2AYxU8EDBB+/9rWj5PygKCzPmGCisKmp27hhXbv02Ss +QTffnxtRrIvGQulUVxb8q8x5s15uhDY6Z/q9jci2HqXCr0F7ilpyXbuHyI0eUQZE +qw== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a0:cf:ed:e6:2e:fe:fc:9c:7d:c5:b5:f9:ad:0c: + 07:3b:61:9a:29:79:7d:0b:c2:a0:2b:64:10:ce:17: + 64:a9:25:35:b4:17:0e:06:73:83:b2:4e:bb:d2:9d: + 38:05:06:0d:61:24:87:ee:f8:eb:0a:87:f4:8c:2d: + cf:ec:c2:13:43:f6:a0:ad:bf:e3:94:56:a6:7e:30: + 93:3d:65:64:62:88:a5:78:6a:dd:ca:54:3d:36:17: + 2b:79:bb:f0:fd:fe:ba:94:99:c7:ce:61:4e:aa:c9: + f3:87:98:05:8a:b8:fe:e9:96:52:e3:c7:3e:e9:60: + e0:7c:94:75:a2:11:d7:11:d3:70:f1:8e:25:c1:20: + af:93:f5:8a:be:76:75:2f:d0:3f:82:8f:99:c7:44: + 79:c3:f2:31:d7:24:30:cd:14:ba:b6:c4:a2:16:86: + 9c:b7:bf:00:1c:f7:eb:a1:e2:fa:14:f3:08:00:06: + f5:b0:a7:79:05:84:ad:a1:4c:e7:f7:e6:14:68:2f: + 67:67:aa:06:c7:31:f2:1f:d3:b7:c2:e8:e7:bc:0f: + 1a:69:55:a0:75:8d:45:fa:1e:52:f4:ea:87:5c:0c: + ef:d6:e4:b4:bb:59:7c:34:eb:67:16:5e:06:56:05: + e3:0a:6f:f6:c8:88:e3:1f:a6:cf:ab:6a:93:cd:b8: + e8:ab + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 22:8D:DE:5E:4F:B1:54:9D:71:73:E9:6B:39:85:BB:08:D8:87:CA:D0 + X509v3 Authority Key Identifier: + keyid:85:85:73:C1:C8:A5:7B:1C:6D:25:84:2A:CE:2B:A3:E4:21:E4:AE:D0 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 32:34:d5:49:6d:d1:25:e9:5b:f5:a8:29:b0:9a:ae:56:da:c0: + 56:b5:e1:76:a8:71:a6:af:c7:3d:a9:cd:d2:7e:56:b4:12:ad: + ae:61:94:02:bf:f2:0c:c3:64:1c:a2:70:41:3c:7c:30:3f:db: + c7:97:69:52:fc:39:63:a3:ed:27:f8:d1:e1:90:09:b5:8a:75: + dc:6b:db:4c:f6:b6:e3:57:84:f8:4d:f2:dd:d6:eb:63:ca:5f: + 39:d1:c2:52:1a:44:dd:02:b9:7c:4a:46:69:25:52:e9:85:48: + a2:22:b4:a6:cc:a3:bb:00:e6:ea:67:e6:ed:40:15:5a:51:d7: + a1:a8:e3:58:91:ec:80:65:63:db:f0:85:62:b4:0c:29:b9:c2: + 0a:f7:96:10:ed:c9:92:b4:71:53:d1:71:12:9c:04:f7:c9:44: + 57:1f:fc:40:57:a9:e1:df:b8:39:17:d0:79:d9:ae:4c:4b:cb: + 24:6e:25:01:8b:ad:37:cc:6f:b6:c2:58:ee:54:3f:78:71:45: + 69:21:c2:15:7c:86:03:1d:64:22:53:d9:65:68:d2:10:d0:38: + be:bc:f2:49:11:a2:39:04:e5:36:79:bf:20:fe:10:03:1a:b5: + 6c:12:c7:8a:06:dd:9d:bb:4d:f8:5b:b6:2d:3e:18:9b:26:b2: + 6c:59:c3:15 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoM/t5i7+ +/Jx9xbX5rQwHO2GaKXl9C8KgK2QQzhdkqSU1tBcOBnODsk670p04BQYNYSSH7vjr +Cof0jC3P7MITQ/agrb/jlFamfjCTPWVkYoileGrdylQ9Nhcrebvw/f66lJnHzmFO +qsnzh5gFirj+6ZZS48c+6WDgfJR1ohHXEdNw8Y4lwSCvk/WKvnZ1L9A/go+Zx0R5 +w/Ix1yQwzRS6tsSiFoact78AHPfroeL6FPMIAAb1sKd5BYStoUzn9+YUaC9nZ6oG +xzHyH9O3wujnvA8aaVWgdY1F+h5S9OqHXAzv1uS0u1l8NOtnFl4GVgXjCm/2yIjj +H6bPq2qTzbjoqwIDAQABo4HLMIHIMB0GA1UdDgQWBBQijd5eT7FUnXFz6Ws5hbsI +2IfK0DAfBgNVHSMEGDAWgBSFhXPByKV7HG0lhCrOK6PkIeSu0DA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +ADI01Ult0SXpW/WoKbCarlbawFa14Xaocaavxz2pzdJ+VrQSra5hlAK/8gzDZByi +cEE8fDA/28eXaVL8OWOj7Sf40eGQCbWKddxr20z2tuNXhPhN8t3W62PKXznRwlIa +RN0CuXxKRmklUumFSKIitKbMo7sA5upn5u1AFVpR16Go41iR7IBlY9vwhWK0DCm5 +wgr3lhDtyZK0cVPRcRKcBPfJRFcf/EBXqeHfuDkX0HnZrkxLyyRuJQGLrTfMb7bC +WO5UP3hxRWkhwhV8hgMdZCJT2WVo0hDQOL688kkRojkE5TZ5vyD+EAMatWwSx4oG +3Z27Tfhbti0+GJsmsmxZwxU= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c1:48:07:e3:d2:dc:88:8f:f9:f5:ff:26:b3:cb: + 73:09:cf:36:b9:28:23:c0:8c:90:51:61:a7:a1:f6: + 73:c6:e2:41:b5:d3:ce:8f:38:99:84:3f:96:be:21: + df:15:74:e4:dc:1d:df:45:68:a1:bd:d8:75:ca:bc: + 42:64:74:de:25:3b:a5:0a:0b:fb:d7:6a:63:e3:19: + 48:a9:5b:33:07:e2:bc:02:d5:86:06:5d:3c:fc:75: + 96:ea:eb:6d:41:ea:96:52:28:63:2c:a7:f2:13:e9: + a9:7f:e3:15:c1:94:31:59:c2:48:e8:b1:9c:ee:10: + 57:64:ef:6d:35:66:c2:46:d0:af:5f:b8:60:d8:48: + 47:ed:75:5d:ae:86:d4:85:ed:95:5d:0e:e7:ec:be: + 85:14:22:03:3e:ed:62:b1:c3:05:b9:b8:2e:77:6a: + 86:42:13:68:2c:33:86:f4:89:34:67:db:90:77:51: + 0a:a1:23:b4:46:06:22:16:e5:fb:c1:85:ef:2d:60: + 60:76:5a:1f:d7:c7:93:83:5c:b7:3b:76:d9:ba:01: + 90:29:d3:ea:84:de:26:10:79:7f:05:2f:ab:80:6e: + 18:80:bb:eb:26:d1:8c:5d:bd:79:4b:24:05:62:0f: + 38:7c:87:fe:1d:6e:5c:16:a2:34:b4:7a:d3:bb:54: + 24:d5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 85:85:73:C1:C8:A5:7B:1C:6D:25:84:2A:CE:2B:A3:E4:21:E4:AE:D0 + X509v3 Authority Key Identifier: + keyid:85:85:73:C1:C8:A5:7B:1C:6D:25:84:2A:CE:2B:A3:E4:21:E4:AE:D0 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 37:89:65:ac:ae:76:77:0d:71:a3:1c:e3:bf:80:fe:87:f8:49: + d3:8b:7f:cf:2a:51:18:b1:f5:a3:6a:d0:e5:e1:7e:f9:83:ca: + 11:2b:fc:e5:9e:cc:df:ee:a2:f9:ea:d2:19:32:fa:58:88:cd: + 59:5c:d6:42:7f:75:2f:17:93:7d:90:8c:7a:60:3a:24:15:15: + 62:82:97:c1:49:81:81:12:25:4a:b9:83:d7:39:dc:2b:da:39: + a9:58:6a:82:5c:7d:49:00:c2:cd:c2:dc:84:4a:23:df:9c:81: + a2:42:fc:4b:66:87:0b:63:12:d3:b8:59:9b:a6:5a:b0:5f:ff: + 51:37:92:03:0c:bb:61:6c:1a:ed:2e:05:e6:d0:a7:2f:d8:7c: + 5c:31:f2:84:f2:9b:05:bd:b5:35:35:a4:28:55:fa:23:32:33: + 4f:6b:91:55:9e:0f:1e:c7:1e:9a:12:c3:97:8d:3c:f9:c8:51: + 27:5b:19:a2:7a:c6:2a:0d:d4:b3:6e:b8:f0:8f:d3:c4:e4:26: + 3a:64:93:70:65:5f:2d:f7:73:31:e7:95:e6:23:1f:f4:17:b9: + d4:ed:20:e2:4f:45:32:a3:e9:7d:6a:2e:02:76:40:8a:ac:64: + c0:b2:99:11:63:de:64:f4:1f:6d:65:4c:84:1e:59:4f:e1:07: + 99:23:0e:d4 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFIB+PS3IiP+fX/JrPL +cwnPNrkoI8CMkFFhp6H2c8biQbXTzo84mYQ/lr4h3xV05Nwd30Voob3Ydcq8QmR0 +3iU7pQoL+9dqY+MZSKlbMwfivALVhgZdPPx1lurrbUHqllIoYyyn8hPpqX/jFcGU +MVnCSOixnO4QV2TvbTVmwkbQr1+4YNhIR+11Xa6G1IXtlV0O5+y+hRQiAz7tYrHD +Bbm4LndqhkITaCwzhvSJNGfbkHdRCqEjtEYGIhbl+8GF7y1gYHZaH9fHk4Nctzt2 +2boBkCnT6oTeJhB5fwUvq4BuGIC76ybRjF29eUskBWIPOHyH/h1uXBaiNLR607tU +JNUCAwEAAaOByzCByDAdBgNVHQ4EFgQUhYVzwcilexxtJYQqziuj5CHkrtAwHwYD +VR0jBBgwFoAUhYVzwcilexxtJYQqziuj5CHkrtAwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA3iWWsrnZ3 +DXGjHOO/gP6H+EnTi3/PKlEYsfWjatDl4X75g8oRK/zlnszf7qL56tIZMvpYiM1Z +XNZCf3UvF5N9kIx6YDokFRVigpfBSYGBEiVKuYPXOdwr2jmpWGqCXH1JAMLNwtyE +SiPfnIGiQvxLZocLYxLTuFmbplqwX/9RN5IDDLthbBrtLgXm0Kcv2HxcMfKE8psF +vbU1NaQoVfojMjNPa5FVng8exx6aEsOXjTz5yFEnWxmiesYqDdSzbrjwj9PE5CY6 +ZJNwZV8t93Mx55XmIx/0F7nU7SDiT0Uyo+l9ai4CdkCKrGTAspkRY95k9B9tZUyE +HllP4QeZIw7U +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTQwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/expired-target.pem b/net/data/verify_certificate_chain_unittest/expired-target.pem new file mode 100644 index 0000000..40b08c6 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/expired-target.pem
@@ -0,0 +1,280 @@ +[Created by: generate-expired-target.py] + +Certificate chain with 1 intermediary, where the target is expired (violates +validity.notAfter). Verification is expected to fail. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e4:45:ec:2b:33:db:da:8a:1f:b0:9c:73:6b:4b: + c2:a7:60:29:4f:61:1c:a6:5d:2a:17:76:d1:87:76: + ec:d7:2c:a6:80:72:62:c1:0c:7b:01:d4:6e:7a:c5: + fe:cc:89:1b:e6:4b:ef:76:0b:b8:46:b0:39:c0:50: + 54:44:97:d8:ea:4a:95:ae:3e:2c:38:1a:69:51:06: + cb:4d:85:44:e0:57:49:30:78:cc:fd:40:81:52:1a: + 43:c7:4a:02:db:b0:90:3a:b9:5f:7a:bd:a1:b1:7d: + a5:f7:ed:95:c5:e6:da:0e:d5:1a:fa:12:ce:2e:4f: + 6b:7c:a4:6b:de:89:47:0d:b9:34:62:c2:3a:06:db: + 72:2e:56:29:ca:80:d0:80:27:9e:3f:bf:73:b1:14: + 3c:88:f5:31:d3:d9:27:54:46:c3:b2:e3:59:f4:54: + 37:b8:73:b5:04:6b:6d:d2:e2:93:e6:57:2e:f8:3a: + 36:24:7c:fa:33:da:1a:5b:5d:da:f5:91:87:67:4a: + ca:2e:79:47:df:8c:33:8b:36:76:39:79:63:a9:7d: + 26:ef:95:22:e2:16:de:0a:1a:4a:4b:74:e3:d8:c5: + b9:ee:60:8d:ad:f7:cf:d4:d6:4e:b0:27:18:84:d1: + e3:ef:23:b8:00:6d:71:e8:a0:8e:bb:84:72:d9:75: + 76:6d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 40:D1:E0:A6:C2:37:1A:32:25:B8:D9:6D:5E:67:E7:CA:E0:76:30:16 + X509v3 Authority Key Identifier: + keyid:DA:CD:B0:93:32:B4:DB:D9:38:FF:99:C6:AF:A7:44:80:D0:C0:4A:A1 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 08:63:be:8b:50:78:97:05:7a:ee:a4:f1:fe:6f:bd:68:84:c4: + ce:e6:c9:fd:30:d8:27:a6:3c:37:74:21:4a:69:23:81:5f:da: + 02:56:45:f4:1e:a0:22:4c:43:8c:f0:65:c2:cb:db:68:05:5b: + 94:4b:93:3a:08:77:da:a0:67:3f:b2:d3:95:09:ad:ed:1e:e2: + 91:a4:8e:63:7d:37:d8:90:20:83:60:ab:0f:b7:ec:73:69:69: + b3:8e:54:6f:54:5b:95:de:2d:c9:49:73:5e:87:43:7e:37:07: + 02:a7:b7:df:e5:5e:9b:77:fb:9a:1f:15:29:29:f4:7e:00:e4: + 6f:5c:d2:66:46:5f:54:c4:6b:b2:50:2f:f4:78:8a:5e:cb:da: + 32:56:1c:ae:a7:92:d0:8e:71:95:6c:b1:ba:6c:b3:eb:3c:29: + 57:4e:e1:cd:8a:ef:41:ea:bd:7f:ce:17:cf:f5:9c:ec:d6:21: + cf:e2:e8:2d:b6:b9:dd:d9:2a:fe:d0:91:54:0e:15:a0:d3:ae: + ea:92:f9:98:c5:a2:da:a6:0d:89:8f:c9:fe:2e:25:9b:f4:f1: + 7f:ae:1a:5b:0f:94:c0:49:fb:15:0a:bb:1f:2b:fe:ca:d1:8e: + 10:94:16:c6:a0:a0:af:b9:5d:6a:31:c2:87:94:ee:ca:1e:93: + b3:ac:d6:dd +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkRewr +M9vaih+wnHNrS8KnYClPYRymXSoXdtGHduzXLKaAcmLBDHsB1G56xf7MiRvmS+92 +C7hGsDnAUFREl9jqSpWuPiw4GmlRBstNhUTgV0kweMz9QIFSGkPHSgLbsJA6uV96 +vaGxfaX37ZXF5toO1Rr6Es4uT2t8pGveiUcNuTRiwjoG23IuVinKgNCAJ54/v3Ox +FDyI9THT2SdURsOy41n0VDe4c7UEa23S4pPmVy74OjYkfPoz2hpbXdr1kYdnSsou +eUffjDOLNnY5eWOpfSbvlSLiFt4KGkpLdOPYxbnuYI2t98/U1k6wJxiE0ePvI7gA +bXHooI67hHLZdXZtAgMBAAGjgekwgeYwHQYDVR0OBBYEFEDR4KbCNxoyJbjZbV5n +58rgdjAWMB8GA1UdIwQYMBaAFNrNsJMytNvZOP+Zxq+nRIDQwEqhMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEACGO+i1B4lwV67qTx/m+9 +aITEzubJ/TDYJ6Y8N3QhSmkjgV/aAlZF9B6gIkxDjPBlwsvbaAVblEuTOgh32qBn +P7LTlQmt7R7ikaSOY3032JAgg2CrD7fsc2lps45Ub1Rbld4tyUlzXodDfjcHAqe3 +3+Vem3f7mh8VKSn0fgDkb1zSZkZfVMRrslAv9HiKXsvaMlYcrqeS0I5xlWyxumyz +6zwpV07hzYrvQeq9f84Xz/Wc7NYhz+LoLba53dkq/tCRVA4VoNOu6pL5mMWi2qYN +iY/J/i4lm/Txf64aWw+UwEn7FQq7Hyv+ytGOEJQWxqCgr7ldajHCh5Tuyh6Ts6zW +3Q== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b9:80:44:8f:9b:41:d5:be:e0:1a:a7:a4:4d:4e: + a0:52:ae:81:e7:c4:bd:f9:79:80:36:6e:8e:2a:56: + a9:84:26:da:d5:ad:e2:2a:5a:0e:68:2d:e9:ab:24: + 52:89:8e:7e:99:3d:b6:b7:ca:27:b7:80:45:38:4a: + eb:66:54:e1:28:a3:0e:df:a1:b7:63:4c:e1:44:e1: + af:6f:60:b3:35:af:9e:4d:51:cc:51:4c:70:8f:6b: + f2:73:c4:39:cb:a6:0b:9f:14:27:1a:90:f6:75:d3: + 3c:a0:b7:ba:3d:7c:27:eb:b3:b1:37:58:2a:e1:d8: + 62:09:dc:07:33:41:40:34:2c:93:98:e5:26:bc:d6: + 98:ed:75:b2:f1:98:4a:71:b4:21:61:96:12:98:7f: + 24:6e:d8:37:f2:2b:54:1e:4a:b0:8a:d9:2c:ab:b7: + 88:f5:a7:fb:fe:a7:04:b7:35:82:66:3f:ea:fb:eb: + 15:26:ae:52:ae:34:ec:da:fe:08:fa:ef:fd:40:f6: + 8d:b4:c5:68:a7:e3:60:2c:dc:b8:e0:3e:54:a9:60: + 11:7d:1e:54:37:98:b1:c2:fe:d0:fd:fa:b5:e6:f9: + bd:a6:50:b9:b6:1b:ec:3f:dc:ed:c2:d7:01:37:9e: + 69:24:90:05:d5:f2:26:fa:76:f3:76:34:e5:b7:88: + 92:95 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + DA:CD:B0:93:32:B4:DB:D9:38:FF:99:C6:AF:A7:44:80:D0:C0:4A:A1 + X509v3 Authority Key Identifier: + keyid:CB:65:23:DB:47:DE:B5:40:EC:44:D8:90:A7:D6:C0:78:81:FA:E2:CE + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 9d:a0:3a:08:79:82:a7:ac:d8:e9:bc:8a:e1:32:88:09:c8:de: + 54:ed:6f:43:fd:ab:68:b2:32:37:8e:74:de:37:da:f9:31:2d: + ee:d6:f7:0b:d2:25:f9:16:1e:93:f1:f3:e1:fd:fd:0f:ac:75: + 7b:a4:60:09:4c:0f:ea:45:5b:46:cf:e5:5a:c9:36:37:17:ee: + cf:44:82:51:c9:ba:eb:55:13:2d:f5:6f:83:9e:01:0c:04:ff: + 58:ad:50:54:7c:ee:a5:a4:e6:3c:93:46:c8:a7:bd:6f:18:7f: + d0:5c:1c:8a:a4:f3:1d:e3:d7:a3:1d:7e:a4:ca:cd:1b:92:ff: + 26:13:cc:b8:89:b2:b8:24:0c:30:df:43:70:20:5d:72:3f:b0: + 0e:8b:08:3e:e5:52:c9:d8:65:db:c6:31:95:a1:c4:56:b4:1f: + eb:af:e8:9c:8b:78:c2:75:c4:f1:98:e1:20:d6:5a:32:9f:94: + 75:c0:a5:86:da:79:a7:d3:25:20:56:13:dd:04:27:bd:e7:27: + 21:9d:8d:1d:dd:87:bc:6e:07:fd:9f:64:c5:7e:ac:2a:a4:a8: + e5:29:d1:5b:e2:24:6c:db:ca:3a:b6:13:34:00:81:15:08:1d: + fb:eb:ac:1a:ab:53:3e:31:db:30:40:4e:17:f3:98:53:00:d8: + d1:b8:5c:58 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuYBEj5tB +1b7gGqekTU6gUq6B58S9+XmANm6OKlaphCba1a3iKloOaC3pqyRSiY5+mT22t8on +t4BFOErrZlThKKMO36G3Y0zhROGvb2CzNa+eTVHMUUxwj2vyc8Q5y6YLnxQnGpD2 +ddM8oLe6PXwn67OxN1gq4dhiCdwHM0FANCyTmOUmvNaY7XWy8ZhKcbQhYZYSmH8k +btg38itUHkqwitksq7eI9af7/qcEtzWCZj/q++sVJq5SrjTs2v4I+u/9QPaNtMVo +p+NgLNy44D5UqWARfR5UN5ixwv7Q/fq15vm9plC5thvsP9ztwtcBN55pJJAF1fIm ++nbzdjTlt4iSlQIDAQABo4HLMIHIMB0GA1UdDgQWBBTazbCTMrTb2Tj/mcavp0SA +0MBKoTAfBgNVHSMEGDAWgBTLZSPbR961QOxE2JCn1sB4gfrizjA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AJ2gOgh5gqes2Om8iuEyiAnI3lTtb0P9q2iyMjeOdN432vkxLe7W9wvSJfkWHpPx +8+H9/Q+sdXukYAlMD+pFW0bP5VrJNjcX7s9EglHJuutVEy31b4OeAQwE/1itUFR8 +7qWk5jyTRsinvW8Yf9BcHIqk8x3j16MdfqTKzRuS/yYTzLiJsrgkDDDfQ3AgXXI/ +sA6LCD7lUsnYZdvGMZWhxFa0H+uv6JyLeMJ1xPGY4SDWWjKflHXApYbaeafTJSBW +E90EJ73nJyGdjR3dh7xuB/2fZMV+rCqkqOUp0VviJGzbyjq2EzQAgRUIHfvrrBqr +Uz4x2zBAThfzmFMA2NG4XFg= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c6:2e:8f:2a:f4:b2:4f:96:3c:a7:4e:f6:92:54: + be:34:77:64:65:fe:dd:dc:fd:11:29:a7:6c:56:04: + 9d:70:2f:3c:3f:55:e5:54:79:f0:bb:5f:79:97:f0: + 7b:0a:22:fb:66:d5:e8:6d:30:81:93:99:a5:8f:a5: + e2:33:b8:bd:05:9e:b1:c7:0a:63:75:12:e6:ac:75: + a3:1c:58:a0:c5:7b:40:45:60:f9:6a:8e:45:2a:59: + 7e:5f:8a:b8:a3:c9:bc:9d:dd:aa:d9:1d:85:30:67: + 67:db:d3:04:aa:cf:e9:42:fe:5d:df:46:ac:06:59: + 51:16:a0:e0:6c:f4:c0:ca:f6:c4:85:24:91:60:84: + b1:d0:92:7f:ab:ef:ce:5c:35:07:bc:03:72:32:c8: + 40:67:23:13:08:db:08:f3:cc:a0:75:e4:08:f7:e9: + ba:b3:e1:17:57:b1:16:93:ac:07:fa:04:1c:a7:6c: + d6:12:4f:c5:75:da:d4:6d:99:21:d1:9e:84:15:7a: + 34:ff:89:4e:c2:5b:43:89:86:63:90:db:37:93:15: + 57:27:0e:7a:c9:bb:21:a8:06:69:5d:41:b5:19:24: + bf:08:ea:67:0c:26:22:a3:86:7e:e0:04:d0:82:48: + b4:f5:48:01:56:20:6e:73:6d:c5:e1:62:1b:8e:f2: + bd:e7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + CB:65:23:DB:47:DE:B5:40:EC:44:D8:90:A7:D6:C0:78:81:FA:E2:CE + X509v3 Authority Key Identifier: + keyid:CB:65:23:DB:47:DE:B5:40:EC:44:D8:90:A7:D6:C0:78:81:FA:E2:CE + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 74:69:8a:c4:51:dd:1d:be:5d:53:de:9d:de:c7:91:3a:0d:47: + 2f:36:0d:d8:a7:c9:89:7e:68:8f:86:ed:af:e6:83:9c:9e:4e: + 99:df:ae:bb:e7:d0:c2:e4:b9:e7:e5:71:f5:4f:c4:55:a5:1d: + a6:93:2c:f8:5f:ab:45:b4:37:74:bc:14:d6:32:b0:f5:c4:82: + b0:5e:47:14:52:37:64:14:4e:25:f5:bf:db:41:27:78:56:29: + 6a:35:87:62:ef:f8:35:fa:51:d7:36:96:b3:6a:6e:bd:3f:ad: + a5:0f:c8:25:7e:11:26:96:1b:a2:32:ac:21:ad:a8:ff:31:32: + 3d:f3:aa:07:df:f7:72:28:12:a7:b9:40:38:b6:6f:69:89:4e: + 33:52:fc:40:61:85:de:b1:29:92:b5:47:b3:f6:a4:37:1c:8c: + b9:1b:02:52:72:a1:4d:46:aa:84:32:8e:d8:c9:e5:87:87:3d: + 66:8f:a1:af:ef:71:3e:a0:a3:8d:cb:75:4b:57:d6:c8:03:e2: + 40:e3:85:cd:a7:cb:af:cc:49:9c:4c:a2:2a:8c:75:6a:70:88: + 3e:6a:24:a1:35:85:e7:6d:0d:7a:b1:35:45:e3:8e:a8:a6:c9: + 0c:d3:78:41:44:5c:0b:d1:ff:b0:b2:91:ed:a0:83:c7:04:b3: + a9:a7:c1:6e +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYujyr0sk+WPKdO9pJU +vjR3ZGX+3dz9ESmnbFYEnXAvPD9V5VR58LtfeZfwewoi+2bV6G0wgZOZpY+l4jO4 +vQWesccKY3US5qx1oxxYoMV7QEVg+WqORSpZfl+KuKPJvJ3dqtkdhTBnZ9vTBKrP +6UL+Xd9GrAZZURag4Gz0wMr2xIUkkWCEsdCSf6vvzlw1B7wDcjLIQGcjEwjbCPPM +oHXkCPfpurPhF1exFpOsB/oEHKds1hJPxXXa1G2ZIdGehBV6NP+JTsJbQ4mGY5Db +N5MVVycOesm7IagGaV1BtRkkvwjqZwwmIqOGfuAE0IJItPVIAVYgbnNtxeFiG47y +vecCAwEAAaOByzCByDAdBgNVHQ4EFgQUy2Uj20fetUDsRNiQp9bAeIH64s4wHwYD +VR0jBBgwFoAUy2Uj20fetUDsRNiQp9bAeIH64s4wNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB0aYrEUd0d +vl1T3p3ex5E6DUcvNg3Yp8mJfmiPhu2v5oOcnk6Z366759DC5Lnn5XH1T8RVpR2m +kyz4X6tFtDd0vBTWMrD1xIKwXkcUUjdkFE4l9b/bQSd4VilqNYdi7/g1+lHXNpaz +am69P62lD8glfhEmlhuiMqwhraj/MTI986oH3/dyKBKnuUA4tm9piU4zUvxAYYXe +sSmStUez9qQ3HIy5GwJScqFNRqqEMo7YyeWHhz1mj6Gv73E+oKONy3VLV9bIA+JA +44XNp8uvzEmcTKIqjHVqcIg+aiShNYXnbQ16sTVF446opskM03hBRFwL0f+wspHt +oIPHBLOpp8Fu +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTYwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/generate-all.sh b/net/data/verify_certificate_chain_unittest/generate-all.sh new file mode 100755 index 0000000..63374a0 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-all.sh
@@ -0,0 +1,16 @@ +#!/bin/bash + +# 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. + +set -e +set -x + +for script in generate-*.py ; do + python "$script" +done + +# Cleanup temporary files. +rm -rf *.pyc +rm -rf out/
diff --git a/net/data/verify_certificate_chain_unittest/generate-basic-constraints-pathlen-0-self-issued.py b/net/data/verify_certificate_chain_unittest/generate-basic-constraints-pathlen-0-self-issued.py new file mode 100755 index 0000000..03c6eb5 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-basic-constraints-pathlen-0-self-issued.py
@@ -0,0 +1,35 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 2 intermediaries. The first intermediary has a basic +constraints path length of 0. The second one is self-issued so does not count +against the path length.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary with pathlen 0 +intermediary1 = common.create_intermediary_certificate('Intermediary', root) +intermediary1.get_extensions().set_property('basicConstraints', + 'critical,CA:true,pathlen:0') + +# Another intermediary (with the same pathlen restriction). +# Note that this is self-issued but NOT self-signed. +intermediary2 = common.create_intermediary_certificate('Intermediary', + intermediary1) +intermediary2.get_extensions().set_property('basicConstraints', + 'critical,CA:true,pathlen:0') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary2) + +chain = [target, intermediary2, intermediary1] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = True + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-expired-intermediary.py b/net/data/verify_certificate_chain_unittest/generate-expired-intermediary.py new file mode 100755 index 0000000..7a97fe36 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-expired-intermediary.py
@@ -0,0 +1,29 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, where the intermediary is expired +(violates validity.notAfter). Verification is expected to fail.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.set_validity_range(common.JANUARY_1_2015_UTC, + common.JANUARY_1_2016_UTC) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] + +# March 2nd, 2016 midnight UTC +time = '160302120000Z' +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py b/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py new file mode 100755 index 0000000..3ff7d63cb --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py
@@ -0,0 +1,28 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, where the target is expired (violates +validity.notBefore). Verification is expected to fail.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) +target.set_validity_range(common.JANUARY_1_2015_UTC, common.JANUARY_1_2016_UTC) + +chain = [target, intermediary] +trusted = [root] + +# March 2nd, 2014 midnight UTC +time = '140302120000Z' +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-expired-target.py b/net/data/verify_certificate_chain_unittest/generate-expired-target.py new file mode 100755 index 0000000..b3b3c531 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-expired-target.py
@@ -0,0 +1,28 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, where the target is expired (violates +validity.notAfter). Verification is expected to fail.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) +target.set_validity_range(common.JANUARY_1_2015_UTC, common.JANUARY_1_2016_UTC) + +chain = [target, intermediary] +trusted = [root] + +# March 2nd, 2016 midnight UTC +time = '160302120000Z' +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-ca-false.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-ca-false.py new file mode 100755 index 0000000..4375f0e3 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-ca-false.py
@@ -0,0 +1,28 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +has a basic constraints extension that indicates it is NOT a CA. Verification +is expected to fail.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary with incorrect basic constraints. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.get_extensions().set_property('basicConstraints', + 'critical,CA:false') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-not-critical.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-not-critical.py new file mode 100755 index 0000000..284354fd --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-not-critical.py
@@ -0,0 +1,28 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +has a basic constraints extension but does not mark it as critical. +Verification is expected to succeed, since although not critical, the +basicConstraints indicates CA=true as expected.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary with non-critical basic constarints. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.get_extensions().set_property('basicConstraints', 'CA:true') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = True + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-lacks-basic-constraints.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-lacks-basic-constraints.py new file mode 100755 index 0000000..1faced54 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-lacks-basic-constraints.py
@@ -0,0 +1,27 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +lacks the basic constraints extension, and hence is expected to fail validation +(RFC 5280 requires v3 signing certificates have a BasicConstaints).""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary that lacks basic constraints. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.get_extensions().remove_property('basicConstraints') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-lacks-signing-key-usage.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-lacks-signing-key-usage.py new file mode 100755 index 0000000..4c3d8e8 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-lacks-signing-key-usage.py
@@ -0,0 +1,28 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +contains a keyUsage extension, HOWEVER it does not contain the keyCertSign bit. +Hence validation is expected to fail.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary that is missing keyCertSign. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.get_extensions().set_property('keyUsage', + 'critical,digitalSignature,keyEncipherment') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-signed-with-md5.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-signed-with-md5.py new file mode 100755 index 0000000..8a59e651 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-signed-with-md5.py
@@ -0,0 +1,27 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +however is signed using the MD5 hash. Verification is expected to fail because +MD5 is too weak.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.set_signature_hash('md5') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-unknown-critical-extension.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-unknown-critical-extension.py new file mode 100755 index 0000000..39c0597 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-unknown-critical-extension.py
@@ -0,0 +1,29 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +has an unknown X.509v3 extension (OID=1.2.3.4) that is marked as critical. +Verifying this certificate chain is expected to fail because there is an +unrecognized critical extension.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary that has an unknown critical extension. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.get_extensions().add_property('1.2.3.4', + 'critical,DER:01:02:03:04') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediary-unknown-non-critical-extension.py b/net/data/verify_certificate_chain_unittest/generate-intermediary-unknown-non-critical-extension.py new file mode 100755 index 0000000..874a658 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-intermediary-unknown-non-critical-extension.py
@@ -0,0 +1,28 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The intermediary +has an unknown X.509v3 extension that is marked as non-critical. Verification +is expected to succeed because although unrecognized, the extension is not +critical.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Intermediary that has an unknown non-critical extension. +intermediary.get_extensions().add_property('1.2.3.4', 'DER:01:02:03:04') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = True + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-and-intermediary.py b/net/data/verify_certificate_chain_unittest/generate-target-and-intermediary.py new file mode 100755 index 0000000..94525cc --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-and-intermediary.py
@@ -0,0 +1,25 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. Verification is +expected to succeed.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = True + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py b/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py new file mode 100755 index 0000000..fa3cafb4 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py
@@ -0,0 +1,30 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, a trusted root, and a target +certificate that is not a CA, and yet has the keyCertSign bit set. Verification +is expected to fail, since keyCertSign should only be asserted when CA is +true.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate (end entity but has keyCertSign bit set). +target = common.create_end_entity_certificate('Target', intermediary) +target.get_extensions().set_property('keyUsage', + 'critical,digitalSignature,keyEncipherment,keyCertSign') + + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py b/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py new file mode 100755 index 0000000..5d29739 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py
@@ -0,0 +1,29 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, a trusted root, and a target +certificate that is not a CA, and yet has a pathlen set. Verification is +expected to fail, since pathlen should only be set for CAs.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate (end entity, but has pathlen set). +target = common.create_end_entity_certificate('Target', intermediary) +target.get_extensions().set_property('basicConstraints', + 'critical,CA:false,pathlen:1') + + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-not-end-entity.py b/net/data/verify_certificate_chain_unittest/generate-target-not-end-entity.py new file mode 100755 index 0000000..83573ad --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-not-end-entity.py
@@ -0,0 +1,26 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, a trusted root, and a target +certificate that is also a CA. Verification is expected to succeed, as the test +code accepts any target certificate.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate (is also a CA) +target = common.create_intermediary_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = True + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py b/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py new file mode 100755 index 0000000..75144a0 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py
@@ -0,0 +1,27 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The target +certificate is signed using a weak RSA key (512-bit modulus), and so +verification is expected to fail.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary with a very weak key size (512-bit RSA). +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.generate_rsa_key(512) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-signed-using-ecdsa.py b/net/data/verify_certificate_chain_unittest/generate-target-signed-using-ecdsa.py new file mode 100755 index 0000000..562ebb1f --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-signed-using-ecdsa.py
@@ -0,0 +1,26 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with a trusted root using RSA, and intermediary using EC, +and a target certificate using RSA. Verification is expected to succeed.""" + +import common + +# Self-signed root certificate (part of trust store), using RSA. +root = common.create_self_signed_root_certificate('Root') + +# Intermediary using an EC key for the P-384 curve. +intermediary = common.create_intermediary_certificate('Intermediary', root) +intermediary.generate_ec_key('secp384r1') + +# Target certificate contains an RSA key (but is signed using ECDSA). +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = True + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py b/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py new file mode 100755 index 0000000..743ad25 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py
@@ -0,0 +1,26 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with an intermediary that uses MD5 to sign the target +certificate. This is expected to fail because MD5 is too weak.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) +target.set_signature_hash('md5') + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py b/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py new file mode 100755 index 0000000..7254299 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py
@@ -0,0 +1,29 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary and a trusted root. The target +certificate has an unknown X.509v3 extension (OID=1.2.3.4) that is marked as +critical. Verifying this certificate chain is expected to fail because there is +an unrecognized critical extension.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate (has unknown critical extension). +target = common.create_end_entity_certificate('Target', intermediary) +target.get_extensions().add_property('1.2.3.4', + 'critical,DER:01:02:03:04') + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py b/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py new file mode 100755 index 0000000..162f7160 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py
@@ -0,0 +1,32 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain where the target has an incorrect signature. Everything +else should check out, however the digital signature contained in the target +certificate is wrong.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate to include in the certificate chain. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Actual intermediate that was used to sign the target certificate. It has the +# same subject as expected, but a different RSA key from the certificate +# included in the actual chain. +wrong_intermediary = common.create_intermediary_certificate('Intermediary', + root) + +# Target certificate, signed using |wrong_intermediary| NOT |intermediary|. +target = common.create_end_entity_certificate('Target', wrong_intermediary) + +chain = [target, intermediary] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-unknown-root.py b/net/data/verify_certificate_chain_unittest/generate-unknown-root.py new file mode 100755 index 0000000..4f0b5f50 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-unknown-root.py
@@ -0,0 +1,26 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 1 intermediary, but the root is not in trust store. +Verification is expected to fail because the final intermediary (Intermediary) +does not chain to a known root.""" + +import common + +# Self-signed root certificate, which is NOT added to the trust store. +root = common.create_self_signed_root_certificate('Root') + +# Intermediary certificate. +intermediary = common.create_intermediary_certificate('Intermediary', root) + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary) + +chain = [target, intermediary] +trusted = [] # Note that this lacks |root| +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py b/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py new file mode 100755 index 0000000..0298956e --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py
@@ -0,0 +1,34 @@ +#!/usr/bin/python +# 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. + +"""Certificate chain with 2 intermediaries. The first intermediary has a basic +constraints path length of 0, so it is a violation for it to have a subordinate +intermediary.""" + +import common + +# Self-signed root certificate (part of trust store). +root = common.create_self_signed_root_certificate('Root') + +# Intermediary with pathlen 0 +intermediary1 = common.create_intermediary_certificate('Intermediary1', root) +intermediary1.get_extensions().set_property('basicConstraints', + 'critical,CA:true,pathlen:0') + +# Another intermediary (with the same pathlen restriction) +intermediary2 = common.create_intermediary_certificate('Intermediary2', + intermediary1) +intermediary2.get_extensions().set_property('basicConstraints', + 'critical,CA:true,pathlen:0') + +# Target certificate. +target = common.create_end_entity_certificate('Target', intermediary2) + +chain = [target, intermediary2, intermediary1] +trusted = [root] +time = common.DEFAULT_TIME +verify_result = False + +common.write_test_file(__doc__, chain, trusted, time, verify_result)
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-basic-constraints-ca-false.pem b/net/data/verify_certificate_chain_unittest/intermediary-basic-constraints-ca-false.pem new file mode 100644 index 0000000..04bbffe7 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-basic-constraints-ca-false.pem
@@ -0,0 +1,281 @@ +[Created by: generate-intermediary-basic-constraints-ca-false.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +has a basic constraints extension that indicates it is NOT a CA. Verification +is expected to fail. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:d7:2c:b6:2c:cc:74:93:54:76:43:6a:c8:78:5d: + c4:cc:30:ab:d1:16:46:84:b6:d8:28:13:74:4f:7f: + 6c:e1:ef:0c:12:07:c8:f5:2b:bd:98:3e:5f:ec:3c: + 6b:96:6b:7d:42:d1:a0:1c:e3:9a:c5:04:10:9f:f6: + d8:d2:e9:0b:98:3b:40:f1:3d:9f:39:fd:70:7b:d3: + f6:af:83:14:48:89:1c:87:aa:f1:21:fc:ab:f4:1e: + b3:66:3b:1e:ae:f9:9b:5d:9b:6d:6c:19:14:e2:38: + 09:36:99:be:b6:c0:27:50:91:33:c5:8d:11:4b:83: + 95:db:21:d6:3b:a8:7c:d9:a7:6b:04:cc:d4:81:28: + 8e:bb:57:76:2a:d9:d9:fa:31:07:62:dc:34:af:2d: + ec:7d:2f:8c:73:b9:57:44:cc:86:3b:49:d5:45:df: + bd:11:97:4e:b5:d2:07:17:71:39:0c:54:5b:c7:76: + db:69:64:e6:0d:3d:a2:c8:bc:45:35:06:f4:6f:fb: + ff:e5:23:53:9d:36:92:b5:15:2e:c7:62:62:22:69: + 66:62:2c:51:ee:1c:b7:2e:10:82:14:e2:ff:3f:f9: + 4e:a5:ad:70:fe:c8:26:d3:99:fb:ee:ea:67:f9:8a: + 06:b8:a1:60:99:4f:ef:95:0e:96:3a:c2:35:11:e9: + 4e:7d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 34:A4:95:47:59:7D:2A:43:E3:DD:5F:55:F7:D0:F4:C0:25:E5:AD:8E + X509v3 Authority Key Identifier: + keyid:9F:6B:93:D1:46:61:07:80:55:0A:40:C8:FE:A8:D8:DD:8E:B1:EF:DD + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 75:a4:8c:02:02:da:03:71:90:d9:46:cc:6a:21:36:ef:86:21: + 68:60:4a:a9:ce:af:f6:49:cf:f4:6b:b0:96:42:60:d5:02:91: + 62:93:01:8b:cb:0b:eb:a5:b0:b8:49:6c:8e:54:84:c2:53:d4: + 46:09:d6:db:29:96:a0:45:e5:09:5b:c1:b7:ba:be:8a:43:62: + f9:8b:e4:47:d5:a9:d9:03:0e:83:86:78:19:81:c8:3b:20:86: + 1d:72:98:cd:06:73:fa:b1:e4:df:fd:08:9c:52:bb:f6:48:61: + bc:6f:3f:1e:1c:ef:f5:4e:94:5b:ee:e7:96:44:ff:1a:8d:6c: + a6:9c:d1:77:17:1f:c7:e1:53:d5:5e:a5:d8:55:c8:36:48:f6: + 8c:25:c3:1b:27:09:58:8e:30:6a:ad:ad:5e:0a:2e:5f:6f:5a: + cb:1a:fb:fe:c9:03:1f:bf:37:9c:b5:c3:93:b7:4c:a2:d5:e2: + ac:af:94:91:85:22:8c:c7:8b:b0:39:4a:67:f0:82:dc:db:fe: + 39:3c:1d:50:4c:70:44:7e:aa:73:e4:fd:51:48:12:ea:9c:18: + b1:27:6b:96:e7:aa:cf:f6:58:bf:05:d0:a4:51:71:27:b6:2c: + 3d:a7:50:4d:93:1a:8d:04:84:7e:d3:9f:0d:b5:a5:6b:d3:db: + d4:3a:03:fb +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXLLYs +zHSTVHZDash4XcTMMKvRFkaEttgoE3RPf2zh7wwSB8j1K72YPl/sPGuWa31C0aAc +45rFBBCf9tjS6QuYO0DxPZ85/XB70/avgxRIiRyHqvEh/Kv0HrNmOx6u+Ztdm21s +GRTiOAk2mb62wCdQkTPFjRFLg5XbIdY7qHzZp2sEzNSBKI67V3Yq2dn6MQdi3DSv +Lex9L4xzuVdEzIY7SdVF370Rl0610gcXcTkMVFvHdttpZOYNPaLIvEU1BvRv+//l +I1OdNpK1FS7HYmIiaWZiLFHuHLcuEIIU4v8/+U6lrXD+yCbTmfvu6mf5iga4oWCZ +T++VDpY6wjUR6U59AgMBAAGjgekwgeYwHQYDVR0OBBYEFDSklUdZfSpD491fVffQ +9MAl5a2OMB8GA1UdIwQYMBaAFJ9rk9FGYQeAVQpAyP6o2N2Ose/dMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAdaSMAgLaA3GQ2UbMaiE2 +74YhaGBKqc6v9knP9GuwlkJg1QKRYpMBi8sL66WwuElsjlSEwlPURgnW2ymWoEXl +CVvBt7q+ikNi+YvkR9Wp2QMOg4Z4GYHIOyCGHXKYzQZz+rHk3/0InFK79khhvG8/ +Hhzv9U6UW+7nlkT/Go1sppzRdxcfx+FT1V6l2FXINkj2jCXDGycJWI4waq2tXgou +X29ayxr7/skDH783nLXDk7dMotXirK+UkYUijMeLsDlKZ/CC3Nv+OTwdUExwRH6q +c+T9UUgS6pwYsSdrlueqz/ZYvwXQpFFxJ7YsPadQTZMajQSEftOfDbWla9Pb1DoD ++w== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b6:2b:92:72:9f:d2:59:95:3f:16:fd:eb:d3:37: + 3e:4d:fa:bf:05:3a:e3:8b:b5:32:90:42:9c:d7:69: + c5:30:e6:0f:d3:6d:fb:93:c0:0e:30:f2:9f:42:8d: + 83:17:62:e0:ac:41:c4:2b:29:4f:e6:c7:64:27:a8: + ca:c0:46:16:50:ba:e1:de:3a:ed:4b:1e:49:84:cf: + 16:2c:5d:84:0c:8e:0d:42:c0:d2:01:e3:94:2a:79: + d7:da:d7:a6:51:75:fe:a3:e5:1a:95:f5:38:a3:5b: + f8:5c:8a:a9:90:f1:f9:83:4a:13:25:61:bc:33:fb: + 19:69:71:c1:c1:a6:45:4a:bd:7f:3f:a6:92:43:fe: + db:88:a2:15:a9:41:cf:9d:62:9b:b4:fc:71:8f:4f: + be:5d:4a:48:8a:7a:de:57:11:82:44:49:a6:5c:25: + a0:8c:0b:f0:ec:74:51:76:ae:f4:5c:14:c6:d0:90: + b9:93:64:93:f8:04:82:99:28:98:fa:c8:a2:e8:98: + 20:2d:7d:cd:d9:99:ef:74:eb:7a:63:06:4c:7a:86: + 1e:e8:4b:8f:d0:8d:ab:d9:3a:8e:bc:ec:f2:2a:0d: + e1:5f:89:54:0f:ef:b8:28:ff:d5:f6:ef:a7:14:94: + 52:72:48:50:29:85:5b:d9:fd:1e:14:59:c8:69:df: + 89:47 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 9F:6B:93:D1:46:61:07:80:55:0A:40:C8:FE:A8:D8:DD:8E:B1:EF:DD + X509v3 Authority Key Identifier: + keyid:D8:01:99:4C:28:49:4B:7F:FB:30:0A:92:A8:90:6F:8B:9C:45:05:7F + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:FALSE + Signature Algorithm: sha256WithRSAEncryption + 7f:36:da:7c:f5:4a:3b:37:53:82:b4:98:99:0b:d7:c0:73:b9: + 05:89:75:fa:97:e4:cc:9d:73:61:18:ad:f2:bd:57:3f:6b:d0: + 45:a2:45:2a:27:68:13:f1:a3:80:15:85:13:52:4b:c6:8f:12: + 78:ba:21:51:fb:9d:1c:88:5d:5c:f5:0b:e5:66:ef:b4:72:67: + 16:cb:3d:79:83:56:9b:90:50:91:fe:f2:0c:f9:36:88:dd:14: + ef:b7:d2:1e:a3:54:d3:67:9f:3e:bc:7b:8c:45:be:12:c0:a9: + 21:cf:b7:ea:e9:9e:ec:e8:79:02:a0:48:3e:a8:b9:fc:62:9d: + a3:ab:74:b6:22:97:ab:78:7f:60:8e:67:96:02:ff:13:6d:66: + b9:df:a4:55:c7:e4:82:a9:f7:0d:30:d4:e9:6b:a9:25:68:f8: + 3c:2f:73:38:cf:07:af:b5:ef:82:5a:5f:34:0c:d9:0a:56:ad: + 30:c4:8a:2a:90:5c:92:e6:01:f5:49:4e:58:a0:13:0c:81:46: + ef:01:bc:8f:48:15:49:da:5d:20:28:a7:2a:b9:2b:85:9c:f8: + c4:5e:76:6f:ff:67:c0:2a:ee:96:91:2e:8d:b3:be:6b:66:51: + 0e:d5:7f:c9:21:c0:af:79:cc:07:0a:cc:dc:85:00:85:cf:74: + 9e:6f:2f:31 +-----BEGIN CERTIFICATE----- +MIIDajCCAlKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtiuScp/S +WZU/Fv3r0zc+Tfq/BTrji7UykEKc12nFMOYP0237k8AOMPKfQo2DF2LgrEHEKylP +5sdkJ6jKwEYWULrh3jrtSx5JhM8WLF2EDI4NQsDSAeOUKnnX2temUXX+o+UalfU4 +o1v4XIqpkPH5g0oTJWG8M/sZaXHBwaZFSr1/P6aSQ/7biKIVqUHPnWKbtPxxj0++ +XUpIinreVxGCREmmXCWgjAvw7HRRdq70XBTG0JC5k2ST+ASCmSiY+sii6JggLX3N +2ZnvdOt6YwZMeoYe6EuP0I2r2TqOvOzyKg3hX4lUD++4KP/V9u+nFJRSckhQKYVb +2f0eFFnIad+JRwIDAQABo4HIMIHFMB0GA1UdDgQWBBSfa5PRRmEHgFUKQMj+qNjd +jrHv3TAfBgNVHSMEGDAWgBTYAZlMKElLf/swCpKokG+LnEUFfzA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBAH82 +2nz1Sjs3U4K0mJkL18BzuQWJdfqX5Mydc2EYrfK9Vz9r0EWiRSonaBPxo4AVhRNS +S8aPEni6IVH7nRyIXVz1C+Vm77RyZxbLPXmDVpuQUJH+8gz5NojdFO+30h6jVNNn +nz68e4xFvhLAqSHPt+rpnuzoeQKgSD6oufxinaOrdLYil6t4f2COZ5YC/xNtZrnf +pFXH5IKp9w0w1OlrqSVo+DwvczjPB6+174JaXzQM2QpWrTDEiiqQXJLmAfVJTlig +EwyBRu8BvI9IFUnaXSAopyq5K4Wc+MRedm//Z8Aq7paRLo2zvmtmUQ7Vf8khwK95 +zAcKzNyFAIXPdJ5vLzE= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a6:91:a5:68:ad:ba:89:8f:b6:5c:19:a1:3d:10: + ad:55:97:10:17:06:9a:7d:59:e7:7c:56:3d:1d:5f: + 17:c7:a2:e5:e7:80:52:a8:cd:ef:ca:82:4a:77:e4: + ac:77:7c:35:f1:1b:b3:7a:9a:58:78:9e:1c:00:c9: + 67:9d:4d:d0:f4:92:f1:0a:82:8a:f0:d4:57:04:04: + cc:12:e4:86:95:93:12:a7:9b:ee:6f:d2:85:5d:63: + 3c:5c:94:91:db:d0:3c:f1:a8:ca:05:19:22:98:e0: + ef:29:22:35:40:3c:7c:c4:74:5c:df:24:2b:e4:b8: + bc:23:ba:db:aa:6b:ef:ba:bb:aa:c2:ab:ce:9f:07: + 2e:36:da:21:67:4d:80:71:ba:4a:7b:62:16:08:51: + 29:35:dd:c8:1d:8c:60:d8:8c:05:a2:ec:f0:5e:af: + f4:f2:e8:95:03:c1:79:77:3e:ff:f4:31:ed:ab:cc: + 1b:dd:7e:f6:2c:71:3a:1c:e3:ab:ab:a4:ab:79:12: + 59:a5:f6:84:00:83:ff:8c:e5:3b:a0:4f:37:2a:b1: + c4:a5:19:69:46:2c:87:bc:a5:0e:ee:31:13:2e:0e: + ed:d2:e2:19:be:d0:14:b3:68:b5:34:c6:3f:6e:95: + da:eb:2c:55:30:92:3d:f8:93:df:4e:ec:85:a7:b3: + 06:71 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + D8:01:99:4C:28:49:4B:7F:FB:30:0A:92:A8:90:6F:8B:9C:45:05:7F + X509v3 Authority Key Identifier: + keyid:D8:01:99:4C:28:49:4B:7F:FB:30:0A:92:A8:90:6F:8B:9C:45:05:7F + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 38:6a:c5:72:2a:2b:2b:2c:d4:6f:07:a5:14:46:10:e5:3b:68: + 80:3c:d9:60:ef:12:ed:e6:1a:c0:76:4a:3d:9c:e1:86:71:b5: + 15:de:eb:47:51:d6:85:3e:14:ef:18:e6:b0:3c:ac:6b:0b:48: + 42:0f:76:3d:59:89:84:63:61:fe:6a:a0:47:0a:75:1a:64:92: + e3:09:14:12:d9:af:36:ec:f4:c5:79:37:22:cd:88:b8:f8:3c: + 55:0a:28:2e:21:26:45:cf:95:41:e4:6c:5a:ad:23:0a:cc:fd: + 83:71:76:7d:63:e2:9f:6c:f2:07:ee:6e:e3:fd:dd:87:f0:23: + 9c:04:5e:19:b2:67:38:00:91:ea:05:4c:3c:db:cd:19:d3:f6: + 7c:fd:fa:1d:86:fc:49:fe:45:ac:99:28:b1:a6:e7:fb:90:a2: + 98:59:a7:12:bc:26:ce:6d:b5:0f:62:19:40:a4:67:45:06:ec: + 18:1e:c5:83:e4:a1:fb:e6:58:3c:6c:a3:12:29:46:22:0d:8a: + 07:75:72:ab:6a:a9:c3:1c:0c:d3:a3:0b:fd:50:af:37:89:0b: + f6:70:57:1c:fb:d6:e7:0f:e6:52:5e:f6:1f:02:1c:73:bb:2b: + eb:21:1e:f0:aa:fe:b1:50:c0:12:fc:76:8c:d0:94:0a:ab:3b: + a8:0a:6c:28 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKaRpWituomPtlwZoT0Q +rVWXEBcGmn1Z53xWPR1fF8ei5eeAUqjN78qCSnfkrHd8NfEbs3qaWHieHADJZ51N +0PSS8QqCivDUVwQEzBLkhpWTEqeb7m/ShV1jPFyUkdvQPPGoygUZIpjg7ykiNUA8 +fMR0XN8kK+S4vCO626pr77q7qsKrzp8HLjbaIWdNgHG6SntiFghRKTXdyB2MYNiM +BaLs8F6v9PLolQPBeXc+//Qx7avMG91+9ixxOhzjq6ukq3kSWaX2hACD/4zlO6BP +NyqxxKUZaUYsh7ylDu4xEy4O7dLiGb7QFLNotTTGP26V2ussVTCSPfiT307shaez +BnECAwEAAaOByzCByDAdBgNVHQ4EFgQU2AGZTChJS3/7MAqSqJBvi5xFBX8wHwYD +VR0jBBgwFoAU2AGZTChJS3/7MAqSqJBvi5xFBX8wNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA4asVyKisr +LNRvB6UURhDlO2iAPNlg7xLt5hrAdko9nOGGcbUV3utHUdaFPhTvGOawPKxrC0hC +D3Y9WYmEY2H+aqBHCnUaZJLjCRQS2a827PTFeTcizYi4+DxVCiguISZFz5VB5Gxa +rSMKzP2DcXZ9Y+KfbPIH7m7j/d2H8COcBF4Zsmc4AJHqBUw8280Z0/Z8/fodhvxJ +/kWsmSixpuf7kKKYWacSvCbObbUPYhlApGdFBuwYHsWD5KH75lg8bKMSKUYiDYoH +dXKraqnDHAzTowv9UK83iQv2cFcc+9bnD+ZSXvYfAhxzuyvrIR7wqv6xUMAS/HaM +0JQKqzuoCmwo +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-basic-constraints-not-critical.pem b/net/data/verify_certificate_chain_unittest/intermediary-basic-constraints-not-critical.pem new file mode 100644 index 0000000..3ff3682 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-basic-constraints-not-critical.pem
@@ -0,0 +1,282 @@ +[Created by: generate-intermediary-basic-constraints-not-critical.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +has a basic constraints extension but does not mark it as critical. +Verification is expected to succeed, since although not critical, the +basicConstraints indicates CA=true as expected. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:d2:25:d5:a0:7a:94:e6:21:0b:8b:e5:68:21:06: + c4:a7:fe:fd:de:97:31:a6:80:a2:3d:be:f0:03:c2: + de:d5:a1:a6:3f:6e:19:3b:fe:f4:66:8f:8f:c8:d3: + e4:7f:73:fc:e7:1c:2f:b4:9f:5e:bf:25:71:2d:d0: + 65:60:76:0d:a6:be:af:1a:1f:3c:00:bf:cd:8e:de: + 04:6f:6c:8d:25:c5:7a:64:71:31:d7:4a:e9:bd:5f: + fa:e6:b8:e8:55:a2:c7:2b:b4:7d:4e:e3:bc:23:c9: + 0f:79:29:86:dd:4d:b3:dd:12:c5:1a:d3:fc:4a:31: + 54:47:7b:62:20:f5:bb:7c:47:6d:7f:67:d5:69:4b: + f8:99:4f:dd:13:56:a4:9d:0a:fc:d0:da:b5:bd:e0: + 0c:c8:50:d6:e1:73:d8:59:37:95:99:70:31:3d:46: + 44:d5:68:7b:45:4b:9e:4a:fd:25:33:05:7c:24:05: + 0f:6c:00:4b:3e:0c:cf:56:e8:88:ef:67:bc:bd:66: + b4:7c:bc:db:c6:4e:8b:44:0b:65:8f:c6:a9:57:d7: + b0:8e:88:19:fc:d6:b7:02:b9:50:a0:e2:06:61:1d: + d1:03:7a:ce:75:09:d2:64:d5:c6:61:3b:f1:28:5b: + 4b:de:08:2f:b9:96:55:d9:4c:8c:48:d0:c6:2b:ee: + 59:33 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + F9:45:14:0B:10:A3:AC:77:3B:19:DE:FB:66:FE:CF:E3:9A:F4:57:1A + X509v3 Authority Key Identifier: + keyid:73:DC:40:FE:F8:8F:F4:BD:DE:B0:63:30:AF:05:0B:6C:4E:99:54:7F + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 41:3c:ca:d6:88:67:86:f8:dc:35:ab:37:d0:40:96:7b:4e:70: + 2a:6b:cc:15:31:fd:06:87:ac:81:6d:89:ce:66:b2:26:73:bc: + 71:3e:af:be:b2:ba:d5:bc:a5:b7:64:0c:7d:31:9b:0c:e1:0c: + 73:14:0c:e0:fe:95:d3:ca:1d:d1:51:8a:fb:b1:e1:8d:68:58: + 30:51:a6:2f:86:57:61:a6:20:7c:1f:0c:7f:14:c7:fe:fa:88: + 14:7b:d9:41:5c:20:da:16:3c:ce:77:b8:ee:7c:33:d8:cf:2e: + 6e:e3:43:01:00:0a:c0:1c:a0:eb:6b:36:a0:d6:bd:6e:91:a9: + e1:8d:8d:b2:4e:12:d3:fa:56:84:be:eb:65:d8:9d:e2:c7:d4: + 36:a2:7e:b8:b2:d4:5c:2f:c2:47:1e:ca:7a:fd:b4:30:3a:59: + 19:8d:ca:7e:44:65:86:97:2d:f4:65:3b:f0:12:4b:d0:74:48: + f9:dd:d3:d3:89:97:83:c6:4c:bb:da:e7:ce:e7:5e:93:f3:51: + 4c:22:95:31:59:a9:3d:82:ec:8d:4c:8e:44:42:5f:13:d0:56: + c2:35:e1:07:11:6d:23:92:3c:de:b1:3e:1c:4e:0e:e3:c6:06: + 09:e1:dc:b8:4c:89:82:35:3c:51:60:1f:06:65:11:39:8b:b4: + 20:04:f0:90 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSJdWg +epTmIQuL5WghBsSn/v3elzGmgKI9vvADwt7VoaY/bhk7/vRmj4/I0+R/c/znHC+0 +n16/JXEt0GVgdg2mvq8aHzwAv82O3gRvbI0lxXpkcTHXSum9X/rmuOhVoscrtH1O +47wjyQ95KYbdTbPdEsUa0/xKMVRHe2Ig9bt8R21/Z9VpS/iZT90TVqSdCvzQ2rW9 +4AzIUNbhc9hZN5WZcDE9RkTVaHtFS55K/SUzBXwkBQ9sAEs+DM9W6IjvZ7y9ZrR8 +vNvGTotEC2WPxqlX17COiBn81rcCuVCg4gZhHdEDes51CdJk1cZhO/EoW0veCC+5 +llXZTIxI0MYr7lkzAgMBAAGjgekwgeYwHQYDVR0OBBYEFPlFFAsQo6x3Oxne+2b+ +z+Oa9FcaMB8GA1UdIwQYMBaAFHPcQP74j/S93rBjMK8FC2xOmVR/MD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAQTzK1ohnhvjcNas30ECW +e05wKmvMFTH9BoesgW2JzmayJnO8cT6vvrK61bylt2QMfTGbDOEMcxQM4P6V08od +0VGK+7HhjWhYMFGmL4ZXYaYgfB8MfxTH/vqIFHvZQVwg2hY8zne47nwz2M8ubuND +AQAKwByg62s2oNa9bpGp4Y2Nsk4S0/pWhL7rZdid4sfUNqJ+uLLUXC/CRx7Kev20 +MDpZGY3KfkRlhpct9GU78BJL0HRI+d3T04mXg8ZMu9rnzudek/NRTCKVMVmpPYLs +jUyOREJfE9BWwjXhBxFtI5I83rE+HE4O48YGCeHcuEyJgjU8UWAfBmUROYu0IATw +kA== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:d5:4a:96:98:34:e1:a8:92:88:9a:0c:d0:b7:e3: + a0:dc:71:4b:32:cd:59:a1:b9:9c:d5:e5:30:1b:ad: + 7e:41:7f:e7:39:81:25:d1:e7:66:c2:5f:79:80:ea: + ff:6b:ef:b9:95:9e:8b:a0:0c:6a:b6:c8:4b:50:2c: + 7d:f1:ad:46:ed:9a:7c:7d:6a:65:70:de:c2:45:7e: + 1b:28:af:dc:eb:3d:bb:4c:98:a9:8c:b3:a3:35:a1: + 2b:cd:bb:8e:2a:2b:74:6d:0c:91:72:36:c2:2f:0e: + 46:2a:77:34:ab:98:f8:28:c9:02:42:78:2f:b2:e0: + 9a:0d:ae:03:94:c0:31:79:1e:72:ce:8b:7c:21:c8: + d5:1c:9b:94:04:29:ce:1c:5f:22:e3:f0:20:62:2b: + 7d:7d:c2:fa:29:5c:8b:2a:dd:0f:08:31:49:58:7d: + 85:76:21:b4:46:0e:d8:26:dc:26:f9:0a:9b:58:a2: + b8:29:b4:df:c0:4e:10:56:28:96:02:54:7c:e9:a3: + 3f:84:12:6a:89:ed:f0:0d:a0:03:54:0c:b2:33:6d: + 1b:a7:84:f2:a0:b0:57:5e:4b:c1:2f:6d:e9:22:52: + 50:b1:3b:a7:7d:ee:a7:dc:6e:6a:bd:b6:a6:ea:66: + f8:1f:30:60:18:d8:5b:a6:dd:9d:9b:d3:4e:2b:0a: + c4:0b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 73:DC:40:FE:F8:8F:F4:BD:DE:B0:63:30:AF:05:0B:6C:4E:99:54:7F + X509v3 Authority Key Identifier: + keyid:6C:05:B0:A0:A8:03:A4:A1:90:D1:A5:74:D2:13:D9:2E:57:83:36:73 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 81:08:b8:48:94:05:02:aa:61:ea:32:48:55:02:31:f6:e0:5d: + 05:6f:32:9b:6a:a0:3b:6f:0e:1d:2a:01:1a:14:20:a2:1e:23: + b4:70:61:86:55:b5:4c:5b:61:3f:dd:1e:38:a4:98:3f:bd:61: + e4:1e:56:54:ed:0e:51:65:6c:73:af:99:86:fc:a7:50:48:87: + 95:6f:5a:93:0d:c9:7a:ff:fb:39:d1:f4:40:2c:fe:1f:28:aa: + 85:cf:12:bd:7b:df:2b:12:56:4a:91:4e:e4:80:00:52:4c:bb: + b2:e6:05:27:47:e2:3f:bb:a4:d7:cc:92:c2:27:02:10:50:10: + 0c:f8:ee:4c:93:90:89:8d:db:8a:f9:05:f1:ec:d7:cf:67:20: + a4:da:90:e0:38:34:fd:79:9b:6b:04:a8:bd:6f:e8:82:4a:d9: + 37:49:b3:10:50:e6:c5:56:d9:ac:9b:e8:97:52:41:a1:66:be: + cb:64:1d:12:0d:86:8b:34:42:26:9a:ad:c3:8a:14:ff:35:0d: + 82:8f:96:e0:af:b7:e7:20:30:3e:b3:fe:57:4a:80:5e:53:8b: + ec:15:ca:a8:db:b7:c6:87:b7:ab:81:8b:42:23:4a:74:9c:9e: + 59:b8:3c:8d:0e:d2:f3:9d:79:45:9a:0e:fd:8c:6b:9e:b5:c8: + e7:03:64:79 +-----BEGIN CERTIFICATE----- +MIIDajCCAlKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1UqWmDTh +qJKImgzQt+Og3HFLMs1Zobmc1eUwG61+QX/nOYEl0edmwl95gOr/a++5lZ6LoAxq +tshLUCx98a1G7Zp8fWplcN7CRX4bKK/c6z27TJipjLOjNaErzbuOKit0bQyRcjbC +Lw5GKnc0q5j4KMkCQngvsuCaDa4DlMAxeR5yzot8IcjVHJuUBCnOHF8i4/AgYit9 +fcL6KVyLKt0PCDFJWH2FdiG0Rg7YJtwm+QqbWKK4KbTfwE4QViiWAlR86aM/hBJq +ie3wDaADVAyyM20bp4TyoLBXXkvBL23pIlJQsTunfe6n3G5qvbam6mb4HzBgGNhb +pt2dm9NOKwrECwIDAQABo4HIMIHFMB0GA1UdDgQWBBRz3ED++I/0vd6wYzCvBQts +TplUfzAfBgNVHSMEGDAWgBRsBbCgqAOkoZDRpXTSE9kuV4M2czA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAIEI +uEiUBQKqYeoySFUCMfbgXQVvMptqoDtvDh0qARoUIKIeI7RwYYZVtUxbYT/dHjik +mD+9YeQeVlTtDlFlbHOvmYb8p1BIh5VvWpMNyXr/+znR9EAs/h8oqoXPEr173ysS +VkqRTuSAAFJMu7LmBSdH4j+7pNfMksInAhBQEAz47kyTkImN24r5BfHs189nIKTa +kOA4NP15m2sEqL1v6IJK2TdJsxBQ5sVW2ayb6JdSQaFmvstkHRINhos0QiaarcOK +FP81DYKPluCvt+cgMD6z/ldKgF5Ti+wVyqjbt8aHt6uBi0IjSnScnlm4PI0O0vOd +eUWaDv2Ma561yOcDZHk= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b6:f1:d2:f8:c9:10:d5:cf:0c:55:ce:8c:38:a2: + 8f:f5:f1:cf:20:85:56:92:df:42:8c:5c:1a:db:8e: + 1d:2e:b4:b3:95:72:e4:67:76:7c:c5:61:62:2b:cf: + 97:f7:84:29:80:ff:df:e8:e7:da:f6:05:11:1d:40: + 1e:73:76:ff:e4:eb:fa:45:59:20:d9:35:cb:c7:4f: + 2b:49:2a:61:7c:45:a1:fe:da:8c:89:05:38:84:ab: + cb:0b:c9:36:3b:e5:3e:31:5e:0b:a6:27:63:b1:c2: + 34:88:3a:e5:e3:43:93:0b:46:69:03:dd:31:16:65: + 18:6e:64:4c:84:e4:a1:37:6b:15:ef:f3:8f:57:e8: + 57:f6:a8:86:62:9b:92:d0:67:d3:ed:0f:89:d3:4e: + 09:aa:e8:74:ab:ce:4b:51:63:52:55:f1:24:9d:42: + 70:cb:14:0f:e3:b4:7f:ba:6a:3c:87:27:eb:3b:82: + 64:99:6a:f9:be:20:5a:9e:b9:8a:8b:ab:94:ed:f3: + 33:eb:ea:42:5c:7e:20:df:f4:9d:82:8f:ac:8e:52: + 99:06:db:d0:9f:01:38:e7:b9:0c:d2:b4:ca:7f:74: + 03:e2:f7:0b:0e:a9:40:14:6c:7f:1b:15:00:77:0a: + 98:76:ee:bd:62:24:f6:a7:8b:d4:7e:4b:8d:c9:eb: + 04:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 6C:05:B0:A0:A8:03:A4:A1:90:D1:A5:74:D2:13:D9:2E:57:83:36:73 + X509v3 Authority Key Identifier: + keyid:6C:05:B0:A0:A8:03:A4:A1:90:D1:A5:74:D2:13:D9:2E:57:83:36:73 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 52:82:fe:3f:2b:71:41:fd:4c:9b:db:c5:b1:60:72:a7:cf:f4: + 29:91:36:0f:ce:92:72:95:3e:34:ab:84:0c:af:23:e8:e1:28: + 35:29:c9:c8:78:9a:12:d7:f1:22:1c:21:e1:b0:b4:df:af:36: + c4:ca:71:2a:6e:6f:4a:d5:65:58:31:7a:c2:d1:30:66:e0:0a: + 61:54:e0:61:97:7b:41:72:58:d9:02:da:22:8b:21:e6:d5:31: + 4c:d2:3c:11:d8:0d:12:f0:dc:eb:e0:1d:16:3a:74:de:9c:b4: + b2:bb:69:ed:e1:53:14:9e:1c:06:3f:ff:e7:2f:8a:d1:f6:37: + 89:76:b2:61:60:5f:48:ce:a3:8f:e0:b5:6f:92:18:21:e4:a8: + 1f:12:70:86:54:2a:da:78:3d:5d:3c:13:b8:b4:7f:a5:81:f0: + 55:cf:ea:56:b4:0a:8a:ca:2b:ca:be:08:9e:a6:4c:12:99:5f: + 23:93:08:58:70:8f:c8:fb:88:11:fe:d6:16:c7:a3:3b:1f:6b: + 78:b0:05:29:9f:7d:4c:01:ba:ed:8a:5f:a8:38:e9:a4:c2:44: + ce:e8:37:1d:d8:1f:16:e4:ef:84:bb:1f:4b:3a:b0:9a:00:57: + aa:ba:52:1c:f4:da:f7:69:5d:ef:8d:35:ef:5c:03:fa:8d:87: + fc:92:60:28 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALbx0vjJENXPDFXOjDii +j/XxzyCFVpLfQoxcGtuOHS60s5Vy5Gd2fMVhYivPl/eEKYD/3+jn2vYFER1AHnN2 +/+Tr+kVZINk1y8dPK0kqYXxFof7ajIkFOISrywvJNjvlPjFeC6YnY7HCNIg65eND +kwtGaQPdMRZlGG5kTITkoTdrFe/zj1foV/aohmKbktBn0+0PidNOCarodKvOS1Fj +UlXxJJ1CcMsUD+O0f7pqPIcn6zuCZJlq+b4gWp65iourlO3zM+vqQlx+IN/0nYKP +rI5SmQbb0J8BOOe5DNK0yn90A+L3Cw6pQBRsfxsVAHcKmHbuvWIk9qeL1H5Ljcnr +BKcCAwEAAaOByzCByDAdBgNVHQ4EFgQUbAWwoKgDpKGQ0aV00hPZLleDNnMwHwYD +VR0jBBgwFoAUbAWwoKgDpKGQ0aV00hPZLleDNnMwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBSgv4/K3FB +/Uyb28WxYHKnz/QpkTYPzpJylT40q4QMryPo4Sg1KcnIeJoS1/EiHCHhsLTfrzbE +ynEqbm9K1WVYMXrC0TBm4AphVOBhl3tBcljZAtoiiyHm1TFM0jwR2A0S8Nzr4B0W +OnTenLSyu2nt4VMUnhwGP//nL4rR9jeJdrJhYF9IzqOP4LVvkhgh5KgfEnCGVCra +eD1dPBO4tH+lgfBVz+pWtAqKyivKvgiepkwSmV8jkwhYcI/I+4gR/tYWx6M7H2t4 +sAUpn31MAbrtil+oOOmkwkTO6Dcd2B8W5O+Eux9LOrCaAFequlIc9Nr3aV3vjTXv +XAP6jYf8kmAo +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +U1VDQ0VTUw== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-lacks-basic-constraints.pem b/net/data/verify_certificate_chain_unittest/intermediary-lacks-basic-constraints.pem new file mode 100644 index 0000000..016f94e --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-lacks-basic-constraints.pem
@@ -0,0 +1,278 @@ +[Created by: generate-intermediary-lacks-basic-constraints.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +lacks the basic constraints extension, and hence is expected to fail validation +(RFC 5280 requires v3 signing certificates have a BasicConstaints). + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:f3:d6:19:96:48:0c:01:e2:21:3d:98:21:52:df: + 5a:79:95:01:e5:c2:ab:77:e4:7b:10:17:64:75:a4: + ca:b6:69:cc:a9:4a:1d:b6:7f:a0:16:89:32:21:c2: + 2a:c2:58:28:d2:f3:ef:a5:2d:81:92:47:17:d5:61: + 65:ab:43:22:ce:59:5b:20:31:be:6e:84:23:19:d5: + 7e:a8:70:50:6c:de:06:b8:58:09:97:fd:02:98:31: + 2d:3b:ab:1b:4a:82:6c:28:ab:c5:a3:6b:ea:40:2b: + 48:02:73:e4:ce:ea:f6:3b:6a:80:1f:5b:59:30:86: + 1b:5e:64:61:b5:94:d2:f0:c8:bb:88:b1:90:05:1a: + e8:e6:97:dc:7d:e8:53:c8:9f:88:09:69:82:1f:1e: + e2:d1:70:f3:85:06:63:18:0a:d2:f1:71:a3:25:a3: + 42:76:3a:5e:02:78:e6:7a:c6:a4:82:dd:79:35:5a: + da:8e:37:92:82:bf:01:13:1b:6e:52:97:97:32:f1: + b2:4e:95:bc:55:89:61:61:73:b4:64:30:b1:89:87: + 51:17:29:f3:67:de:5b:99:ee:47:71:07:8c:d5:17: + 55:e0:70:bc:b6:06:6e:eb:7a:c6:69:69:97:e1:3d: + 1d:be:93:da:a0:fa:cb:2f:f0:ed:5c:da:18:0e:67: + 89:8d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + FD:C8:4E:91:CD:73:65:1D:13:F9:EC:F0:91:13:F1:D0:01:AD:1E:7C + X509v3 Authority Key Identifier: + keyid:60:E7:1E:8E:53:95:1F:8F:00:D1:F7:9F:36:01:26:15:86:53:0E:F2 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 88:1d:e7:e6:1e:4b:93:a9:79:59:0e:10:43:1e:f7:79:a4:c7: + 68:55:81:b6:b4:6d:b0:5b:b6:46:13:8b:4e:1c:d4:79:17:b1: + 71:46:b6:69:21:92:fa:bf:bd:76:cc:6c:b1:04:58:28:41:79: + 34:4f:09:e7:17:5c:d0:ac:fc:c5:2e:1e:5c:31:ca:ed:55:ea: + df:4a:43:9a:72:37:0a:8a:69:dd:4e:e9:a3:ef:dd:48:45:41: + 7b:55:e3:d1:98:69:a5:ec:0b:43:32:24:da:33:cd:fd:35:74: + 17:81:b1:61:37:b1:12:5d:51:86:e6:a2:08:e5:c7:99:aa:f7: + 23:c4:5f:83:c0:59:9c:36:f9:a0:4c:03:f7:40:42:fb:90:39: + 5a:45:e5:e2:94:a3:58:c2:a1:d8:c9:aa:3e:83:98:b0:32:a1: + 85:9a:b1:34:c7:67:a4:03:67:6e:5b:d7:83:b8:92:0f:af:81: + b5:00:50:c4:0f:f6:bb:cd:7d:0f:a8:cd:28:bb:48:b8:32:82: + ef:d1:cf:96:74:e4:25:74:ce:5e:4c:75:d2:80:55:a3:6b:a6: + 76:eb:aa:3e:2b:55:d3:c9:bd:2b:32:d3:1d:01:00:cb:8d:c4: + c0:b9:29:0b:10:e5:ab:34:2f:30:63:29:df:a8:4f:b3:28:dd: + 0b:8c:ea:14 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDz1hmW +SAwB4iE9mCFS31p5lQHlwqt35HsQF2R1pMq2acypSh22f6AWiTIhwirCWCjS8++l +LYGSRxfVYWWrQyLOWVsgMb5uhCMZ1X6ocFBs3ga4WAmX/QKYMS07qxtKgmwoq8Wj +a+pAK0gCc+TO6vY7aoAfW1kwhhteZGG1lNLwyLuIsZAFGujml9x96FPIn4gJaYIf +HuLRcPOFBmMYCtLxcaMlo0J2Ol4CeOZ6xqSC3Xk1WtqON5KCvwETG25Sl5cy8bJO +lbxViWFhc7RkMLGJh1EXKfNn3luZ7kdxB4zVF1XgcLy2Bm7resZpaZfhPR2+k9qg ++ssv8O1c2hgOZ4mNAgMBAAGjgekwgeYwHQYDVR0OBBYEFP3ITpHNc2UdE/ns8JET +8dABrR58MB8GA1UdIwQYMBaAFGDnHo5TlR+PANH3nzYBJhWGUw7yMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAiB3n5h5Lk6l5WQ4QQx73 +eaTHaFWBtrRtsFu2RhOLThzUeRexcUa2aSGS+r+9dsxssQRYKEF5NE8J5xdc0Kz8 +xS4eXDHK7VXq30pDmnI3Copp3U7po+/dSEVBe1Xj0ZhppewLQzIk2jPN/TV0F4Gx +YTexEl1RhuaiCOXHmar3I8Rfg8BZnDb5oEwD90BC+5A5WkXl4pSjWMKh2MmqPoOY +sDKhhZqxNMdnpANnblvXg7iSD6+BtQBQxA/2u819D6jNKLtIuDKC79HPlnTkJXTO +Xkx10oBVo2umduuqPitV08m9KzLTHQEAy43EwLkpCxDlqzQvMGMp36hPsyjdC4zq +FA== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a0:8f:6c:dd:c5:0d:76:a9:8a:da:5d:9f:94:cf: + 9a:18:cd:32:ee:e1:c3:88:29:0d:40:7d:8b:37:9c: + 18:b9:ed:11:81:5b:cc:8c:7c:4a:f3:e2:b9:eb:f7: + 3c:74:5a:5c:78:37:e3:7e:a8:b9:34:d7:da:d2:dc: + 52:de:c6:bb:ca:cd:39:c3:ea:8e:84:1b:e5:ad:4b: + 67:1b:70:bd:70:0e:5e:20:95:37:bf:ae:d1:f4:b0: + 97:c0:8a:d3:e5:2a:04:d8:eb:1d:c8:f0:95:1b:25: + d4:49:ae:d4:5f:d9:bc:ea:19:2d:38:d3:d2:c4:8b: + 77:37:45:ae:f9:70:b2:43:93:85:06:58:e0:3e:38: + 11:32:d2:bc:a5:d4:df:09:2d:e9:c4:16:a7:f9:5b: + 25:8d:57:f7:bf:01:4e:c8:25:b4:f8:5d:33:1d:7a: + 04:4b:9d:fe:71:d4:65:78:4b:8d:52:ef:04:80:d4: + 45:18:1d:d8:53:8e:2a:e8:23:3f:14:a4:b4:f1:00: + ff:30:be:06:c5:61:ac:13:e8:cb:4c:ef:77:f7:6b: + 1d:da:5a:d4:7f:f8:5a:87:cb:4b:45:05:8c:06:73: + 7b:65:d5:71:c9:35:c7:6e:07:ce:0b:e2:54:e1:43: + f0:da:a9:51:b8:ad:fe:da:de:29:8c:5f:2d:40:06: + 7f:39 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 60:E7:1E:8E:53:95:1F:8F:00:D1:F7:9F:36:01:26:15:86:53:0E:F2 + X509v3 Authority Key Identifier: + keyid:73:D9:03:F6:54:EA:FC:42:DA:77:EC:19:89:AD:6D:D2:A3:3E:E9:FD + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + Signature Algorithm: sha256WithRSAEncryption + 43:31:7d:91:39:1d:8a:88:6c:d2:2d:36:b1:92:53:1d:18:24: + e9:42:27:c3:d3:f1:77:69:6f:67:7b:39:46:32:fb:36:a1:8d: + 07:ee:16:6b:ac:09:e3:78:38:7a:a7:4b:fe:3f:81:eb:f2:85: + aa:d6:3e:5a:68:57:e3:98:0d:ae:ee:45:84:d1:ed:6d:9c:78: + fe:63:50:94:55:5e:b5:41:ef:c9:16:ed:4f:38:03:cb:73:3c: + 79:c1:c4:0c:c1:95:43:11:49:c0:bc:7e:9a:6a:05:d2:43:c4: + 66:72:66:57:69:46:ed:a7:10:af:bf:e9:bb:48:72:4b:00:a2: + 46:78:38:68:dd:6b:a9:ac:62:70:4b:0b:f3:29:fa:a7:a2:42: + 4b:d7:88:1f:97:1f:71:60:20:82:89:d6:3a:60:d5:4b:08:28: + 6a:6a:97:2e:c9:93:d8:a7:32:b7:e1:68:be:07:7a:3c:76:3b: + 2c:1b:10:17:4c:c9:ea:ee:48:c9:ad:ac:2e:61:dd:16:eb:62: + 1e:33:1d:6c:8a:b4:56:0f:3d:04:35:f3:8f:d0:12:f9:66:8d: + 39:95:e9:44:41:32:7e:f3:17:2e:58:c9:0c:23:b1:e3:db:f7: + ed:da:bd:94:0e:00:27:34:3d:3d:c6:48:d8:e4:a3:66:57:d9: + 5e:13:3e:59 +-----BEGIN CERTIFICATE----- +MIIDXDCCAkSgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoI9s3cUN +dqmK2l2flM+aGM0y7uHDiCkNQH2LN5wYue0RgVvMjHxK8+K56/c8dFpceDfjfqi5 +NNfa0txS3sa7ys05w+qOhBvlrUtnG3C9cA5eIJU3v67R9LCXwIrT5SoE2OsdyPCV +GyXUSa7UX9m86hktONPSxIt3N0Wu+XCyQ5OFBljgPjgRMtK8pdTfCS3pxBan+Vsl +jVf3vwFOyCW0+F0zHXoES53+cdRleEuNUu8EgNRFGB3YU44q6CM/FKS08QD/ML4G +xWGsE+jLTO9392sd2lrUf/hah8tLRQWMBnN7ZdVxyTXHbgfOC+JU4UPw2qlRuK3+ +2t4pjF8tQAZ/OQIDAQABo4G6MIG3MB0GA1UdDgQWBBRg5x6OU5UfjwDR9582ASYV +hlMO8jAfBgNVHSMEGDAWgBRz2QP2VOr8Qtp37BmJrW3Soz7p/TA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBDMX2ROR2KiGzSLTaxklMd +GCTpQifD0/F3aW9nezlGMvs2oY0H7hZrrAnjeDh6p0v+P4Hr8oWq1j5aaFfjmA2u +7kWE0e1tnHj+Y1CUVV61Qe/JFu1POAPLczx5wcQMwZVDEUnAvH6aagXSQ8RmcmZX +aUbtpxCvv+m7SHJLAKJGeDho3WuprGJwSwvzKfqnokJL14gflx9xYCCCidY6YNVL +CChqapcuyZPYpzK34Wi+B3o8djssGxAXTMnq7kjJrawuYd0W62IeMx1sirRWDz0E +NfOP0BL5Zo05lelEQTJ+8xcuWMkMI7Hj2/ft2r2UDgAnND09xkjY5KNmV9leEz5Z +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ea:c6:b8:66:62:c2:1a:2a:7d:83:ca:b2:7b:11: + e4:92:4a:b8:3a:39:35:73:aa:89:55:7d:f4:ec:40: + 4b:2c:c7:56:58:ac:9d:25:ef:c3:26:86:98:c4:74: + a4:3a:94:36:d8:78:7c:1a:f4:f7:5c:a0:56:69:fc: + 23:c0:a4:06:5f:5b:ce:ea:cb:32:9b:c3:21:89:fd: + 9f:4e:38:a2:b9:f4:de:af:44:1e:53:02:09:41:44: + 92:bc:a5:4f:70:86:23:85:48:2a:51:01:70:ab:b0: + c4:bd:97:3c:2f:d0:2c:3e:9c:be:40:2e:ee:be:f8: + ed:63:a2:1b:fd:e2:0f:d1:b2:3b:b3:ce:da:84:59: + 56:bb:77:17:93:ef:c0:b7:b4:11:db:b9:6e:b0:4a: + 28:55:fb:56:4e:ed:22:b6:e3:4d:5b:ad:6a:af:ff: + df:33:f9:18:a6:91:0a:b8:89:d3:28:55:18:c7:71: + 19:32:bc:88:a8:ee:5b:c8:34:84:e5:f5:fe:6e:5e: + c0:3b:73:9b:a4:bc:4c:6a:8a:5a:31:c0:34:f3:c3: + 89:e0:57:97:64:01:dd:c2:9f:75:8e:e3:fd:b3:58: + b5:0b:e3:4d:8f:94:e8:9b:0c:c2:12:af:13:31:30: + d1:a6:1c:2c:f1:0a:7a:a4:17:e2:2f:6f:73:cb:22: + 15:67 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 73:D9:03:F6:54:EA:FC:42:DA:77:EC:19:89:AD:6D:D2:A3:3E:E9:FD + X509v3 Authority Key Identifier: + keyid:73:D9:03:F6:54:EA:FC:42:DA:77:EC:19:89:AD:6D:D2:A3:3E:E9:FD + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + e0:b7:24:3a:ee:4c:8d:42:9f:b9:52:2b:7d:21:c5:7b:dd:2b: + bc:6a:5d:86:57:ee:d5:1f:27:e6:e1:08:e3:72:a3:10:2b:97: + 1b:98:b9:39:18:6e:7f:b8:b0:1c:f1:f5:d9:7e:1d:05:3f:5b: + f4:cd:1e:66:7f:77:ed:ab:d0:51:b6:ad:6c:a6:66:ab:fc:31: + a1:ac:ee:66:ae:3b:af:4e:3c:c6:29:07:dc:1a:ac:b5:10:3f: + 3f:ad:27:1b:bc:32:19:ab:b3:75:62:47:23:d1:b8:60:78:ac: + 96:0c:4f:b8:31:7b:40:7e:f3:f7:ba:a9:ae:9b:65:ef:c5:e3: + fc:c8:28:c6:c0:74:48:00:33:48:a4:e6:3c:0c:5b:a0:1e:c2: + 57:c5:0c:24:34:c3:36:c0:8a:f3:a6:c3:16:24:32:c3:dc:81: + 76:54:3e:00:68:c8:6a:b6:ee:9f:ab:44:64:64:37:54:ff:1b: + b9:a5:c2:bf:ff:a5:68:b3:5a:ef:d7:bc:64:39:24:2e:ad:c7: + a3:9c:ef:60:cb:ab:de:45:f1:40:65:95:01:0c:52:ea:a8:d6: + 8b:77:e0:2e:1f:2b:4f:a3:bc:b8:80:6b:8d:92:42:66:17:10: + 4b:d4:b0:2d:8d:4c:77:50:74:83:0e:9a:4c:0d:3b:6b:3d:c6: + 0a:2e:f6:5c +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOrGuGZiwhoqfYPKsnsR +5JJKuDo5NXOqiVV99OxASyzHVlisnSXvwyaGmMR0pDqUNth4fBr091ygVmn8I8Ck +Bl9bzurLMpvDIYn9n044orn03q9EHlMCCUFEkrylT3CGI4VIKlEBcKuwxL2XPC/Q +LD6cvkAu7r747WOiG/3iD9GyO7PO2oRZVrt3F5PvwLe0Edu5brBKKFX7Vk7tIrbj +TVutaq//3zP5GKaRCriJ0yhVGMdxGTK8iKjuW8g0hOX1/m5ewDtzm6S8TGqKWjHA +NPPDieBXl2QB3cKfdY7j/bNYtQvjTY+U6JsMwhKvEzEw0aYcLPEKeqQX4i9vc8si +FWcCAwEAAaOByzCByDAdBgNVHQ4EFgQUc9kD9lTq/ELad+wZia1t0qM+6f0wHwYD +VR0jBBgwFoAUc9kD9lTq/ELad+wZia1t0qM+6f0wNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDgtyQ67kyN +Qp+5Uit9IcV73Su8al2GV+7VHyfm4QjjcqMQK5cbmLk5GG5/uLAc8fXZfh0FP1v0 +zR5mf3ftq9BRtq1spmar/DGhrO5mrjuvTjzGKQfcGqy1ED8/rScbvDIZq7N1Ykcj +0bhgeKyWDE+4MXtAfvP3uqmum2XvxeP8yCjGwHRIADNIpOY8DFugHsJXxQwkNMM2 +wIrzpsMWJDLD3IF2VD4AaMhqtu6fq0RkZDdU/xu5pcK//6Vos1rv17xkOSQurcej +nO9gy6veRfFAZZUBDFLqqNaLd+AuHytPo7y4gGuNkkJmFxBL1LAtjUx3UHSDDppM +DTtrPcYKLvZc +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-lacks-signing-key-usage.pem b/net/data/verify_certificate_chain_unittest/intermediary-lacks-signing-key-usage.pem new file mode 100644 index 0000000..63275452 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-lacks-signing-key-usage.pem
@@ -0,0 +1,281 @@ +[Created by: generate-intermediary-lacks-signing-key-usage.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +contains a keyUsage extension, HOWEVER it does not contain the keyCertSign bit. +Hence validation is expected to fail. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b6:80:03:5a:ee:21:94:59:e3:bf:eb:26:bb:b5: + 2e:39:80:35:38:e7:7e:1d:e6:17:d2:fb:50:be:d2: + 03:33:14:ee:1f:a2:f8:78:bb:d0:60:e2:0c:ff:59: + 80:52:fb:5a:3d:38:2d:26:9e:d6:af:df:f2:ff:49: + f7:ec:8a:02:2b:51:02:d3:53:f9:6e:2b:ed:68:5e: + 90:54:03:7b:f7:0c:08:93:59:9f:41:2c:27:05:6c: + dd:dc:f8:a8:ea:78:c0:6d:a1:c8:11:cd:e8:40:cc: + 6c:65:db:16:50:20:07:68:00:c0:7f:c5:89:fe:e8: + 6a:0c:36:6a:ad:5a:ab:40:8e:4c:0e:e9:51:a0:6b: + 28:b8:df:c0:7c:3c:6c:a7:b8:8b:9e:07:1f:e5:29: + 01:5b:81:76:ca:53:80:b8:a4:8f:1a:35:66:b7:96: + 24:ac:fb:44:a1:4c:71:c6:28:6d:91:75:59:1a:bf: + e4:8e:15:71:43:3f:24:3f:b4:db:a0:2c:5e:af:46: + 16:65:7e:25:0c:90:5e:16:7b:e3:a6:47:0f:03:fe: + 31:cc:06:dc:ba:0e:0b:fa:6b:e5:4a:53:11:c4:00: + 54:d5:76:09:97:12:38:31:12:9d:27:49:e8:4d:01: + 18:0c:54:b3:c7:a8:c3:fc:60:3f:92:0b:ef:9f:72: + 8e:59 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 76:E3:64:67:6F:B9:A6:B7:6E:DC:62:12:09:FE:30:0A:19:F4:BF:B3 + X509v3 Authority Key Identifier: + keyid:5A:C6:0B:DA:37:A3:BB:21:85:17:C5:EF:0C:FA:BF:A9:79:B1:FE:29 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 92:d5:77:f8:65:61:e9:66:0d:f7:00:9b:46:28:26:52:37:9f: + 3c:15:33:01:95:61:b9:0c:a1:c3:e7:f5:09:6a:4c:ba:0f:3b: + 80:3a:65:c3:22:e7:9d:e7:4d:c3:ca:3a:bc:88:98:6c:a3:8e: + 56:4e:64:98:b7:85:a7:aa:d3:e8:9a:b3:e4:2f:7d:18:bf:74: + c7:29:d9:51:a7:39:4a:4b:e1:94:14:0b:f9:af:e9:89:26:98: + cb:b2:b7:64:d4:ab:42:f5:68:cb:40:78:72:91:02:13:fe:05: + 41:68:42:c2:e0:d5:ea:bd:56:52:6f:76:b3:20:f4:e6:39:2a: + 83:ea:7a:c9:d2:37:4a:45:c4:ad:ac:6a:24:38:6e:fd:d6:ed: + 4c:42:cf:87:2c:7d:21:e5:18:ee:3a:c0:1e:83:ac:25:70:9a: + f5:fd:e7:4e:ab:67:0e:5d:00:9f:44:e4:e5:d6:d9:02:43:05: + 91:c3:66:a6:1f:8a:ce:ae:c8:2b:4d:c6:0e:9e:5f:d7:ff:e7: + b6:39:a7:f1:19:b0:3a:59:33:6a:72:a6:03:6b:42:e7:f8:07: + a3:0d:2d:f7:31:c3:f4:e5:cf:8b:24:42:0c:29:40:5a:7d:df: + 65:81:8c:0f:cb:86:e6:2b:39:26:58:0b:18:b8:4c:87:6c:10: + 03:0b:7c:c4 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2gANa +7iGUWeO/6ya7tS45gDU4534d5hfS+1C+0gMzFO4fovh4u9Bg4gz/WYBS+1o9OC0m +ntav3/L/SffsigIrUQLTU/luK+1oXpBUA3v3DAiTWZ9BLCcFbN3c+KjqeMBtocgR +zehAzGxl2xZQIAdoAMB/xYn+6GoMNmqtWqtAjkwO6VGgayi438B8PGynuIueBx/l +KQFbgXbKU4C4pI8aNWa3liSs+0ShTHHGKG2RdVkav+SOFXFDPyQ/tNugLF6vRhZl +fiUMkF4We+OmRw8D/jHMBty6Dgv6a+VKUxHEAFTVdgmXEjgxEp0nSehNARgMVLPH +qMP8YD+SC++fco5ZAgMBAAGjgekwgeYwHQYDVR0OBBYEFHbjZGdvuaa3btxiEgn+ +MAoZ9L+zMB8GA1UdIwQYMBaAFFrGC9o3o7shhRfF7wz6v6l5sf4pMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAktV3+GVh6WYN9wCbRigm +UjefPBUzAZVhuQyhw+f1CWpMug87gDplwyLnnedNw8o6vIiYbKOOVk5kmLeFp6rT +6Jqz5C99GL90xynZUac5SkvhlBQL+a/piSaYy7K3ZNSrQvVoy0B4cpECE/4FQWhC +wuDV6r1WUm92syD05jkqg+p6ydI3SkXEraxqJDhu/dbtTELPhyx9IeUY7jrAHoOs +JXCa9f3nTqtnDl0An0Tk5dbZAkMFkcNmph+Kzq7IK03GDp5f1//ntjmn8RmwOlkz +anKmA2tC5/gHow0t9zHD9OXPiyRCDClAWn3fZYGMD8uG5is5JlgLGLhMh2wQAwt8 +xA== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:9b:71:4d:95:69:ff:1c:81:da:58:66:90:29:ae: + 15:48:a6:43:09:a2:05:75:ca:16:d1:a5:69:e0:77: + c8:c1:f4:e5:e2:4d:97:c6:09:e4:e0:98:64:c2:b7: + 7f:11:5a:ee:7a:3e:c5:d8:24:b0:b8:a2:98:ac:05: + bd:71:07:71:6a:11:67:17:55:5c:2d:d3:fe:4b:d0: + e1:f3:d5:08:de:7e:c2:56:ff:e6:95:6f:11:7f:5a: + 34:e7:0c:1c:e3:82:f6:f4:e1:ed:4e:ce:60:2f:f7: + 5d:b8:b1:54:f0:c8:aa:28:5d:56:90:24:7b:cf:a7: + 01:de:d9:63:16:a3:7b:5e:34:c9:8c:35:50:57:fc: + be:6c:48:70:83:7a:52:d9:19:f8:e8:a2:91:f3:23: + 34:f3:14:b6:3d:59:e6:86:05:9b:26:ec:14:fa:78: + d3:91:a4:af:f7:c5:01:15:c0:3c:84:b8:5f:09:62: + ab:c3:b3:51:df:14:20:47:ee:0b:5f:85:06:42:4d: + b3:5a:e0:08:14:32:d8:0a:8b:7a:41:f5:0e:34:cc: + 4a:a3:79:be:6d:b5:cd:d1:b8:e0:71:2a:81:e1:22: + bc:6c:fe:89:59:97:ee:71:ad:d7:e1:d4:ea:01:85: + 0a:ae:83:a1:09:65:3c:2e:68:29:e1:3f:b0:c2:c7: + 90:85 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 5A:C6:0B:DA:37:A3:BB:21:85:17:C5:EF:0C:FA:BF:A9:79:B1:FE:29 + X509v3 Authority Key Identifier: + keyid:D3:3B:10:26:28:99:EC:09:2A:08:9C:53:7D:24:9F:B1:F1:04:0B:B5 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 53:21:fb:72:d3:86:6c:af:f6:75:07:5c:bc:0c:7a:97:8f:05: + b8:86:af:ee:af:ca:9b:c0:89:2f:28:cd:79:a7:a3:70:04:37: + 8b:ca:4d:84:3a:72:d5:9a:2e:f9:85:64:59:5b:7f:7e:b4:bf: + 09:74:af:fe:f1:d1:8c:47:3a:1b:87:9d:73:ce:a1:de:8f:33: + f7:ad:b4:7d:83:d5:e2:60:ff:f4:b2:79:ee:6b:fb:db:ae:c5: + f5:1c:e9:20:9a:b9:71:31:c9:55:02:a1:e1:9b:a6:b7:dd:c0: + cc:e1:66:02:91:fe:a1:59:67:bf:3b:45:32:20:08:a0:08:66: + eb:47:2d:db:24:6f:ab:3c:53:9b:96:81:5f:61:4a:fa:bb:70: + 2a:31:a1:2b:ff:cc:ae:1c:c9:be:e5:a6:f1:6a:6e:b1:3f:4b: + 30:59:e3:a7:9f:f2:6e:6d:9d:ed:5f:b9:cf:b2:07:66:84:63: + 53:f4:64:c7:d1:b2:62:63:c6:ec:a2:09:89:c5:bc:75:96:bc: + d2:a5:86:f7:9c:28:1c:47:45:30:e6:90:87:c6:e3:2b:be:d3: + 8e:b7:89:30:f3:f3:83:14:f6:56:be:0c:e7:34:6e:6f:b4:f3: + 0c:17:87:dd:a8:e2:8b:ec:34:24:dc:0c:16:dc:e4:c4:21:da: + dc:ba:9d:a6 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm3FNlWn/ +HIHaWGaQKa4VSKZDCaIFdcoW0aVp4HfIwfTl4k2Xxgnk4Jhkwrd/EVruej7F2CSw +uKKYrAW9cQdxahFnF1VcLdP+S9Dh89UI3n7CVv/mlW8Rf1o05wwc44L29OHtTs5g +L/dduLFU8MiqKF1WkCR7z6cB3tljFqN7XjTJjDVQV/y+bEhwg3pS2Rn46KKR8yM0 +8xS2PVnmhgWbJuwU+njTkaSv98UBFcA8hLhfCWKrw7NR3xQgR+4LX4UGQk2zWuAI +FDLYCot6QfUONMxKo3m+bbXN0bjgcSqB4SK8bP6JWZfuca3X4dTqAYUKroOhCWU8 +Lmgp4T+wwseQhQIDAQABo4HLMIHIMB0GA1UdDgQWBBRaxgvaN6O7IYUXxe8M+r+p +ebH+KTAfBgNVHSMEGDAWgBTTOxAmKJnsCSoInFN9JJ+x8QQLtTA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgWgMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AFMh+3LThmyv9nUHXLwMepePBbiGr+6vypvAiS8ozXmno3AEN4vKTYQ6ctWaLvmF +ZFlbf360vwl0r/7x0YxHOhuHnXPOod6PM/ettH2D1eJg//Syee5r+9uuxfUc6SCa +uXExyVUCoeGbprfdwMzhZgKR/qFZZ787RTIgCKAIZutHLdskb6s8U5uWgV9hSvq7 +cCoxoSv/zK4cyb7lpvFqbrE/SzBZ46ef8m5tne1fuc+yB2aEY1P0ZMfRsmJjxuyi +CYnFvHWWvNKlhvecKBxHRTDmkIfG4yu+0463iTDz84MU9la+DOc0bm+08wwXh92o +4ovsNCTcDBbc5MQh2ty6naY= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:99:27:87:07:8d:52:53:4f:bc:b6:55:16:e3:64: + 12:13:89:32:c4:f9:6f:a2:9c:93:06:fc:4c:a9:4d: + 09:1a:04:8a:24:58:74:7a:53:ad:d6:c6:29:0e:19: + f2:cc:1e:02:72:2d:7f:52:4c:3a:88:dd:35:fc:c5: + e6:d4:41:1a:b0:76:a7:b9:c1:db:d9:7a:a0:56:d8: + e7:4c:a6:ed:45:ca:99:eb:4c:dd:44:5b:52:79:00: + 1b:f0:ca:fc:19:c9:39:d7:1c:24:e5:90:f8:77:f7: + 4a:cd:0c:ec:dc:c5:15:6d:43:de:43:b4:f9:03:b9: + fa:b9:8f:4f:b4:e2:9f:dd:e8:d5:af:9f:ab:79:ce: + 32:2f:be:04:85:e8:2f:5e:91:26:b5:08:a1:ef:11: + f5:20:28:8d:09:9f:4e:b9:5a:ef:cf:45:b3:aa:6e: + 14:1b:fe:1e:c3:4b:39:ad:76:9a:58:b5:be:c4:ae: + ce:0e:03:ef:8e:5d:a7:03:00:e7:ed:88:0e:97:8e: + 2d:bd:82:6e:d8:39:7f:c0:7e:4e:c8:1e:eb:60:cb: + f7:97:dd:fb:79:ee:a8:00:4a:40:b7:1c:2f:1a:59: + 5a:51:36:a9:aa:0b:97:a0:d0:d5:87:5e:b9:36:73: + 5c:31:fc:b6:8c:ef:f1:2a:f5:ea:6d:2b:05:d2:8c: + 60:87 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + D3:3B:10:26:28:99:EC:09:2A:08:9C:53:7D:24:9F:B1:F1:04:0B:B5 + X509v3 Authority Key Identifier: + keyid:D3:3B:10:26:28:99:EC:09:2A:08:9C:53:7D:24:9F:B1:F1:04:0B:B5 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 2e:84:d8:57:d4:09:e8:0e:8f:b5:9c:8f:48:ef:62:40:49:3e: + 9a:2e:b9:85:1c:77:f6:94:f3:73:0e:06:58:d4:63:5d:20:90: + e4:4b:c8:39:64:ca:ec:04:8c:bb:dd:b2:58:81:3e:89:05:1d: + 42:19:f9:d4:92:24:de:03:6c:69:36:74:95:65:b3:a4:06:83: + 2b:9f:93:72:57:dc:53:09:be:d2:fb:23:39:df:85:73:9a:c2: + c4:2d:7e:aa:36:01:dd:4e:a6:4f:fe:61:99:21:9c:89:a4:e7: + f8:8e:03:92:f6:cc:24:08:db:c8:59:41:6e:ea:c2:c3:4a:54: + d6:93:e5:3d:17:ff:24:a4:f7:55:2b:3c:d2:40:a7:2a:67:df: + 67:66:f5:37:ef:aa:20:d2:5a:da:d1:19:08:43:be:ae:11:f3: + 43:80:8a:ce:15:af:04:c5:b5:10:21:7c:f6:5e:7a:68:8e:59: + 40:ca:4b:be:c7:59:1b:48:a4:a1:ee:ef:57:b4:5b:d9:93:3b: + a2:36:3b:b6:f2:54:1e:c8:97:7e:5c:62:99:6c:f6:b0:bf:df: + af:5a:52:64:99:39:93:20:dc:4f:5e:a6:fe:8d:19:e2:21:1f: + 95:9d:7c:e8:8e:05:eb:74:ed:60:8e:ee:76:17:a8:40:56:36: + ac:bf:61:b9 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJknhweNUlNPvLZVFuNk +EhOJMsT5b6Kckwb8TKlNCRoEiiRYdHpTrdbGKQ4Z8sweAnItf1JMOojdNfzF5tRB +GrB2p7nB29l6oFbY50ym7UXKmetM3URbUnkAG/DK/BnJOdccJOWQ+Hf3Ss0M7NzF +FW1D3kO0+QO5+rmPT7Tin93o1a+fq3nOMi++BIXoL16RJrUIoe8R9SAojQmfTrla +789Fs6puFBv+HsNLOa12mli1vsSuzg4D745dpwMA5+2IDpeOLb2Cbtg5f8B+Tsge +62DL95fd+3nuqABKQLccLxpZWlE2qaoLl6DQ1YdeuTZzXDH8tozv8Sr16m0rBdKM +YIcCAwEAAaOByzCByDAdBgNVHQ4EFgQU0zsQJiiZ7AkqCJxTfSSfsfEEC7UwHwYD +VR0jBBgwFoAU0zsQJiiZ7AkqCJxTfSSfsfEEC7UwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAuhNhX1Ano +Do+1nI9I72JAST6aLrmFHHf2lPNzDgZY1GNdIJDkS8g5ZMrsBIy73bJYgT6JBR1C +GfnUkiTeA2xpNnSVZbOkBoMrn5NyV9xTCb7S+yM534VzmsLELX6qNgHdTqZP/mGZ +IZyJpOf4jgOS9swkCNvIWUFu6sLDSlTWk+U9F/8kpPdVKzzSQKcqZ99nZvU376og +0lra0RkIQ76uEfNDgIrOFa8ExbUQIXz2XnpojllAyku+x1kbSKSh7u9XtFvZkzui +Nju28lQeyJd+XGKZbPawv9+vWlJkmTmTINxPXqb+jRniIR+VnXzojgXrdO1gju52 +F6hAVjasv2G5 +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-signed-with-md5.pem b/net/data/verify_certificate_chain_unittest/intermediary-signed-with-md5.pem new file mode 100644 index 0000000..d1544816 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-signed-with-md5.pem
@@ -0,0 +1,281 @@ +[Created by: generate-intermediary-signed-with-md5.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +however is signed using the MD5 hash. Verification is expected to fail because +MD5 is too weak. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e9:b3:cb:c4:9b:c5:59:0a:ca:5e:ca:b3:7b:e1: + bb:ec:3d:4b:10:7b:d4:ee:71:92:1c:c0:24:af:0b: + c4:5e:55:3b:af:aa:e3:43:a3:d3:ae:1c:db:7b:fe: + 2a:35:d0:d8:49:77:09:f5:5d:65:9b:84:42:93:da: + 64:a4:12:f7:f5:6d:91:2f:7c:96:aa:7b:50:09:67: + 1d:f6:76:a2:4f:64:6c:d7:78:c6:78:f4:5c:83:3a: + 01:64:3c:15:37:4e:2a:b9:48:2a:ce:42:36:35:59: + b0:b0:f6:4c:db:21:59:14:87:91:09:d8:18:76:b8: + fb:0c:b4:e4:ab:5a:24:27:e5:47:9c:c7:eb:d0:74: + 17:5b:13:9a:f7:96:b7:1d:de:84:8c:6a:fd:c7:92: + 53:09:72:31:66:aa:54:07:3d:1c:2c:86:e9:68:d8: + 12:f6:22:ec:37:b5:58:6c:26:fe:79:c5:d0:f7:42: + 79:f9:ad:7a:3a:f4:0a:52:3e:5a:5b:45:d9:a8:d1: + 18:35:db:9d:56:81:11:49:f9:77:0d:ff:a7:1e:39: + 63:14:3b:64:3d:d0:2f:1b:47:c6:ad:6a:a8:d8:c9: + 09:cd:58:0b:5d:de:ad:aa:56:38:bd:42:0f:f9:c6: + 9d:c0:da:b0:06:03:a5:3f:43:5f:e1:83:74:cc:a7: + ab:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + E8:2D:DF:58:DB:57:BD:6D:98:31:15:C9:58:49:E0:02:47:79:10:9D + X509v3 Authority Key Identifier: + keyid:0E:AF:B4:0B:04:28:C3:55:B4:F8:2D:EB:A1:62:49:26:60:A2:A7:D8 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + a2:d6:e1:fe:94:8d:78:bc:5b:9e:53:1a:b9:6b:76:32:2e:66: + 0b:b3:ce:8f:96:9a:33:37:b6:e2:fb:99:56:2e:3b:cb:3d:d3: + 96:c7:b8:05:9a:00:e4:f4:72:f6:97:b2:b3:72:08:3d:17:59: + af:98:b3:16:a2:cb:e7:b8:bf:c1:5b:49:92:28:9c:47:bd:29: + 9e:56:f8:52:67:eb:de:23:69:52:79:32:1f:ba:b5:58:d3:b6: + 19:58:ac:62:04:a5:29:9a:7b:df:90:ad:c1:b1:42:c4:6c:a6: + 16:db:af:5e:ee:85:83:9e:c9:02:ba:c6:3c:63:55:93:58:36: + b4:86:b8:fa:e4:09:6f:98:6f:23:2a:2c:98:04:e4:2c:fd:69: + 61:b2:36:88:8f:a2:70:ec:2a:47:6d:e0:cb:f8:5c:07:25:71: + f4:f6:af:50:a7:d7:49:d8:c8:08:4a:09:12:8c:21:bc:d7:54: + f2:04:fc:f0:33:2f:aa:b1:a7:d3:0a:d0:96:0f:69:7c:a4:a8: + cd:a5:a6:d3:d2:6a:b1:f2:b1:0a:81:18:68:18:23:c1:6f:9c: + 40:9f:d2:2d:6d:e2:52:36:05:4e:99:ae:b2:e1:b3:da:40:99: + 1f:c6:9f:ae:9b:43:1d:e3:db:58:7c:96:b5:b8:cc:b6:b7:e9: + 1b:57:a0:61 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDps8vE +m8VZCspeyrN74bvsPUsQe9TucZIcwCSvC8ReVTuvquNDo9OuHNt7/io10NhJdwn1 +XWWbhEKT2mSkEvf1bZEvfJaqe1AJZx32dqJPZGzXeMZ49FyDOgFkPBU3Tiq5SCrO +QjY1WbCw9kzbIVkUh5EJ2Bh2uPsMtOSrWiQn5Uecx+vQdBdbE5r3lrcd3oSMav3H +klMJcjFmqlQHPRwshulo2BL2Iuw3tVhsJv55xdD3Qnn5rXo69ApSPlpbRdmo0Rg1 +251WgRFJ+XcN/6ceOWMUO2Q90C8bR8ataqjYyQnNWAtd3q2qVji9Qg/5xp3A2rAG +A6U/Q1/hg3TMp6ufAgMBAAGjgekwgeYwHQYDVR0OBBYEFOgt31jbV71tmDEVyVhJ +4AJHeRCdMB8GA1UdIwQYMBaAFA6vtAsEKMNVtPgt66FiSSZgoqfYMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAotbh/pSNeLxbnlMauWt2 +Mi5mC7POj5aaMze24vuZVi47yz3Tlse4BZoA5PRy9peys3IIPRdZr5izFqLL57i/ +wVtJkiicR70pnlb4Umfr3iNpUnkyH7q1WNO2GVisYgSlKZp735CtwbFCxGymFtuv +Xu6Fg57JArrGPGNVk1g2tIa4+uQJb5hvIyosmATkLP1pYbI2iI+icOwqR23gy/hc +ByVx9PavUKfXSdjICEoJEowhvNdU8gT88DMvqrGn0wrQlg9pfKSozaWm09JqsfKx +CoEYaBgjwW+cQJ/SLW3iUjYFTpmusuGz2kCZH8afrptDHePbWHyWtbjMtrfpG1eg +YQ== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: md5WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e9:c2:e1:d4:1c:a8:bf:ff:07:7f:17:bf:a4:f7: + f5:bc:e3:1f:76:32:e2:a3:e4:5c:a2:5d:83:a4:ad: + c7:19:12:8a:20:dc:5c:d3:db:22:97:e5:59:09:d8: + 7f:95:bc:79:61:c2:66:d1:69:02:fc:98:02:12:8e: + f4:4e:63:4d:1f:d0:df:f9:25:f0:86:f0:17:ba:3d: + 1c:5c:7d:7c:0a:f5:fc:f5:f3:a1:1f:44:45:30:e5: + f2:02:b8:e2:04:69:50:f7:b8:10:1d:35:92:56:3b: + 06:42:fc:a7:e5:45:40:b0:0c:2f:2c:61:dd:0e:55: + cb:23:7d:8b:48:b6:ac:68:b3:e3:3b:fc:07:a4:89: + 17:3e:e3:fc:74:12:e6:2f:15:b8:78:dc:a2:6b:6b: + 98:e2:36:f6:69:26:71:21:20:d1:60:4d:44:ea:32: + fd:54:64:4a:f1:6a:94:f3:51:43:e8:f9:5f:68:9e: + 03:a8:a8:6c:a2:0e:55:e5:d8:87:ad:62:db:61:5b: + a8:4b:1a:dc:f3:14:9f:97:24:5c:32:98:e4:9b:8b: + 1e:32:d4:12:d0:5b:a1:c1:f6:2e:85:42:c4:dc:60: + 8f:b1:b2:8b:7a:63:3e:ad:95:62:60:2a:0e:88:dc: + 5c:10:c6:90:ab:6b:75:d2:42:f4:b2:a9:81:5a:d8: + 0e:41 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 0E:AF:B4:0B:04:28:C3:55:B4:F8:2D:EB:A1:62:49:26:60:A2:A7:D8 + X509v3 Authority Key Identifier: + keyid:DE:7E:F6:82:CA:37:00:C9:C3:30:07:35:D1:BA:48:C5:9B:B6:2D:A7 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 03:a2:90:68:d8:0d:83:e4:1c:83:20:2e:0b:ff:60:1c:01:a9: + ec:66:71:cd:3b:61:2c:10:95:ab:42:4e:fc:05:bb:40:d3:8c: + 00:34:72:b3:8f:74:de:21:67:0a:e8:b4:93:3d:c3:a2:a0:a0: + f0:4b:d9:7d:c6:2b:4f:dd:31:12:ad:72:3c:54:58:5c:21:3f: + 75:39:46:80:da:f3:20:1d:93:a3:ef:bb:00:91:bd:8d:22:16: + d9:5e:c7:a1:45:39:1a:76:d9:7d:e6:86:6c:65:0e:29:50:4b: + 5f:40:ec:79:9c:9a:d0:d9:fa:6a:6a:90:62:db:fa:9e:28:1a: + 40:e4:b3:45:90:41:26:09:d4:7c:f7:5c:58:ce:c5:67:6a:d1: + 41:86:73:df:6e:cb:79:70:75:5f:d2:54:53:07:e0:53:d1:45: + d9:4b:e7:f6:2b:60:fb:56:b4:17:79:be:2a:7e:98:0d:ad:ea: + d1:79:5d:87:80:65:84:15:61:d8:dd:a8:3c:5f:f0:90:a6:0b: + d8:c5:ca:d8:8d:fb:2f:1b:f8:a2:4d:ea:33:71:c2:30:a5:3b: + 56:a4:73:79:51:b7:7a:e7:6c:f7:23:52:48:61:1c:82:54:97: + 0d:54:e5:80:07:bb:84:d7:ee:90:ee:4d:85:df:f7:34:fb:d3: + d8:bf:19:7f +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQQFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6cLh1Byo +v/8Hfxe/pPf1vOMfdjLio+Rcol2DpK3HGRKKINxc09sil+VZCdh/lbx5YcJm0WkC +/JgCEo70TmNNH9Df+SXwhvAXuj0cXH18CvX89fOhH0RFMOXyArjiBGlQ97gQHTWS +VjsGQvyn5UVAsAwvLGHdDlXLI32LSLasaLPjO/wHpIkXPuP8dBLmLxW4eNyia2uY +4jb2aSZxISDRYE1E6jL9VGRK8WqU81FD6PlfaJ4DqKhsog5V5diHrWLbYVuoSxrc +8xSflyRcMpjkm4seMtQS0FuhwfYuhULE3GCPsbKLemM+rZViYCoOiNxcEMaQq2t1 +0kL0sqmBWtgOQQIDAQABo4HLMIHIMB0GA1UdDgQWBBQOr7QLBCjDVbT4LeuhYkkm +YKKn2DAfBgNVHSMEGDAWgBTefvaCyjcAycMwBzXRukjFm7YtpzA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEB +AAOikGjYDYPkHIMgLgv/YBwBqexmcc07YSwQlatCTvwFu0DTjAA0crOPdN4hZwro +tJM9w6KgoPBL2X3GK0/dMRKtcjxUWFwhP3U5RoDa8yAdk6PvuwCRvY0iFtlex6FF +ORp22X3mhmxlDilQS19A7HmcmtDZ+mpqkGLb+p4oGkDks0WQQSYJ1Hz3XFjOxWdq +0UGGc99uy3lwdV/SVFMH4FPRRdlL5/YrYPtWtBd5vip+mA2t6tF5XYeAZYQVYdjd +qDxf8JCmC9jFytiN+y8b+KJN6jNxwjClO1akc3lRt3rnbPcjUkhhHIJUlw1U5YAH +u4TX7pDuTYXf9zT709i/GX8= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c6:d0:57:18:e0:d7:81:35:67:b0:a4:a1:5b:fd: + 8f:32:51:4f:d9:76:67:02:84:59:10:4d:4a:b9:ed: + 1d:ef:fe:5e:d4:69:c1:24:e3:1f:91:08:d8:15:de: + 68:ca:dc:c7:fc:ea:6f:27:a5:60:45:af:0f:f1:44: + b8:d7:c7:96:70:d9:e1:dd:84:aa:ea:65:52:62:67: + e1:06:cd:d9:18:ad:eb:a3:0a:60:4b:cd:76:71:44: + 26:3c:22:c7:44:74:77:31:50:a5:b3:c4:ef:ac:14: + 1e:ea:ff:74:a0:7b:e4:7a:ca:87:dd:45:0b:bc:75: + 4b:92:44:0f:e8:f3:d2:6d:3e:47:4b:cf:77:a2:e9: + ff:f9:e2:79:9f:88:d7:ff:e5:cc:93:91:91:24:e1: + 9f:ef:a4:13:15:cc:03:3e:06:ba:9d:4c:de:52:b9: + de:c6:57:af:76:d8:9e:4b:37:11:1d:52:57:fe:af: + 8e:11:1d:fd:a8:55:3b:84:c9:10:ac:dc:51:62:e8: + c8:54:5b:3d:60:0b:8e:ad:66:2a:26:92:81:c6:a1: + be:31:51:d3:28:b1:9e:86:67:ca:c4:f2:88:47:1c: + 03:c9:f8:ee:f8:87:4c:b4:9e:24:9d:c0:48:d8:ec: + a7:8b:52:7a:d0:65:cf:06:2a:63:7f:1c:c9:15:44: + 48:01 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + DE:7E:F6:82:CA:37:00:C9:C3:30:07:35:D1:BA:48:C5:9B:B6:2D:A7 + X509v3 Authority Key Identifier: + keyid:DE:7E:F6:82:CA:37:00:C9:C3:30:07:35:D1:BA:48:C5:9B:B6:2D:A7 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 8c:97:4a:f9:c2:c2:57:2a:4b:a1:69:03:9e:c1:17:fb:4c:f2: + 8e:36:0f:e2:c4:f6:4d:42:9c:ac:7f:67:7b:fd:7e:fd:14:3b: + fb:df:08:3d:0e:23:fa:d1:47:d5:68:14:b2:1f:5c:40:db:fe: + 8d:e6:fc:17:3a:c6:2f:5e:96:1a:3c:32:fa:63:c5:e5:cf:fc: + db:6b:59:71:b8:f7:d2:70:78:cc:7f:8c:54:5f:c6:69:ba:98: + 77:92:32:b3:a1:18:84:ed:3c:93:3f:12:93:64:e6:7f:92:8a: + 4f:db:42:1d:c0:7c:0d:4a:d6:ef:ca:05:a3:5b:26:47:79:7e: + 91:b0:e6:35:92:91:e2:2f:4d:18:17:44:b5:a7:de:8a:92:86: + 4c:0c:de:0e:23:53:c0:30:1f:7a:c5:70:59:94:19:02:8a:f1: + 23:f9:88:fb:09:af:b8:90:d6:c6:d5:46:92:74:44:8b:8e:66: + b1:79:cb:82:3d:80:cc:cf:d9:03:5a:a3:71:a6:f5:f0:75:9f: + 79:38:f0:fe:66:e5:d1:a1:9d:0a:48:e1:45:a1:42:fb:d3:16: + 53:91:b9:c9:0d:27:8a:34:e0:59:8d:4f:e0:e7:7d:7d:0c:e6: + ec:a1:ea:66:23:77:55:fc:f1:d0:13:32:1d:9e:0c:fd:3b:38: + 1d:dc:2c:2b +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbQVxjg14E1Z7CkoVv9 +jzJRT9l2ZwKEWRBNSrntHe/+XtRpwSTjH5EI2BXeaMrcx/zqbyelYEWvD/FEuNfH +lnDZ4d2EquplUmJn4QbN2Rit66MKYEvNdnFEJjwix0R0dzFQpbPE76wUHur/dKB7 +5HrKh91FC7x1S5JED+jz0m0+R0vPd6Lp//nieZ+I1//lzJORkSThn++kExXMAz4G +up1M3lK53sZXr3bYnks3ER1SV/6vjhEd/ahVO4TJEKzcUWLoyFRbPWALjq1mKiaS +gcahvjFR0yixnoZnysTyiEccA8n47viHTLSeJJ3ASNjsp4tSetBlzwYqY38cyRVE +SAECAwEAAaOByzCByDAdBgNVHQ4EFgQU3n72gso3AMnDMAc10bpIxZu2LacwHwYD +VR0jBBgwFoAU3n72gso3AMnDMAc10bpIxZu2LacwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCMl0r5wsJX +KkuhaQOewRf7TPKONg/ixPZNQpysf2d7/X79FDv73wg9DiP60UfVaBSyH1xA2/6N +5vwXOsYvXpYaPDL6Y8Xlz/zba1lxuPfScHjMf4xUX8Zpuph3kjKzoRiE7TyTPxKT +ZOZ/kopP20IdwHwNStbvygWjWyZHeX6RsOY1kpHiL00YF0S1p96KkoZMDN4OI1PA +MB96xXBZlBkCivEj+Yj7Ca+4kNbG1UaSdESLjmaxecuCPYDMz9kDWqNxpvXwdZ95 +OPD+ZuXRoZ0KSOFFoUL70xZTkbnJDSeKNOBZjU/g5319DObsoepmI3dV/PHQEzId +ngz9Ozgd3Cwr +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-unknown-critical-extension.pem b/net/data/verify_certificate_chain_unittest/intermediary-unknown-critical-extension.pem new file mode 100644 index 0000000..7e7045c --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-unknown-critical-extension.pem
@@ -0,0 +1,284 @@ +[Created by: generate-intermediary-unknown-critical-extension.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +has an unknown X.509v3 extension (OID=1.2.3.4) that is marked as critical. +Verifying this certificate chain is expected to fail because there is an +unrecognized critical extension. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cf:51:a6:c4:9e:d4:eb:c4:eb:d6:57:2b:80:e5: + da:cd:db:3a:cf:b0:43:c5:18:9c:4e:b7:c4:9c:18: + 73:e6:85:e6:00:00:76:25:9f:5d:8f:28:19:f2:05: + 02:a9:5c:75:65:12:38:d7:7a:eb:e3:46:42:07:3d: + 3b:c4:5d:32:7b:26:fb:1e:69:cb:36:ca:c2:da:2f: + b4:ec:e3:bf:5e:9a:d3:8a:6d:3e:f2:53:dc:da:40: + 3c:fe:fd:02:36:32:f5:b2:17:bf:05:97:f0:3e:8b: + b7:15:a2:10:be:27:79:62:30:82:3e:57:60:60:13: + 8e:fc:33:8e:72:cd:d9:d9:50:e9:62:04:8c:e4:db: + f8:cf:1b:da:a2:f7:ee:4c:b8:7f:b2:bf:92:c9:2c: + 44:a7:b5:ad:b9:75:06:c0:24:5a:0b:44:ca:4f:af: + f6:2f:c2:00:12:bb:7b:0c:c4:54:47:f1:73:53:64: + 72:40:9d:51:40:b3:21:73:ce:82:c5:f3:b7:14:ef: + 31:50:5b:d5:0b:b7:92:0e:08:5c:ea:ed:73:86:e3: + b1:6d:63:7f:56:7d:74:3e:3b:90:8c:2f:a2:6e:65: + b9:4e:38:a3:54:fb:7b:de:69:6f:c0:57:ea:51:c0: + 09:83:b4:a8:4d:ec:74:a6:ea:31:97:0c:9a:66:b7: + 58:0f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 89:EB:AF:F5:F3:C7:53:ED:03:95:5A:DB:94:4A:E0:BF:C3:D2:CE:FA + X509v3 Authority Key Identifier: + keyid:21:32:55:0D:16:9C:AD:C4:16:5D:BE:40:67:0D:B6:40:4E:E2:75:60 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 17:7b:87:2f:11:ac:6d:68:03:d3:07:31:20:18:b7:d4:9d:98: + e4:aa:10:6d:f2:41:2f:3e:cf:1f:50:f9:f9:3f:6e:61:c2:b7: + dd:e0:f6:5a:d6:66:bb:2d:31:98:6a:12:0a:17:e8:a1:4e:cd: + fd:c4:ed:3e:01:a3:1c:ef:18:9e:fb:f8:46:c6:1b:ad:a4:ce: + ba:84:79:a6:84:f0:2c:84:d4:6c:3f:f9:ff:f8:66:f1:9b:82: + 8c:83:c8:79:5b:bd:f0:dd:e0:e5:76:55:92:97:d2:46:64:ea: + 3e:99:bc:9d:b8:8f:15:41:f8:3f:1b:c0:df:cd:d5:01:88:74: + 37:8e:58:f8:ad:7d:75:70:59:98:cc:c4:bd:fc:b9:bd:f5:69: + fe:09:08:be:ea:e8:f3:ee:53:d8:05:4f:d5:d1:85:dc:7e:58: + 64:cf:d4:41:c1:d0:ec:c4:2a:ca:ae:39:8e:57:63:e3:03:ff: + 4f:d4:42:92:ec:ac:e8:f6:83:e5:51:0e:32:2c:6f:2d:15:72: + 21:37:f0:18:77:3b:97:f5:71:84:1f:07:e0:76:b6:a0:f4:34: + 16:b9:53:e2:4f:48:45:b6:7d:b3:0f:30:06:e6:89:89:a4:3f: + e8:4c:2a:9c:1f:9c:91:c9:66:4e:28:39:3d:5b:21:19:03:dc: + 02:56:69:e9 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPUabE +ntTrxOvWVyuA5drN2zrPsEPFGJxOt8ScGHPmheYAAHYln12PKBnyBQKpXHVlEjjX +euvjRkIHPTvEXTJ7Jvseacs2ysLaL7Ts479emtOKbT7yU9zaQDz+/QI2MvWyF78F +l/A+i7cVohC+J3liMII+V2BgE478M45yzdnZUOliBIzk2/jPG9qi9+5MuH+yv5LJ +LESnta25dQbAJFoLRMpPr/YvwgASu3sMxFRH8XNTZHJAnVFAsyFzzoLF87cU7zFQ +W9ULt5IOCFzq7XOG47FtY39WfXQ+O5CML6JuZblOOKNU+3veaW/AV+pRwAmDtKhN +7HSm6jGXDJpmt1gPAgMBAAGjgekwgeYwHQYDVR0OBBYEFInrr/Xzx1PtA5Va25RK +4L/D0s76MB8GA1UdIwQYMBaAFCEyVQ0WnK3EFl2+QGcNtkBO4nVgMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAF3uHLxGsbWgD0wcxIBi3 +1J2Y5KoQbfJBLz7PH1D5+T9uYcK33eD2WtZmuy0xmGoSChfooU7N/cTtPgGjHO8Y +nvv4RsYbraTOuoR5poTwLITUbD/5//hm8ZuCjIPIeVu98N3g5XZVkpfSRmTqPpm8 +nbiPFUH4PxvA383VAYh0N45Y+K19dXBZmMzEvfy5vfVp/gkIvuro8+5T2AVP1dGF +3H5YZM/UQcHQ7MQqyq45jldj4wP/T9RCkuys6PaD5VEOMixvLRVyITfwGHc7l/Vx +hB8H4Ha2oPQ0FrlT4k9IRbZ9sw8wBuaJiaQ/6EwqnB+ckclmTig5PVshGQPcAlZp +6Q== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c7:80:3b:a7:4e:4e:fa:0a:39:4f:5b:5c:af:ba: + 84:27:6a:8d:34:95:5e:91:93:c8:d0:1f:64:84:5f: + 25:d9:3b:5d:f9:31:5f:4f:6f:04:be:50:35:09:5e: + 78:f3:9a:15:b5:27:fa:24:70:04:26:29:08:95:a5: + dd:b1:ee:4f:ee:d8:a0:59:51:ab:75:70:c2:7b:42: + 06:e2:4d:d7:91:ec:e5:e7:f8:34:1e:01:63:45:11: + 6a:fe:45:3e:e7:16:59:86:e7:4b:91:67:ec:1f:c1: + 13:a4:62:cb:f6:0d:9b:2b:e5:1e:df:c4:35:f3:94: + 60:9b:99:e1:54:ce:ff:7d:92:f1:9d:d4:f6:0e:99: + 8c:dc:7b:b1:95:54:04:6f:40:1c:23:42:50:ab:96: + f5:9e:93:27:f1:5c:e5:97:9c:c1:e4:ae:a8:cb:f9: + 42:7e:14:02:e1:32:4b:4d:03:2d:2a:a6:7e:a1:77: + c3:4e:4e:46:18:1a:95:d7:0d:48:8d:a1:d3:bb:b7: + 55:07:01:d9:c0:27:fd:f7:ec:61:3a:57:84:b6:91: + 78:dc:a9:19:a6:d4:83:c5:57:67:bd:b7:a0:6a:ec: + 7b:83:1e:d9:bf:2f:b7:bf:d6:ce:18:5a:54:cf:8b: + 1a:fc:5a:03:63:bc:d2:3a:01:db:91:e0:ce:96:19: + 55:19 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 21:32:55:0D:16:9C:AD:C4:16:5D:BE:40:67:0D:B6:40:4E:E2:75:60 + X509v3 Authority Key Identifier: + keyid:BA:1F:26:2C:E0:77:F2:16:78:6D:83:49:A1:30:9E:B4:AB:10:6A:22 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + 1.2.3.4: critical + .... + Signature Algorithm: sha256WithRSAEncryption + 02:57:1a:5a:82:9a:29:1e:39:b4:aa:c4:e3:04:2b:6f:1c:0a: + 79:df:d3:f8:c9:9f:94:b6:c1:7e:e5:47:8d:35:72:e2:09:ce: + 6f:61:f1:7e:93:f3:37:11:0d:c0:28:05:bc:8d:dc:f8:2a:22: + 0e:dc:79:b9:71:99:38:f5:c2:81:ac:0b:47:c2:39:96:2e:2b: + 35:0a:fe:80:fe:50:da:74:03:1c:4b:36:be:4b:23:70:4f:a1: + 1f:c8:3b:9a:6b:92:3d:61:9b:67:9a:8b:ea:0b:b0:8c:aa:6a: + 02:fd:27:6f:a8:be:8f:d0:78:f2:84:76:da:e2:c5:10:3c:9f: + 61:c4:3f:50:8e:40:ac:d8:aa:87:b6:7c:da:42:c5:05:c0:82: + bc:9f:35:ae:22:34:32:11:71:ab:fd:27:af:ef:42:ec:cd:b7: + d1:66:14:5f:f1:e5:10:c2:1f:ac:e4:96:1f:a9:9c:5a:ad:97: + 4d:90:40:df:cb:77:15:ba:d5:f4:76:94:9f:d6:c2:4f:53:60: + 3b:c3:a3:9c:02:4d:03:28:32:58:3d:0f:62:36:a9:7b:70:d9: + f8:2b:05:cd:ca:c7:17:68:76:6b:cd:ad:7f:f1:65:a6:d1:be: + b7:4c:83:bb:0d:5d:98:6e:02:d3:b6:ea:82:b6:44:0d:a1:b2: + 37:4b:a0:a3 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx4A7p05O ++go5T1tcr7qEJ2qNNJVekZPI0B9khF8l2Ttd+TFfT28EvlA1CV5485oVtSf6JHAE +JikIlaXdse5P7tigWVGrdXDCe0IG4k3Xkezl5/g0HgFjRRFq/kU+5xZZhudLkWfs +H8ETpGLL9g2bK+Ue38Q185Rgm5nhVM7/fZLxndT2DpmM3HuxlVQEb0AcI0JQq5b1 +npMn8Vzll5zB5K6oy/lCfhQC4TJLTQMtKqZ+oXfDTk5GGBqV1w1IjaHTu7dVBwHZ +wCf99+xhOleEtpF43KkZptSDxVdnvbegaux7gx7Zvy+3v9bOGFpUz4sa/FoDY7zS +OgHbkeDOlhlVGQIDAQABo4HbMIHYMB0GA1UdDgQWBBQhMlUNFpytxBZdvkBnDbZA +TuJ1YDAfBgNVHSMEGDAWgBS6HyYs4HfyFnhtg0mhMJ60qxBqIjA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDKgMEAQH/BAQBAgMEMA0G +CSqGSIb3DQEBCwUAA4IBAQACVxpagpopHjm0qsTjBCtvHAp539P4yZ+UtsF+5UeN +NXLiCc5vYfF+k/M3EQ3AKAW8jdz4KiIO3Hm5cZk49cKBrAtHwjmWLis1Cv6A/lDa +dAMcSza+SyNwT6EfyDuaa5I9YZtnmovqC7CMqmoC/SdvqL6P0HjyhHba4sUQPJ9h +xD9QjkCs2KqHtnzaQsUFwIK8nzWuIjQyEXGr/Sev70LszbfRZhRf8eUQwh+s5JYf +qZxarZdNkEDfy3cVutX0dpSf1sJPU2A7w6OcAk0DKDJYPQ9iNql7cNn4KwXNyscX +aHZrza1/8WWm0b63TIO7DV2YbgLTtuqCtkQNobI3S6Cj +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:9f:42:45:62:cb:c5:f3:07:65:8a:9b:4c:d4:91: + 4a:66:e6:89:24:24:6f:91:3e:4a:50:63:42:47:e3: + 67:10:71:ac:f3:81:82:3b:9f:56:7c:6a:36:a6:87: + be:d5:e6:03:4b:bb:d3:c8:90:6a:6b:1d:4c:16:a1: + c3:98:58:f7:39:de:90:27:df:40:c5:03:10:b2:b4: + 1b:cb:28:5d:80:a4:83:60:f2:c0:ac:f5:1f:81:4d: + 31:84:6f:04:96:7b:26:bf:b6:55:78:33:06:23:65: + 1c:bc:65:ac:a3:31:27:49:38:ce:92:73:87:a7:b4: + 53:4b:85:71:29:7a:f5:09:fc:03:9a:90:56:14:b1: + b7:89:03:c4:61:b6:49:fc:3d:30:62:84:a2:46:66: + 22:37:32:fd:a3:62:bb:99:62:53:ca:fc:1f:e9:29: + c6:d4:8c:09:6f:02:d5:de:7c:de:12:d8:00:dd:df: + 04:94:d4:36:b5:f6:d9:fe:a7:ff:46:e7:07:da:3e: + d0:e3:ea:90:4c:7c:b7:ff:bc:85:99:d5:1f:46:f5: + ac:57:e9:09:03:61:8c:0b:9d:a8:82:9c:17:43:27: + de:80:d2:59:e3:ca:ed:23:41:1a:32:48:83:ca:bd: + 8e:cb:bf:9c:f0:03:7d:e0:41:ce:72:05:27:59:3c: + 10:5b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + BA:1F:26:2C:E0:77:F2:16:78:6D:83:49:A1:30:9E:B4:AB:10:6A:22 + X509v3 Authority Key Identifier: + keyid:BA:1F:26:2C:E0:77:F2:16:78:6D:83:49:A1:30:9E:B4:AB:10:6A:22 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 70:b4:15:ff:b7:d9:b7:51:10:ce:fa:e5:61:0e:f6:c7:b6:d7: + be:59:ed:07:d5:77:95:e1:ef:3f:80:9e:99:d2:2c:1b:9a:a7: + 35:1c:ec:84:9e:ce:27:52:3a:2c:00:06:4d:60:62:aa:4b:a7: + 61:32:e3:64:f1:96:c7:d2:3f:fe:78:bc:f4:da:76:f9:44:d2: + 9b:1a:94:1f:44:9a:49:c9:c0:1c:de:a9:63:d0:23:4a:c3:fb: + 60:45:76:dd:12:ef:c1:95:4f:8e:bd:48:56:b8:f9:74:e2:5c: + ae:90:5a:19:9e:90:13:0b:97:ff:cd:a9:45:54:68:aa:fa:f6: + ea:3f:2e:fa:2a:40:48:42:cd:10:cc:c8:e6:a4:34:9d:8f:1c: + 74:55:58:b2:99:cf:35:40:23:bf:90:5f:4c:60:30:5f:a0:b4: + d6:0f:4f:42:03:71:82:f7:d3:f5:72:bb:a8:cf:24:ab:10:7e: + c5:e1:84:a9:7e:25:b1:8a:80:db:ae:0e:49:f1:03:fb:11:1a: + 63:58:42:7f:73:9b:f3:f8:d6:ae:81:0b:59:ca:98:ec:3d:9c: + 85:6b:7d:70:e8:c2:04:47:f0:b6:7e:4a:96:70:c9:a8:11:b7: + 23:54:55:d3:57:c3:7e:47:66:35:91:26:56:fd:37:14:35:a4: + 6b:29:38:ee +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ9CRWLLxfMHZYqbTNSR +SmbmiSQkb5E+SlBjQkfjZxBxrPOBgjufVnxqNqaHvtXmA0u708iQamsdTBahw5hY +9znekCffQMUDELK0G8soXYCkg2DywKz1H4FNMYRvBJZ7Jr+2VXgzBiNlHLxlrKMx +J0k4zpJzh6e0U0uFcSl69Qn8A5qQVhSxt4kDxGG2Sfw9MGKEokZmIjcy/aNiu5li +U8r8H+kpxtSMCW8C1d583hLYAN3fBJTUNrX22f6n/0bnB9o+0OPqkEx8t/+8hZnV +H0b1rFfpCQNhjAudqIKcF0Mn3oDSWePK7SNBGjJIg8q9jsu/nPADfeBBznIFJ1k8 +EFsCAwEAAaOByzCByDAdBgNVHQ4EFgQUuh8mLOB38hZ4bYNJoTCetKsQaiIwHwYD +VR0jBBgwFoAUuh8mLOB38hZ4bYNJoTCetKsQaiIwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBwtBX/t9m3 +URDO+uVhDvbHtte+We0H1XeV4e8/gJ6Z0iwbmqc1HOyEns4nUjosAAZNYGKqS6dh +MuNk8ZbH0j/+eLz02nb5RNKbGpQfRJpJycAc3qlj0CNKw/tgRXbdEu/BlU+OvUhW +uPl04lyukFoZnpATC5f/zalFVGiq+vbqPy76KkBIQs0QzMjmpDSdjxx0VViymc81 +QCO/kF9MYDBfoLTWD09CA3GC99P1cruozySrEH7F4YSpfiWxioDbrg5J8QP7ERpj +WEJ/c5vz+NaugQtZypjsPZyFa31w6MIER/C2fkqWcMmoEbcjVFXTV8N+R2Y1kSZW +/TcUNaRrKTju +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediary-unknown-non-critical-extension.pem b/net/data/verify_certificate_chain_unittest/intermediary-unknown-non-critical-extension.pem new file mode 100644 index 0000000..dffed19 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/intermediary-unknown-non-critical-extension.pem
@@ -0,0 +1,284 @@ +[Created by: generate-intermediary-unknown-non-critical-extension.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +has an unknown X.509v3 extension that is marked as non-critical. Verification +is expected to succeed because although unrecognized, the extension is not +critical. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e2:f4:a3:48:79:59:87:08:4d:c1:84:b4:97:67: + 5d:f6:24:2b:74:f1:f0:1a:13:e0:a5:28:30:1f:c6: + 04:fc:ce:9b:73:4a:95:1f:56:a0:9d:26:07:97:8f: + 7c:06:c7:a2:fb:5f:85:41:d3:bd:50:83:61:72:5e: + a0:f9:e1:39:c6:ae:77:05:8c:f7:8e:6f:ae:5d:14: + 69:97:12:4a:c7:40:de:e7:ab:7a:83:9b:b3:e8:15: + 90:ab:52:3a:ee:c4:36:9b:58:eb:51:c3:1d:c5:c8: + eb:f7:65:e9:15:56:93:e4:55:37:97:29:f1:88:da: + fc:1c:53:5f:24:07:f9:3e:14:86:b3:50:c6:94:06: + 8e:b1:b1:ab:32:d4:f3:98:ee:f8:42:ed:65:43:36: + bb:4f:59:a0:4d:77:a5:9e:a9:c2:40:40:df:cc:3c: + d7:dc:56:bd:d4:2c:fe:b5:20:d6:a8:74:cd:99:4f: + bf:eb:71:0b:20:95:f2:c3:21:92:42:d7:e6:ff:5b: + 87:0b:c2:89:5c:e7:d6:30:77:cd:8d:c7:92:0d:74: + 6f:88:d6:81:49:e8:f6:25:de:6d:51:3e:db:cd:e4: + 91:99:98:5a:ff:7a:61:46:da:7a:ec:9b:22:a5:5f: + 16:6e:cd:7a:ec:3b:b0:aa:1b:af:65:a6:3a:85:fc: + a6:e9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 82:EC:E0:87:C2:A2:2A:EF:4B:E0:B5:F8:75:6A:18:32:51:B4:0D:54 + X509v3 Authority Key Identifier: + keyid:60:BD:98:38:CE:C3:01:40:CA:86:14:C7:F4:E4:D5:72:BA:ED:80:31 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 89:1e:64:8c:61:b5:87:aa:76:6d:f6:ef:87:b6:ca:3b:0f:47: + a9:bb:9a:91:7f:7a:d8:65:e9:c7:b1:1a:ea:13:fb:9c:79:5e: + df:33:f5:d9:bc:f1:f8:89:bc:59:31:27:c2:2d:3e:47:e9:13: + 27:65:c8:cb:ba:e1:da:51:60:7a:93:aa:28:92:d5:81:89:09: + b7:22:e7:4b:4f:82:0e:fb:2f:62:19:b4:ea:f5:47:34:fd:60: + 7e:4c:e6:be:08:8e:f8:fd:89:62:ff:97:89:27:69:37:7f:e3: + 76:ea:72:30:ca:de:73:bb:c7:65:1c:6d:5e:ab:f8:ba:da:57: + 7d:28:1f:6a:64:76:aa:89:6b:ac:57:a3:e9:e2:c1:ca:f8:4b: + 7c:0b:21:57:cc:71:c8:9b:7f:25:8f:09:61:6e:5c:a8:9b:0b: + 79:98:7a:1e:82:95:22:fd:9e:9c:cd:20:73:0d:0e:d9:21:cb: + 67:3d:e9:1e:24:ae:4f:84:1f:de:3e:27:ee:54:41:66:71:9c: + b6:6b:08:7a:16:e7:c1:c7:7a:71:24:ed:c0:2a:d9:fd:2b:ff: + e6:41:c9:63:93:90:52:35:21:4a:72:be:f9:9c:27:49:0d:b7: + 01:af:cb:5f:53:ee:ef:58:69:16:ba:e6:5b:12:45:e0:d4:3d: + ea:58:fe:a5 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDi9KNI +eVmHCE3BhLSXZ132JCt08fAaE+ClKDAfxgT8zptzSpUfVqCdJgeXj3wGx6L7X4VB +071Qg2FyXqD54TnGrncFjPeOb65dFGmXEkrHQN7nq3qDm7PoFZCrUjruxDabWOtR +wx3FyOv3ZekVVpPkVTeXKfGI2vwcU18kB/k+FIazUMaUBo6xsasy1POY7vhC7WVD +NrtPWaBNd6WeqcJAQN/MPNfcVr3ULP61INaodM2ZT7/rcQsglfLDIZJC1+b/W4cL +wolc59Ywd82Nx5INdG+I1oFJ6PYl3m1RPtvN5JGZmFr/emFG2nrsmyKlXxZuzXrs +O7CqG69lpjqF/KbpAgMBAAGjgekwgeYwHQYDVR0OBBYEFILs4IfCoirvS+C1+HVq +GDJRtA1UMB8GA1UdIwQYMBaAFGC9mDjOwwFAyoYUx/Tk1XK67YAxMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAiR5kjGG1h6p2bfbvh7bK +Ow9HqbuakX962GXpx7Ea6hP7nHle3zP12bzx+Im8WTEnwi0+R+kTJ2XIy7rh2lFg +epOqKJLVgYkJtyLnS0+CDvsvYhm06vVHNP1gfkzmvgiO+P2JYv+XiSdpN3/jdupy +MMrec7vHZRxtXqv4utpXfSgfamR2qolrrFej6eLByvhLfAshV8xxyJt/JY8JYW5c +qJsLeZh6HoKVIv2enM0gcw0O2SHLZz3pHiSuT4Qf3j4n7lRBZnGctmsIehbnwcd6 +cSTtwCrZ/Sv/5kHJY5OQUjUhSnK++ZwnSQ23Aa/LX1Pu71hpFrrmWxJF4NQ96lj+ +pQ== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:de:7c:cd:1c:92:c3:9a:ff:be:f3:03:37:c7:6a: + 3a:d4:ac:56:50:3a:b1:17:0d:73:09:ef:d9:16:4b: + 38:de:a4:82:46:61:a8:ed:f8:b9:a0:21:7e:3c:26: + f6:a8:c5:d3:34:99:9c:58:c6:e1:de:f6:1c:eb:49: + a3:34:65:71:29:95:3a:2e:b4:5f:33:dd:2a:0b:5f: + 7a:e0:47:3f:bc:00:15:a1:24:26:9f:c6:c7:d7:eb: + e3:f3:37:19:d5:30:48:f2:7d:c5:77:11:cc:cc:17: + 7e:91:c4:20:f8:a6:c3:28:00:ec:23:53:40:7b:0e: + dc:14:6e:57:a5:ca:52:9f:2b:3b:34:ea:e4:ae:5c: + ed:b4:8d:25:9a:08:00:26:d0:e4:34:d2:94:36:8c: + e1:df:ef:31:f8:18:5b:ed:80:57:44:77:94:a2:fa: + ae:5c:e0:ea:e1:30:e3:24:03:da:7c:5b:66:90:c7: + 01:f1:f8:8d:ca:bc:d7:e3:25:35:28:3c:f6:f4:83: + 13:2a:73:d0:f7:c2:69:11:b1:ed:43:6d:71:28:7e: + 43:8d:f5:f0:78:e2:5a:31:39:38:ae:92:05:29:e0: + 1f:04:6f:9d:a0:a1:b4:29:80:af:87:1c:0c:e5:7d: + 6d:11:59:63:43:af:7f:a4:32:fa:0a:d1:7e:88:86: + cd:61 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 60:BD:98:38:CE:C3:01:40:CA:86:14:C7:F4:E4:D5:72:BA:ED:80:31 + X509v3 Authority Key Identifier: + keyid:B2:41:26:7A:EF:3A:C9:BF:FE:6A:E7:7F:04:60:B0:34:62:08:E3:93 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + 1.2.3.4: + .... + Signature Algorithm: sha256WithRSAEncryption + 68:5c:74:6c:fd:93:14:86:9f:d9:3a:4b:67:1d:6e:2b:78:2f: + 89:b4:b0:76:ac:3f:aa:ea:4a:ea:42:04:40:96:09:1a:b7:b7: + 01:93:fb:55:0d:44:30:0e:16:b3:e8:bb:b2:77:17:79:93:37: + 17:b5:62:c9:5b:15:76:90:2d:74:3d:1f:7e:59:61:59:e2:61: + 81:18:46:6b:94:42:be:be:d3:1e:37:16:68:49:db:9e:f0:f1: + 24:bb:e0:00:e0:57:e0:27:3f:59:e9:a8:92:31:80:2a:7a:cc: + b1:47:5b:8d:3b:55:f5:5a:f0:9a:56:90:1a:8e:d2:ab:51:e2: + 15:ca:9f:cb:a9:ec:10:f1:5d:58:72:84:75:63:bd:a7:7c:bf: + 5b:80:65:d6:97:77:e2:8a:89:8a:ea:5b:1f:da:55:5e:7b:33: + 37:e2:60:09:02:13:89:a3:ca:0f:bf:17:8e:47:fb:c1:8d:a8: + fb:9f:20:64:a6:a4:a0:86:da:fa:7f:6a:e1:50:10:41:9b:21: + e6:8e:9f:29:9c:cc:0b:83:a3:65:47:2a:15:8b:47:6a:48:89: + e4:2c:97:d7:81:51:bb:bb:e0:db:22:e2:be:bf:53:63:26:77: + 08:c3:b6:04:c7:9b:9c:03:91:00:63:bd:70:cb:e2:6c:c8:a7: + 2c:5b:f6:28 +-----BEGIN CERTIFICATE----- +MIIDejCCAmKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3nzNHJLD +mv++8wM3x2o61KxWUDqxFw1zCe/ZFks43qSCRmGo7fi5oCF+PCb2qMXTNJmcWMbh +3vYc60mjNGVxKZU6LrRfM90qC1964Ec/vAAVoSQmn8bH1+vj8zcZ1TBI8n3FdxHM +zBd+kcQg+KbDKADsI1NAew7cFG5XpcpSnys7NOrkrlzttI0lmggAJtDkNNKUNozh +3+8x+Bhb7YBXRHeUovquXODq4TDjJAPafFtmkMcB8fiNyrzX4yU1KDz29IMTKnPQ +98JpEbHtQ21xKH5DjfXweOJaMTk4rpIFKeAfBG+doKG0KYCvhxwM5X1tEVljQ69/ +pDL6CtF+iIbNYQIDAQABo4HYMIHVMB0GA1UdDgQWBBRgvZg4zsMBQMqGFMf05NVy +uu2AMTAfBgNVHSMEGDAWgBSyQSZ67zrJv/5q538EYLA0YgjjkzA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wCwYDKgMEBAQBAgMEMA0GCSqG +SIb3DQEBCwUAA4IBAQBoXHRs/ZMUhp/ZOktnHW4reC+JtLB2rD+q6krqQgRAlgka +t7cBk/tVDUQwDhaz6Luydxd5kzcXtWLJWxV2kC10PR9+WWFZ4mGBGEZrlEK+vtMe +NxZoSdue8PEku+AA4FfgJz9Z6aiSMYAqesyxR1uNO1X1WvCaVpAajtKrUeIVyp/L +qewQ8V1YcoR1Y72nfL9bgGXWl3fiiomK6lsf2lVeezM34mAJAhOJo8oPvxeOR/vB +jaj7nyBkpqSghtr6f2rhUBBBmyHmjp8pnMwLg6NlRyoVi0dqSInkLJfXgVG7u+Db +IuK+v1NjJncIw7YEx5ucA5EAY71wy+JsyKcsW/Yo +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a8:e9:07:4a:9e:20:9a:c5:14:9a:16:49:17:bf: + 0b:c1:7d:b6:91:54:cd:60:e6:df:bf:81:e1:bb:24: + 47:df:ea:c8:27:93:bb:49:b7:b7:e6:48:ff:11:43: + c1:8d:cb:54:f8:0d:49:05:e7:4b:a9:0d:cb:79:b8: + 49:26:6b:1c:ad:7d:2c:e5:a3:0a:1b:ad:99:9c:d4: + c2:d6:2c:de:ae:74:42:b7:06:ca:e0:57:06:e6:46: + 5a:80:70:6f:f7:0c:76:c5:8f:de:cc:35:85:bf:f5: + 79:29:63:79:22:fd:c0:48:1e:a0:4f:86:6b:2f:07: + 72:55:1f:96:dc:81:c7:19:8d:bf:7f:56:21:fc:05: + 6e:1a:3d:6d:f2:a7:37:6f:8d:c9:f5:5e:79:3a:89: + 6b:b5:6b:d4:14:eb:c4:de:3d:68:8c:e6:f8:96:e3: + b3:cb:73:09:6a:d1:8d:46:9e:c6:9f:1d:01:30:69: + ea:a4:2a:3c:90:fe:40:92:9d:61:81:88:96:67:cb: + ae:4c:f5:3d:31:37:8b:31:0a:a0:cf:87:80:f7:50: + eb:93:32:bf:64:13:3e:0a:d8:98:80:4b:b7:b1:a9: + 87:fe:b8:d3:d2:3b:a2:7d:20:cb:ff:6b:4e:67:88: + 52:03:4c:a2:2a:81:0d:63:4e:d0:f8:2e:f6:38:c9: + 9b:03 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + B2:41:26:7A:EF:3A:C9:BF:FE:6A:E7:7F:04:60:B0:34:62:08:E3:93 + X509v3 Authority Key Identifier: + keyid:B2:41:26:7A:EF:3A:C9:BF:FE:6A:E7:7F:04:60:B0:34:62:08:E3:93 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 91:be:af:fa:3e:50:a9:b4:7e:d5:c6:a9:91:2f:d3:63:11:bc: + 07:35:35:31:76:8e:69:e4:39:7d:82:65:be:6b:b0:9e:42:ce: + 0c:02:5a:0d:73:93:ce:89:c1:c7:27:cb:19:26:a0:77:85:53: + b5:1e:a8:60:9f:0c:b9:b4:fa:34:9f:4f:3a:0e:d6:ab:d3:a6: + 47:32:d8:ec:c9:80:90:2e:7c:fa:5f:16:96:f6:ba:fd:13:10: + 73:ec:3e:b0:3c:f5:7a:e1:8f:e3:32:59:d2:f1:3c:36:8c:92: + 21:a1:29:21:39:1c:08:b1:f6:85:35:ab:36:97:56:fc:4c:85: + 11:bc:69:72:05:f6:21:b8:85:bb:1e:cf:69:1a:3c:98:dd:93: + 58:53:e0:f1:ce:d0:2a:68:d9:b3:b9:26:71:d9:61:01:a8:cd: + bb:53:48:06:a5:c4:3f:d6:3b:aa:01:4d:01:fc:f2:79:96:a9: + 13:d3:ba:25:2c:2a:3d:e5:bd:e1:f7:ae:f9:3a:ea:59:77:8c: + 27:3c:f5:a4:01:f8:08:97:1b:28:1a:81:cb:ce:36:6b:2f:1e: + 41:05:f6:d6:d9:4d:84:87:16:61:e4:34:4c:06:7e:a8:2b:2b: + b5:a1:93:de:ca:52:f7:74:d9:ce:f7:f7:2b:0f:5d:f8:b6:9f: + 93:34:b2:00 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKjpB0qeIJrFFJoWSRe/ +C8F9tpFUzWDm37+B4bskR9/qyCeTu0m3t+ZI/xFDwY3LVPgNSQXnS6kNy3m4SSZr +HK19LOWjChutmZzUwtYs3q50QrcGyuBXBuZGWoBwb/cMdsWP3sw1hb/1eSljeSL9 +wEgeoE+Gay8HclUfltyBxxmNv39WIfwFbho9bfKnN2+NyfVeeTqJa7Vr1BTrxN49 +aIzm+Jbjs8tzCWrRjUaexp8dATBp6qQqPJD+QJKdYYGIlmfLrkz1PTE3izEKoM+H +gPdQ65Myv2QTPgrYmIBLt7Gph/6409I7on0gy/9rTmeIUgNMoiqBDWNO0Pgu9jjJ +mwMCAwEAAaOByzCByDAdBgNVHQ4EFgQUskEmeu86yb/+aud/BGCwNGII45MwHwYD +VR0jBBgwFoAUskEmeu86yb/+aud/BGCwNGII45MwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCRvq/6PlCp +tH7VxqmRL9NjEbwHNTUxdo5p5Dl9gmW+a7CeQs4MAloNc5POicHHJ8sZJqB3hVO1 +Hqhgnwy5tPo0n086Dtar06ZHMtjsyYCQLnz6XxaW9rr9ExBz7D6wPPV64Y/jMlnS +8Tw2jJIhoSkhORwIsfaFNas2l1b8TIURvGlyBfYhuIW7Hs9pGjyY3ZNYU+DxztAq +aNmzuSZx2WEBqM27U0gGpcQ/1juqAU0B/PJ5lqkT07olLCo95b3h9675OupZd4wn +PPWkAfgIlxsoGoHLzjZrLx5BBfbW2U2EhxZh5DRMBn6oKyu1oZPeylL3dNnO9/cr +D134tp+TNLIA +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +U1VDQ0VTUw== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/openssl_conf.py b/net/data/verify_certificate_chain_unittest/openssl_conf.py new file mode 100755 index 0000000..fe1838d --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/openssl_conf.py
@@ -0,0 +1,136 @@ +#!/usr/bin/python +# 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. + +"""This file contains helpers for representing, manipulating, and writing +OpenSSL configuration files [1] + +Configuration files are simply a collection of name=value "properties", which +are grouped into "sections". + +[1] https://www.openssl.org/docs/manmaster/apps/config.html +""" + +class Property(object): + """Represents a key/value pair in OpenSSL .cnf files. + + Names and values are not quoted in any way, so callers need to pass the text + exactly as it should be written to the file (leading and trailing whitespace + doesn't matter). + + For instance: + baseConstraints = critical, CA:false + + Could be represented by a Property where: + name = 'baseConstraints' + value = 'critical, CA:false' + """ + def __init__(self, name, value): + self.name = name + self.value = value + + + def write_to(self, out): + """Outputs this property to .cnf file.""" + out.write('%s = %s\n' % (self.name, self.value)) + + +class Section(object): + """Represents a section in OpenSSL. For instance: + [CA_root] + preserve = true + + Could be represented by a Section where: + name = 'CA_root' + properties = [Property('preserve', 'true')] + """ + def __init__(self, name): + self.name = name + self.properties = [] + + + def ensure_property_name_not_duplicated(self, name): + """Raises an exception of there is more than 1 property named |name|.""" + count = 0 + for prop in self.properties: + if prop.name == name: + count += 1 + if count > 1: + raise Exception('Duplicate property: %s' % (name)) + + + def set_property(self, name, value): + """Replaces, adds, or removes a Property from the Section: + + - If |value| is None, then this is equivalent to calling + remove_property(name) + - If there is an existing property matching |name| then its value is + replaced with |value| + - If there are no properties matching |name| then a new one is added at + the end of the section + + It is expected that there is AT MOST 1 property with the given name. If + that is not the case then this function will raise an error.""" + + if value is None: + self.remove_property(name) + return + + self.ensure_property_name_not_duplicated(name) + + for prop in self.properties: + if prop.name == name: + prop.value = value + return + + self.add_property(name, value) + + + def add_property(self, name, value): + """Adds a property (allows duplicates)""" + self.properties.append(Property(name, value)) + + + def remove_property(self, name): + """Removes the property with the indicated name, if it exists. + + It is expected that there is AT MOST 1 property with the given name. If + that is not the case then this function will raise an error.""" + self.ensure_property_name_not_duplicated(name) + + for i in range(len(self.properties)): + if self.properties[i].name == name: + self.properties.pop(i) + return + + + def write_to(self, out): + """Outputs the section in the format used by .cnf files""" + out.write('[%s]\n' % (self.name)) + for prop in self.properties: + prop.write_to(out) + out.write('\n') + + +class Config(object): + """Represents a .cnf (configuration) file in OpenSSL""" + def __init__(self): + self.sections = [] + + + def get_section(self, name): + """Gets or creates a section with the given name.""" + for section in self.sections: + if section.name == name: + return section + new_section = Section(name) + self.sections.append(new_section) + return new_section + + + def write_to_file(self, path): + """Outputs the Config to a .cnf files.""" + with open(path, 'w') as out: + for section in self.sections: + section.write_to(out)
diff --git a/net/data/verify_certificate_chain_unittest/target-and-intermediary.pem b/net/data/verify_certificate_chain_unittest/target-and-intermediary.pem new file mode 100644 index 0000000..51446ab --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-and-intermediary.pem
@@ -0,0 +1,280 @@ +[Created by: generate-target-and-intermediary.py] + +Certificate chain with 1 intermediary and a trusted root. Verification is +expected to succeed. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:dc:50:a0:d0:af:3b:b6:d5:af:48:be:31:08:db: + 91:81:c5:c8:d7:22:88:d4:74:1e:12:de:7a:79:79: + 10:71:de:b5:8a:4e:d1:1d:46:6b:46:62:e8:de:f8: + 01:f5:9d:6b:35:f6:a6:b7:f2:7f:4c:5f:f9:ad:10: + f6:7e:9c:87:dc:27:e5:3f:19:1c:f0:c5:69:06:51: + 96:bf:d0:c5:ef:b8:e3:2c:47:6a:8f:44:68:70:ed: + 18:b9:f1:85:7b:2e:42:bc:44:5d:e3:d3:df:95:93: + 8c:1d:ad:bc:9e:45:ad:6e:4f:78:68:6e:8f:ee:16: + a9:6e:9d:50:6b:9c:72:a0:d7:fe:ff:68:4b:1c:df: + 18:fd:26:fb:65:be:c9:63:30:30:15:7d:f9:83:95: + c4:5e:2e:e5:d1:f0:ce:9c:5e:4a:6c:ec:6f:26:f6: + 79:38:bc:15:e2:50:68:f0:46:c2:7f:7d:0a:c2:79: + 08:b7:ea:41:18:d5:65:29:3e:6d:bb:80:8e:a2:0d: + c3:c4:8a:e2:dd:3c:19:01:e9:ea:0c:bb:db:6c:c7: + ed:6d:c5:7e:78:5f:5d:e2:87:d9:fa:90:3a:1d:c3: + b6:d8:7f:78:77:7b:e8:2c:bb:ed:04:18:72:a7:0f: + b2:ef:96:65:b4:39:a0:e9:59:b3:64:f4:db:9d:53: + 42:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 86:F0:37:63:2C:67:7D:F8:D4:71:4D:9B:A3:47:47:BA:F5:F0:0E:90 + X509v3 Authority Key Identifier: + keyid:42:1A:C3:C4:D6:79:39:E2:20:E5:63:13:EB:41:7B:8C:0E:28:72:8E + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 4e:86:be:e0:4b:d5:15:99:49:09:6c:9a:6d:9a:82:e2:41:3e: + 99:a5:e3:23:dd:43:d7:22:8d:c6:4f:4c:51:47:cb:32:44:b8: + 3a:f0:b6:88:0c:fd:08:d1:ea:0d:b0:72:fe:a0:48:6b:5d:a2: + 9e:f2:2d:12:6a:bf:68:ce:2e:d0:35:5f:da:32:c9:74:4b:29: + 53:81:69:a1:a1:1a:de:c8:5e:c1:73:21:b6:02:81:d8:57:ef: + 68:c3:24:f7:05:fa:ae:ed:d7:8a:62:e3:09:bf:fc:d0:41:93: + e8:12:a5:fc:c3:46:d8:2b:f6:e3:cc:36:a7:39:cd:32:9e:9d: + e1:79:68:ff:15:b9:10:5f:86:ad:4d:a0:dc:60:2f:1f:36:6f: + d3:7a:60:81:c5:38:71:d0:fa:28:ae:ba:80:0e:cf:9c:ef:4d: + 1f:d4:0c:27:0f:55:a8:49:65:c1:d6:af:6d:b1:1d:fb:90:38: + ad:8b:5e:ba:82:68:60:2a:e4:7a:b8:07:aa:91:37:84:d6:18: + 38:ba:37:a6:d9:bb:3b:45:da:59:8c:c5:90:11:1d:85:fe:af: + fa:62:87:84:5d:5a:90:91:c3:6c:53:e1:d3:74:e7:51:19:b6: + b5:e7:12:1a:73:35:34:16:dd:e4:31:62:58:de:3a:fb:40:80: + 21:4f:f5:13 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDcUKDQ +rzu21a9IvjEI25GBxcjXIojUdB4S3np5eRBx3rWKTtEdRmtGYuje+AH1nWs19qa3 +8n9MX/mtEPZ+nIfcJ+U/GRzwxWkGUZa/0MXvuOMsR2qPRGhw7Ri58YV7LkK8RF3j +09+Vk4wdrbyeRa1uT3hobo/uFqlunVBrnHKg1/7/aEsc3xj9JvtlvsljMDAVffmD +lcReLuXR8M6cXkps7G8m9nk4vBXiUGjwRsJ/fQrCeQi36kEY1WUpPm27gI6iDcPE +iuLdPBkB6eoMu9tsx+1txX54X13ih9n6kDodw7bYf3h3e+gsu+0EGHKnD7LvlmW0 +OaDpWbNk9NudU0KfAgMBAAGjgekwgeYwHQYDVR0OBBYEFIbwN2MsZ3341HFNm6NH +R7r18A6QMB8GA1UdIwQYMBaAFEIaw8TWeTniIOVjE+tBe4wOKHKOMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAToa+4EvVFZlJCWyabZqC +4kE+maXjI91D1yKNxk9MUUfLMkS4OvC2iAz9CNHqDbBy/qBIa12invItEmq/aM4u +0DVf2jLJdEspU4FpoaEa3shewXMhtgKB2FfvaMMk9wX6ru3XimLjCb/80EGT6BKl +/MNG2Cv248w2pznNMp6d4Xlo/xW5EF+GrU2g3GAvHzZv03pggcU4cdD6KK66gA7P +nO9NH9QMJw9VqEllwdavbbEd+5A4rYteuoJoYCrkergHqpE3hNYYOLo3ptm7O0Xa +WYzFkBEdhf6v+mKHhF1akJHDbFPh03TnURm2tecSGnM1NBbd5DFiWN46+0CAIU/1 +Ew== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a4:16:0d:45:92:8b:7b:8e:42:07:a1:f4:01:dc: + 31:0e:68:b4:3f:f3:b7:0d:8f:08:f4:f0:bb:2b:45: + 37:98:b4:3b:6f:61:7c:23:2e:6e:cf:33:a3:d1:09: + 16:74:3f:ac:4f:59:f1:92:42:35:e6:8a:e9:98:5e: + 39:a2:0d:45:26:8f:7d:bb:ad:bf:f8:66:a3:b0:eb: + 7f:eb:79:60:9a:70:03:5d:9f:46:a8:47:64:7d:a9: + eb:a7:7d:77:60:3a:f5:5f:e8:bc:54:f3:d7:25:5e: + 5b:62:3a:4a:df:f3:21:df:e4:bc:89:69:26:fa:d7: + 24:16:f1:06:d0:57:a1:a0:aa:f2:bd:9f:0c:59:50: + 57:c2:5d:25:24:05:eb:91:58:bb:1a:82:df:eb:03: + ec:55:ed:d4:46:b5:fe:2e:fa:08:14:d7:76:71:99: + 2b:34:10:2d:20:21:ed:78:91:f9:05:04:14:42:a0: + ed:95:46:a3:a2:e6:55:1e:87:0b:1b:57:8e:e4:7c: + c5:c5:39:83:b1:c6:91:e1:54:8a:6f:6a:9b:a5:80: + 93:ec:00:81:6f:20:70:6c:31:95:42:76:a3:82:17: + d8:d2:ff:3a:09:53:be:76:ea:e1:a9:fb:a9:a5:5f: + 2b:5f:f9:5a:78:97:2e:f9:9d:31:42:2a:f9:1c:26: + 16:7d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 42:1A:C3:C4:D6:79:39:E2:20:E5:63:13:EB:41:7B:8C:0E:28:72:8E + X509v3 Authority Key Identifier: + keyid:FE:3F:EE:E8:53:09:31:CA:D4:66:C1:C7:FE:E0:74:C3:D7:81:44:5F + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + af:11:72:82:33:e5:f9:b1:10:fc:c2:4a:9e:c8:8e:b4:16:51: + 62:8d:b5:e3:e3:c7:30:32:52:52:55:aa:6b:c4:c2:67:de:71: + 37:2d:85:68:80:c8:b7:9b:4b:05:6f:97:e1:82:03:f4:b7:07: + b8:c2:a8:02:7a:60:34:c8:07:9b:7e:c3:02:bd:11:26:51:b4: + 4d:e2:6c:e4:38:bc:4c:e7:35:91:24:f1:40:6e:69:7f:ac:b4: + ee:12:8a:1c:41:f6:96:13:93:67:c4:11:18:67:80:e6:41:ef: + 2b:3e:47:1a:57:b1:66:ac:87:93:ed:6c:fe:a2:c4:5a:47:75: + d0:1b:01:b6:74:b6:f8:7b:aa:e3:91:c3:45:56:2b:a4:d2:67: + 94:18:71:e7:ea:41:14:bb:12:4e:56:d8:5a:95:89:bc:e6:89: + be:9a:03:8c:b8:2b:18:56:7c:41:db:2d:e3:86:b5:de:aa:cb: + 11:da:91:8f:f2:75:1d:d2:b6:0b:bd:d6:b5:65:a5:96:1a:44: + fd:66:80:89:bf:a5:a9:c4:fb:3f:2b:cc:f5:e7:a6:e6:bd:5f: + e3:df:51:76:e3:e8:1c:e5:53:e9:6e:cf:e8:54:5f:f3:7f:ca: + 3a:b2:b2:07:7d:6c:29:a9:01:17:cf:f9:e8:0a:13:88:13:d3: + ad:ac:be:ad +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApBYNRZKL +e45CB6H0AdwxDmi0P/O3DY8I9PC7K0U3mLQ7b2F8Iy5uzzOj0QkWdD+sT1nxkkI1 +5orpmF45og1FJo99u62/+GajsOt/63lgmnADXZ9GqEdkfanrp313YDr1X+i8VPPX +JV5bYjpK3/Mh3+S8iWkm+tckFvEG0FehoKryvZ8MWVBXwl0lJAXrkVi7GoLf6wPs +Ve3URrX+LvoIFNd2cZkrNBAtICHteJH5BQQUQqDtlUajouZVHocLG1eO5HzFxTmD +scaR4VSKb2qbpYCT7ACBbyBwbDGVQnajghfY0v86CVO+durhqfuppV8rX/laeJcu ++Z0xQir5HCYWfQIDAQABo4HLMIHIMB0GA1UdDgQWBBRCGsPE1nk54iDlYxPrQXuM +DihyjjAfBgNVHSMEGDAWgBT+P+7oUwkxytRmwcf+4HTD14FEXzA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AK8RcoIz5fmxEPzCSp7IjrQWUWKNtePjxzAyUlJVqmvEwmfecTcthWiAyLebSwVv +l+GCA/S3B7jCqAJ6YDTIB5t+wwK9ESZRtE3ibOQ4vEznNZEk8UBuaX+stO4SihxB +9pYTk2fEERhngOZB7ys+RxpXsWash5PtbP6ixFpHddAbAbZ0tvh7quORw0VWK6TS +Z5QYcefqQRS7Ek5W2FqVibzmib6aA4y4KxhWfEHbLeOGtd6qyxHakY/ydR3Stgu9 +1rVlpZYaRP1mgIm/panE+z8rzPXnpua9X+PfUXbj6BzlU+luz+hUX/N/yjqysgd9 +bCmpARfP+egKE4gT062svq0= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ea:28:d6:83:e1:ad:7f:df:9a:70:91:b6:2a:45: + 28:bb:1a:00:d2:1f:0c:6e:14:10:27:c0:65:c9:90: + 40:45:83:6c:af:9a:66:ed:cb:59:2f:f7:82:67:74: + aa:1d:73:ec:f3:98:cb:38:9c:f6:6b:4f:bc:6b:5d: + f7:15:89:ed:02:f8:ed:17:69:df:a2:8d:ee:f5:d1: + 84:92:42:b8:9f:fe:77:fd:d5:06:7b:6f:59:8a:2a: + c7:32:f5:ff:ad:f9:8a:59:e7:93:11:79:fe:f6:2a: + cb:99:db:a9:d7:05:a8:be:af:db:2e:b1:8a:56:8e: + f7:ec:b4:b0:a3:a4:96:39:79:69:3c:3b:ce:fe:42: + 15:a8:56:bb:88:94:42:a5:0b:04:b4:e9:fa:c9:1a: + 14:7d:c0:82:d5:d8:3a:de:ec:6f:a6:be:5c:43:6d: + 85:f8:84:57:cd:06:b0:e1:63:a5:ab:05:14:2f:2d: + fb:04:99:fb:7e:ce:06:cf:3b:29:27:7a:70:1a:6b: + fb:6a:f3:a6:23:31:dd:93:80:67:b9:09:03:92:e2: + a9:c4:71:85:1b:a5:f9:1c:ff:86:b0:72:e3:23:58: + 15:6c:4e:55:7f:89:91:35:0a:b3:41:ba:3c:17:76: + da:e6:39:6e:58:92:67:9d:06:c5:c8:84:e0:61:49: + ea:b3 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + FE:3F:EE:E8:53:09:31:CA:D4:66:C1:C7:FE:E0:74:C3:D7:81:44:5F + X509v3 Authority Key Identifier: + keyid:FE:3F:EE:E8:53:09:31:CA:D4:66:C1:C7:FE:E0:74:C3:D7:81:44:5F + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 9f:ae:51:c1:f5:31:bf:30:6c:e1:b5:38:07:b5:c2:56:38:6b: + 3c:f3:49:50:93:5f:75:9e:94:15:5c:15:0a:91:87:6a:c1:fa: + 36:d6:4a:72:6f:cd:8c:9d:77:e7:61:96:14:88:4f:b2:71:d7: + 81:8f:06:9f:c7:14:49:0c:de:7c:73:ba:00:c8:44:58:ac:0a: + 4b:27:bb:3d:cb:fd:4d:14:dd:f7:61:b7:a0:f4:00:8a:ff:54: + 6b:c0:6a:6d:21:43:b8:9b:cb:f9:ad:9d:fe:2a:09:3d:a1:dd: + de:17:7d:6f:74:44:79:0c:12:4e:d0:68:4f:b2:35:60:ef:95: + da:a5:25:f8:e4:4c:ea:83:38:c1:26:83:db:13:78:58:1c:50: + e3:20:93:b0:c8:5e:a0:76:5f:c2:fe:cc:16:3d:f6:2f:33:08: + fe:61:af:57:cd:c6:ae:8a:d2:7b:98:e8:eb:98:9b:89:ff:47: + 24:d6:bf:a3:29:f6:e3:7e:e2:08:0b:a6:06:11:36:07:ea:61: + 5f:58:16:d3:c1:29:b4:c8:39:7c:32:98:17:82:e7:8c:0f:2e: + 34:bc:a3:78:62:15:29:95:4e:ca:c4:40:8b:29:2e:5c:8c:9b: + 14:ee:90:68:08:91:ef:64:fe:8f:61:89:cd:6b:44:dd:24:cf: + 7c:3d:a3:86 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOoo1oPhrX/fmnCRtipF +KLsaANIfDG4UECfAZcmQQEWDbK+aZu3LWS/3gmd0qh1z7POYyzic9mtPvGtd9xWJ +7QL47Rdp36KN7vXRhJJCuJ/+d/3VBntvWYoqxzL1/635ilnnkxF5/vYqy5nbqdcF +qL6v2y6xilaO9+y0sKOkljl5aTw7zv5CFahWu4iUQqULBLTp+skaFH3AgtXYOt7s +b6a+XENthfiEV80GsOFjpasFFC8t+wSZ+37OBs87KSd6cBpr+2rzpiMx3ZOAZ7kJ +A5LiqcRxhRul+Rz/hrBy4yNYFWxOVX+JkTUKs0G6PBd22uY5bliSZ50GxciE4GFJ +6rMCAwEAAaOByzCByDAdBgNVHQ4EFgQU/j/u6FMJMcrUZsHH/uB0w9eBRF8wHwYD +VR0jBBgwFoAU/j/u6FMJMcrUZsHH/uB0w9eBRF8wNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCfrlHB9TG/ +MGzhtTgHtcJWOGs880lQk191npQVXBUKkYdqwfo21kpyb82MnXfnYZYUiE+ycdeB +jwafxxRJDN58c7oAyERYrApLJ7s9y/1NFN33Ybeg9ACK/1RrwGptIUO4m8v5rZ3+ +Kgk9od3eF31vdER5DBJO0GhPsjVg75XapSX45EzqgzjBJoPbE3hYHFDjIJOwyF6g +dl/C/swWPfYvMwj+Ya9XzcauitJ7mOjrmJuJ/0ck1r+jKfbjfuIIC6YGETYH6mFf +WBbTwSm0yDl8MpgXgueMDy40vKN4YhUplU7KxECLKS5cjJsU7pBoCJHvZP6PYYnN +a0TdJM98PaOG +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +U1VDQ0VTUw== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem b/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem new file mode 100644 index 0000000..f008c4e --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem
@@ -0,0 +1,282 @@ +[Created by: ./generate-target-has-keycertsign-but-not-ca.py] + +Certificate chain with 1 intermediary, a trusted root, and a target +certificate that is not a CA, and yet has the keyCertSign bit set. Verification +is expected to fail, since keyCertSign should only be asserted when CA is +true. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a6:ec:9f:55:56:11:c4:7a:fc:00:75:b9:b4:bb: + 08:8f:8f:88:ad:df:22:e4:5d:b4:f1:7d:af:a4:62: + df:64:86:46:34:cb:a4:32:21:b0:53:7c:94:5e:8a: + e6:6d:56:8b:28:93:23:79:ef:0b:7f:96:5a:19:09: + 3a:b7:30:77:e3:db:54:a5:c0:f7:df:3c:bd:f5:26: + 9f:ab:73:f9:c5:02:e8:67:cf:4d:d5:0e:31:4d:ab: + b7:d5:55:1a:f2:dc:1a:87:45:61:3c:ea:56:19:a3: + a7:f7:34:82:30:6f:48:54:fd:ce:05:cc:fe:95:2b: + a3:d8:b5:8f:20:26:60:e9:22:07:2e:e3:54:22:fe: + e2:2e:fc:33:2b:9d:6d:ed:1f:56:6d:7b:4a:69:15: + c0:f3:d5:0a:f8:c2:9b:82:b0:91:36:7c:5a:06:6b: + eb:02:85:58:5c:15:14:c4:c9:72:8c:21:29:29:e7: + 23:ca:56:07:7e:28:fa:f0:99:69:ad:10:bc:6c:43: + 31:1c:d1:bc:79:51:dd:92:54:f9:f3:0c:f8:ee:a4: + 8a:96:1d:17:ef:70:64:71:f4:30:54:b5:77:53:26: + 11:80:ce:dc:cb:38:98:98:69:20:e1:ae:f7:1b:61: + 53:32:59:27:8d:e9:84:b8:6f:c1:9f:03:95:ac:9a: + 8c:35 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 64:67:70:1F:EA:D4:3D:30:5E:54:D3:BF:DF:83:3D:14:94:C3:DD:58 + X509v3 Authority Key Identifier: + keyid:F3:98:98:C6:42:9E:AB:03:53:76:3F:43:FB:C9:9D:E4:0B:FF:BF:B5 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment, Certificate Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 65:55:d3:04:1b:96:89:b8:44:32:01:15:ee:43:85:c0:c9:ee: + f9:19:6c:ef:f4:5a:92:22:b2:62:b1:18:38:c5:42:06:e5:c7: + be:83:9c:96:6b:72:d7:2a:0c:68:40:d6:30:91:4b:4e:e1:d4: + 13:05:c5:5a:91:c1:11:ce:57:2e:31:87:2a:f3:70:e4:77:3a: + 60:82:fa:58:56:18:1f:bf:4a:dd:89:48:c6:ab:4c:01:06:d5: + ec:8d:aa:55:eb:07:0f:bd:bd:2b:67:f6:3f:43:15:c7:a4:77: + 88:fa:f8:9f:3b:fa:0b:a2:fe:55:7c:f1:0b:49:da:b7:08:24: + 34:68:db:a8:76:37:60:02:be:32:54:29:b4:b7:69:c4:05:66: + 60:a4:86:9f:a1:13:d7:c3:f6:ed:a0:97:37:17:35:97:05:c9: + ce:f9:af:e0:42:c3:e5:32:15:d7:1e:6c:3b:41:93:df:ba:b0: + aa:60:e8:66:46:55:b3:00:65:e2:1c:70:85:c7:81:21:3f:8e: + 41:69:19:a0:ac:8b:54:bc:d0:4b:78:db:f8:11:d7:93:eb:a4: + 48:04:1b:76:96:e2:ae:d5:2b:dd:ea:e4:a5:02:ca:02:86:11: + 82:cc:3c:70:10:3a:35:81:0e:52:ad:71:11:be:d9:f2:9c:3f: + 85:53:b8:df +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCm7J9V +VhHEevwAdbm0uwiPj4it3yLkXbTxfa+kYt9khkY0y6QyIbBTfJReiuZtVosokyN5 +7wt/lloZCTq3MHfj21SlwPffPL31Jp+rc/nFAuhnz03VDjFNq7fVVRry3BqHRWE8 +6lYZo6f3NIIwb0hU/c4FzP6VK6PYtY8gJmDpIgcu41Qi/uIu/DMrnW3tH1Zte0pp +FcDz1Qr4wpuCsJE2fFoGa+sChVhcFRTEyXKMISkp5yPKVgd+KPrwmWmtELxsQzEc +0bx5Ud2SVPnzDPjupIqWHRfvcGRx9DBUtXdTJhGAztzLOJiYaSDhrvcbYVMyWSeN +6YS4b8GfA5Wsmow1AgMBAAGjgekwgeYwHQYDVR0OBBYEFGRncB/q1D0wXlTTv9+D +PRSUw91YMB8GA1UdIwQYMBaAFPOYmMZCnqsDU3Y/Q/vJneQL/7+1MD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgKkMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAZVXTBBuWibhEMgEV7kOF +wMnu+Rls7/RakiKyYrEYOMVCBuXHvoOclmty1yoMaEDWMJFLTuHUEwXFWpHBEc5X +LjGHKvNw5Hc6YIL6WFYYH79K3YlIxqtMAQbV7I2qVesHD729K2f2P0MVx6R3iPr4 +nzv6C6L+VXzxC0natwgkNGjbqHY3YAK+MlQptLdpxAVmYKSGn6ET18P27aCXNxc1 +lwXJzvmv4ELD5TIV1x5sO0GT37qwqmDoZkZVswBl4hxwhceBIT+OQWkZoKyLVLzQ +S3jb+BHXk+ukSAQbdpbirtUr3erkpQLKAoYRgsw8cBA6NYEOUq1xEb7Z8pw/hVO4 +3w== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a8:d0:63:48:13:03:82:fe:27:31:f5:c0:25:67: + 0e:46:56:3b:d0:db:01:06:88:ae:64:12:2a:b3:8f: + 79:c1:20:87:75:e7:11:2d:97:09:b4:55:e6:c4:14: + 7e:61:4e:98:6c:1d:dc:ec:2c:ef:16:40:99:d1:29: + dd:0d:74:77:c7:f9:2f:5f:bd:55:63:35:3c:a2:36: + e1:42:12:49:a1:83:0b:7b:53:f1:9d:53:02:97:3e: + cf:27:50:2e:41:63:3a:6f:c2:b0:2a:b6:f9:bd:bb: + d8:0a:42:0d:99:e5:5a:ea:c8:26:bc:54:6f:b6:36: + d2:28:d4:d6:53:b5:f6:0e:8d:dd:e0:46:98:32:61: + 42:20:ee:44:f0:a1:06:e4:9e:8c:c3:b6:cd:1b:7e: + ef:3c:68:d6:80:5e:49:b4:66:3f:2a:5c:e1:c3:fd: + 43:ce:b7:c7:ec:fa:1f:1d:94:e4:21:4e:51:5f:5d: + 5a:fd:3f:84:a5:15:2a:64:2c:d5:70:4f:24:dd:96: + 67:43:c6:1d:62:53:ed:2f:ef:64:8c:a9:b2:c3:c7: + f3:a2:55:08:ed:dc:2a:5f:51:50:05:59:e8:e2:0e: + cf:8d:06:5b:7b:19:56:b9:3b:dc:75:ce:b0:4e:74: + 62:d7:31:a4:7b:1f:44:ca:3f:79:8d:5c:b7:41:a6: + c0:bf + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + F3:98:98:C6:42:9E:AB:03:53:76:3F:43:FB:C9:9D:E4:0B:FF:BF:B5 + X509v3 Authority Key Identifier: + keyid:97:E9:16:F3:C4:AD:14:F3:56:CD:F3:E6:E5:60:D4:8F:EF:F7:BA:06 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 05:1f:e8:41:f2:76:1f:cd:2a:92:f9:cc:61:a9:6f:14:40:12: + 69:19:1c:44:1d:3e:2e:c5:d0:a8:25:e3:bc:62:a3:6c:0f:e8: + b9:dc:b0:92:cd:7a:ae:1d:4e:de:cc:90:3f:97:98:d4:d4:b0: + a2:73:f7:b4:83:94:fb:ac:83:d3:39:af:13:64:61:bd:80:8d: + dc:de:af:50:1a:15:12:c2:99:04:d4:c6:b8:31:12:2c:15:0a: + 7c:13:ad:c8:be:37:fb:fa:43:ae:70:fd:64:70:a8:fb:77:fd: + 09:7e:7e:e1:ff:27:e6:91:d8:c4:62:54:ad:cd:04:51:b0:da: + 09:df:99:ac:91:0b:f8:31:e3:2e:18:64:f4:76:55:dd:d9:b3: + 90:3a:07:91:e5:89:f7:83:48:15:5d:b3:bb:76:e6:d6:4a:1f: + 3b:a4:3e:89:36:de:a8:80:09:2c:1f:23:a7:8a:cb:c3:e7:46: + f3:f3:1e:0f:8b:88:bb:a9:87:9e:a7:64:2e:64:be:48:c1:91: + d2:ef:c1:82:b9:1a:f4:08:d9:b1:a0:1f:ff:16:af:c4:b2:bc: + 01:0f:e4:a0:f0:eb:81:aa:37:32:70:61:16:52:01:f6:39:10: + a3:b0:8c:ec:2c:3f:ac:1b:cd:12:91:44:2f:6a:2e:4f:d4:8d: + 92:a5:55:1b +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqNBjSBMD +gv4nMfXAJWcORlY70NsBBoiuZBIqs495wSCHdecRLZcJtFXmxBR+YU6YbB3c7Czv +FkCZ0SndDXR3x/kvX71VYzU8ojbhQhJJoYMLe1PxnVMClz7PJ1AuQWM6b8KwKrb5 +vbvYCkINmeVa6sgmvFRvtjbSKNTWU7X2Do3d4EaYMmFCIO5E8KEG5J6Mw7bNG37v +PGjWgF5JtGY/Klzhw/1DzrfH7PofHZTkIU5RX11a/T+EpRUqZCzVcE8k3ZZnQ8Yd +YlPtL+9kjKmyw8fzolUI7dwqX1FQBVno4g7PjQZbexlWuTvcdc6wTnRi1zGkex9E +yj95jVy3QabAvwIDAQABo4HLMIHIMB0GA1UdDgQWBBTzmJjGQp6rA1N2P0P7yZ3k +C/+/tTAfBgNVHSMEGDAWgBSX6RbzxK0U81bN8+blYNSP7/e6BjA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AAUf6EHydh/NKpL5zGGpbxRAEmkZHEQdPi7F0Kgl47xio2wP6LncsJLNeq4dTt7M +kD+XmNTUsKJz97SDlPusg9M5rxNkYb2Ajdzer1AaFRLCmQTUxrgxEiwVCnwTrci+ +N/v6Q65w/WRwqPt3/Ql+fuH/J+aR2MRiVK3NBFGw2gnfmayRC/gx4y4YZPR2Vd3Z +s5A6B5HlifeDSBVds7t25tZKHzukPok23qiACSwfI6eKy8PnRvPzHg+LiLuph56n +ZC5kvkjBkdLvwYK5GvQI2bGgH/8Wr8SyvAEP5KDw64GqNzJwYRZSAfY5EKOwjOws +P6wbzRKRRC9qLk/UjZKlVRs= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ba:52:6a:89:3e:75:9b:d6:ed:f4:d1:1c:fb:aa: + 99:8f:5e:89:59:2a:75:5a:54:77:9c:b5:91:d5:2a: + f8:8a:a3:74:d2:75:39:24:cc:c5:f7:42:83:11:a7: + 6c:cd:c2:2b:e1:18:84:b6:26:d8:12:fd:e2:a8:6a: + 4d:4d:8f:a1:25:07:08:d2:73:a0:17:c7:54:11:a5: + fb:0e:36:cd:e2:24:a8:dc:85:a1:22:a2:7c:c3:20: + 02:60:ec:40:ba:1e:5b:03:51:68:d7:f2:28:f6:3d: + 3f:b3:30:34:0e:33:6c:44:c4:31:a9:ee:cf:42:96: + c2:eb:06:52:92:86:80:b9:0b:99:41:4b:64:aa:b7: + 55:2b:21:25:92:46:1d:e2:31:3d:0b:54:ad:a9:c7: + 2a:29:be:5c:bb:ba:99:59:69:70:71:75:bb:9a:a1: + 7c:fa:36:79:bd:b4:f3:6c:4b:6c:c9:ea:32:03:dd: + 64:9e:94:82:33:d1:d9:f8:48:04:ae:79:35:5c:a4: + 43:54:c1:ec:3c:97:bf:3a:40:f6:e6:9d:7b:bf:a1: + 67:b0:59:de:78:ff:33:94:f2:2b:15:d0:0a:89:0c: + 2c:ee:9f:dc:f8:48:f0:68:0c:19:59:86:86:41:1c: + 19:02:89:4f:0c:ea:43:b2:a8:b9:c9:c1:1d:76:c0: + 3d:19 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 97:E9:16:F3:C4:AD:14:F3:56:CD:F3:E6:E5:60:D4:8F:EF:F7:BA:06 + X509v3 Authority Key Identifier: + keyid:97:E9:16:F3:C4:AD:14:F3:56:CD:F3:E6:E5:60:D4:8F:EF:F7:BA:06 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + a5:32:dc:be:9a:58:7d:66:69:99:07:13:d9:ec:20:99:72:37: + c1:8b:4d:e1:8e:79:0b:7f:ed:1c:89:a1:9b:18:66:bd:1b:fe: + ec:74:f6:aa:7b:57:71:06:07:ea:02:41:6e:83:b4:68:39:15: + c8:c5:16:d7:4e:10:75:f5:05:b4:f2:c6:e4:bd:b4:64:21:16: + c8:14:dd:06:88:f7:81:89:76:44:c8:70:99:70:f2:67:e6:4c: + 72:3e:75:24:d7:2f:83:b2:4e:6b:f8:4d:f0:e7:16:25:02:16: + c3:fa:8a:9c:c2:75:60:6b:ed:40:1d:b2:14:97:6a:26:a1:72: + b9:53:f1:95:fb:6e:d9:11:b3:d4:67:ff:ba:0a:06:c3:5b:fb: + 84:e7:b1:48:07:fb:db:d7:6f:c9:7e:6f:e6:b4:3b:8c:e0:3c: + 73:fe:80:8e:cd:35:3c:4f:51:f8:ac:fc:b4:d0:0a:5e:b9:d7: + 95:f2:e6:fb:a8:de:25:ab:20:da:d5:e6:e2:d3:5b:6b:9b:db: + 2c:77:0e:59:01:7a:29:07:1f:53:72:2b:f3:06:86:1b:04:a0: + 01:82:aa:59:4f:a5:e6:8b:2a:01:24:8b:77:5b:bb:8d:36:94: + 4a:02:ab:61:5c:0a:ba:87:ee:53:53:a7:5d:e3:6a:bc:73:9f: + fe:e9:fc:9f +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALpSaok+dZvW7fTRHPuq +mY9eiVkqdVpUd5y1kdUq+IqjdNJ1OSTMxfdCgxGnbM3CK+EYhLYm2BL94qhqTU2P +oSUHCNJzoBfHVBGl+w42zeIkqNyFoSKifMMgAmDsQLoeWwNRaNfyKPY9P7MwNA4z +bETEManuz0KWwusGUpKGgLkLmUFLZKq3VSshJZJGHeIxPQtUranHKim+XLu6mVlp +cHF1u5qhfPo2eb2082xLbMnqMgPdZJ6UgjPR2fhIBK55NVykQ1TB7DyXvzpA9uad +e7+hZ7BZ3nj/M5TyKxXQCokMLO6f3PhI8GgMGVmGhkEcGQKJTwzqQ7KoucnBHXbA +PRkCAwEAAaOByzCByDAdBgNVHQ4EFgQUl+kW88StFPNWzfPm5WDUj+/3ugYwHwYD +VR0jBBgwFoAUl+kW88StFPNWzfPm5WDUj+/3ugYwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQClMty+mlh9 +ZmmZBxPZ7CCZcjfBi03hjnkLf+0ciaGbGGa9G/7sdPaqe1dxBgfqAkFug7RoORXI +xRbXThB19QW08sbkvbRkIRbIFN0GiPeBiXZEyHCZcPJn5kxyPnUk1y+Dsk5r+E3w +5xYlAhbD+oqcwnVga+1AHbIUl2omoXK5U/GV+27ZEbPUZ/+6CgbDW/uE57FIB/vb +12/Jfm/mtDuM4Dxz/oCOzTU8T1H4rPy00ApeudeV8ub7qN4lqyDa1ebi01trm9ss +dw5ZAXopBx9TcivzBoYbBKABgqpZT6XmiyoBJIt3W7uNNpRKAqthXAq6h+5TU6dd +42q8c5/+6fyf +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem b/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem new file mode 100644 index 0000000..34c777c0 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem
@@ -0,0 +1,283 @@ +[Created by: ./generate-target-has-pathlen-but-not-ca.py] + +Certificate chain with 1 intermediary, a trusted root, and a target +certificate that is not a CA, and yet has a pathlen set. Verification is +expected to fail, since pathlen should only be set for CAs. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e4:03:84:57:5e:99:af:4e:fe:20:15:48:81:f8: + 76:01:11:a3:33:b0:2e:ff:3d:ec:69:be:76:8d:9b: + c6:9b:5d:cb:b1:a6:eb:84:60:8e:99:fd:31:c1:66: + 9f:bb:3d:bb:16:e0:c8:d8:f5:cd:23:10:8a:c5:96: + e7:df:ed:96:d9:76:eb:82:23:e2:8c:7d:00:a9:71: + ff:71:df:2e:14:b4:ab:3e:29:e8:11:c2:44:75:f9: + 9f:e9:cd:cf:2f:0c:db:7b:47:b2:80:c1:90:45:a8: + 01:6d:26:88:ff:3b:d8:54:7b:cd:ff:dc:aa:bd:38: + 49:b0:02:d8:80:e2:79:07:33:5a:74:cd:ce:8e:df: + 75:33:41:e7:5e:fb:25:c0:45:fb:48:32:78:47:1a: + 70:03:d6:56:66:32:6e:2d:35:6b:76:8c:a6:33:4c: + 1d:60:91:10:5f:70:f3:13:ec:b4:03:4f:cf:99:f9: + 8e:e8:99:85:23:0b:cc:3d:17:5b:ec:df:aa:eb:8a: + a7:52:67:10:dd:66:c5:b2:95:9f:72:2b:4e:fa:19: + 31:99:62:d7:60:fd:9d:9e:e0:ca:29:13:ec:e3:c6: + af:47:e0:84:73:ab:3b:2d:58:f5:d8:d1:0c:ee:f6: + 23:b1:5c:55:1e:33:40:87:84:f9:d8:8a:ac:ac:46: + ed:93 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 3F:B5:B3:28:77:02:A4:B0:9D:4B:DE:37:42:2E:E6:59:0A:D8:38:84 + X509v3 Authority Key Identifier: + keyid:77:62:DF:59:FD:79:52:7B:9A:CF:99:3C:7C:BD:87:CE:41:27:57:F6 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment, Certificate Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:FALSE, pathlen:1 + Signature Algorithm: sha256WithRSAEncryption + 0f:6a:84:9e:41:23:9d:77:90:68:4b:93:39:8e:74:cc:f5:3f: + 0a:1c:8f:d9:45:bc:5d:42:d1:23:11:e6:a6:2f:52:58:23:5f: + ba:ef:a2:3a:c7:3e:bd:24:a3:47:d3:5a:f7:00:37:0d:a4:c8: + cd:ee:92:73:67:4c:d0:3f:63:08:c4:90:a8:42:5f:0e:cb:1e: + 96:ae:c7:16:5f:4d:69:e4:3c:8c:a9:47:7e:ad:aa:52:dd:b3: + 77:d8:f6:bf:f3:e3:c5:46:ec:c3:21:af:52:62:76:e5:99:0a: + ba:a2:1c:54:62:8f:3f:0b:b8:c1:9e:e3:6e:50:4e:36:17:d0: + ee:e1:a2:2e:29:c0:1e:a3:94:a3:69:1f:4d:13:50:4c:44:5c: + 0f:c3:80:94:3f:6f:60:02:98:da:4f:3a:40:e4:ee:01:af:f1: + b3:7b:4a:2e:3a:57:3b:8e:9c:8a:0c:3e:4c:49:e2:22:09:ef: + dc:ea:fc:e2:04:20:5c:8e:a5:82:a9:0e:83:b3:ef:cc:09:ff: + a9:bc:fa:47:0f:61:3f:7f:d6:df:ec:57:b2:da:16:70:42:8e: + 68:28:f5:4d:cb:fb:85:16:e4:78:3b:5e:8a:96:f0:73:d6:f7: + b0:ce:4d:18:6a:b9:1b:99:33:01:15:ce:90:c2:13:8e:14:e6: + 0e:32:84:28 +-----BEGIN CERTIFICATE----- +MIIDnjCCAoagAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkA4RX +XpmvTv4gFUiB+HYBEaMzsC7/PexpvnaNm8abXcuxpuuEYI6Z/THBZp+7PbsW4MjY +9c0jEIrFluff7ZbZduuCI+KMfQCpcf9x3y4UtKs+KegRwkR1+Z/pzc8vDNt7R7KA +wZBFqAFtJoj/O9hUe83/3Kq9OEmwAtiA4nkHM1p0zc6O33UzQede+yXARftIMnhH +GnAD1lZmMm4tNWt2jKYzTB1gkRBfcPMT7LQDT8+Z+Y7omYUjC8w9F1vs36rriqdS +ZxDdZsWylZ9yK076GTGZYtdg/Z2e4MopE+zjxq9H4IRzqzstWPXY0Qzu9iOxXFUe +M0CHhPnYiqysRu2TAgMBAAGjgfowgfcwHQYDVR0OBBYEFD+1syh3AqSwnUveN0Iu +5lkK2DiEMB8GA1UdIwQYMBaAFHdi31n9eVJ7ms+ZPHy9h85BJ1f2MD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgKkMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjAPBgNVHRMBAf8EBTADAgEBMA0GCSqGSIb3DQEBCwUAA4IB +AQAPaoSeQSOdd5BoS5M5jnTM9T8KHI/ZRbxdQtEjEeamL1JYI1+676I6xz69JKNH +01r3ADcNpMjN7pJzZ0zQP2MIxJCoQl8Oyx6WrscWX01p5DyMqUd+rapS3bN32Pa/ +8+PFRuzDIa9SYnblmQq6ohxUYo8/C7jBnuNuUE42F9Du4aIuKcAeo5SjaR9NE1BM +RFwPw4CUP29gApjaTzpA5O4Br/Gze0ouOlc7jpyKDD5MSeIiCe/c6vziBCBcjqWC +qQ6Ds+/MCf+pvPpHD2E/f9bf7Fey2hZwQo5oKPVNy/uFFuR4O16KlvBz1vewzk0Y +arkbmTMBFc6QwhOOFOYOMoQo +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cd:be:5e:d6:3b:af:1c:51:0b:b8:31:41:16:86: + a1:04:5b:d4:c3:d1:e8:16:12:b0:7a:f8:d4:b6:61: + 9b:5a:51:bb:7d:a5:e6:cf:70:48:1d:4e:21:74:de: + f8:de:c7:8d:b2:e1:b5:a0:b9:4a:7c:76:b1:24:e6: + 6d:7b:17:79:28:99:85:44:d5:9c:c7:b3:7c:64:fd: + 3a:97:76:94:88:aa:dc:eb:c3:6e:ab:43:42:d2:89: + b3:cb:56:dc:89:f6:4c:65:e0:be:1e:72:01:c7:c6: + 50:e6:5b:df:a2:de:4f:43:9d:3d:e8:c8:25:2e:50: + 1b:61:0e:2c:45:22:f0:93:7b:d6:05:9f:a4:23:fb: + 78:b1:15:49:fe:eb:73:29:b0:eb:9f:e8:6e:3b:92: + 86:c0:d0:20:e7:4c:b7:69:7f:d3:0f:54:39:05:3a: + 46:9b:47:4d:fa:7e:8c:ce:45:a5:1f:2c:6f:f7:33: + 36:10:bc:67:d9:b6:15:86:71:5f:7a:7a:af:4e:71: + 59:1d:46:d1:76:96:d8:4b:fc:a0:b9:11:e4:5f:5d: + fe:f4:bf:c8:48:54:66:60:be:4b:8b:70:4a:33:e0: + ea:02:7a:cd:a1:37:3d:67:ad:93:f3:d0:a5:9e:f2: + a4:ff:18:3e:77:97:d2:2c:58:12:a5:d6:55:03:6d: + a1:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 77:62:DF:59:FD:79:52:7B:9A:CF:99:3C:7C:BD:87:CE:41:27:57:F6 + X509v3 Authority Key Identifier: + keyid:AA:16:BC:F9:7E:AD:F4:71:D6:D4:94:D9:61:4B:01:38:B2:95:8B:84 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 4f:dc:80:b5:cb:13:5d:2d:af:b6:6d:7b:51:4e:81:36:16:d1: + 36:bb:5d:37:be:6e:4d:40:87:57:5e:db:a9:75:ae:46:e4:74: + c4:dc:e5:fd:bc:04:2f:ca:7f:b4:67:db:65:f7:d6:37:94:74: + a4:f9:8a:e2:da:d5:64:9e:00:4d:85:39:07:6f:e0:96:d7:2b: + ef:73:d3:a4:77:6b:e1:ee:d4:f7:54:ba:30:23:a3:95:2c:c8: + 38:21:0c:14:fb:f4:44:27:9a:f3:81:2f:89:59:3e:12:52:52: + bf:4e:7c:93:7c:db:b7:df:9b:fb:b6:3c:70:fc:67:07:a6:42: + 99:6d:95:c0:64:f8:99:50:aa:2f:b6:19:d8:63:80:0f:22:c3: + b4:d6:b0:09:9b:62:a0:37:0e:21:e5:ef:c2:61:ed:7e:2f:f5: + 7d:09:19:f4:6f:8a:c8:7a:0e:0a:44:41:9b:22:01:d4:7c:c9: + a8:da:d5:91:d9:a6:1f:1f:b8:4a:6a:bd:bc:7e:36:33:7a:e0: + 9c:58:c1:75:71:9f:14:04:ce:c9:1f:e6:dc:40:95:ee:ed:b3: + 6c:77:5c:31:9a:90:bd:99:80:ab:8f:ef:8d:a6:e0:64:ba:16: + 03:a2:21:5d:75:bd:d9:50:7f:d2:02:44:58:9e:b5:c2:1d:37: + 50:8f:27:21 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb5e1juv +HFELuDFBFoahBFvUw9HoFhKwevjUtmGbWlG7faXmz3BIHU4hdN743seNsuG1oLlK +fHaxJOZtexd5KJmFRNWcx7N8ZP06l3aUiKrc68Nuq0NC0omzy1bcifZMZeC+HnIB +x8ZQ5lvfot5PQ5096MglLlAbYQ4sRSLwk3vWBZ+kI/t4sRVJ/utzKbDrn+huO5KG +wNAg50y3aX/TD1Q5BTpGm0dN+n6MzkWlHyxv9zM2ELxn2bYVhnFfenqvTnFZHUbR +dpbYS/yguRHkX13+9L/ISFRmYL5Li3BKM+DqAnrNoTc9Z62T89ClnvKk/xg+d5fS +LFgSpdZVA22hywIDAQABo4HLMIHIMB0GA1UdDgQWBBR3Yt9Z/XlSe5rPmTx8vYfO +QSdX9jAfBgNVHSMEGDAWgBSqFrz5fq30cdbUlNlhSwE4spWLhDA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AE/cgLXLE10tr7Zte1FOgTYW0Ta7XTe+bk1Ah1de26l1rkbkdMTc5f28BC/Kf7Rn +22X31jeUdKT5iuLa1WSeAE2FOQdv4JbXK+9z06R3a+Hu1PdUujAjo5UsyDghDBT7 +9EQnmvOBL4lZPhJSUr9OfJN827ffm/u2PHD8ZwemQpltlcBk+JlQqi+2GdhjgA8i +w7TWsAmbYqA3DiHl78Jh7X4v9X0JGfRvish6DgpEQZsiAdR8yaja1ZHZph8fuEpq +vbx+NjN64JxYwXVxnxQEzskf5txAle7ts2x3XDGakL2ZgKuP742m4GS6FgOiIV11 +vdlQf9ICRFietcIdN1CPJyE= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:eb:e2:5f:c7:d4:38:fe:e8:6d:64:82:8e:c6:d8: + d7:a5:a4:ca:65:5f:55:b6:c5:5c:9c:f6:cc:af:d6: + 4b:ec:a1:5c:c3:55:08:19:1c:0e:99:4a:4d:b2:14: + 22:36:a0:db:eb:c3:1c:6f:d6:05:69:a5:5b:61:59: + 7a:fb:88:da:28:1d:95:c6:fe:31:51:06:ac:f7:41: + a6:10:08:25:7f:41:f1:01:39:48:27:c1:34:73:2f: + c2:05:b1:97:42:80:de:d4:3a:44:db:a0:34:8c:b8: + 5c:de:ab:42:c8:1e:f1:08:7e:10:3a:ee:16:8e:61: + ee:ab:aa:f5:7a:2b:ab:af:a2:69:da:f4:b5:95:32: + 17:bc:cf:ba:ad:a7:7b:fc:ea:9b:43:bc:ae:07:c3: + 92:15:ce:4a:fb:ee:33:e6:89:7d:09:88:f9:a5:af: + 0b:4d:c1:7f:28:30:d8:93:75:92:b5:27:2c:01:bd: + 52:05:5d:42:a5:dc:f3:1f:1e:b2:3c:a1:17:19:9b: + 30:ec:18:85:41:e3:72:d2:93:ef:a0:4d:0b:d4:8a: + fa:89:0d:b6:46:fe:bc:f0:82:de:99:4c:1e:57:1c: + 8d:71:b3:9c:41:ea:03:8f:a1:d6:f2:a4:9d:1c:b8: + 50:c8:c0:19:6a:18:4d:c0:7f:7d:f8:b3:af:c6:62: + 09:9b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + AA:16:BC:F9:7E:AD:F4:71:D6:D4:94:D9:61:4B:01:38:B2:95:8B:84 + X509v3 Authority Key Identifier: + keyid:AA:16:BC:F9:7E:AD:F4:71:D6:D4:94:D9:61:4B:01:38:B2:95:8B:84 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 07:d5:33:48:84:04:40:42:f1:f2:ff:d9:07:5e:5f:bf:d9:72: + 07:6f:a9:6a:f1:5f:f3:59:69:99:41:cd:9d:37:65:cb:2e:c8: + 06:f3:0a:0c:da:46:28:6d:d6:06:08:20:5b:ca:ed:c9:14:6e: + 11:5a:9f:df:33:06:67:44:e7:63:ba:b2:42:53:2e:31:0b:ce: + ef:c1:74:60:76:96:0b:3f:da:9b:f2:a1:d1:89:99:34:f0:f9: + ae:8c:39:fd:3d:a6:be:7f:f5:82:f0:25:62:b0:b7:b4:bc:1b: + 51:c3:60:05:af:bc:22:b9:62:49:c0:27:12:72:c2:ac:d9:1e: + 17:ff:e7:57:f6:b2:f8:37:dd:76:1a:dc:e0:89:4f:b3:8a:74: + 0b:76:5f:48:fc:6c:af:6d:42:85:25:b4:44:ca:27:ed:2e:fb: + d8:df:1a:a1:82:bd:6c:25:35:62:cb:50:db:27:9e:b2:65:cc: + 58:fa:fd:1e:6a:2a:77:cd:3f:b4:6b:e6:71:ec:85:f5:7b:73: + a9:73:05:78:1f:26:21:dc:8b:a4:f5:e1:06:a6:97:13:9f:5f: + 84:03:12:59:37:81:17:21:2d:39:db:b7:b0:f4:17:73:90:7c: + a1:2f:53:c0:4a:af:53:54:2c:5b:9c:8a:e3:66:80:40:30:96: + e3:d8:b2:23 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOviX8fUOP7obWSCjsbY +16WkymVfVbbFXJz2zK/WS+yhXMNVCBkcDplKTbIUIjag2+vDHG/WBWmlW2FZevuI +2igdlcb+MVEGrPdBphAIJX9B8QE5SCfBNHMvwgWxl0KA3tQ6RNugNIy4XN6rQsge +8Qh+EDruFo5h7quq9Xorq6+iadr0tZUyF7zPuq2ne/zqm0O8rgfDkhXOSvvuM+aJ +fQmI+aWvC03Bfygw2JN1krUnLAG9UgVdQqXc8x8esjyhFxmbMOwYhUHjctKT76BN +C9SK+okNtkb+vPCC3plMHlccjXGznEHqA4+h1vKknRy4UMjAGWoYTcB/ffizr8Zi +CZsCAwEAAaOByzCByDAdBgNVHQ4EFgQUqha8+X6t9HHW1JTZYUsBOLKVi4QwHwYD +VR0jBBgwFoAUqha8+X6t9HHW1JTZYUsBOLKVi4QwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAH1TNIhARA +QvHy/9kHXl+/2XIHb6lq8V/zWWmZQc2dN2XLLsgG8woM2kYobdYGCCBbyu3JFG4R +Wp/fMwZnROdjurJCUy4xC87vwXRgdpYLP9qb8qHRiZk08PmujDn9Paa+f/WC8CVi +sLe0vBtRw2AFr7wiuWJJwCcScsKs2R4X/+dX9rL4N912GtzgiU+zinQLdl9I/Gyv +bUKFJbREyiftLvvY3xqhgr1sJTViy1DbJ56yZcxY+v0eaip3zT+0a+Zx7IX1e3Op +cwV4HyYh3Iuk9eEGppcTn1+EAxJZN4EXIS0527ew9BdzkHyhL1PASq9TVCxbnIrj +ZoBAMJbj2LIj +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-not-end-entity.pem b/net/data/verify_certificate_chain_unittest/target-not-end-entity.pem new file mode 100644 index 0000000..249d42a --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-not-end-entity.pem
@@ -0,0 +1,280 @@ +[Created by: ./generate-target-not-end-entity.py] + +Certificate chain with 1 intermediary, a trusted root, and a target +certificate that is also a CA. Verification is expected to succeed, as the test +code accepts any target certificate. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ee:c2:63:d9:42:ea:55:e7:60:10:b7:7a:07:f3: + 2c:85:b7:38:91:0c:ec:29:d5:fd:ca:14:ad:58:8b: + 12:c2:fd:b6:2e:fb:50:dc:04:e9:c3:20:d1:db:23: + da:0e:5e:93:94:cf:82:54:fd:e7:5d:9a:ee:01:37: + 84:67:e9:f4:93:7b:ef:be:b1:e1:a3:5a:5a:eb:31: + b1:29:8e:05:1a:90:d5:15:aa:5e:de:29:1b:1f:80: + eb:17:fa:89:4b:d4:5b:77:0f:d1:e0:7b:f2:8d:a6: + b4:aa:22:44:42:3e:bb:af:b7:5e:06:ae:0b:c0:20: + 6e:ea:90:ef:4c:cb:34:5a:6b:37:29:a7:07:0c:66: + 65:16:36:29:f0:d7:c8:e7:cc:88:2f:cc:bd:63:33: + 2d:f5:91:8d:9b:69:f6:f3:05:d3:ca:87:96:ed:79: + e4:0f:85:a4:41:62:aa:f2:f9:89:fe:a7:92:e5:7c: + 0a:6e:74:70:b0:be:b2:67:12:2c:c4:44:77:54:f0: + d6:07:26:aa:ad:8f:9c:f2:12:c2:c1:23:2d:54:8c: + 09:df:94:59:7c:8b:e0:62:f1:2d:7b:cc:26:f3:11: + 7b:97:04:3b:2a:02:c5:8f:2f:28:c5:c4:52:dc:4c: + 5b:6f:0b:8c:e4:89:0a:85:d0:a3:d4:02:74:35:48: + c7:c5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 75:E4:93:1E:26:35:79:D3:34:F7:E2:FD:A3:1C:38:1C:68:8B:F6:CD + X509v3 Authority Key Identifier: + keyid:58:01:24:B6:3B:E6:E7:85:87:83:6F:54:23:6A:C2:D4:E0:9D:6C:37 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 86:0e:74:e2:4f:1c:93:23:8a:9c:37:4a:42:ff:ab:4b:7b:5c: + 38:c3:67:11:1d:60:03:b3:1e:57:15:8f:1f:b2:94:45:f0:44: + 31:f1:7e:30:0e:f9:cc:48:7b:a3:27:2b:bf:9a:bd:e9:a1:69: + e2:1f:e7:91:ef:98:e9:58:5e:f8:7c:a0:8d:e5:81:85:af:8c: + a6:04:c5:57:3e:cb:5f:33:dc:ca:b6:72:5b:e7:82:9b:68:91: + 73:aa:f2:47:b9:6b:e2:7d:12:b4:85:87:2a:a9:49:a0:cd:79: + 41:8d:60:33:43:e8:aa:55:4b:60:8a:41:26:ca:e1:75:35:bd: + 45:00:a7:1a:2e:16:15:14:1f:be:9d:aa:25:54:e2:0d:f2:da: + 96:27:72:2c:75:4b:d7:06:5f:9d:47:37:25:08:7f:1f:ad:df: + e7:6f:1d:f6:95:63:e8:08:02:c9:51:dc:ae:4a:31:eb:c5:61: + 24:79:4c:d1:88:79:1f:04:ae:35:79:24:bc:29:4d:0c:c0:05: + 99:91:db:f3:83:af:95:4f:f3:13:35:b4:a9:40:04:81:cb:f5: + 39:e1:55:96:cf:42:86:68:26:f8:cc:82:6a:b9:10:77:41:55: + 03:16:9d:0e:57:37:33:a0:53:ca:7e:0b:1c:85:9e:c2:81:8d: + c8:3e:b8:62 +-----BEGIN CERTIFICATE----- +MIIDfzCCAmegAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDuwmPZ +QupV52AQt3oH8yyFtziRDOwp1f3KFK1YixLC/bYu+1DcBOnDINHbI9oOXpOUz4JU +/eddmu4BN4Rn6fSTe+++seGjWlrrMbEpjgUakNUVql7eKRsfgOsX+olL1Ft3D9Hg +e/KNprSqIkRCPruvt14GrgvAIG7qkO9MyzRaazcppwcMZmUWNinw18jnzIgvzL1j +My31kY2bafbzBdPKh5bteeQPhaRBYqry+Yn+p5LlfApudHCwvrJnEizERHdU8NYH +Jqqtj5zyEsLBIy1UjAnflFl8i+Bi8S17zCbzEXuXBDsqAsWPLyjFxFLcTFtvC4zk +iQqF0KPUAnQ1SMfFAgMBAAGjgdswgdgwHQYDVR0OBBYEFHXkkx4mNXnTNPfi/aMc +OBxoi/bNMB8GA1UdIwQYMBaAFFgBJLY75ueFh4NvVCNqwtTgnWw3MD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQELBQADggEBAIYOdOJPHJMjipw3SkL/q0t7XDjDZxEdYAOzHlcV +jx+ylEXwRDHxfjAO+cxIe6MnK7+avemhaeIf55HvmOlYXvh8oI3lgYWvjKYExVc+ +y18z3Mq2clvngptokXOq8ke5a+J9ErSFhyqpSaDNeUGNYDND6KpVS2CKQSbK4XU1 +vUUApxouFhUUH76dqiVU4g3y2pYncix1S9cGX51HNyUIfx+t3+dvHfaVY+gIAslR +3K5KMevFYSR5TNGIeR8ErjV5JLwpTQzABZmR2/ODr5VP8xM1tKlABIHL9TnhVZbP +QoZoJvjMgmq5EHdBVQMWnQ5XNzOgU8p+CxyFnsKBjcg+uGI= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c7:c3:50:5c:f2:60:57:55:0d:be:39:c4:be:74: + 76:26:ce:b2:4c:be:ac:dc:17:ac:a0:a4:c3:5f:ae: + 64:59:da:20:77:7c:88:28:0e:75:7e:ef:70:80:9c: + 0c:8e:94:1c:48:ea:4f:b3:34:1e:e4:cf:af:f8:29: + 13:06:6f:19:0f:e7:9a:df:59:8c:44:d3:0e:26:70: + 5f:c7:a5:3a:36:4d:4b:50:9c:bd:14:fb:21:4a:f8: + d6:2b:49:94:2b:df:4c:8c:89:32:d7:53:f8:59:14: + e9:23:76:f3:fb:b4:27:2d:c9:28:17:cc:fe:06:2c: + bd:b5:97:30:83:40:9e:c7:ff:9e:0a:99:a7:f0:e8: + 0c:c7:73:ca:3f:48:3a:75:97:bd:de:9a:84:6d:5b: + 13:dc:0c:64:1e:66:4f:72:10:28:cd:34:bb:15:f1: + ca:65:3f:03:db:aa:fa:4d:4c:26:64:8a:3f:6f:67: + 51:fa:15:2d:71:7c:fd:0b:12:9e:12:c2:77:9c:f2: + a8:86:78:f2:6f:9f:79:c9:50:51:28:41:13:79:79: + 7c:a1:93:dd:71:f7:08:92:99:f7:9c:37:ff:2b:82: + b6:4e:a9:93:47:83:dc:36:83:40:13:22:96:eb:5e: + 2f:ad:a1:d6:70:38:c5:2b:3a:0b:ce:4c:fc:81:c1: + 49:f5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 58:01:24:B6:3B:E6:E7:85:87:83:6F:54:23:6A:C2:D4:E0:9D:6C:37 + X509v3 Authority Key Identifier: + keyid:92:00:23:C7:C3:33:14:62:3D:59:C9:52:A4:CC:A0:5C:16:DD:35:2D + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 3d:c9:5f:4a:71:a9:28:ca:c0:27:47:f1:23:b0:87:2c:5f:4c: + 20:de:1e:60:8b:6d:c3:42:2c:bf:ed:82:26:00:b6:f8:4f:7e: + ac:37:ec:43:ea:7a:a5:58:fc:34:cd:af:54:2d:3e:30:e8:44: + 8d:37:8d:5b:5c:b8:52:bd:f1:d5:ab:c7:61:d9:83:b5:f5:51: + 41:ed:f0:1c:02:c7:ae:4f:57:60:49:c8:6d:3e:44:53:13:ce: + 97:47:78:b5:04:23:fd:0a:49:e5:99:67:90:07:e7:a5:66:61: + 2b:93:5f:b5:dd:d0:fe:92:e8:36:3e:4f:cb:a7:f0:64:d2:88: + 11:e5:78:42:89:a7:3f:b6:fe:93:3a:d8:52:d0:8c:9d:ea:89: + 21:56:67:04:21:c5:c2:83:42:13:43:ee:5c:1c:2f:00:97:45: + 56:4a:18:21:ad:2d:b3:b6:38:ed:5e:df:fe:13:43:53:90:2a: + 05:ab:47:6a:dd:9e:9e:51:a2:f2:98:08:03:4c:3f:17:5f:55: + e7:b0:f3:ae:62:be:a3:0f:5f:d2:3c:b9:c3:48:55:a9:f6:0d: + 4b:fd:15:54:f5:0b:57:30:c7:f5:fb:61:ff:0a:82:35:58:21: + f0:05:90:a2:d6:52:d4:6b:53:a8:ea:98:68:53:59:0c:11:db: + b2:af:fd:3e +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx8NQXPJg +V1UNvjnEvnR2Js6yTL6s3BesoKTDX65kWdogd3yIKA51fu9wgJwMjpQcSOpPszQe +5M+v+CkTBm8ZD+ea31mMRNMOJnBfx6U6Nk1LUJy9FPshSvjWK0mUK99MjIky11P4 +WRTpI3bz+7QnLckoF8z+Biy9tZcwg0Cex/+eCpmn8OgMx3PKP0g6dZe93pqEbVsT +3AxkHmZPchAozTS7FfHKZT8D26r6TUwmZIo/b2dR+hUtcXz9CxKeEsJ3nPKohnjy +b595yVBRKEETeXl8oZPdcfcIkpn3nDf/K4K2TqmTR4PcNoNAEyKW614vraHWcDjF +KzoLzkz8gcFJ9QIDAQABo4HLMIHIMB0GA1UdDgQWBBRYASS2O+bnhYeDb1QjasLU +4J1sNzAfBgNVHSMEGDAWgBSSACPHwzMUYj1ZyVKkzKBcFt01LTA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AD3JX0pxqSjKwCdH8SOwhyxfTCDeHmCLbcNCLL/tgiYAtvhPfqw37EPqeqVY/DTN +r1QtPjDoRI03jVtcuFK98dWrx2HZg7X1UUHt8BwCx65PV2BJyG0+RFMTzpdHeLUE +I/0KSeWZZ5AH56VmYSuTX7Xd0P6S6DY+T8un8GTSiBHleEKJpz+2/pM62FLQjJ3q +iSFWZwQhxcKDQhND7lwcLwCXRVZKGCGtLbO2OO1e3/4TQ1OQKgWrR2rdnp5RovKY +CANMPxdfVeew865ivqMPX9I8ucNIVan2DUv9FVT1C1cwx/X7Yf8KgjVYIfAFkKLW +UtRrU6jqmGhTWQwR27Kv/T4= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:9d:bb:c1:61:ff:52:46:21:fd:d7:06:43:c7:e0: + 5d:5c:c8:02:0a:44:68:63:45:92:58:8d:2f:d6:b3: + 86:f1:01:ee:fd:34:97:4b:d6:64:fc:4f:8f:88:50: + 56:1a:e6:20:00:9f:8c:8d:e0:c0:30:41:28:99:10: + 14:b6:28:6c:b9:37:ef:5c:c4:ee:eb:37:ff:06:07: + f3:5c:17:8b:aa:d6:5c:8e:19:01:8d:66:3b:8f:c9: + e2:83:0a:0f:8c:7b:21:da:cb:4d:ea:81:11:17:92: + 83:f5:35:19:d5:b5:92:49:3d:08:a5:c3:95:37:76: + ad:38:9c:fd:11:ff:d4:7f:09:60:10:ea:07:93:5c: + 2f:4c:95:53:a1:cb:3b:b1:a8:9a:9d:b9:a4:87:af: + 78:78:6e:dc:76:bb:00:74:cd:54:75:6a:17:45:b8: + 55:d8:87:87:88:7a:d4:98:30:05:92:df:65:07:aa: + d7:08:b7:18:b8:35:79:bb:5e:13:e2:c3:07:65:42: + d4:52:e3:91:41:9d:38:cb:1e:9e:5d:3b:51:7d:95: + f4:3b:6f:31:77:57:4b:e8:74:59:82:47:60:f9:91: + 83:19:20:54:03:a0:cb:76:5e:50:32:ec:32:57:f6: + d0:1d:f7:46:7d:c1:ff:a7:b8:1d:80:66:f0:d9:c9: + 59:d9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 92:00:23:C7:C3:33:14:62:3D:59:C9:52:A4:CC:A0:5C:16:DD:35:2D + X509v3 Authority Key Identifier: + keyid:92:00:23:C7:C3:33:14:62:3D:59:C9:52:A4:CC:A0:5C:16:DD:35:2D + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 7a:76:9e:1b:08:ba:ae:df:d7:32:30:27:f7:6d:e0:00:f2:4f: + f0:cf:dd:b5:3e:65:71:d9:97:18:5c:fc:5f:a4:61:88:41:73: + e6:45:d2:09:3a:a5:6d:09:ab:29:13:dc:0a:43:fd:8a:1f:be: + 7f:a5:a2:07:cc:9c:63:d5:30:51:93:eb:fc:27:17:08:d4:15: + 80:84:1c:5e:1b:bd:00:a0:21:0d:08:8a:44:64:40:73:6c:b5: + 50:2b:82:5f:c8:d8:fd:26:f6:91:38:df:d2:58:20:a0:ae:f2: + 14:54:e5:d2:ff:ef:87:57:7d:bd:5e:68:b8:1b:62:e0:ae:f4: + 08:cd:53:35:1e:a4:cf:3c:21:22:55:1e:e4:51:87:f9:74:38: + 10:29:86:64:87:8b:55:9b:96:5a:81:e4:93:2d:c0:fb:06:7f: + dd:17:b1:d3:24:75:73:97:df:31:d6:01:a4:be:70:e2:af:ee: + c3:bc:fc:a1:cd:93:2d:4d:b6:b5:95:02:28:38:68:27:59:38: + 95:d9:64:20:1e:e5:46:f1:bb:f3:5a:2c:b3:f8:d8:cc:fd:34: + 09:fb:0b:02:b7:e5:de:0f:ea:2a:2b:0d:81:55:4d:84:d6:f6: + ba:a4:47:fe:f1:f9:7d:3f:f9:a1:46:bf:fd:dd:89:8b:b4:22: + 1d:86:9f:c5 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ27wWH/UkYh/dcGQ8fg +XVzIAgpEaGNFkliNL9azhvEB7v00l0vWZPxPj4hQVhrmIACfjI3gwDBBKJkQFLYo +bLk371zE7us3/wYH81wXi6rWXI4ZAY1mO4/J4oMKD4x7IdrLTeqBEReSg/U1GdW1 +kkk9CKXDlTd2rTic/RH/1H8JYBDqB5NcL0yVU6HLO7Gomp25pIeveHhu3Ha7AHTN +VHVqF0W4VdiHh4h61JgwBZLfZQeq1wi3GLg1ebteE+LDB2VC1FLjkUGdOMsenl07 +UX2V9DtvMXdXS+h0WYJHYPmRgxkgVAOgy3ZeUDLsMlf20B33Rn3B/6e4HYBm8NnJ +WdkCAwEAAaOByzCByDAdBgNVHQ4EFgQUkgAjx8MzFGI9WclSpMygXBbdNS0wHwYD +VR0jBBgwFoAUkgAjx8MzFGI9WclSpMygXBbdNS0wNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB6dp4bCLqu +39cyMCf3beAA8k/wz921PmVx2ZcYXPxfpGGIQXPmRdIJOqVtCaspE9wKQ/2KH75/ +paIHzJxj1TBRk+v8JxcI1BWAhBxeG70AoCENCIpEZEBzbLVQK4JfyNj9JvaRON/S +WCCgrvIUVOXS/++HV329Xmi4G2LgrvQIzVM1HqTPPCEiVR7kUYf5dDgQKYZkh4tV +m5ZageSTLcD7Bn/dF7HTJHVzl98x1gGkvnDir+7DvPyhzZMtTba1lQIoOGgnWTiV +2WQgHuVG8bvzWiyz+NjM/TQJ+wsCt+XeD+oqKw2BVU2E1va6pEf+8fl9P/mhRr/9 +3YmLtCIdhp/F +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +U1VDQ0VTUw== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem b/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem new file mode 100644 index 0000000..8c8bd24 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem
@@ -0,0 +1,248 @@ +[Created by: generate-target-signed-by-512bit-rsa.py] + +Certificate chain with 1 intermediary and a trusted root. The target +certificate is signed using a weak RSA key (512-bit modulus), and so +verification is expected to fail. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a0:09:f8:e1:95:28:53:9e:e3:c1:a5:c0:76:05: + 74:88:fb:fb:d0:c9:c2:3e:61:e3:a1:e3:b0:c8:81: + a3:d1:bf:0c:f4:d8:06:3d:8f:58:45:e1:f0:00:8e: + b1:8c:ab:bc:83:ae:d1:39:3d:6c:52:ef:76:f1:6f: + 93:b0:b2:26:b7:b4:ab:fd:25:44:94:85:4a:c1:ad: + 2a:6c:59:11:3c:33:63:39:e9:f1:c6:96:05:7a:a4: + 8b:3c:74:10:cb:ae:19:eb:cd:df:eb:b0:68:91:cd: + 5c:56:8d:41:d4:b4:4f:db:45:50:4d:01:01:10:09: + be:84:a3:3a:98:55:a2:a6:ea:6b:fc:c7:4f:ae:cd: + 31:60:80:2b:86:27:cf:64:f8:4f:35:32:83:02:57: + ab:85:9e:ae:e0:39:06:03:d8:8e:c5:6f:01:5f:f6: + 08:1f:ae:c9:a1:32:65:35:c5:9b:d7:2c:e1:6f:93: + 41:f7:40:ff:b1:36:08:5e:35:9e:42:2b:a4:d8:0a: + c2:ce:e4:94:cf:51:7c:76:18:d0:0a:4e:e8:37:b3: + 44:f4:0b:31:fa:49:96:94:c8:c0:ef:3a:10:ca:4d: + eb:ed:24:a7:d4:ec:bf:d5:5d:80:ed:d7:3a:b1:7c: + 3f:0f:b7:cb:48:59:73:fb:af:43:5e:3e:6b:e7:a5: + ed:01 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 01:E0:D2:38:1C:28:DC:51:7E:F9:E6:25:7A:C5:47:ED:81:6C:FC:5F + X509v3 Authority Key Identifier: + keyid:B8:D0:79:3D:EA:8A:56:E5:90:68:D6:6C:E9:91:14:0C:AE:5A:48:10 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + be:ba:eb:82:1f:02:6b:d0:9e:c9:55:09:b1:e9:e1:82:8c:50: + 39:7e:f5:ff:0f:4f:ef:d8:7d:52:10:07:5e:c1:c4:0e:d5:94: + 67:d2:0e:2e:22:e6:5a:91:b5:f7:05:e3:a4:be:bc:6c:fb:38: + 2c:df:47:55:61:bc:4c:39:14:68 +-----BEGIN CERTIFICATE----- +MIICyzCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgCfjh +lShTnuPBpcB2BXSI+/vQycI+YeOh47DIgaPRvwz02AY9j1hF4fAAjrGMq7yDrtE5 +PWxS73bxb5Owsia3tKv9JUSUhUrBrSpsWRE8M2M56fHGlgV6pIs8dBDLrhnrzd/r +sGiRzVxWjUHUtE/bRVBNAQEQCb6EozqYVaKm6mv8x0+uzTFggCuGJ89k+E81MoMC +V6uFnq7gOQYD2I7FbwFf9ggfrsmhMmU1xZvXLOFvk0H3QP+xNgheNZ5CK6TYCsLO +5JTPUXx2GNAKTug3s0T0CzH6SZaUyMDvOhDKTevtJKfU7L/VXYDt1zqxfD8Pt8tI +WXP7r0NePmvnpe0BAgMBAAGjgekwgeYwHQYDVR0OBBYEFAHg0jgcKNxRfvnmJXrF +R+2BbPxfMB8GA1UdIwQYMBaAFLjQeT3qilblkGjWbOmRFAyuWkgQMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAANBAL6664IfAmvQnslVCbHp4YKM +UDl+9f8PT+/YfVIQB17BxA7VlGfSDi4i5lqRtfcF46S+vGz7OCzfR1VhvEw5FGg= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (512 bit) + Modulus: + 00:da:fa:51:64:db:d4:40:cf:aa:60:3f:0b:9a:0e: + 26:21:59:0e:f1:8b:e2:75:11:de:2d:1c:e5:dc:9b: + e2:16:ce:cf:50:a1:aa:c9:e0:19:9f:5c:e5:44:69: + 0d:f9:0c:d7:c5:1e:cf:11:65:77:cd:37:5f:d8:fe: + 6f:e0:99:b3:f7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + B8:D0:79:3D:EA:8A:56:E5:90:68:D6:6C:E9:91:14:0C:AE:5A:48:10 + X509v3 Authority Key Identifier: + keyid:68:06:12:0B:9D:1F:3A:7C:E5:87:20:3C:ED:A3:49:5D:3E:74:28:69 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 8c:35:af:f3:d9:62:41:91:93:ed:8b:f6:42:3e:94:80:cf:31: + ed:0f:a5:52:2e:51:3f:f3:3f:56:38:c5:f0:25:c5:f1:13:8c: + 6a:80:28:58:79:e1:eb:39:25:5a:af:31:07:24:da:8c:ae:17: + c7:56:fd:c1:d4:3a:2c:7e:7e:a4:ff:eb:66:74:96:66:e8:26: + 52:1d:c5:d6:0a:64:ea:cd:b7:df:b8:49:b1:c4:44:c6:d0:e3: + 94:0f:b2:b2:cb:75:5a:bf:48:c6:ad:82:46:74:a7:53:bd:55: + 00:67:6e:ba:2c:b8:15:43:30:64:d8:10:3a:67:b0:31:df:f6: + 9e:7e:7c:0b:63:d6:6d:b0:5d:9a:61:96:51:03:71:d3:fb:da: + 30:b8:d1:a6:8a:4a:a2:36:58:84:34:c0:30:5a:d8:51:30:d0: + 89:8c:1e:c3:45:32:85:17:ba:01:4d:60:04:91:23:ee:df:71: + 0d:82:90:67:2f:04:4e:e2:64:a9:48:55:03:e7:0b:a1:b4:e3: + e7:e9:54:3b:bc:83:f0:b3:bb:3f:1a:fd:03:95:28:0e:d2:3b: + 8b:62:fe:bb:b7:9a:1d:15:d3:96:47:be:c9:4e:21:77:63:60: + 3b:27:b3:3d:7e:8b:fd:3b:55:17:cf:8b:99:81:6d:92:66:5b: + 35:62:4a:96 +-----BEGIN CERTIFICATE----- +MIICpTCCAY2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANr6UWTb1EDPqmA/C5oO +JiFZDvGL4nUR3i0c5dyb4hbOz1ChqsngGZ9c5URpDfkM18UezxFld803X9j+b+CZ +s/cCAwEAAaOByzCByDAdBgNVHQ4EFgQUuNB5PeqKVuWQaNZs6ZEUDK5aSBAwHwYD +VR0jBBgwFoAUaAYSC50fOnzlhyA87aNJXT50KGkwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCMNa/z2WJB +kZPti/ZCPpSAzzHtD6VSLlE/8z9WOMXwJcXxE4xqgChYeeHrOSVarzEHJNqMrhfH +Vv3B1Dosfn6k/+tmdJZm6CZSHcXWCmTqzbffuEmxxETG0OOUD7Kyy3Vav0jGrYJG +dKdTvVUAZ266LLgVQzBk2BA6Z7Ax3/aefnwLY9ZtsF2aYZZRA3HT+9owuNGmikqi +NliENMAwWthRMNCJjB7DRTKFF7oBTWAEkSPu33ENgpBnLwRO4mSpSFUD5wuhtOPn +6VQ7vIPws7s/Gv0DlSgO0juLYv67t5odFdOWR77JTiF3Y2A7J7M9fov9O1UXz4uZ +gW2SZls1YkqW +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cc:43:57:ce:f5:69:b5:17:2d:24:1e:10:48:61: + 1e:6e:27:06:10:ae:6d:cd:70:97:4c:39:7b:0d:68: + 76:49:5b:2a:56:cf:24:d3:35:e4:f9:44:b0:60:c2: + db:ee:58:f0:2c:3f:25:53:95:bf:fc:3b:cf:1a:5c: + de:94:67:30:7f:6b:7b:c1:9c:d9:55:91:8b:34:57: + a7:4f:d0:d7:38:8c:e6:57:ae:f6:61:66:bb:fb:4e: + d3:b0:d0:c0:74:83:e3:43:7a:15:ab:29:fa:3f:65: + b5:58:3b:0b:76:cf:b9:85:d9:2a:5b:bf:81:4d:d7: + bb:72:cf:30:91:1a:0a:4f:6c:64:48:13:fe:cc:14: + 21:f0:74:b8:90:73:f7:d5:fe:5b:dd:b2:7a:71:1a: + e3:c3:22:5a:37:38:db:d0:39:62:b3:87:0e:7d:a8: + 93:68:82:01:29:36:eb:30:20:66:d9:2a:f8:e9:7d: + 53:ac:93:c1:68:c1:21:66:26:9e:4d:34:8a:14:c2: + 38:c0:6e:57:9a:c8:93:c1:7d:7d:d8:22:6e:bb:5e: + ff:dd:e0:af:e4:af:32:6d:f2:e7:57:d4:53:8d:ea: + f9:ca:72:d3:3a:4e:19:e3:b8:b7:4f:fb:d8:5b:41: + da:0e:17:59:e2:88:cd:c2:b7:6b:d4:64:50:f0:1e: + 36:9d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 68:06:12:0B:9D:1F:3A:7C:E5:87:20:3C:ED:A3:49:5D:3E:74:28:69 + X509v3 Authority Key Identifier: + keyid:68:06:12:0B:9D:1F:3A:7C:E5:87:20:3C:ED:A3:49:5D:3E:74:28:69 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 2a:56:07:28:0a:b2:16:a5:3e:e3:cc:7e:10:47:8d:88:04:be: + 92:d6:ef:fa:c2:e3:5f:5f:57:3a:75:5a:8e:8e:62:e0:94:26: + 32:d2:ab:d3:d7:88:7e:d0:14:b1:1b:1a:5d:15:87:15:45:ae: + 47:50:0b:50:dd:52:55:03:0b:cb:91:13:b0:96:20:24:c5:aa: + 13:f5:4f:60:20:b6:46:6a:a6:cf:9d:4e:88:09:77:ad:4d:6f: + ea:d6:18:81:ac:7c:ad:59:9c:bb:f5:c5:62:e5:e4:b3:61:b2: + fb:f4:22:4e:38:a4:42:3a:e1:00:54:78:dd:24:90:20:47:d2: + 74:2b:89:44:64:04:02:3b:f9:8b:fa:35:aa:90:c1:73:82:95: + 94:fa:5f:85:e9:af:e1:3e:33:2b:1b:91:31:1d:94:ee:1c:0c: + e5:22:de:48:d4:2d:f7:3a:16:7e:f2:40:dc:ce:ec:3e:41:0d: + 12:3e:9c:ff:15:2b:9b:b3:80:87:02:50:76:ae:e1:05:dd:89: + 72:fc:49:e5:81:1f:91:cc:c8:27:b7:2c:b2:ef:71:a0:97:76: + 49:da:71:75:24:5e:45:2d:5b:2b:79:d2:b0:a3:b8:85:13:d5: + 68:d7:53:f0:d1:b8:87:d1:84:7c:9e:e1:18:23:f4:cc:2a:8d: + f3:93:51:5e +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMxDV871abUXLSQeEEhh +Hm4nBhCubc1wl0w5ew1odklbKlbPJNM15PlEsGDC2+5Y8Cw/JVOVv/w7zxpc3pRn +MH9re8Gc2VWRizRXp0/Q1ziM5leu9mFmu/tO07DQwHSD40N6Fasp+j9ltVg7C3bP +uYXZKlu/gU3Xu3LPMJEaCk9sZEgT/swUIfB0uJBz99X+W92yenEa48MiWjc429A5 +YrOHDn2ok2iCASk26zAgZtkq+Ol9U6yTwWjBIWYmnk00ihTCOMBuV5rIk8F9fdgi +brte/93gr+SvMm3y51fUU43q+cpy0zpOGeO4t0/72FtB2g4XWeKIzcK3a9RkUPAe +Np0CAwEAAaOByzCByDAdBgNVHQ4EFgQUaAYSC50fOnzlhyA87aNJXT50KGkwHwYD +VR0jBBgwFoAUaAYSC50fOnzlhyA87aNJXT50KGkwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAqVgcoCrIW +pT7jzH4QR42IBL6S1u/6wuNfX1c6dVqOjmLglCYy0qvT14h+0BSxGxpdFYcVRa5H +UAtQ3VJVAwvLkROwliAkxaoT9U9gILZGaqbPnU6ICXetTW/q1hiBrHytWZy79cVi +5eSzYbL79CJOOKRCOuEAVHjdJJAgR9J0K4lEZAQCO/mL+jWqkMFzgpWU+l+F6a/h +PjMrG5ExHZTuHAzlIt5I1C33OhZ+8kDczuw+QQ0SPpz/FSubs4CHAlB2ruEF3Yly +/EnlgR+RzMgntyyy73Ggl3ZJ2nF1JF5FLVsredKwo7iFE9Vo11Pw0biH0YR8nuEY +I/TMKo3zk1Fe +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-signed-using-ecdsa.pem b/net/data/verify_certificate_chain_unittest/target-signed-using-ecdsa.pem new file mode 100644 index 0000000..6109796 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-signed-using-ecdsa.pem
@@ -0,0 +1,252 @@ +[Created by: generate-target-signed-using-ecdsa.py] + +Certificate chain with a trusted root using RSA, and intermediary using EC, +and a target certificate using RSA. Verification is expected to succeed. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: ecdsa-with-SHA256 + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:f5:15:82:5b:5b:ef:98:fd:63:b3:5b:08:9c:21: + 8b:be:10:f1:3a:ab:17:e8:f2:9c:37:24:80:41:6a: + 87:71:1d:9a:ea:c3:a6:f7:25:e3:09:03:3f:92:2e: + e1:bc:9e:fd:70:65:e9:29:21:4f:46:01:12:20:e2: + 08:d9:bd:86:40:5d:3d:b9:6a:c5:ad:3f:dc:82:00: + 75:7b:da:26:a1:c9:49:f2:b5:30:6c:40:07:94:c6: + f4:41:1f:88:3a:d7:89:ab:86:79:50:cc:85:8e:f6: + a4:fc:7b:03:70:74:1e:6e:09:98:ff:b4:8a:ea:c0: + c1:e3:07:ff:8d:f8:e8:bc:f5:fd:6e:aa:db:fc:26: + 2e:44:bd:52:e3:66:f5:58:6d:ea:0c:30:19:ed:8f: + db:cd:1f:40:20:2f:36:35:d7:63:b5:d7:2c:e8:4b: + d3:e2:90:82:2f:27:4d:22:8a:94:e3:fb:c7:40:77: + e2:e0:56:c7:70:b6:ae:9b:e9:7c:fa:b5:d0:40:34: + dd:0b:59:96:0d:ba:84:47:87:62:c1:3e:1f:21:5b: + 3b:15:56:3a:8b:e8:4e:6c:02:c8:da:dc:b3:2b:a3: + b9:7e:c6:dc:06:94:9b:0c:ea:fc:7e:02:d3:3f:d2: + 87:30:da:c4:41:1a:5f:1f:89:c9:6f:39:96:e5:fd: + 3a:c9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 0A:36:4B:AA:5E:42:C2:6B:CE:3C:58:0C:33:53:9B:ED:09:42:89:B9 + X509v3 Authority Key Identifier: + keyid:A4:A1:01:1C:8F:94:62:C3:11:19:36:76:04:DC:A9:AF:6F:B6:11:9C + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: ecdsa-with-SHA256 + 30:64:02:30:3b:0e:cc:c2:70:77:25:fe:01:46:fb:e7:fe:ee: + 68:07:50:f1:14:b8:9a:6f:53:bb:1f:4f:7f:ba:62:d2:76:06: + 4b:d4:93:8a:1b:f6:3c:96:91:8c:57:90:a2:99:5d:0b:02:30: + 3e:98:92:c5:01:13:f9:d4:21:bc:44:14:a6:9b:b9:8e:f0:86: + ec:67:c8:12:07:74:41:8c:f0:f3:e8:b7:cc:e3:23:a0:a1:05: + 2f:66:73:be:62:9b:1c:ce:70:fe:eb:09 +-----BEGIN CERTIFICATE----- +MIIC6zCCAnKgAwIBAgIBATAKBggqhkjOPQQDAjAXMRUwEwYDVQQDDAxJbnRlcm1l +ZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYDVQQD +DAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD1FYJbW++Y +/WOzWwicIYu+EPE6qxfo8pw3JIBBaodxHZrqw6b3JeMJAz+SLuG8nv1wZekpIU9G +ARIg4gjZvYZAXT25asWtP9yCAHV72iahyUnytTBsQAeUxvRBH4g614mrhnlQzIWO +9qT8ewNwdB5uCZj/tIrqwMHjB/+N+Oi89f1uqtv8Ji5EvVLjZvVYbeoMMBntj9vN +H0AgLzY112O11yzoS9PikIIvJ00iipTj+8dAd+LgVsdwtq6b6Xz6tdBANN0LWZYN +uoRHh2LBPh8hWzsVVjqL6E5sAsja3LMro7l+xtwGlJsM6vx+AtM/0ocw2sRBGl8f +iclvOZbl/TrJAgMBAAGjgekwgeYwHQYDVR0OBBYEFAo2S6peQsJrzjxYDDNTm+0J +Qom5MB8GA1UdIwQYMBaAFKShARyPlGLDERk2dgTcqa9vthGcMD8GCCsGAQUFBwEB +BDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVkaWFy +eS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0ludGVy +bWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMB +BggrBgEFBQcDAjAKBggqhkjOPQQDAgNnADBkAjA7DszCcHcl/gFG++f+7mgHUPEU +uJpvU7sfT3+6YtJ2BkvUk4ob9jyWkYxXkKKZXQsCMD6YksUBE/nUIbxEFKabuY7w +huxnyBIHdEGM8PPot8zjI6ChBS9mc75imxzOcP7rCQ== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (384 bit) + pub: + 04:ca:bc:6c:d5:4b:51:ef:d3:7d:8a:46:12:ab:5f: + d4:f3:3c:7d:eb:40:8b:de:0f:79:6d:6f:a4:40:0f: + 96:51:8a:00:20:48:7a:d3:d4:30:2e:5b:1d:9f:e1: + 00:3e:54:cb:93:62:21:7c:09:57:2e:43:38:08:77: + 5c:1c:8b:aa:17:c1:22:c0:db:01:bf:c0:80:0a:24: + 68:0d:2d:ce:51:e4:a3:2a:c9:42:0b:7c:57:82:31: + 94:2f:b7:a8:42:9c:4e + ASN1 OID: secp384r1 + X509v3 extensions: + X509v3 Subject Key Identifier: + A4:A1:01:1C:8F:94:62:C3:11:19:36:76:04:DC:A9:AF:6F:B6:11:9C + X509v3 Authority Key Identifier: + keyid:E9:AC:73:09:B6:86:CD:95:42:29:5D:E5:EC:C7:99:29:12:91:8C:53 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 22:50:e8:71:34:bf:8b:44:c5:4e:82:31:fd:50:48:f4:fa:3a: + 01:4a:f9:71:a6:a9:a2:d0:1e:bc:d3:1d:dc:ac:8f:4e:db:58: + 8a:6b:a2:64:29:6e:f5:1b:0b:87:2e:f5:bd:dd:92:7a:5f:4e: + a6:aa:1d:b4:7c:f2:eb:5a:2b:17:83:99:29:1f:2b:12:45:9b: + 1a:cd:d3:b1:71:a3:d9:7d:cf:78:f4:64:ce:03:a5:0b:c7:98: + e8:73:58:e2:26:47:5c:c0:ed:ac:c0:11:b8:39:11:19:39:fc: + 01:b6:4c:a2:f5:4a:ae:a3:9e:3c:82:73:3e:b5:2c:28:63:ec: + 14:a2:9f:a7:d7:4b:3e:f3:56:50:f6:9e:87:9b:d1:38:fa:78: + 2e:7f:29:fe:4a:a8:d6:43:c4:05:d6:d6:67:7f:52:90:36:53: + ff:a6:78:1f:7f:f7:ad:66:65:7d:4b:57:3c:d6:b3:19:9d:08: + af:d2:5b:1a:76:42:ff:b2:6b:2c:0d:d1:1d:05:c0:d8:28:02: + 9b:cb:f6:1d:7a:35:93:b9:c9:76:2d:d3:ef:f4:07:bf:d6:8b: + 33:2a:83:69:8a:68:63:0a:b9:45:f6:e4:12:38:37:87:d6:53: + 46:33:ae:f8:72:d3:e5:e9:93:bb:ba:db:8d:73:01:b1:79:0f: + d8:1c:a0:d0 +-----BEGIN CERTIFICATE----- +MIICvzCCAaegAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEyrxs1UtR79N9ikYSq1/U +8zx960CL3g95bW+kQA+WUYoAIEh609QwLlsdn+EAPlTLk2IhfAlXLkM4CHdcHIuq +F8EiwNsBv8CACiRoDS3OUeSjKslCC3xXgjGUL7eoQpxOo4HLMIHIMB0GA1UdDgQW +BBSkoQEcj5RiwxEZNnYE3Kmvb7YRnDAfBgNVHSMEGDAWgBTprHMJtobNlUIpXeXs +x5kpEpGMUzA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwt +Zm9yLWFpYS9Sb290LmNlcjAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZv +ci1jcmwvUm9vdC5jcmwwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQELBQADggEBACJQ6HE0v4tExU6CMf1QSPT6OgFK+XGmqaLQHrzT +Hdysj07bWIpromQpbvUbC4cu9b3dknpfTqaqHbR88utaKxeDmSkfKxJFmxrN07Fx +o9l9z3j0ZM4DpQvHmOhzWOImR1zA7azAEbg5ERk5/AG2TKL1Sq6jnjyCcz61LChj +7BSin6fXSz7zVlD2noeb0Tj6eC5/Kf5KqNZDxAXW1md/UpA2U/+meB9/961mZX1L +VzzWsxmdCK/SWxp2Qv+yaywN0R0FwNgoApvL9h16NZO5yXYt0+/0B7/WizMqg2mK +aGMKuUX25BI4N4fWU0Yzrvhy0+Xpk7u6241zAbF5D9gcoNA= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b8:3c:af:88:6d:5e:96:7e:58:90:09:5d:40:54: + 11:4f:55:ff:bb:e7:94:1b:ba:d7:df:b9:47:c3:ff: + 84:71:22:da:a8:89:e6:98:71:4b:ae:d8:c1:19:df: + 4f:69:bf:c2:3d:da:0a:a8:65:08:a8:c3:2c:aa:34: + c7:a2:b9:00:45:6f:2e:69:6e:90:ee:9b:a2:f6:20: + 0d:75:17:c2:33:e0:59:2c:7d:d6:3d:23:34:0e:e6: + e0:49:74:3b:21:04:9f:6b:25:92:1a:2e:0f:e5:4a: + 0a:96:85:0d:69:dc:ab:31:23:19:b7:d0:54:e6:18: + c6:a1:ef:c6:e1:8b:da:a4:c2:78:7a:61:19:d7:83: + 5f:81:34:37:3e:1a:e2:b4:56:64:eb:db:af:7c:83: + c7:67:58:f1:69:c4:02:3a:05:1c:d9:56:5c:32:32: + bd:a7:e9:5f:82:b3:bb:1e:a6:e8:9c:86:86:ee:de: + 9b:19:d7:19:4f:89:cf:98:76:81:6d:dc:10:7d:d3: + 92:b8:7b:0d:c8:2f:2d:fc:ee:d7:68:fb:d5:87:7e: + 64:9a:32:73:57:58:5b:31:fc:da:d3:2c:2c:22:1d: + d6:db:71:a6:58:0b:84:0d:28:de:82:ad:d1:4e:2c: + 4b:b4:df:1d:78:34:59:52:a3:16:bd:0b:77:26:4d: + 4b:6f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + E9:AC:73:09:B6:86:CD:95:42:29:5D:E5:EC:C7:99:29:12:91:8C:53 + X509v3 Authority Key Identifier: + keyid:E9:AC:73:09:B6:86:CD:95:42:29:5D:E5:EC:C7:99:29:12:91:8C:53 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 76:62:2d:4c:94:4e:63:cb:7f:35:52:08:e2:8a:f3:d1:03:55: + 31:f4:e8:e0:79:68:23:f0:19:d5:7f:b2:dd:27:0a:a2:bb:6c: + f3:85:ae:48:83:3c:37:7e:62:69:e9:af:e0:4d:60:f0:8b:bf: + 1b:2c:da:90:10:fc:8c:83:b1:55:46:a6:fe:d1:d1:21:6f:91: + e1:cc:d6:c6:8c:1e:b1:03:e5:d7:5b:5f:3c:a7:2d:16:a1:71: + 54:e1:8a:4b:62:61:18:42:b1:f4:ec:6e:33:5a:3b:52:2a:8e: + 1a:60:75:73:89:78:72:86:9f:42:82:e5:d7:0e:5c:ce:36:a7: + 2d:8e:78:0a:e9:95:2d:72:d2:42:6f:b6:7c:7e:28:29:2d:85: + 3c:46:ab:6f:04:a8:f4:a2:ec:c4:24:7e:7a:a9:96:ec:b3:49: + 8b:ec:2a:00:88:c0:a6:50:01:a5:f0:df:ef:1c:6c:f8:bf:8e: + 64:ab:ff:43:bf:05:ce:82:b6:d4:cc:30:47:d8:74:7f:4e:4c: + dc:cc:a6:92:e3:96:37:97:b1:03:27:93:38:62:4d:b7:ae:fe: + a2:2b:61:05:32:27:28:27:c3:1f:e9:50:91:0a:4a:4b:ca:a3: + b0:8e:d4:56:30:ad:e8:76:49:e4:0e:36:83:15:22:8a:bc:59: + 27:1c:62:f3 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALg8r4htXpZ+WJAJXUBU +EU9V/7vnlBu619+5R8P/hHEi2qiJ5phxS67YwRnfT2m/wj3aCqhlCKjDLKo0x6K5 +AEVvLmlukO6bovYgDXUXwjPgWSx91j0jNA7m4El0OyEEn2slkhouD+VKCpaFDWnc +qzEjGbfQVOYYxqHvxuGL2qTCeHphGdeDX4E0Nz4a4rRWZOvbr3yDx2dY8WnEAjoF +HNlWXDIyvafpX4Kzux6m6JyGhu7emxnXGU+Jz5h2gW3cEH3Tkrh7DcgvLfzu12j7 +1Yd+ZJoyc1dYWzH82tMsLCId1ttxplgLhA0o3oKt0U4sS7TfHXg0WVKjFr0LdyZN +S28CAwEAAaOByzCByDAdBgNVHQ4EFgQU6axzCbaGzZVCKV3l7MeZKRKRjFMwHwYD +VR0jBBgwFoAU6axzCbaGzZVCKV3l7MeZKRKRjFMwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB2Yi1MlE5j +y381UgjiivPRA1Ux9OjgeWgj8BnVf7LdJwqiu2zzha5Igzw3fmJp6a/gTWDwi78b +LNqQEPyMg7FVRqb+0dEhb5HhzNbGjB6xA+XXW188py0WoXFU4YpLYmEYQrH07G4z +WjtSKo4aYHVziXhyhp9CguXXDlzONqctjngK6ZUtctJCb7Z8figpLYU8RqtvBKj0 +ouzEJH56qZbss0mL7CoAiMCmUAGl8N/vHGz4v45kq/9DvwXOgrbUzDBH2HR/Tkzc +zKaS45Y3l7EDJ5M4Yk23rv6iK2EFMicoJ8Mf6VCRCkpLyqOwjtRWMK3odknkDjaD +FSKKvFknHGLz +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +U1VDQ0VTUw== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem b/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem new file mode 100644 index 0000000..dd82071 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem
@@ -0,0 +1,280 @@ +[Created by: generate-target-signed-with-md5.py] + +Certificate chain with an intermediary that uses MD5 to sign the target +certificate. This is expected to fail because MD5 is too weak. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: md5WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c5:55:ac:42:f6:5f:21:93:e6:93:07:6a:dc:a0: + 4c:66:21:42:8c:2e:f4:d0:61:30:ac:bf:9a:3b:b3: + 59:21:e4:29:9f:33:5d:5e:6f:a1:de:4d:c2:b3:22: + f3:16:0a:81:f0:51:90:f8:45:e0:5e:9b:7d:3a:e4: + 60:d2:a8:a1:b1:2f:13:8c:41:dc:c3:58:1d:66:6c: + 67:13:5e:21:51:f7:49:21:5d:29:dd:91:fd:a7:36: + 10:bb:d1:30:71:16:ee:4b:7f:1b:ba:02:c3:79:0c: + 4d:e7:98:59:b1:0f:c8:61:a3:f9:5c:fa:03:08:29: + 41:af:60:50:b8:80:3b:f6:fe:75:0f:bb:d4:92:d9: + f5:3a:25:41:12:f1:cd:ad:2c:08:c9:f9:a3:17:78: + 86:2a:18:13:b1:20:15:83:de:04:ac:2a:c6:42:5c: + d1:f9:e6:12:1c:1b:51:7a:2c:cd:40:94:c8:76:17: + d7:20:4a:f8:e4:c8:3c:57:7c:c8:c6:6d:bd:2a:5e: + a9:03:7e:14:9d:a5:4e:1f:b1:aa:94:2f:64:34:6e: + d1:cb:5f:41:84:f7:86:95:04:90:ce:77:27:f6:7d: + 8e:5b:9c:52:7a:5e:dd:e2:f6:e6:fd:10:8d:e2:7d: + 34:f0:54:1b:c2:54:45:fe:01:97:90:f7:33:03:db: + 0c:bd + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + DF:16:6B:0E:36:1E:E4:F1:15:A2:3A:9E:07:4A:F9:6D:81:82:7A:D5 + X509v3 Authority Key Identifier: + keyid:E2:CD:39:61:AF:F5:B9:CE:D9:7C:36:97:5D:28:36:61:63:0B:CA:49 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: md5WithRSAEncryption + 35:9f:32:4a:5f:2e:b6:3f:d4:03:97:8f:0d:70:8b:5a:8d:62: + 30:77:44:37:e0:85:5f:e8:fc:8a:f6:e2:cb:df:05:f3:08:2d: + 05:dc:bb:16:1f:69:06:2e:4b:2b:1b:6f:a1:b3:77:02:1e:7d: + 49:da:a0:d9:6a:ac:bd:5e:4d:65:10:51:ee:e6:2a:33:e5:b9: + b5:5b:83:67:3d:c1:9d:c5:a6:c4:6e:7b:3b:ad:88:02:dc:ef: + 98:c4:cf:1d:cc:ab:45:23:53:27:ee:7f:87:f4:e6:13:5a:3a: + 3d:30:1e:66:b7:6e:67:e7:ae:1b:c6:4e:26:14:0f:cf:71:8a: + 0c:ee:60:14:25:45:a1:4b:2f:46:73:41:11:59:9f:e7:9f:12: + 01:7e:dc:e4:68:96:31:a5:c0:cc:03:fc:e3:b0:c5:c2:65:57: + ef:48:a4:85:eb:6e:d9:95:2f:d8:b1:48:46:b1:d5:30:84:d6: + c0:aa:32:41:a2:8a:be:35:b4:97:e5:1d:f7:36:f4:47:36:68: + f9:6b:10:39:1f:13:e8:b3:f5:7c:57:71:df:a8:e8:40:28:ed: + 65:3a:ba:7a:98:fa:4d:14:e9:5e:f5:a3:92:03:aa:d5:0b:72: + 29:7e:30:80:03:40:b9:eb:72:e2:ac:43:3a:2c:f6:c9:a3:13: + c7:c9:05:b9 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQQFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFVaxC +9l8hk+aTB2rcoExmIUKMLvTQYTCsv5o7s1kh5CmfM11eb6HeTcKzIvMWCoHwUZD4 +ReBem3065GDSqKGxLxOMQdzDWB1mbGcTXiFR90khXSndkf2nNhC70TBxFu5Lfxu6 +AsN5DE3nmFmxD8hho/lc+gMIKUGvYFC4gDv2/nUPu9SS2fU6JUES8c2tLAjJ+aMX +eIYqGBOxIBWD3gSsKsZCXNH55hIcG1F6LM1AlMh2F9cgSvjkyDxXfMjGbb0qXqkD +fhSdpU4fsaqUL2Q0btHLX0GE94aVBJDOdyf2fY5bnFJ6Xt3i9ub9EI3ifTTwVBvC +VEX+AZeQ9zMD2wy9AgMBAAGjgekwgeYwHQYDVR0OBBYEFN8Waw42HuTxFaI6ngdK ++W2BgnrVMB8GA1UdIwQYMBaAFOLNOWGv9bnO2Xw2l10oNmFjC8pJMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQQFAAOCAQEANZ8ySl8utj/UA5ePDXCL +Wo1iMHdEN+CFX+j8ivbiy98F8wgtBdy7Fh9pBi5LKxtvobN3Ah59Sdqg2WqsvV5N +ZRBR7uYqM+W5tVuDZz3BncWmxG57O62IAtzvmMTPHcyrRSNTJ+5/h/TmE1o6PTAe +ZrduZ+euG8ZOJhQPz3GKDO5gFCVFoUsvRnNBEVmf558SAX7c5GiWMaXAzAP847DF +wmVX70ikhetu2ZUv2LFIRrHVMITWwKoyQaKKvjW0l+Ud9zb0RzZo+WsQOR8T6LP1 +fFdx36joQCjtZTq6epj6TRTpXvWjkgOq1QtyKX4wgANAuety4qxDOiz2yaMTx8kF +uQ== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b0:67:b9:ee:01:e6:50:d2:01:11:81:3a:70:41: + c3:36:af:95:28:11:ed:90:02:37:9a:f9:fe:23:38: + d6:72:c5:38:da:62:a4:84:dc:50:12:0e:03:e2:34: + 4d:d8:88:b7:aa:09:31:14:71:b5:e5:f9:80:06:c5: + 72:8a:1a:dd:72:a8:c9:76:79:3b:14:34:0a:bc:7a: + d4:a6:75:58:c0:f1:77:d7:23:bb:5b:a1:54:d2:cf: + ec:0f:b7:ab:53:01:7d:1d:54:40:68:12:fb:75:68: + 56:d5:0d:5c:00:de:81:5f:a5:14:fd:5d:77:b8:1f: + 3e:ee:84:99:a5:b5:0d:13:9a:fe:cf:b8:b0:e1:4c: + db:87:64:e1:36:a0:04:02:5d:fd:58:9e:e5:70:85: + 63:65:50:93:b8:3e:6c:85:10:67:bc:3d:e2:77:38: + b2:75:b5:e3:57:55:b2:44:68:3c:ab:65:2b:cb:8b: + 11:29:d5:7c:b8:24:88:25:d1:80:0b:04:3f:0e:e9: + 1d:79:db:39:7d:ab:81:67:fb:cf:ae:a3:da:ea:f1: + 12:ac:cd:87:96:5c:ed:fd:db:bc:e2:3a:4e:33:05: + af:1a:d3:03:85:ec:74:23:04:12:7e:62:a1:56:4c: + 45:9c:95:80:55:b6:2f:13:82:27:24:c4:a0:68:33: + e6:71 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + E2:CD:39:61:AF:F5:B9:CE:D9:7C:36:97:5D:28:36:61:63:0B:CA:49 + X509v3 Authority Key Identifier: + keyid:BD:2A:00:54:BB:89:72:89:4F:27:75:12:AA:89:38:AB:A0:06:F7:D1 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 3d:9a:bd:e5:a7:4d:e4:0e:ea:6a:34:da:9e:48:c7:8a:e4:34: + 6c:19:fe:d0:2f:2f:7b:01:14:46:3a:45:d7:a7:46:6e:83:bb: + 54:cc:4e:af:cf:ef:fc:6d:90:e4:54:38:94:2d:cb:55:85:bd: + 1d:9f:9e:cd:ac:68:b3:7f:ed:bb:1f:30:30:14:15:ba:17:e4: + 62:db:6b:70:5a:1f:c2:e7:43:c6:30:d0:0f:be:78:06:4e:09: + 0b:00:96:63:d2:14:84:93:88:5d:e6:bf:93:1c:e9:18:9d:df: + 7d:db:34:39:e5:94:f8:c9:84:b6:ff:a0:e7:5c:51:5e:ba:40: + 82:5a:7e:64:ca:bf:e3:0e:c8:76:0b:5c:be:29:b1:62:79:18: + b2:d6:c3:ee:d0:05:61:96:be:a8:dc:c5:65:72:cc:f7:f8:6e: + 27:85:c3:9b:68:6d:3d:a5:e5:34:20:ff:19:12:62:7c:5d:b8: + 95:8f:a8:a8:a8:90:41:e0:83:f1:e3:3f:67:26:bc:b1:6c:76: + b1:5e:25:60:49:7d:78:bf:bb:11:22:43:ac:d3:5f:c0:c9:73: + 76:d5:9c:97:b0:ec:17:36:0d:4b:83:3e:77:d0:84:62:76:98: + af:6d:42:ac:cb:40:bb:04:1d:9e:0a:a3:97:11:f2:b0:3f:6b: + b6:fd:ff:da +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsGe57gHm +UNIBEYE6cEHDNq+VKBHtkAI3mvn+IzjWcsU42mKkhNxQEg4D4jRN2Ii3qgkxFHG1 +5fmABsVyihrdcqjJdnk7FDQKvHrUpnVYwPF31yO7W6FU0s/sD7erUwF9HVRAaBL7 +dWhW1Q1cAN6BX6UU/V13uB8+7oSZpbUNE5r+z7iw4Uzbh2ThNqAEAl39WJ7lcIVj +ZVCTuD5shRBnvD3idziydbXjV1WyRGg8q2Ury4sRKdV8uCSIJdGACwQ/Dukdeds5 +fauBZ/vPrqPa6vESrM2Hllzt/du84jpOMwWvGtMDhex0IwQSfmKhVkxFnJWAVbYv +E4InJMSgaDPmcQIDAQABo4HLMIHIMB0GA1UdDgQWBBTizTlhr/W5ztl8NpddKDZh +YwvKSTAfBgNVHSMEGDAWgBS9KgBUu4lyiU8ndRKqiTiroAb30TA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AD2aveWnTeQO6mo02p5Ix4rkNGwZ/tAvL3sBFEY6RdenRm6Du1TMTq/P7/xtkORU +OJQty1WFvR2fns2saLN/7bsfMDAUFboX5GLba3BaH8LnQ8Yw0A++eAZOCQsAlmPS +FISTiF3mv5Mc6Rid333bNDnllPjJhLb/oOdcUV66QIJafmTKv+MOyHYLXL4psWJ5 +GLLWw+7QBWGWvqjcxWVyzPf4bieFw5tobT2l5TQg/xkSYnxduJWPqKiokEHgg/Hj +P2cmvLFsdrFeJWBJfXi/uxEiQ6zTX8DJc3bVnJew7Bc2DUuDPnfQhGJ2mK9tQqzL +QLsEHZ4Ko5cR8rA/a7b9/9o= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a0:9b:ff:8c:74:7b:c9:1e:3c:34:5b:7c:c0:35: + a4:88:6a:26:ed:0b:52:e9:58:e6:b5:bd:fd:f6:ae: + 0f:08:09:24:ef:62:fb:1c:61:7f:8a:ca:5f:d4:b5: + 2b:45:c2:21:1f:1a:a1:ef:f9:d8:0d:be:31:88:bd: + d7:35:8e:0d:de:e8:be:60:63:f6:3c:6a:cd:e7:1d: + 78:36:86:91:a1:e9:5c:2d:c6:9a:95:b9:e7:c3:66: + 6f:b5:0c:4b:aa:9a:51:ea:b3:a3:9e:57:d6:17:c9: + ae:4c:3f:32:ef:28:5a:99:6a:dc:50:54:f5:cc:80: + 51:76:6c:50:4d:52:01:45:92:af:a2:ca:a7:c1:9e: + 76:24:29:9c:d1:73:95:0a:a1:16:73:0f:56:9d:e8: + fe:c2:bb:e4:64:99:a3:d4:46:7d:7a:f7:25:d3:49: + c0:da:38:18:78:9c:2a:40:60:c2:b8:98:8a:84:ed: + d2:84:e0:39:a6:31:64:36:2a:59:ca:ba:dc:c2:6d: + a2:ac:1a:93:58:27:76:95:ea:5d:12:8d:7a:a5:b6: + 50:3b:1c:25:3f:75:ee:eb:db:12:78:67:47:0d:86: + 49:77:ce:f5:d0:37:03:55:eb:98:93:bf:f1:10:5b: + 87:aa:a1:ef:76:30:e1:e4:77:54:b1:52:e8:c9:81: + 4d:5b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + BD:2A:00:54:BB:89:72:89:4F:27:75:12:AA:89:38:AB:A0:06:F7:D1 + X509v3 Authority Key Identifier: + keyid:BD:2A:00:54:BB:89:72:89:4F:27:75:12:AA:89:38:AB:A0:06:F7:D1 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 43:7c:24:ea:dc:11:3a:08:d7:6e:dd:8c:b9:21:1a:d7:88:d8: + f1:4c:90:a0:b7:67:a7:3c:d2:8d:a4:68:50:34:db:a4:f1:69: + d4:e0:8b:4c:b3:39:62:11:b5:4a:df:3a:60:87:eb:f6:79:2c: + ef:4d:67:91:93:5f:b3:d1:63:1b:2e:12:74:4e:e2:60:d8:c1: + 1f:e8:b2:5d:d4:56:2d:85:27:64:36:b0:e4:17:5e:d1:9c:ce: + 56:e2:f4:68:d3:80:6f:44:d6:e4:7b:5b:c6:5e:3e:ea:69:9d: + 97:4b:0d:83:3b:a7:52:f5:78:96:9f:af:15:e2:bf:59:a7:5f: + 5b:d4:21:d1:49:b2:f4:b5:26:b1:b1:cf:74:d0:ba:26:b1:2e: + 0e:ef:74:29:ed:f5:35:18:2f:cc:8b:80:39:41:8f:ea:ab:81: + 6a:89:71:b8:22:e6:bc:e5:33:34:f7:dd:6c:37:0a:e1:21:a7: + 7f:2d:29:f6:aa:02:d8:47:3f:a6:3d:0e:85:20:59:f8:5f:49: + 06:f7:3a:9a:b8:d9:3a:08:ce:9a:60:aa:dd:72:07:1e:bb:8f: + 86:fd:6a:3e:dc:4a:3f:5e:c2:b7:e6:0e:89:75:08:89:e3:bf: + 2b:6c:cc:02:63:e0:1c:04:21:79:64:c0:7c:89:73:2b:e9:85: + 49:80:5e:f4 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKCb/4x0e8kePDRbfMA1 +pIhqJu0LUulY5rW9/fauDwgJJO9i+xxhf4rKX9S1K0XCIR8aoe/52A2+MYi91zWO +Dd7ovmBj9jxqzecdeDaGkaHpXC3GmpW558Nmb7UMS6qaUeqzo55X1hfJrkw/Mu8o +Wplq3FBU9cyAUXZsUE1SAUWSr6LKp8GediQpnNFzlQqhFnMPVp3o/sK75GSZo9RG +fXr3JdNJwNo4GHicKkBgwriYioTt0oTgOaYxZDYqWcq63MJtoqwak1gndpXqXRKN +eqW2UDscJT917uvbEnhnRw2GSXfO9dA3A1XrmJO/8RBbh6qh73Yw4eR3VLFS6MmB +TVsCAwEAAaOByzCByDAdBgNVHQ4EFgQUvSoAVLuJcolPJ3USqok4q6AG99EwHwYD +VR0jBBgwFoAUvSoAVLuJcolPJ3USqok4q6AG99EwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBDfCTq3BE6 +CNdu3Yy5IRrXiNjxTJCgt2enPNKNpGhQNNuk8WnU4ItMszliEbVK3zpgh+v2eSzv +TWeRk1+z0WMbLhJ0TuJg2MEf6LJd1FYthSdkNrDkF17RnM5W4vRo04BvRNbke1vG +Xj7qaZ2XSw2DO6dS9XiWn68V4r9Zp19b1CHRSbL0tSaxsc900LomsS4O73Qp7fU1 +GC/Mi4A5QY/qq4FqiXG4Iua85TM0991sNwrhIad/LSn2qgLYRz+mPQ6FIFn4X0kG +9zqauNk6CM6aYKrdcgceu4+G/Wo+3Eo/XsK35g6JdQiJ478rbMwCY+AcBCF5ZMB8 +iXMr6YVJgF70 +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem b/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem new file mode 100644 index 0000000..f02ac62 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem
@@ -0,0 +1,284 @@ +[Created by: ./generate-target-unknown-critical-extension.py] + +Certificate chain with 1 intermediary and a trusted root. The intermediary +has an unknown X.509v3 extension (OID=1.2.3.4) that is marked as critical. +Verifying this certificate chain is expected to fail because there is an +unrecognized critical extension. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c9:42:1d:0f:19:4b:d8:78:b9:3f:4d:43:a8:a9: + 92:67:ed:f3:55:a4:f5:9e:f4:d0:21:3c:25:cc:28: + 1d:db:22:5c:c0:eb:e8:78:fe:6c:71:72:ed:0c:cd: + 76:80:44:dc:72:d1:92:29:7d:e8:7f:e0:42:60:d6: + cb:b1:53:06:0d:6c:8b:f4:d3:ce:42:af:34:bc:57: + 63:34:dd:b2:00:26:3f:a9:7f:c8:ce:f6:1a:66:75: + db:7c:b6:57:ef:ee:3d:e7:d7:b8:38:3a:83:5d:7a: + 63:1f:91:c4:f1:15:da:9b:e9:f7:ef:d5:d6:26:16: + 96:c1:94:55:3f:3e:67:13:26:bf:3d:0c:93:ab:1b: + a2:58:10:38:60:11:18:15:c5:3c:db:71:62:ef:27: + 1f:a9:62:61:1f:f6:55:51:d9:7c:2d:b6:e3:2d:c3: + 86:2b:cd:5c:30:d3:a0:0d:a4:e4:34:fb:bb:59:09: + d5:7b:8f:b2:49:10:0d:d7:2d:0e:34:72:25:7b:b4: + 0e:e9:fd:cb:ce:50:ee:d2:71:40:14:3d:06:ad:71: + 52:43:cc:e9:77:4e:c4:8c:af:8c:a2:41:40:4a:82: + 82:83:a2:58:e3:5e:40:fa:74:f0:fb:bd:46:aa:55: + 9d:6d:5b:db:af:6a:1f:7c:46:cf:1a:1f:d3:17:c3: + 02:2f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 07:DB:E2:A1:15:3D:67:0C:54:ED:D5:22:AD:DE:59:73:9E:0F:F5:24 + X509v3 Authority Key Identifier: + keyid:07:D2:5E:3F:28:F7:AD:46:16:25:D0:4D:DD:6D:77:7B:26:81:89:85 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + 1.2.3.4: critical + .... + Signature Algorithm: sha256WithRSAEncryption + 66:78:33:4b:09:c3:20:05:e2:d2:a3:7f:90:2f:96:15:b8:d0: + ca:7e:97:c6:12:53:4b:18:92:03:77:b6:2c:8b:57:8e:84:7d: + 14:ee:df:cc:99:0d:f9:2e:21:dd:ca:4d:00:77:87:88:4d:13: + 28:36:4a:88:82:52:d2:b8:1d:75:67:1f:b5:0a:ea:bd:6a:b8: + 98:79:ea:cf:6e:2c:5f:21:94:e4:a9:29:d5:37:87:58:6a:d7: + 5b:0b:f5:35:59:c9:68:dd:f9:e7:c6:67:1a:ef:26:17:cf:89: + e7:18:8c:be:41:c4:07:d3:b7:1a:20:44:4f:20:12:8c:2e:5a: + 39:7c:8b:f3:12:f7:bd:b6:f1:7b:8c:48:7f:c5:29:7f:7a:9e: + 1e:28:13:08:36:56:ca:8d:17:f2:37:ce:59:0a:e7:ca:19:90: + c7:c8:b4:45:ab:3b:f7:0e:10:db:81:4b:2d:74:05:46:ab:5c: + 7e:c2:88:83:87:09:4d:5a:a3:40:56:f5:d5:da:fd:a2:2d:99: + 8c:d1:bf:0b:d0:8c:ce:79:12:0c:37:fc:b2:08:68:b2:fe:5e: + cc:3e:99:85:40:74:27:88:7f:f6:43:0f:60:dd:b7:6e:31:e3: + d4:39:87:8e:b1:cf:2d:b7:2f:bb:f9:ec:f8:86:96:1e:fc:68: + 0d:45:21:2c +-----BEGIN CERTIFICATE----- +MIIDnTCCAoWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJQh0P +GUvYeLk/TUOoqZJn7fNVpPWe9NAhPCXMKB3bIlzA6+h4/mxxcu0MzXaARNxy0ZIp +feh/4EJg1suxUwYNbIv0085CrzS8V2M03bIAJj+pf8jO9hpmddt8tlfv7j3n17g4 +OoNdemMfkcTxFdqb6ffv1dYmFpbBlFU/PmcTJr89DJOrG6JYEDhgERgVxTzbcWLv +Jx+pYmEf9lVR2XwttuMtw4YrzVww06ANpOQ0+7tZCdV7j7JJEA3XLQ40ciV7tA7p +/cvOUO7ScUAUPQatcVJDzOl3TsSMr4yiQUBKgoKDoljjXkD6dPD7vUaqVZ1tW9uv +ah98Rs8aH9MXwwIvAgMBAAGjgfkwgfYwHQYDVR0OBBYEFAfb4qEVPWcMVO3VIq3e +WXOeD/UkMB8GA1UdIwQYMBaAFAfSXj8o961GFiXQTd1td3smgYmFMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjAOBgMqAwQBAf8EBAECAwQwDQYJKoZIhvcNAQELBQADggEB +AGZ4M0sJwyAF4tKjf5AvlhW40Mp+l8YSU0sYkgN3tiyLV46EfRTu38yZDfkuId3K +TQB3h4hNEyg2SoiCUtK4HXVnH7UK6r1quJh56s9uLF8hlOSpKdU3h1hq11sL9TVZ +yWjd+efGZxrvJhfPiecYjL5BxAfTtxogRE8gEowuWjl8i/MS97228XuMSH/FKX96 +nh4oEwg2VsqNF/I3zlkK58oZkMfItEWrO/cOENuBSy10BUarXH7CiIOHCU1ao0BW +9dXa/aItmYzRvwvQjM55Egw3/LIIaLL+Xsw+mYVAdCeIf/ZDD2Ddt24x49Q5h46x +zy23L7v57PiGlh78aA1FISw= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e1:3b:e0:9e:b3:37:a6:d2:5d:5a:cf:1d:6c:d4: + e7:9d:92:0e:29:b6:da:7e:48:32:ea:dd:a8:6e:a5: + 4f:d4:07:23:be:f5:b2:e2:e9:57:1b:a1:bc:67:5a: + 27:15:9d:f7:51:07:23:d9:0a:0f:21:36:4b:b1:c3: + 48:71:f5:f8:67:6f:a4:9c:54:8b:e8:d2:79:da:6e: + 70:06:b8:ae:b5:6f:82:ab:89:5a:68:19:56:c7:8a: + 93:25:f9:4b:7e:8b:de:2f:1a:92:c4:be:c4:9f:ea: + 34:fe:95:f5:74:ab:fc:47:8b:34:7d:28:d3:7a:7b: + 29:70:3e:aa:b9:d9:be:53:fe:79:3a:ea:79:c7:d7: + 1d:b1:c3:47:e6:7d:8e:ed:40:2a:47:d9:71:5f:c2: + 6c:cb:52:be:1b:83:01:de:06:97:d4:98:ea:37:67: + f6:fb:67:69:c7:b1:fe:07:ad:be:0a:f8:c8:a8:5d: + 98:0b:f6:02:7b:cb:19:f6:23:58:79:f9:d3:8c:a5: + 09:73:c9:2b:ae:76:33:3f:2d:a9:49:93:39:89:92: + bc:5e:27:1c:ae:a6:29:43:97:a1:04:d0:6c:b6:b6: + b8:c3:62:5e:43:7c:ca:27:50:e2:91:da:bb:cc:c6: + e5:7b:5a:31:62:77:a6:4d:6a:ee:84:ea:7a:87:de: + a9:bd + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 07:D2:5E:3F:28:F7:AD:46:16:25:D0:4D:DD:6D:77:7B:26:81:89:85 + X509v3 Authority Key Identifier: + keyid:C8:0F:45:73:03:B2:2C:B8:35:14:0F:C4:D7:4B:E4:E2:9D:B2:AB:CE + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 2a:af:ec:1b:fc:c9:ad:bf:ad:97:8d:ed:f4:44:87:7f:72:86: + c0:4d:85:dd:eb:6c:d3:c7:17:df:11:0a:f5:e5:2b:c2:53:41: + 58:73:66:da:29:8a:43:af:5e:24:b2:16:26:b6:89:7e:4a:6f: + 46:13:05:c4:3f:13:6c:ed:b8:37:a7:a9:f6:c9:c8:b9:b3:a1: + 7c:eb:99:57:fb:8d:12:c5:47:ff:1e:02:b2:47:dc:e9:6f:41: + 17:0a:3b:ff:ba:14:76:cc:14:35:ec:71:b0:1a:d4:eb:b0:6c: + a3:96:eb:7d:50:59:d7:01:a0:ee:67:b8:c8:b6:ed:78:02:b1: + 0b:72:9c:ea:c3:3b:14:3d:89:fc:89:c2:af:6c:18:ae:b0:13: + 31:04:a2:89:4f:a6:99:58:00:c6:00:e1:39:79:d4:31:0b:0f: + d5:92:86:a2:e7:ec:c6:b8:f2:62:21:bb:0d:d5:91:b8:f2:5f: + db:dc:b1:b2:b2:28:fd:d5:14:54:a6:cf:8d:bd:33:ca:22:27: + 72:d8:27:85:03:21:7f:8e:4f:2d:e6:bf:22:08:86:03:a8:f3: + 9f:42:2f:81:8f:1e:44:39:e3:23:b2:9d:3d:64:7e:e2:b3:93: + 8d:46:a0:b7:08:4e:d5:e6:14:af:1d:5d:b6:74:7c:91:36:37: + 0c:c0:ab:14 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4TvgnrM3 +ptJdWs8dbNTnnZIOKbbafkgy6t2obqVP1AcjvvWy4ulXG6G8Z1onFZ33UQcj2QoP +ITZLscNIcfX4Z2+knFSL6NJ52m5wBriutW+Cq4laaBlWx4qTJflLfoveLxqSxL7E +n+o0/pX1dKv8R4s0fSjTenspcD6qudm+U/55Oup5x9cdscNH5n2O7UAqR9lxX8Js +y1K+G4MB3gaX1JjqN2f2+2dpx7H+B62+CvjIqF2YC/YCe8sZ9iNYefnTjKUJc8kr +rnYzPy2pSZM5iZK8XiccrqYpQ5ehBNBstra4w2JeQ3zKJ1Dikdq7zMble1oxYnem +TWruhOp6h96pvQIDAQABo4HLMIHIMB0GA1UdDgQWBBQH0l4/KPetRhYl0E3dbXd7 +JoGJhTAfBgNVHSMEGDAWgBTID0VzA7IsuDUUD8TXS+TinbKrzjA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +ACqv7Bv8ya2/rZeN7fREh39yhsBNhd3rbNPHF98RCvXlK8JTQVhzZtopikOvXiSy +Fia2iX5Kb0YTBcQ/E2ztuDenqfbJyLmzoXzrmVf7jRLFR/8eArJH3OlvQRcKO/+6 +FHbMFDXscbAa1OuwbKOW631QWdcBoO5nuMi27XgCsQtynOrDOxQ9ifyJwq9sGK6w +EzEEoolPpplYAMYA4Tl51DELD9WShqLn7Ma48mIhuw3VkbjyX9vcsbKyKP3VFFSm +z429M8oiJ3LYJ4UDIX+OTy3mvyIIhgOo859CL4GPHkQ54yOynT1kfuKzk41GoLcI +TtXmFK8dXbZ0fJE2NwzAqxQ= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:dc:6a:1a:05:36:f1:a3:7c:28:e9:97:2f:7b:85: + d5:c1:91:33:0a:72:2d:bb:45:ae:c6:29:54:22:05: + c2:e9:f4:be:f2:39:ec:e0:64:66:1d:e3:c9:42:3e: + 6c:c8:3b:65:0a:e4:2c:74:e4:c9:17:c8:8b:27:6e: + c0:4c:9a:b4:85:ae:ff:3f:e3:1e:d0:21:1c:8b:84: + e0:3b:f6:59:00:a7:ab:59:f3:58:67:d7:af:97:74: + a9:b1:1f:78:80:ad:e3:09:31:81:c2:11:55:10:d0: + 93:ca:eb:de:a7:72:76:09:33:6a:89:f9:51:b1:de: + ca:4a:48:e8:9f:1c:5f:df:bc:7d:a7:f5:27:6b:77: + a3:53:e5:c3:e4:3d:9e:82:72:9e:d2:1b:76:52:8c: + f0:53:b6:98:5f:6c:54:1b:da:9a:72:14:ee:c3:51: + b4:c7:6b:f0:75:b2:2c:6e:b4:b7:29:54:92:ab:69: + 57:af:3c:6d:96:e8:05:c8:a4:d0:7a:c2:42:7d:8b: + 7f:3c:8f:9d:1d:c1:35:af:41:7b:f5:0e:60:88:72: + 90:22:ac:37:2f:7b:b4:47:01:62:b8:fe:73:4b:d2: + 7b:56:8d:b2:37:d3:18:2f:dc:fb:d1:fb:e9:14:19: + b1:d8:76:eb:34:d2:c0:40:a8:22:68:33:44:a7:84: + 90:e1 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + C8:0F:45:73:03:B2:2C:B8:35:14:0F:C4:D7:4B:E4:E2:9D:B2:AB:CE + X509v3 Authority Key Identifier: + keyid:C8:0F:45:73:03:B2:2C:B8:35:14:0F:C4:D7:4B:E4:E2:9D:B2:AB:CE + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 54:39:78:5b:30:97:aa:99:fb:e5:0a:39:27:2a:ea:ad:9f:37: + 3e:aa:5a:b8:c4:51:66:83:6e:36:5c:c3:1b:da:de:cd:a7:6e: + bd:55:47:7c:3e:53:12:6a:51:02:13:c2:98:03:32:b6:5b:d9: + 5e:26:b2:9a:d1:21:ca:39:cd:20:be:ad:d8:3a:23:a2:de:d7: + 18:b2:99:bb:d4:1a:82:43:7c:6e:20:3c:01:f1:22:5f:72:ac: + 43:9a:87:07:37:5d:a8:34:26:19:89:aa:f3:18:e3:ee:c6:67: + 43:49:64:e4:b3:d8:2c:11:8c:f7:8b:48:7f:fd:e1:6b:e9:a5: + 87:55:bf:f1:9d:54:fe:b5:7f:c4:5c:8b:08:cf:4f:47:21:58: + 06:5e:ab:40:be:b7:28:0c:27:55:82:6b:e8:17:5e:dd:f8:79: + 61:f2:7e:18:59:7a:24:7e:e3:08:3c:d9:d1:81:73:36:51:99: + a1:ea:bf:18:ff:94:40:d7:ff:5f:1a:8a:b1:ae:78:c1:91:7b: + 55:1a:d8:b1:91:02:b6:5e:94:32:84:5f:77:f8:89:89:00:5c: + 74:be:77:1b:95:3e:60:2d:6a:67:a3:e9:42:03:51:af:1f:10: + d8:21:6f:36:29:33:72:90:f4:7e:05:17:bb:a5:aa:fb:d6:56: + fc:40:2e:0e +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxqGgU28aN8KOmXL3uF +1cGRMwpyLbtFrsYpVCIFwun0vvI57OBkZh3jyUI+bMg7ZQrkLHTkyRfIiyduwEya +tIWu/z/jHtAhHIuE4Dv2WQCnq1nzWGfXr5d0qbEfeICt4wkxgcIRVRDQk8rr3qdy +dgkzaon5UbHeykpI6J8cX9+8faf1J2t3o1Plw+Q9noJyntIbdlKM8FO2mF9sVBva +mnIU7sNRtMdr8HWyLG60tylUkqtpV688bZboBcik0HrCQn2LfzyPnR3BNa9Be/UO +YIhykCKsNy97tEcBYrj+c0vSe1aNsjfTGC/c+9H76RQZsdh26zTSwECoImgzRKeE +kOECAwEAAaOByzCByDAdBgNVHQ4EFgQUyA9FcwOyLLg1FA/E10vk4p2yq84wHwYD +VR0jBBgwFoAUyA9FcwOyLLg1FA/E10vk4p2yq84wNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBUOXhbMJeq +mfvlCjknKuqtnzc+qlq4xFFmg242XMMb2t7Np269VUd8PlMSalECE8KYAzK2W9le +JrKa0SHKOc0gvq3YOiOi3tcYspm71BqCQ3xuIDwB8SJfcqxDmocHN12oNCYZiarz +GOPuxmdDSWTks9gsEYz3i0h//eFr6aWHVb/xnVT+tX/EXIsIz09HIVgGXqtAvrco +DCdVgmvoF17d+Hlh8n4YWXokfuMIPNnRgXM2UZmh6r8Y/5RA1/9fGoqxrnjBkXtV +GtixkQK2XpQyhF93+ImJAFx0vncblT5gLWpno+lCA1GvHxDYIW82KTNykPR+BRe7 +par71lb8QC4O +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem b/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem new file mode 100644 index 0000000..9d162b0 --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem
@@ -0,0 +1,281 @@ +[Created by: generate-target-wrong-signature.py] + +Certificate chain where the target has an incorrect signature. Everything +else should check out, however the digital signature contained in the target +certificate is wrong. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cd:40:90:3b:6e:2e:d4:5d:a8:08:3e:d4:69:a0: + ec:3b:62:99:ec:81:30:1b:6e:d0:92:8b:bd:df:17: + 3a:fb:ce:bd:2a:32:5b:bb:5e:da:53:6c:b9:3d:4b: + a8:0b:12:41:61:d3:f9:3f:23:b9:71:3f:33:8a:bf: + 57:48:bd:99:e1:5d:c7:99:72:fd:ac:f4:4f:e1:cd: + ca:b8:0c:81:57:64:c5:56:1f:d9:ed:f8:df:c6:60: + 70:82:ee:b5:23:4a:a4:b5:d6:b4:e3:84:74:c9:ca: + da:d7:a7:11:51:c4:56:36:6c:b4:53:0e:35:e5:63: + fa:fd:75:df:72:01:31:17:e9:4d:35:8c:ae:a9:c1: + 3b:ae:ac:06:75:e0:77:2b:36:97:e5:bb:99:34:b6: + dc:f4:11:f6:2f:33:4e:db:4b:73:18:78:51:e6:12: + d1:be:94:2a:02:33:d9:bc:8a:36:dc:12:f0:2f:ae: + 57:4b:66:f0:ba:e6:1b:65:01:de:95:06:63:22:9b: + d0:58:42:55:99:34:06:ec:5a:00:f2:77:ed:71:23: + 24:7d:66:9a:e0:8c:d3:64:91:0a:a6:5b:36:43:36: + e3:07:33:a0:c3:fa:46:9c:3e:81:b2:2c:a6:51:92: + a7:7a:01:cb:95:1a:ea:cf:3c:fa:93:2d:81:5b:29: + 98:d5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 7F:F7:32:82:5E:B7:BD:FB:F8:64:38:93:2A:B1:6E:10:D6:4A:B4:28 + X509v3 Authority Key Identifier: + keyid:E1:EB:47:46:C2:78:53:C4:B6:58:28:94:20:81:58:06:93:17:36:7F + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 80:dc:43:74:98:bf:da:2c:ea:5f:60:45:7f:d9:90:46:b1:f1: + ba:ea:9f:e3:39:40:4e:43:51:30:f1:a6:1a:c7:52:48:ed:de: + 2a:d8:6d:0d:b6:b2:69:a7:d7:e6:e9:4d:c3:73:c6:e5:3f:56: + 06:04:79:d2:a5:56:b7:a6:a5:a8:a2:2c:4f:0e:fa:fe:4f:39: + 11:5a:83:76:af:5e:0f:5d:df:0e:c6:c2:ea:79:19:04:92:a1: + c7:57:b2:16:83:c3:44:d1:47:89:e1:14:eb:1c:2c:f0:a9:63: + ed:31:fc:43:d0:93:c5:4c:7f:d3:68:6e:9b:81:2c:4f:70:71: + 90:af:98:ce:f6:73:97:5b:dc:13:d3:d9:01:8e:5f:34:a8:00: + 1d:71:89:a7:6e:12:f3:df:9d:4b:18:1f:0f:84:59:2b:7f:d0: + 05:5d:5f:e7:97:b7:26:ab:c1:12:87:19:28:6a:43:dc:c0:76: + 38:8a:fc:16:93:92:d3:2e:69:1f:9b:f3:1d:75:0d:32:89:f6: + ca:a4:8c:f2:c6:0a:17:e4:29:c3:bc:a6:33:df:c2:cd:42:97: + 28:65:1f:99:c9:6b:41:0e:4b:59:de:32:f2:1e:f7:62:88:66: + c6:d1:e7:9a:25:78:86:7d:e3:f3:4e:f7:18:11:ce:bc:37:56: + 78:f4:04:b1 +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNQJA7 +bi7UXagIPtRpoOw7YpnsgTAbbtCSi73fFzr7zr0qMlu7XtpTbLk9S6gLEkFh0/k/ +I7lxPzOKv1dIvZnhXceZcv2s9E/hzcq4DIFXZMVWH9nt+N/GYHCC7rUjSqS11rTj +hHTJytrXpxFRxFY2bLRTDjXlY/r9dd9yATEX6U01jK6pwTuurAZ14HcrNpflu5k0 +ttz0EfYvM07bS3MYeFHmEtG+lCoCM9m8ijbcEvAvrldLZvC65htlAd6VBmMim9BY +QlWZNAbsWgDyd+1xIyR9ZprgjNNkkQqmWzZDNuMHM6DD+kacPoGyLKZRkqd6AcuV +GurPPPqTLYFbKZjVAgMBAAGjgekwgeYwHQYDVR0OBBYEFH/3MoJet737+GQ4kyqx +bhDWSrQoMB8GA1UdIwQYMBaAFOHrR0bCeFPEtlgolCCBWAaTFzZ/MD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAgNxDdJi/2izqX2BFf9mQ +RrHxuuqf4zlATkNRMPGmGsdSSO3eKthtDbayaafX5ulNw3PG5T9WBgR50qVWt6al +qKIsTw76/k85EVqDdq9eD13fDsbC6nkZBJKhx1eyFoPDRNFHieEU6xws8Klj7TH8 +Q9CTxUx/02hum4EsT3BxkK+YzvZzl1vcE9PZAY5fNKgAHXGJp24S89+dSxgfD4RZ +K3/QBV1f55e3JqvBEocZKGpD3MB2OIr8FpOS0y5pH5vzHXUNMon2yqSM8sYKF+Qp +w7ymM9/CzUKXKGUfmclrQQ5LWd4y8h73YohmxtHnmiV4hn3j8073GBHOvDdWePQE +sQ== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 3 (0x3) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c8:7f:42:62:ee:29:ef:bb:58:84:48:c3:aa:61: + ca:32:b1:ec:f0:e6:34:0b:f4:7e:d2:21:46:bb:bb: + b5:fb:43:ef:e8:66:88:2e:a3:86:4f:2e:95:51:f8: + 82:dd:c4:7a:9f:3b:6e:81:4d:32:eb:a6:c7:05:4a: + 1d:f1:bd:31:9a:2d:45:0b:2e:a9:9b:d4:13:a4:55: + 40:1c:12:db:4b:76:2b:31:cc:8b:fb:f7:a4:52:e1: + de:f7:0f:b8:17:47:a4:0a:1e:53:b9:7c:a6:cc:ac: + ed:40:72:d1:9c:93:85:05:2e:77:1e:60:ab:7d:fc: + 46:0f:f1:47:65:09:53:62:c6:90:db:5d:4e:ee:cd: + e9:ea:f0:18:f0:ba:a3:91:e2:bf:7b:24:e9:eb:13: + 48:4e:05:63:f4:40:b8:f1:84:7b:d6:91:e9:90:50: + c2:7a:f7:44:2e:70:ad:73:c1:5a:3c:32:5e:3c:9b: + 15:5f:9a:b2:48:03:50:a6:72:2f:10:94:81:e5:27: + bf:28:01:6a:a2:ef:3f:6c:10:b0:a2:02:72:27:d8: + 1c:0c:d4:4d:06:55:48:19:ab:6d:67:56:cd:2d:55: + 63:e5:50:63:02:7d:cc:c6:28:ef:29:ed:db:50:f2: + 31:23:dd:52:f3:27:7e:fd:e1:5f:6f:f5:0f:69:58: + 2b:01 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + C4:E1:12:23:5E:5D:61:E9:F8:C1:9E:0E:57:94:54:97:B2:4E:0B:65 + X509v3 Authority Key Identifier: + keyid:81:56:F3:D5:96:CB:97:DE:87:18:26:E0:E7:E9:59:9E:58:FC:8B:76 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 4a:7b:2a:d9:aa:69:78:28:dc:2d:46:22:f2:ec:d3:09:b7:b7: + 91:2b:6d:a0:07:b9:8a:9e:5c:11:73:ba:1d:61:ed:07:b2:a3: + 7e:3c:48:f3:95:59:ed:98:e9:40:9c:88:47:47:23:9e:37:ce: + f3:49:b5:53:51:be:4a:8b:77:ac:ef:76:2a:3b:11:d1:92:61: + cc:f4:04:85:09:c2:83:db:21:cc:20:a6:49:3d:54:da:e8:ba: + e2:0f:f6:15:fd:cb:83:8a:82:17:b2:c3:43:dd:a4:0a:42:61: + 59:75:5c:c6:5b:7e:5f:97:e6:ea:7e:bc:19:17:5b:df:9e:72: + a4:31:fd:64:6d:34:5b:05:39:5d:f3:2d:35:44:0a:cc:da:cb: + af:86:06:14:0f:ae:47:9e:ff:f1:55:dc:32:4b:9b:43:df:60: + d9:ee:0a:09:95:08:43:c3:c3:18:30:c6:56:f1:d0:b9:17:c9: + 19:5f:a5:c3:a2:76:c0:ad:b2:73:24:0e:34:03:f0:83:17:a5: + ac:b1:4f:9e:38:3d:7d:82:f6:90:ca:43:f5:37:c4:1a:19:2e: + a5:a9:40:64:0a:fb:d1:eb:42:c2:42:f1:08:26:6b:d6:c3:59: + bc:14:99:95:b3:62:80:92:93:49:4f:95:fe:71:e8:7c:3d:ee: + 21:99:7a:aa +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyH9CYu4p +77tYhEjDqmHKMrHs8OY0C/R+0iFGu7u1+0Pv6GaILqOGTy6VUfiC3cR6nztugU0y +66bHBUod8b0xmi1FCy6pm9QTpFVAHBLbS3YrMcyL+/ekUuHe9w+4F0ekCh5TuXym +zKztQHLRnJOFBS53HmCrffxGD/FHZQlTYsaQ211O7s3p6vAY8LqjkeK/eyTp6xNI +TgVj9EC48YR71pHpkFDCevdELnCtc8FaPDJePJsVX5qySANQpnIvEJSB5Se/KAFq +ou8/bBCwogJyJ9gcDNRNBlVIGattZ1bNLVVj5VBjAn3MxijvKe3bUPIxI91S8yd+ +/eFfb/UPaVgrAQIDAQABo4HLMIHIMB0GA1UdDgQWBBTE4RIjXl1h6fjBng5XlFSX +sk4LZTAfBgNVHSMEGDAWgBSBVvPVlsuX3ocYJuDn6VmeWPyLdjA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AEp7KtmqaXgo3C1GIvLs0wm3t5ErbaAHuYqeXBFzuh1h7Qeyo348SPOVWe2Y6UCc +iEdHI543zvNJtVNRvkqLd6zvdio7EdGSYcz0BIUJwoPbIcwgpkk9VNrouuIP9hX9 +y4OKgheyw0PdpApCYVl1XMZbfl+X5up+vBkXW9+ecqQx/WRtNFsFOV3zLTVECsza +y6+GBhQPrkee//FV3DJLm0PfYNnuCgmVCEPDwxgwxlbx0LkXyRlfpcOidsCtsnMk +DjQD8IMXpayxT544PX2C9pDKQ/U3xBoZLqWpQGQK+9HrQsJC8Qgma9bDWbwUmZWz +YoCSk0lPlf5x6Hw97iGZeqo= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ce:b8:01:ca:69:e8:5c:e1:16:2a:54:88:85:15: + 66:e9:09:2e:04:cf:e8:7f:98:b0:63:1a:39:b9:25: + 0d:dd:d8:81:f6:e3:d3:3b:98:39:70:09:eb:ed:63: + 35:91:6a:bf:c4:4e:38:fa:04:a7:1c:bd:32:92:3b: + 5b:2b:29:f3:94:bc:b2:e6:69:7c:32:57:40:36:1b: + 6a:1f:9d:12:10:96:db:75:2b:77:bb:50:95:0e:03: + 65:d7:28:85:12:c8:54:89:38:be:2c:83:81:59:31: + c7:36:d8:d8:89:28:f3:87:7d:ab:b8:24:c0:d9:43: + a8:c8:0d:18:fa:98:4c:32:90:73:4c:86:ec:b1:c1: + 52:1f:af:03:73:84:7c:80:ee:72:56:4e:49:91:0e: + 1d:16:bc:ad:39:5a:dd:52:96:cb:87:09:e0:15:6a: + a4:ac:24:5c:c0:93:13:4b:09:1e:b7:bd:a6:0b:0a: + 94:96:5d:b5:7f:3a:ea:25:cd:c3:c5:7a:49:6a:89: + 42:db:e6:b5:71:fc:46:45:19:d2:33:d8:e4:95:a4: + 53:12:fd:09:f1:94:d8:24:28:d3:cc:ec:21:bd:cb: + 46:1b:24:d9:5a:70:86:1d:cb:7f:6c:be:24:7c:e4: + 37:72:3e:4f:c5:3e:01:68:d8:3b:ae:4a:ab:b2:90: + 3c:cd + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 81:56:F3:D5:96:CB:97:DE:87:18:26:E0:E7:E9:59:9E:58:FC:8B:76 + X509v3 Authority Key Identifier: + keyid:81:56:F3:D5:96:CB:97:DE:87:18:26:E0:E7:E9:59:9E:58:FC:8B:76 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 49:ab:00:40:12:3b:b6:18:a4:f7:c0:e3:94:db:49:b3:45:02: + 45:ac:38:50:2c:4f:b9:a3:31:4f:99:e5:1a:3d:a7:76:23:1f: + 47:83:c4:ea:11:1e:98:f4:a5:d2:d3:76:d1:e7:47:23:09:5f: + e6:de:ef:d3:9e:aa:fa:42:4f:2e:14:2e:78:ee:0f:3f:ac:53: + 1c:d5:7f:b2:ec:4e:34:bd:c6:10:f4:be:fa:31:e4:a3:67:7e: + 3e:31:e7:55:ad:17:8c:b3:72:e0:19:5e:77:59:06:bb:56:8e: + 81:ec:c8:b5:c1:95:d6:6c:53:9c:86:a0:19:72:1d:47:ea:be: + ad:bc:4d:cd:26:f8:87:75:ff:08:1d:9a:d5:f8:7c:ae:3f:57: + 97:3a:54:aa:90:5a:b5:93:97:3f:47:be:34:2d:14:bf:7d:fd: + be:67:88:22:7e:b7:b5:3a:a0:3a:b0:d2:0f:9d:28:1e:fb:1a: + c0:11:ed:ba:a6:4e:c5:6f:2a:4b:90:84:26:1d:2b:f0:14:40: + 7a:55:22:c7:7d:39:ee:42:30:7f:b5:4a:0b:d5:1b:12:42:36: + 62:86:b2:02:68:24:8a:c3:a6:7e:18:b1:15:5d:d4:f0:62:2c: + cf:09:0d:7d:8f:80:a5:13:8d:9a:53:87:70:f0:94:b1:62:71: + e3:b9:b0:d1 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM64Acpp6FzhFipUiIUV +ZukJLgTP6H+YsGMaObklDd3Ygfbj0zuYOXAJ6+1jNZFqv8ROOPoEpxy9MpI7Wysp +85S8suZpfDJXQDYbah+dEhCW23Urd7tQlQ4DZdcohRLIVIk4viyDgVkxxzbY2Iko +84d9q7gkwNlDqMgNGPqYTDKQc0yG7LHBUh+vA3OEfIDuclZOSZEOHRa8rTla3VKW +y4cJ4BVqpKwkXMCTE0sJHre9pgsKlJZdtX866iXNw8V6SWqJQtvmtXH8RkUZ0jPY +5JWkUxL9CfGU2CQo08zsIb3LRhsk2Vpwhh3Lf2y+JHzkN3I+T8U+AWjYO65Kq7KQ +PM0CAwEAAaOByzCByDAdBgNVHQ4EFgQUgVbz1ZbLl96HGCbg5+lZnlj8i3YwHwYD +VR0jBBgwFoAUgVbz1ZbLl96HGCbg5+lZnlj8i3YwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBJqwBAEju2 +GKT3wOOU20mzRQJFrDhQLE+5ozFPmeUaPad2Ix9Hg8TqER6Y9KXS03bR50cjCV/m +3u/Tnqr6Qk8uFC547g8/rFMc1X+y7E40vcYQ9L76MeSjZ34+MedVrReMs3LgGV53 +WQa7Vo6B7Mi1wZXWbFOchqAZch1H6r6tvE3NJviHdf8IHZrV+HyuP1eXOlSqkFq1 +k5c/R740LRS/ff2+Z4gifre1OqA6sNIPnSge+xrAEe26pk7FbypLkIQmHSvwFEB6 +VSLHfTnuQjB/tUoL1RsSQjZihrICaCSKw6Z+GLEVXdTwYizPCQ19j4ClE42aU4dw +8JSxYnHjubDR +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/unknown-root.pem b/net/data/verify_certificate_chain_unittest/unknown-root.pem new file mode 100644 index 0000000..a3ee2f7d --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/unknown-root.pem
@@ -0,0 +1,192 @@ +[Created by: generate-unknown-root.py] + +Certificate chain with 1 intermediary, but the root is not in trust store. +Verification is expected to fail because the final intermediary (Intermediary) +does not chain to a known root. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:f3:f6:f4:c5:f5:4f:a3:17:ee:19:45:0e:97:90: + 31:60:2a:a5:31:0d:e4:c7:f4:fa:4d:e4:99:f5:3c: + db:ad:6b:2d:f2:8d:07:4f:dc:c1:e3:3f:53:b6:48: + 31:8e:8e:a6:b3:d6:a4:3c:fb:21:00:01:a6:35:79: + 50:a6:d0:43:10:8d:13:1b:6f:a9:4b:a3:9b:77:11: + af:0f:7c:f9:f0:e6:03:c5:b5:b4:49:7a:9d:8f:a1: + 42:89:a5:41:5d:c7:e1:7d:4a:e5:af:8f:66:ad:93: + b0:f6:60:52:f4:0c:2d:d1:60:ca:a4:4c:fa:0d:55: + 0d:46:60:69:10:a7:8e:06:bd:ad:28:65:63:a5:63: + 36:d8:eb:8e:e1:cc:fd:53:76:80:d3:1d:e2:b8:46: + f9:24:e7:3a:86:30:f9:14:34:a2:42:81:b7:2b:a4: + 41:14:7a:9c:77:83:51:cb:b9:08:31:29:a2:b0:25: + 92:1e:7f:43:90:1c:6a:43:ca:64:04:37:c8:26:b7: + 7b:ae:cb:8b:2e:e7:6f:09:c4:3e:87:0d:b1:ef:70: + 58:cd:b5:d7:c7:6b:dd:7b:3c:46:0c:4d:5f:21:1d: + 78:b9:cf:46:5e:f8:35:48:7d:14:0b:3e:a4:2a:1c: + 4e:78:6d:27:76:61:e5:c5:74:16:fb:f1:77:9c:f3: + 51:7f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + F8:48:56:E7:65:49:C4:48:98:8E:F0:F5:EA:01:C4:01:C8:4D:56:D9 + X509v3 Authority Key Identifier: + keyid:41:D3:BE:10:2F:EE:43:B6:25:B0:04:4E:39:CF:78:F9:0E:ED:E1:9D + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 48:65:f4:55:86:82:85:93:a0:4d:b0:ce:b8:b2:21:f5:bf:56: + 66:ef:e3:f5:24:52:da:a5:15:21:f7:b4:a1:7c:2f:69:de:1e: + 6a:90:8d:98:e9:38:29:b8:51:44:7b:43:68:92:95:e4:50:7c: + 32:94:72:6c:96:4a:77:07:ce:0c:55:df:19:50:29:e5:ee:ff: + c4:54:c9:75:2d:c2:fd:f1:41:5c:c4:28:3c:15:df:1a:12:73: + aa:a6:af:2a:3e:f5:a6:17:68:5b:80:d8:6d:fa:6d:37:26:a1: + 01:0e:0a:c1:a8:ed:ef:2b:65:1c:43:4d:dd:aa:7b:e1:6d:a6: + a6:23:66:11:58:73:f0:e2:98:d2:ba:db:94:ed:c9:fc:41:6f: + 4b:99:7c:be:2e:e9:57:e2:c6:26:24:db:2a:02:4e:3c:7e:8b: + d8:96:27:43:7b:b4:1e:25:2f:19:c0:e4:05:b9:5e:0e:57:29: + 9e:81:9c:1e:d8:48:4b:d0:c8:ff:1a:a7:7f:71:4a:9f:51:0d: + 8a:11:6e:74:86:8e:89:d8:fd:a4:69:bb:67:78:2d:2d:44:75: + 9b:63:31:ef:b1:3e:38:11:ce:01:ae:b0:fa:a4:3f:b0:df:be: + 13:9a:5e:11:f6:bb:eb:8e:3a:7d:09:be:76:9b:e5:d4:91:f3: + dc:e5:23:df +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxJbnRl +cm1lZGlhcnkwHhcNMTUwMTAxMTIwMDAwWhcNMTYwMTAxMTIwMDAwWjARMQ8wDQYD +VQQDDAZUYXJnZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDz9vTF +9U+jF+4ZRQ6XkDFgKqUxDeTH9PpN5Jn1PNutay3yjQdP3MHjP1O2SDGOjqaz1qQ8 ++yEAAaY1eVCm0EMQjRMbb6lLo5t3Ea8PfPnw5gPFtbRJep2PoUKJpUFdx+F9SuWv +j2atk7D2YFL0DC3RYMqkTPoNVQ1GYGkQp44Gva0oZWOlYzbY647hzP1TdoDTHeK4 +Rvkk5zqGMPkUNKJCgbcrpEEUepx3g1HLuQgxKaKwJZIef0OQHGpDymQEN8gmt3uu +y4su528JxD6HDbHvcFjNtdfHa917PEYMTV8hHXi5z0Ze+DVIfRQLPqQqHE54bSd2 +YeXFdBb78Xec81F/AgMBAAGjgekwgeYwHQYDVR0OBBYEFPhIVudlScRImI7w9eoB +xAHITVbZMB8GA1UdIwQYMBaAFEHTvhAv7kO2JbAETjnPePkO7eGdMD8GCCsGAQUF +BwEBBDMwMTAvBggrBgEFBQcwAoYjaHR0cDovL3VybC1mb3ItYWlhL0ludGVybWVk +aWFyeS5jZXIwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL3VybC1mb3ItY3JsL0lu +dGVybWVkaWFyeS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEASGX0VYaChZOgTbDOuLIh +9b9WZu/j9SRS2qUVIfe0oXwvad4eapCNmOk4KbhRRHtDaJKV5FB8MpRybJZKdwfO +DFXfGVAp5e7/xFTJdS3C/fFBXMQoPBXfGhJzqqavKj71phdoW4DYbfptNyahAQ4K +wajt7ytlHENN3ap74W2mpiNmEVhz8OKY0rrblO3J/EFvS5l8vi7pV+LGJiTbKgJO +PH6L2JYnQ3u0HiUvGcDkBbleDlcpnoGcHthIS9DI/xqnf3FKn1ENihFudIaOidj9 +pGm7Z3gtLUR1m2Mx77E+OBHOAa6w+qQ/sN++E5peEfa76446fQm+dpvl1JHz3OUj +3w== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cd:6f:e8:b3:ea:d4:9e:d9:23:03:8a:4a:f3:6c: + 84:cd:0c:28:7c:c2:07:60:89:c5:9a:9f:74:b8:d0: + ac:e4:30:f1:4b:1c:c5:7f:9d:d2:0f:4e:e0:e5:45: + 4a:cc:93:70:a0:df:3c:4c:fc:0c:a5:d5:c9:86:fd: + ba:4e:67:c0:af:c3:04:98:cb:bb:f6:25:a6:af:7f: + 7b:a3:29:b9:86:60:87:80:67:90:ab:e7:64:86:ec: + e6:30:f6:dd:5b:3a:69:4f:b1:58:f8:4b:15:ae:13: + c8:84:24:bf:9a:a0:6c:8a:b3:36:31:84:2f:a4:3e: + 4a:f2:9f:07:91:a4:8b:dc:fa:5b:65:3c:4e:93:19: + 02:a5:3a:78:5d:f2:51:bd:d7:96:16:6e:c5:8b:17: + d0:21:77:2f:96:4a:44:c8:17:2d:73:d5:da:24:40: + d1:a4:b7:f2:c4:b2:e2:16:6a:19:9b:72:cb:58:62: + eb:30:2f:2f:c5:35:1c:74:2f:ba:e6:93:7e:dc:78: + bc:ad:e3:89:c9:72:9a:f5:01:95:61:02:9f:82:40: + f9:c1:c8:6e:36:b7:14:4a:13:36:bb:d0:1b:25:bd: + d6:5e:11:e7:d9:ea:a7:db:6d:d3:92:98:b1:2a:c1: + cf:00:52:c1:78:c9:0a:30:41:30:09:c8:90:0a:04: + 8f:0d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 41:D3:BE:10:2F:EE:43:B6:25:B0:04:4E:39:CF:78:F9:0E:ED:E1:9D + X509v3 Authority Key Identifier: + keyid:A7:80:43:01:58:B0:DD:7A:AD:7C:38:10:73:02:DE:2C:E6:E4:9E:A9 + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 90:b6:a5:85:fe:d4:51:b9:f7:92:ae:60:80:ab:54:09:3d:63: + 43:fd:ce:e0:ea:e3:f2:c0:db:f5:1b:a7:db:f1:b3:21:d0:e4: + 7f:63:c1:75:13:ca:3d:6b:70:76:55:23:cc:c8:74:80:b8:82: + c0:cd:63:41:77:4c:27:8a:32:34:f7:9d:8d:0e:9f:15:ee:22: + 4f:ed:d7:32:f2:c9:95:bd:35:87:d8:c5:58:19:ba:06:58:a4: + 96:bc:2d:4e:1b:ed:2f:23:ac:b1:2f:b7:e0:88:a9:fc:68:c0: + 8d:8a:41:e6:d3:ba:b9:88:77:54:37:5a:e5:a9:b3:f2:85:7b: + b4:7d:69:83:37:81:12:54:21:4c:d1:69:98:a2:fd:ef:a3:65: + e9:32:f6:63:1e:54:ce:a9:75:74:53:61:b4:f0:78:72:c4:f0: + 04:f0:f3:a8:70:93:f6:35:89:0f:6f:49:7a:0e:57:e0:af:33: + 35:89:b6:cd:ef:81:aa:8c:10:11:e9:57:a1:66:4c:30:9c:11: + 6a:c6:85:4b:d1:94:88:6e:aa:5f:8e:fb:d2:31:3d:ee:19:19: + 01:3c:4a:05:72:9c:aa:ae:ef:af:b0:f1:9f:e0:ae:d6:8e:09: + d1:05:ee:6b:77:08:11:52:8c:91:a0:2f:9b:ac:88:98:14:14: + a4:08:b5:7d +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowFzEVMBMGA1UEAwwMSW50 +ZXJtZWRpYXJ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzW/os+rU +ntkjA4pK82yEzQwofMIHYInFmp90uNCs5DDxSxzFf53SD07g5UVKzJNwoN88TPwM +pdXJhv26TmfAr8MEmMu79iWmr397oym5hmCHgGeQq+dkhuzmMPbdWzppT7FY+EsV +rhPIhCS/mqBsirM2MYQvpD5K8p8HkaSL3PpbZTxOkxkCpTp4XfJRvdeWFm7FixfQ +IXcvlkpEyBctc9XaJEDRpLfyxLLiFmoZm3LLWGLrMC8vxTUcdC+65pN+3Hi8reOJ +yXKa9QGVYQKfgkD5wchuNrcUShM2u9AbJb3WXhHn2eqn223TkpixKsHPAFLBeMkK +MEEwCciQCgSPDQIDAQABo4HLMIHIMB0GA1UdDgQWBBRB074QL+5DtiWwBE45z3j5 +Du3hnTAfBgNVHSMEGDAWgBSngEMBWLDdeq18OBBzAt4s5uSeqTA3BggrBgEFBQcB +AQQrMCkwJwYIKwYBBQUHMAKGG2h0dHA6Ly91cmwtZm9yLWFpYS9Sb290LmNlcjAs +BgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vdXJsLWZvci1jcmwvUm9vdC5jcmwwDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB +AJC2pYX+1FG595KuYICrVAk9Y0P9zuDq4/LA2/Ubp9vxsyHQ5H9jwXUTyj1rcHZV +I8zIdIC4gsDNY0F3TCeKMjT3nY0OnxXuIk/t1zLyyZW9NYfYxVgZugZYpJa8LU4b +7S8jrLEvt+CIqfxowI2KQebTurmId1Q3WuWps/KFe7R9aYM3gRJUIUzRaZii/e+j +Zeky9mMeVM6pdXRTYbTweHLE8ATw86hwk/Y1iQ9vSXoOV+CvMzWJts3vgaqMEBHp +V6FmTDCcEWrGhUvRlIhuql+O+9IxPe4ZGQE8SgVynKqu76+w8Z/grtaOCdEF7mt3 +CBFSjJGgL5usiJgUFKQItX0= +-----END CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem b/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem new file mode 100644 index 0000000..a0cd187e --- /dev/null +++ b/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem
@@ -0,0 +1,370 @@ +[Created by: generate-violates-basic-constraints-pathlen-0.py] + +Certificate chain with 2 intermediaries. The first intermediary has a basic +constraints path length of 0, so it is a violation for it to have a subordinate +intermediary. + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary2 + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Target + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b2:f1:24:bb:4b:3d:6d:80:7f:67:ad:2e:0e:e8: + 07:e4:4b:6c:28:0d:2e:d9:9d:9d:e5:31:0a:7f:37: + 3f:9c:c1:c3:03:8e:b8:72:5a:1c:52:d4:4e:84:7a: + 9c:4d:f6:2a:a8:4b:f2:5c:5b:6c:f4:23:73:b3:4e: + 0a:b9:66:16:ae:e4:c4:8b:d7:1b:b5:d0:5e:5f:03: + 21:ce:63:b8:3a:da:e0:3c:f8:0a:7e:4b:99:f9:c6: + 0d:01:a2:ab:18:d8:a7:a0:84:8c:3f:09:fd:10:41: + 7c:6f:b0:51:34:4f:5d:39:b5:3f:6d:a0:68:87:6d: + 09:47:db:0d:2a:62:99:83:02:0c:b9:d7:93:0b:bf: + 17:5f:06:58:22:27:62:fc:1c:d9:02:b9:1e:e9:f0: + fb:e1:a4:cc:fd:e3:9e:a8:a5:2d:f9:af:8b:b8:1e: + 68:dc:f1:52:a2:55:94:20:da:82:14:b7:c0:a0:c5: + 53:ff:00:0f:76:f9:fd:bf:53:71:99:60:2f:00:c9: + 9e:d0:07:eb:3c:d0:47:5c:7b:65:cb:62:db:9b:74: + ed:b8:51:a0:ed:ed:af:e9:6f:44:0e:8c:a4:42:ee: + fc:92:bb:19:1a:b3:42:74:27:39:47:b8:d4:06:ed: + bd:99:72:0c:83:15:10:ff:4a:66:66:0f:d6:14:ef: + dd:17 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 33:73:C0:44:EE:71:53:CD:C0:EA:D9:FC:FF:BE:B7:DD:16:66:19:84 + X509v3 Authority Key Identifier: + keyid:FD:31:C0:C5:57:AB:1E:A5:78:24:73:72:58:9F:75:7D:78:17:42:AC + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary2.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary2.crl + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: sha256WithRSAEncryption + 61:39:30:49:95:f7:63:44:f3:a5:97:35:48:84:ea:94:cd:94: + 37:ce:09:7a:b1:58:21:3e:f8:9c:a4:a9:65:bf:1d:a1:cb:eb: + 09:95:f7:f6:ad:a4:65:95:a1:51:c4:18:06:43:d2:93:eb:16: + 41:65:33:8a:42:cc:90:9d:e9:66:1f:d6:98:31:f1:48:f4:a8: + a3:89:50:29:bc:f2:2d:af:8b:f7:af:9e:62:02:21:06:75:3d: + 4a:8d:98:a0:df:4d:5d:db:9a:af:2a:0f:32:50:aa:61:c3:19: + 87:99:54:60:3a:16:c5:46:ea:ed:54:ab:91:34:5f:8e:60:33: + 10:e4:e1:4d:05:8d:36:5b:47:1c:c3:f2:58:7f:22:07:c7:95: + 02:24:8e:03:f4:1f:06:25:d7:49:76:f8:f1:02:25:7c:9a:cf: + 0f:4d:8f:08:e7:bf:fd:13:31:43:e5:56:20:eb:0a:43:ca:41: + 0d:7c:4f:68:f6:d1:d1:67:ca:24:4f:e3:8e:8e:12:39:2f:7b: + e8:9a:5c:c9:b5:19:01:1a:46:7e:54:21:ad:7e:c5:cd:e2:40: + c3:13:aa:b5:e5:16:b3:18:dc:c8:61:d7:73:b7:3b:23:00:04: + ce:dc:5a:22:1a:0b:da:8a:99:10:96:33:32:ae:4e:83:f4:d0: + 93:e7:75:56 +-----BEGIN CERTIFICATE----- +MIIDkDCCAnigAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1JbnRl +cm1lZGlhcnkyMB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowETEPMA0G +A1UEAwwGVGFyZ2V0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsvEk +u0s9bYB/Z60uDugH5EtsKA0u2Z2d5TEKfzc/nMHDA464clocUtROhHqcTfYqqEvy +XFts9CNzs04KuWYWruTEi9cbtdBeXwMhzmO4OtrgPPgKfkuZ+cYNAaKrGNinoISM +Pwn9EEF8b7BRNE9dObU/baBoh20JR9sNKmKZgwIMudeTC78XXwZYIidi/BzZArke +6fD74aTM/eOeqKUt+a+LuB5o3PFSolWUINqCFLfAoMVT/wAPdvn9v1NxmWAvAMme +0AfrPNBHXHtly2Lbm3TtuFGg7e2v6W9EDoykQu78krsZGrNCdCc5R7jUBu29mXIM +gxUQ/0pmZg/WFO/dFwIDAQABo4HrMIHoMB0GA1UdDgQWBBQzc8BE7nFTzcDq2fz/ +vrfdFmYZhDAfBgNVHSMEGDAWgBT9McDFV6sepXgkc3JYn3V9eBdCrDBABggrBgEF +BQcBAQQ0MDIwMAYIKwYBBQUHMAKGJGh0dHA6Ly91cmwtZm9yLWFpYS9JbnRlcm1l +ZGlhcnkyLmNlcjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vdXJsLWZvci1jcmwv +SW50ZXJtZWRpYXJ5Mi5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG +AQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAYTkwSZX3Y0TzpZc1 +SITqlM2UN84JerFYIT74nKSpZb8docvrCZX39q2kZZWhUcQYBkPSk+sWQWUzikLM +kJ3pZh/WmDHxSPSoo4lQKbzyLa+L96+eYgIhBnU9So2YoN9NXduaryoPMlCqYcMZ +h5lUYDoWxUbq7VSrkTRfjmAzEOThTQWNNltHHMPyWH8iB8eVAiSOA/QfBiXXSXb4 +8QIlfJrPD02PCOe//RMxQ+VWIOsKQ8pBDXxPaPbR0WfKJE/jjo4SOS976JpcybUZ +ARpGflQhrX7FzeJAwxOqteUWsxjcyGHXc7c7IwAEztxaIhoL2oqZEJYzMq5Og/TQ +k+d1Vg== +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Intermediary1 + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary2 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b9:4e:dc:bd:a8:9e:1d:81:d7:bb:c3:4d:8a:5d: + 34:3f:b2:71:12:c0:0d:76:05:d6:b3:6a:b6:3d:b5: + 97:a8:8d:a0:ba:d9:2f:3c:da:b0:8f:5f:18:f0:83: + fb:59:ef:91:8d:5a:57:57:63:36:a1:ff:54:9a:f5: + 10:ab:4a:6b:16:fc:c6:f2:4e:9f:97:ec:22:6f:97: + dd:0e:63:ef:ce:71:4f:f6:8e:04:68:22:c9:6d:b4: + d2:fe:7b:46:aa:e9:05:a0:c0:b0:25:42:cd:ba:e8: + 8d:bb:cb:3e:5f:e4:54:b7:dd:48:c6:08:52:30:54: + e2:f4:c1:ae:ee:71:71:a7:33:ce:c1:b1:55:e4:77: + 15:72:c5:ea:5f:ed:b3:a6:ef:a7:cc:f6:eb:6c:42: + 1d:45:c3:75:15:d5:bd:09:44:52:b9:f5:5d:1f:10: + e1:fc:31:9e:37:90:ca:7c:8d:16:c4:f7:76:39:b7: + 57:ea:5b:75:3d:6c:50:60:26:ed:8b:2a:e4:a2:b8: + a2:34:ba:51:89:ce:3c:e3:68:c3:3c:4a:58:cb:be: + 79:34:54:2d:61:38:7b:7a:89:3f:4c:5f:3f:c9:c6: + fc:d0:81:de:0c:21:2e:5a:2a:74:cd:fe:d7:c9:de: + b3:3a:60:d6:16:e7:91:13:87:a4:f4:f8:67:4b:17: + e6:13 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + FD:31:C0:C5:57:AB:1E:A5:78:24:73:72:58:9F:75:7D:78:17:42:AC + X509v3 Authority Key Identifier: + keyid:09:87:C1:14:11:81:04:D8:AF:CF:66:4A:4F:8D:1C:A5:BB:04:CF:DA + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Intermediary1.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Intermediary1.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Signature Algorithm: sha256WithRSAEncryption + 51:f3:32:1a:03:bd:bd:a1:40:7d:4a:55:ef:6e:5e:58:57:8c: + 50:75:7c:e6:d0:44:ff:7e:0c:f7:9d:c2:67:99:83:e2:da:19: + e6:0b:54:8a:61:7d:16:86:99:2d:b7:32:2d:c6:a0:7a:1a:e2: + c2:46:8c:a1:b7:f8:bb:d4:22:b1:ae:d0:2f:a9:98:32:4e:14: + 20:6c:22:cf:df:c8:08:ce:f4:4c:8b:5c:03:33:0a:d1:32:2b: + 5a:0d:d2:99:18:79:a1:e8:ed:8d:31:85:9e:dd:30:52:30:1f: + ff:af:1f:09:08:98:a0:75:11:02:e6:6c:2b:7e:67:df:89:91: + 1e:57:b4:a2:ba:1e:7b:86:68:f3:62:7a:69:c1:4e:b3:76:58: + 74:e5:84:3d:0f:6d:1b:22:97:e9:7f:0b:c7:2f:00:c5:4d:1a: + fd:47:ff:9f:c0:84:0b:ee:dc:cd:c2:43:7f:0f:7a:a6:28:6e: + c3:2c:7a:a1:cf:4f:16:3f:f5:fc:40:c7:65:91:a5:bc:5c:82: + 9c:a0:fb:0a:1d:69:89:85:e5:9e:10:41:7e:4d:83:02:4f:64: + 54:04:86:97:d7:5e:6c:e1:ef:65:b0:a4:69:b8:e3:d4:0e:cd: + 20:04:1a:05:56:e9:e1:c3:e9:2f:9a:7b:43:59:73:ff:0b:82: + 38:e8:b3:b5 +-----BEGIN CERTIFICATE----- +MIIDjDCCAnSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1JbnRl +cm1lZGlhcnkxMB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowGDEWMBQG +A1UEAwwNSW50ZXJtZWRpYXJ5MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALlO3L2onh2B17vDTYpdND+ycRLADXYF1rNqtj21l6iNoLrZLzzasI9fGPCD ++1nvkY1aV1djNqH/VJr1EKtKaxb8xvJOn5fsIm+X3Q5j785xT/aOBGgiyW200v57 +RqrpBaDAsCVCzbrojbvLPl/kVLfdSMYIUjBU4vTBru5xcaczzsGxVeR3FXLF6l/t +s6bvp8z262xCHUXDdRXVvQlEUrn1XR8Q4fwxnjeQynyNFsT3djm3V+pbdT1sUGAm +7Ysq5KK4ojS6UYnOPONowzxKWMu+eTRULWE4e3qJP0xfP8nG/NCB3gwhLloqdM3+ +18neszpg1hbnkROHpPT4Z0sX5hMCAwEAAaOB4DCB3TAdBgNVHQ4EFgQU/THAxVer +HqV4JHNyWJ91fXgXQqwwHwYDVR0jBBgwFoAUCYfBFBGBBNivz2ZKT40cpbsEz9ow +QAYIKwYBBQUHAQEENDAyMDAGCCsGAQUFBzAChiRodHRwOi8vdXJsLWZvci1haWEv +SW50ZXJtZWRpYXJ5MS5jZXIwNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL3VybC1m +b3ItY3JsL0ludGVybWVkaWFyeTEuY3JsMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB +Af8ECDAGAQH/AgEAMA0GCSqGSIb3DQEBCwUAA4IBAQBR8zIaA729oUB9SlXvbl5Y +V4xQdXzm0ET/fgz3ncJnmYPi2hnmC1SKYX0WhpkttzItxqB6GuLCRoyht/i71CKx +rtAvqZgyThQgbCLP38gIzvRMi1wDMwrRMitaDdKZGHmh6O2NMYWe3TBSMB//rx8J +CJigdREC5mwrfmffiZEeV7Siuh57hmjzYnppwU6zdlh05YQ9D20bIpfpfwvHLwDF +TRr9R/+fwIQL7tzNwkN/D3qmKG7DLHqhz08WP/X8QMdlkaW8XIKcoPsKHWmJheWe +EEF+TYMCT2RUBIaX115s4e9lsKRpuOPUDs0gBBoFVunhw+kvmntDWXP/C4I46LO1 +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Intermediary1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ab:e9:a0:28:67:38:13:72:12:a0:3b:f2:f9:13: + c2:2b:c1:a2:07:e6:45:35:cf:ff:1a:46:b0:d2:58: + 12:63:fc:3d:b3:85:50:68:9c:57:21:ff:31:ff:24: + 48:db:13:de:b1:f4:f8:39:7a:f3:34:dd:51:58:1a: + 12:73:9d:85:e0:d0:f8:be:fd:9d:e2:34:ce:36:e0: + a0:48:53:36:23:bf:52:d2:ac:da:d1:ef:6c:da:9f: + 11:3b:6c:e1:67:6a:f1:df:97:2c:1a:12:c7:c3:72: + 0f:98:21:6a:40:2b:f0:28:b8:c2:ef:7f:cb:ee:7a: + e9:8f:17:fe:0a:a1:ff:d5:15:4c:63:5b:53:55:15: + 01:b9:5d:91:77:b0:23:03:0e:45:00:84:52:33:2b: + 11:51:99:e8:0d:5b:45:ef:d2:e2:c9:0e:a2:ae:43: + c2:92:5c:b0:36:76:06:21:91:d0:42:e8:0f:6f:80: + 61:98:12:a6:c0:c3:b7:64:7e:77:0c:76:12:1f:50: + 73:f8:bb:28:1a:5d:7b:68:36:01:fa:09:e7:9a:90: + b6:c5:3d:e9:16:a0:7b:c2:76:19:f0:e9:bc:15:0d: + 55:df:ea:67:2a:b2:e0:69:f8:c1:49:c4:a6:51:e9: + 43:d2:df:2a:de:e3:a0:66:3f:0c:18:b8:f8:8d:bb: + 43:15 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 09:87:C1:14:11:81:04:D8:AF:CF:66:4A:4F:8D:1C:A5:BB:04:CF:DA + X509v3 Authority Key Identifier: + keyid:A4:9D:E4:F8:B0:AF:D5:A4:2F:B9:3F:42:B8:C3:D5:60:9D:64:C2:8C + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Signature Algorithm: sha256WithRSAEncryption + 7d:97:b6:93:81:ef:63:d9:d6:31:8d:ba:e0:61:36:7c:06:cd: + b5:2f:3f:4a:04:84:c2:c4:51:07:49:55:53:4f:22:b6:2f:15: + d9:62:8a:65:97:15:84:a1:e2:2e:4e:66:59:02:b2:8f:b6:d6: + 84:d6:ed:d4:df:45:a3:75:93:58:88:76:8d:6c:01:81:cc:c5: + 91:99:cc:9c:65:f9:c9:f0:86:ed:3a:fe:d0:a0:2e:6c:04:d2: + 49:f8:d4:31:9f:ce:db:93:bb:5a:73:4d:5d:24:83:4b:55:fe: + 49:79:67:64:83:18:56:d9:ad:90:96:0b:ab:49:de:08:80:7a: + 93:54:b1:38:19:c2:0b:6f:e1:b1:50:52:19:67:15:a9:aa:5a: + c5:ed:73:30:63:1a:64:24:d4:8b:95:c9:c4:54:78:62:ce:42: + f7:98:f1:94:2e:4d:93:7e:df:6f:cd:6f:41:c4:ef:c8:ed:f7: + 73:92:af:ee:19:b5:e5:47:82:f7:47:41:35:29:8c:88:3b:62: + 18:c0:f6:80:56:3f:f8:9e:b4:6e:33:2c:ce:41:da:56:83:c7: + c7:30:c6:0f:f5:49:f5:79:d6:7b:c5:33:4c:0f:2a:e9:13:27: + 0b:e3:b8:63:74:14:c0:2e:19:24:00:a4:f8:17:d7:cd:b5:1b: + c1:38:25:9a +-----BEGIN CERTIFICATE----- +MIIDcTCCAlmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowGDEWMBQGA1UEAwwNSW50 +ZXJtZWRpYXJ5MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKvpoChn +OBNyEqA78vkTwivBogfmRTXP/xpGsNJYEmP8PbOFUGicVyH/Mf8kSNsT3rH0+Dl6 +8zTdUVgaEnOdheDQ+L79neI0zjbgoEhTNiO/UtKs2tHvbNqfETts4Wdq8d+XLBoS +x8NyD5ghakAr8Ci4wu9/y+566Y8X/gqh/9UVTGNbU1UVAbldkXewIwMORQCEUjMr +EVGZ6A1bRe/S4skOoq5DwpJcsDZ2BiGR0ELoD2+AYZgSpsDDt2R+dwx2Eh9Qc/i7 +KBpde2g2AfoJ55qQtsU96Rage8J2GfDpvBUNVd/qZyqy4Gn4wUnEplHpQ9LfKt7j +oGY/DBi4+I27QxUCAwEAAaOBzjCByzAdBgNVHQ4EFgQUCYfBFBGBBNivz2ZKT40c +pbsEz9owHwYDVR0jBBgwFoAUpJ3k+LCv1aQvuT9CuMPVYJ1kwowwNwYIKwYBBQUH +AQEEKzApMCcGCCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIw +LAYDVR0fBCUwIzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4G +A1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMA0GCSqGSIb3DQEBCwUA +A4IBAQB9l7aTge9j2dYxjbrgYTZ8Bs21Lz9KBITCxFEHSVVTTyK2LxXZYopllxWE +oeIuTmZZArKPttaE1u3U30WjdZNYiHaNbAGBzMWRmcycZfnJ8IbtOv7QoC5sBNJJ ++NQxn87bk7tac01dJINLVf5JeWdkgxhW2a2QlgurSd4IgHqTVLE4GcILb+GxUFIZ +ZxWpqlrF7XMwYxpkJNSLlcnEVHhizkL3mPGULk2Tft9vzW9BxO/I7fdzkq/uGbXl +R4L3R0E1KYyIO2IYwPaAVj/4nrRuMyzOQdpWg8fHMMYP9Un1edZ7xTNMDyrpEycL +47hjdBTALhkkAKT4F9fNtRvBOCWa +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=Root + Validity + Not Before: Jan 1 12:00:00 2015 GMT + Not After : Jan 1 12:00:00 2016 GMT + Subject: CN=Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:9e:1f:9a:ec:aa:50:56:02:47:76:c8:ff:b9:91: + c0:58:8d:08:b9:87:d9:ac:9e:7c:6e:2e:b7:60:68: + d6:ab:1c:3d:f3:e2:a8:e6:05:58:ff:52:27:7c:f9: + 7e:96:2d:19:71:35:84:eb:8d:3c:db:27:f7:5f:2f: + d1:56:af:73:a8:26:84:f5:bb:7f:7a:7c:40:81:66: + e9:e5:c1:53:eb:ac:d5:65:47:3d:a1:0a:67:c6:c8: + 3b:cb:2f:a9:1e:9c:d5:30:6b:7b:50:cb:ad:46:6b: + 33:44:91:14:94:20:ad:e2:79:1b:62:bb:1d:7e:a7: + 2a:45:03:4b:d4:64:1b:15:82:c6:dc:cb:48:84:c5: + 77:22:2a:20:6d:d8:bd:25:8d:55:11:95:46:73:97: + fa:53:66:2e:ec:1a:73:66:09:f7:ef:e4:f8:df:ea: + ce:90:c8:f8:38:67:bb:3c:c2:48:e7:69:01:98:6b: + c1:3e:8f:17:05:0f:c0:d0:eb:49:f1:c7:ab:c6:07: + 49:85:a7:57:ac:11:42:e5:de:bf:a1:65:4b:e6:ba: + e8:44:64:2d:84:d8:a4:4a:ba:62:56:76:49:bf:67: + 19:91:e1:29:e9:fb:aa:de:ef:df:58:01:08:65:14: + 8e:71:b5:3b:43:fb:6c:65:9a:d6:6e:42:65:24:2d: + f4:99 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + A4:9D:E4:F8:B0:AF:D5:A4:2F:B9:3F:42:B8:C3:D5:60:9D:64:C2:8C + X509v3 Authority Key Identifier: + keyid:A4:9D:E4:F8:B0:AF:D5:A4:2F:B9:3F:42:B8:C3:D5:60:9D:64:C2:8C + + Authority Information Access: + CA Issuers - URI:http://url-for-aia/Root.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://url-for-crl/Root.crl + + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: sha256WithRSAEncryption + 39:75:b8:af:a2:4e:d6:2f:15:08:4e:6d:06:1f:e7:65:29:96: + c2:77:96:ed:1b:b2:48:e3:f9:cf:fd:8c:40:d1:67:37:1a:7c: + e8:40:f0:ca:ee:72:9e:ef:6d:eb:e7:e9:5c:c4:61:e5:65:0e: + 25:62:8e:ca:b1:5d:08:d2:21:6d:cb:0f:d6:f3:41:4a:66:56: + 5b:06:3a:a7:6e:df:ad:6c:4d:18:01:95:b4:c9:7e:f4:80:e7: + 75:17:e0:41:25:7e:03:1b:5b:bd:a0:2d:1c:f8:f5:18:e6:0b: + 4c:69:7e:aa:54:78:f3:b4:84:b8:eb:8c:37:e9:60:dd:df:b8: + f8:43:57:37:99:db:b1:ed:99:2e:1f:f2:af:94:33:97:86:83: + 58:6d:e6:37:56:36:f8:68:e6:32:70:3f:5b:9b:13:75:a5:fc: + c0:5a:e5:61:61:37:d2:b6:d8:d5:5c:55:21:d5:8e:3a:ed:bf: + 83:81:76:e7:71:2b:3f:5b:0f:77:43:20:3a:d2:f6:ef:53:c8: + 29:19:2c:0a:4d:a6:2e:fb:9b:3b:10:73:e1:dc:ac:0e:8d:e4: + bd:36:da:e9:1e:0a:e6:57:b4:1d:ea:d8:cd:a0:dd:e3:88:8d: + a5:b4:43:7f:fd:b1:3c:29:e5:6a:b4:c9:4e:e6:77:83:ae:c6: + f7:04:47:a2 +-----BEGIN TRUSTED_CERTIFICATE----- +MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 +MB4XDTE1MDEwMTEyMDAwMFoXDTE2MDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ4fmuyqUFYCR3bI/7mR +wFiNCLmH2ayefG4ut2Bo1qscPfPiqOYFWP9SJ3z5fpYtGXE1hOuNPNsn918v0Vav +c6gmhPW7f3p8QIFm6eXBU+us1WVHPaEKZ8bIO8svqR6c1TBre1DLrUZrM0SRFJQg +reJ5G2K7HX6nKkUDS9RkGxWCxtzLSITFdyIqIG3YvSWNVRGVRnOX+lNmLuwac2YJ +9+/k+N/qzpDI+DhnuzzCSOdpAZhrwT6PFwUPwNDrSfHHq8YHSYWnV6wRQuXev6Fl +S+a66ERkLYTYpEq6YlZ2Sb9nGZHhKen7qt7v31gBCGUUjnG1O0P7bGWa1m5CZSQt +9JkCAwEAAaOByzCByDAdBgNVHQ4EFgQUpJ3k+LCv1aQvuT9CuMPVYJ1kwowwHwYD +VR0jBBgwFoAUpJ3k+LCv1aQvuT9CuMPVYJ1kwowwNwYIKwYBBQUHAQEEKzApMCcG +CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw +IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA5dbivok7W +LxUITm0GH+dlKZbCd5btG7JI4/nP/YxA0Wc3GnzoQPDK7nKe723r5+lcxGHlZQ4l +Yo7KsV0I0iFtyw/W80FKZlZbBjqnbt+tbE0YAZW0yX70gOd1F+BBJX4DG1u9oC0c ++PUY5gtMaX6qVHjztIS464w36WDd37j4Q1c3mdux7ZkuH/KvlDOXhoNYbeY3Vjb4 +aOYycD9bmxN1pfzAWuVhYTfSttjVXFUh1Y467b+DgXbncSs/Ww93QyA60vbvU8gp +GSwKTaYu+5s7EHPh3KwOjeS9NtrpHgrmV7Qd6tjNoN3jiI2ltEN//bE8KeVqtMlO +5neDrsb3BEei +-----END TRUSTED_CERTIFICATE----- + +-----BEGIN TIME----- +MTUwMzAyMTIwMDAwWg== +-----END TIME----- + +-----BEGIN VERIFY_RESULT----- +RkFJTA== +-----END VERIFY_RESULT-----
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc index 3f82110..7190ed8 100644 --- a/net/dns/dns_transaction_unittest.cc +++ b/net/dns/dns_transaction_unittest.cc
@@ -117,7 +117,7 @@ // Terminate the reads with ERR_IO_PENDING to prevent overrun and default to // timeout. reads_.push_back( - MockRead(ASYNC, ERR_IO_PENDING, writes_.size() + reads_.size())); + MockRead(SYNCHRONOUS, ERR_IO_PENDING, writes_.size() + reads_.size())); provider_.reset(new SequencedSocketData(&reads_[0], reads_.size(), &writes_[0], writes_.size())); if (use_tcp_) {
diff --git a/net/http/http_content_disposition.cc b/net/http/http_content_disposition.cc index 28ea8bd..bef2d44a 100644 --- a/net/http/http_content_disposition.cc +++ b/net/http/http_content_disposition.cc
@@ -10,6 +10,7 @@ #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "net/base/escape.h" #include "net/base/net_string_util.h" #include "net/base/net_util.h" #include "net/http/http_util.h"
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index ff8e630..e3bb03b 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -4586,7 +4586,7 @@ // Allow the SpdyProxyClientSocket's write callback to complete. base::MessageLoop::current()->RunUntilIdle(); // Now allow the read of the response to complete. - spdy_data.CompleteRead(); + spdy_data.Resume(); rv = callback1.WaitForResult(); EXPECT_EQ(OK, rv); @@ -7735,7 +7735,7 @@ CreateMockRead(*stream2_syn, 2, ASYNC), CreateMockRead(*stream1_body, 3, ASYNC), CreateMockRead(*stream2_body, 4, ASYNC), - MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a hang }; SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes, @@ -7846,7 +7846,7 @@ CreateMockRead(*stream1_reply, 1, ASYNC), CreateMockRead(*stream2_syn, 2, ASYNC), CreateMockRead(*stream1_body, 4, ASYNC), - MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a hang }; SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes, @@ -10943,10 +10943,8 @@ scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); MockRead spdy_reads[] = { - MockRead(ASYNC, 1, kCONNECTResponse), - CreateMockRead(*resp.get(), 3), - CreateMockRead(*data.get(), 4), - MockRead(ASYNC, ERR_IO_PENDING, 5), + MockRead(ASYNC, 1, kCONNECTResponse), CreateMockRead(*resp.get(), 3), + CreateMockRead(*data.get(), 4), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), }; SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes, @@ -13109,11 +13107,8 @@ scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); - MockRead reads1[] = { - CreateMockRead(*resp1, 1), - CreateMockRead(*body1, 2), - MockRead(ASYNC, ERR_IO_PENDING, 3) - }; + MockRead reads1[] = {CreateMockRead(*resp1, 1), CreateMockRead(*body1, 2), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)}; SequencedSocketData data1(reads1, arraysize(reads1), writes1, arraysize(writes1)); @@ -13293,9 +13288,8 @@ int rv = trans1->Start(&request1, callback1.callback(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); base::MessageLoop::current()->RunUntilIdle(); - if (data.IsReadPaused()) { - data.CompleteRead(); - } + if (data.IsPaused()) + data.Resume(); rv = callback1.WaitForResult(); if (valid) { EXPECT_EQ(OK, rv); @@ -13654,14 +13648,12 @@ spdy_util_wrapped.ConstructWrappedSpdyFrame(body1, 1)); scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); - MockRead reads1[] = { - CreateMockRead(*conn_resp, 1), - CreateMockRead(*wrapped_resp1, 3), - CreateMockRead(*wrapped_body1, 4), - CreateMockRead(*resp2, 6), - CreateMockRead(*body2, 7), - MockRead(ASYNC, ERR_IO_PENDING, 8) - }; + MockRead reads1[] = {CreateMockRead(*conn_resp, 1), + CreateMockRead(*wrapped_resp1, 3), + CreateMockRead(*wrapped_body1, 4), + CreateMockRead(*resp2, 6), + CreateMockRead(*body2, 7), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8)}; DeterministicSocketData data1(reads1, arraysize(reads1), writes1, arraysize(writes1)); @@ -13952,9 +13944,8 @@ scoped_ptr<SpdyFrame> host1_resp_body( spdy_util_.ConstructSpdyBodyFrame(1, true)); MockRead spdy1_reads[] = { - CreateMockRead(*host1_resp, 1), - CreateMockRead(*host1_resp_body, 2), - MockRead(ASYNC, ERR_IO_PENDING, 3), + CreateMockRead(*host1_resp, 1), CreateMockRead(*host1_resp_body, 2), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), }; // Use a separate test instance for the separate SpdySession that will be @@ -13975,9 +13966,8 @@ scoped_ptr<SpdyFrame> host2_resp_body( spdy_util_2.ConstructSpdyBodyFrame(1, true)); MockRead spdy2_reads[] = { - CreateMockRead(*host2_resp, 1), - CreateMockRead(*host2_resp_body, 2), - MockRead(ASYNC, ERR_IO_PENDING, 3), + CreateMockRead(*host2_resp, 1), CreateMockRead(*host2_resp_body, 2), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), }; scoped_ptr<SequencedSocketData> spdy2_data(
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h index e95da05e..3f61ae1 100644 --- a/net/http/transport_security_state_static.h +++ b/net/http/transport_security_state_static.h
@@ -550,7 +550,7 @@ "\xcc\xe5\x0f\xee\xff\x81\x37\xcd\xbe\xe0\x32\x6e\x02\xcf\x36\x2b"; static const char* const kExpectCTReportURIs[] = { - "https://expect-ct-test.badssl.com/report", + "https://report.badssl.com/expect-ct", }; // The following is static data describing the hosts that are hardcoded with // certificate pins or HSTS information. @@ -732,3545 +732,3696 @@ // value has the MSB set then it represents a literal leaf value. Otherwise // it's a pointer to the n'th element of the array. static const uint8 kHSTSHuffmanTree[] = { - 0xf0, 0xe4, 0x00, 0xf2, 0x01, 0x80, 0xae, 0xe6, 0x03, 0xed, 0xe9, 0x04, - 0xb9, 0xb5, 0xb8, 0x06, 0xb2, 0x07, 0xb4, 0xf1, 0x08, 0x09, 0xb7, 0xb6, - 0xb1, 0x0b, 0xb0, 0xb3, 0x0c, 0x0d, 0x0e, 0xea, 0x0a, 0x0f, 0x10, 0xf7, - 0xe7, 0x11, 0x12, 0xef, 0x05, 0x13, 0x02, 0x14, 0xeb, 0xe2, 0xe3, 0x16, - 0xe1, 0x17, 0x18, 0xff, 0xfa, 0xf8, 0xf6, 0x1a, 0x1b, 0xe8, 0xf3, 0x1c, - 0xe5, 0x1d, 0xec, 0xee, 0xad, 0xf9, 0x20, 0xf5, 0xf4, 0x21, 0x1f, 0x22, - 0x1e, 0x23, 0x19, 0x24, 0x15, 0x25, + 0xf0, 0xe4, 0x00, 0xf2, 0x01, 0x80, 0xf9, 0xe6, 0x03, 0xe7, 0xe9, 0x04, + 0xb7, 0xb6, 0xb1, 0x06, 0xb0, 0xb3, 0x07, 0x08, 0x09, 0xea, 0xf8, 0x0a, + 0x0b, 0xf7, 0xed, 0x0c, 0x0d, 0xef, 0x05, 0x0e, 0x02, 0x0f, 0xeb, 0xe2, + 0xe3, 0x11, 0xe1, 0x12, 0x13, 0xff, 0xf3, 0xec, 0xe5, 0x15, 0xb9, 0xb5, + 0xb8, 0x17, 0xb2, 0x18, 0xb4, 0xf1, 0x19, 0x1a, 0xfa, 0x1b, 0x1c, 0xf6, + 0x1d, 0xe8, 0x1e, 0xee, 0xad, 0xae, 0x20, 0xf5, 0xf4, 0x21, 0x1f, 0x22, + 0x16, 0x23, 0x14, 0x24, 0x10, 0x25, }; static const uint8 kPreloadedHSTSData[] = { - 0xfe, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x22, 0x55, 0xc0, 0xfc, 0xe5, 0xe9, - 0x0b, 0x59, 0xcb, 0xb7, 0xf1, 0xcb, 0xff, 0xe8, 0xec, 0x48, 0x5d, 0x5d, - 0xe5, 0x19, 0xe3, 0x97, 0x3e, 0x8e, 0x54, 0x8f, 0xf4, 0x23, 0x08, 0x9f, - 0x7f, 0xb1, 0xb1, 0x8f, 0x75, 0x0e, 0x5f, 0xfe, 0xd7, 0xeb, 0xe8, 0xe6, - 0xfe, 0x17, 0xe9, 0xcb, 0xb3, 0x47, 0x2f, 0x3b, 0xb0, 0xd1, 0x16, 0xaa, - 0x48, 0x89, 0xc4, 0xb6, 0x0b, 0x5d, 0xcd, 0x1c, 0xae, 0x1e, 0x36, 0x8b, - 0xef, 0xff, 0xdf, 0xbf, 0x70, 0x79, 0xcc, 0xde, 0x5e, 0x45, 0x9c, 0xb9, - 0x90, 0x72, 0xff, 0xdf, 0xbf, 0xd1, 0xc9, 0xb9, 0x0d, 0x9c, 0xb8, 0x5b, - 0x39, 0x58, 0x7d, 0xfd, 0x16, 0x6d, 0x0a, 0xff, 0xf4, 0xa3, 0x07, 0xdf, - 0xb8, 0x75, 0x0a, 0x9c, 0xbf, 0x82, 0x30, 0xc5, 0xfe, 0x72, 0xfe, 0x8d, - 0xc3, 0xc7, 0x91, 0xcb, 0x82, 0x13, 0x97, 0xfc, 0xd8, 0xa6, 0x90, 0x77, - 0x91, 0xcb, 0x92, 0x73, 0x97, 0xfd, 0xef, 0xf8, 0xfa, 0x7c, 0xe9, 0xca, - 0x09, 0xe8, 0x20, 0xbd, 0x62, 0x30, 0x50, 0x5d, 0xe1, 0x13, 0x7f, 0xf3, - 0x39, 0x0a, 0xc0, 0xf9, 0xa2, 0x68, 0x9a, 0x83, 0x97, 0xf9, 0x3a, 0x3f, - 0xba, 0xac, 0x39, 0x70, 0xe8, 0xe5, 0x42, 0x27, 0xb1, 0x50, 0x4d, 0x2f, - 0xfe, 0x11, 0x8d, 0xfe, 0xe7, 0x35, 0x8d, 0x9c, 0xbf, 0xcc, 0x4d, 0x73, - 0x91, 0x23, 0x97, 0xff, 0xec, 0x06, 0x93, 0x76, 0xf1, 0x90, 0x3f, 0xbc, - 0x8e, 0x5f, 0xfd, 0x18, 0x3e, 0xd7, 0xb3, 0x1b, 0xd1, 0xca, 0x44, 0xc4, - 0xba, 0x8c, 0x26, 0x7e, 0x56, 0xbb, 0x37, 0x29, 0x68, 0x29, 0x60, 0x70, - 0xd3, 0x80, 0x5e, 0xff, 0x7b, 0x38, 0x05, 0xa6, 0x8a, 0x28, 0x69, 0xef, - 0xe9, 0x75, 0x36, 0x64, 0xc7, 0x2a, 0x0f, 0xd1, 0xd1, 0x2f, 0xee, 0xa3, - 0x21, 0x68, 0x72, 0xff, 0x40, 0x27, 0x79, 0x43, 0x59, 0xcb, 0x0c, 0x1f, - 0x10, 0x96, 0x59, 0x46, 0xa1, 0x90, 0x28, 0xd1, 0x86, 0x22, 0x13, 0x93, - 0x97, 0x64, 0x60, 0x2a, 0x91, 0x32, 0x18, 0xbb, 0x97, 0xa2, 0x54, 0xc5, - 0xdd, 0x87, 0x78, 0xc3, 0x43, 0x51, 0x9f, 0xed, 0xc3, 0xfb, 0xec, 0x20, - 0xaf, 0xff, 0xfe, 0x75, 0xa8, 0x9c, 0xe7, 0xfc, 0xe4, 0x0e, 0x2a, 0x9d, - 0xee, 0x7d, 0x39, 0x7f, 0xf9, 0xa2, 0x55, 0xb6, 0xb9, 0xc2, 0xd2, 0xf9, - 0xf3, 0xbb, 0x67, 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x15, 0x12, 0xfb, 0xb9, - 0xcc, 0x39, 0x79, 0x26, 0xda, 0x39, 0x50, 0x78, 0x3d, 0x21, 0xbf, 0xff, - 0x02, 0x53, 0xb4, 0x50, 0xd5, 0xce, 0xce, 0x7c, 0xf9, 0xdd, 0xb3, 0x97, - 0xff, 0xe7, 0x90, 0xc6, 0xb3, 0x76, 0x0b, 0xe6, 0xec, 0x39, 0x65, 0x24, - 0x9d, 0xc6, 0x31, 0xb1, 0xd7, 0xa4, 0x3b, 0x1a, 0xef, 0xfc, 0x1c, 0x5a, - 0x9b, 0x78, 0x29, 0xe3, 0x97, 0xb1, 0xbc, 0x39, 0x7f, 0x64, 0xe1, 0x8c, - 0x09, 0xcb, 0xe0, 0xf5, 0x26, 0x39, 0x58, 0x7a, 0x0e, 0x5b, 0x7b, 0xb0, - 0x13, 0x97, 0xfa, 0x21, 0x04, 0x7f, 0x6b, 0x39, 0x73, 0xfe, 0x72, 0xfb, - 0xa9, 0xd5, 0x1a, 0x08, 0xf3, 0x55, 0xb2, 0x62, 0x0e, 0x8e, 0x36, 0x69, - 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xaf, 0x57, 0xe4, 0xda, 0x67, 0xf3, 0x9c, - 0xba, 0x24, 0x72, 0xe8, 0x01, 0xcb, 0xfa, 0x7f, 0xbb, 0x6e, 0x20, 0x39, - 0x7f, 0xe7, 0x10, 0x67, 0xa0, 0x50, 0x07, 0x2a, 0x0f, 0xbb, 0x6c, 0xce, - 0xca, 0x62, 0x63, 0xfc, 0x34, 0x72, 0xd0, 0x0b, 0x7d, 0x84, 0x25, 0xff, - 0xca, 0x3c, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0x19, 0x7f, 0xf9, 0x45, - 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0xe1, 0x7f, 0xf9, 0x45, 0xbc, - 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0xfd, 0x7f, 0xf9, 0x45, 0xbc, 0x94, - 0xce, 0x31, 0xdd, 0x86, 0x8a, 0x19, 0x7f, 0xf2, 0xde, 0x4a, 0x67, 0x18, - 0xee, 0xc3, 0x45, 0x10, 0xbf, 0xf4, 0x94, 0xff, 0x5f, 0x23, 0x51, 0x23, - 0x94, 0xa2, 0x25, 0x21, 0x46, 0xff, 0xd3, 0x27, 0x77, 0xcf, 0x07, 0x16, - 0x72, 0xff, 0xc2, 0xea, 0x78, 0x7f, 0x79, 0x68, 0xe5, 0xfb, 0x8c, 0x77, - 0x61, 0xa2, 0x91, 0x5f, 0xfd, 0xdd, 0x8f, 0xcd, 0x3f, 0x75, 0x13, 0x9c, - 0xbf, 0xf9, 0xf7, 0xd7, 0x5b, 0x80, 0x7c, 0xfa, 0xb3, 0x97, 0xfd, 0x12, - 0x8e, 0x4f, 0x1c, 0x9c, 0xe5, 0xe7, 0x92, 0x98, 0x98, 0x03, 0x9a, 0x01, - 0x1c, 0x52, 0xef, 0xff, 0x49, 0x4e, 0x38, 0x1f, 0xc9, 0xcc, 0x59, 0xcb, - 0xfa, 0x59, 0xde, 0xbc, 0x8e, 0x5f, 0xff, 0xd8, 0x1e, 0xc7, 0xd5, 0x3c, - 0x2e, 0x0d, 0x6a, 0x00, 0x52, 0xca, 0x42, 0xaa, 0x06, 0x20, 0x2e, 0x33, - 0xf7, 0x4d, 0xf2, 0x56, 0xd9, 0x6d, 0xff, 0xf7, 0x63, 0xa8, 0xae, 0xb5, - 0x82, 0x0d, 0xbc, 0x39, 0x7c, 0xc7, 0x76, 0x1a, 0x25, 0x05, 0xff, 0xa0, - 0x0b, 0x79, 0x76, 0x1f, 0x87, 0x2a, 0x48, 0xbd, 0xe2, 0x90, 0x97, 0x5f, - 0xfe, 0x17, 0xf6, 0xbe, 0x8f, 0xf2, 0x1c, 0x59, 0xcb, 0xe5, 0x1e, 0x4a, - 0x61, 0xfd, 0x2c, 0xbe, 0xa7, 0x6d, 0x60, 0x65, 0x48, 0x54, 0x0c, 0x62, - 0x2c, 0x94, 0x5a, 0x8a, 0x6d, 0x71, 0x9a, 0x72, 0x38, 0x85, 0xab, 0xf5, - 0x48, 0x0b, 0x0d, 0x35, 0x8d, 0x43, 0xb3, 0xf9, 0x58, 0x7b, 0x51, 0xcf, - 0x5f, 0xfe, 0x51, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x73, 0x5f, - 0xfe, 0x51, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x89, 0x5f, 0xf7, - 0xef, 0xc9, 0x35, 0x3d, 0x80, 0x43, 0x97, 0xf2, 0x6a, 0x69, 0x20, 0x0e, - 0x5f, 0xe8, 0x9f, 0xee, 0xdb, 0x88, 0x0e, 0x5d, 0x25, 0x02, 0x8a, 0x8e, - 0xa1, 0x7d, 0x2e, 0xbf, 0xfc, 0xa6, 0x87, 0x01, 0x00, 0xe7, 0x21, 0xb3, - 0x95, 0xc4, 0x45, 0x00, 0xfe, 0xb8, 0xa8, 0x17, 0x4b, 0x1f, 0xc7, 0x15, - 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0x87, 0x17, 0xf7, 0xec, 0xe2, 0x40, 0x9c, - 0xb2, 0x98, 0x7c, 0x3d, 0x34, 0xbf, 0xe8, 0xe6, 0x33, 0xb1, 0xbc, 0x8e, - 0x5f, 0x31, 0xdd, 0x86, 0x88, 0xbd, 0x7e, 0x17, 0x03, 0xe8, 0xe5, 0xfb, - 0x26, 0x93, 0xe8, 0xe5, 0x70, 0xff, 0x3c, 0x5d, 0xf4, 0x9a, 0xfe, 0xc0, - 0xf7, 0x00, 0xe7, 0x2f, 0xa3, 0xf6, 0x9e, 0x8e, 0x56, 0x8f, 0x4d, 0xb2, - 0xcb, 0x86, 0x73, 0x97, 0xfd, 0xe1, 0x85, 0xfd, 0x0f, 0x60, 0xe5, 0x41, - 0xe8, 0xa0, 0xbd, 0xda, 0xdc, 0xe5, 0xf7, 0xa5, 0x0a, 0x94, 0xa5, 0x9b, - 0xb7, 0x18, 0xbf, 0x3c, 0xfe, 0xce, 0x9c, 0xb2, 0x93, 0xaa, 0x50, 0xc8, - 0x5a, 0xcd, 0x08, 0x4e, 0xba, 0x0a, 0xde, 0xd9, 0x05, 0xff, 0xff, 0xf0, - 0xba, 0x99, 0xfb, 0x4d, 0x15, 0x4f, 0x77, 0x12, 0x5a, 0xf9, 0x8a, 0xc4, - 0x8e, 0x5f, 0xb3, 0x4b, 0x0c, 0x1c, 0xbf, 0xf3, 0xc9, 0x4c, 0xe3, 0x1d, - 0xd8, 0x68, 0x99, 0x16, 0x51, 0x88, 0xf6, 0xe4, 0x21, 0x16, 0x4f, 0x7b, - 0xd8, 0xb3, 0x97, 0x75, 0x67, 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x16, 0xf2, - 0xca, 0x41, 0xf3, 0x84, 0x73, 0x05, 0xef, 0xff, 0x28, 0xb7, 0x92, 0x99, - 0xc6, 0x3b, 0xb0, 0xd1, 0x49, 0xae, 0x6a, 0x9a, 0xb3, 0x97, 0xf6, 0x78, - 0x62, 0x16, 0x72, 0xfe, 0xdc, 0x1f, 0x78, 0xe0, 0x39, 0x77, 0x54, 0x68, - 0x1f, 0xef, 0x48, 0x5c, 0xae, 0xa1, 0x77, 0x1a, 0x52, 0x9e, 0x32, 0x36, - 0x3d, 0x42, 0x8f, 0x61, 0xa7, 0xd8, 0x6a, 0xdf, 0xe5, 0x33, 0x8c, 0x77, - 0x61, 0xa2, 0x1d, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x25, 0x85, 0xf6, 0x01, - 0x68, 0x72, 0xfc, 0xa2, 0xde, 0x4a, 0x61, 0xea, 0xed, 0x9a, 0x5f, 0xe5, - 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x30, 0x5f, 0xff, 0xda, 0x70, 0x6d, 0xe2, - 0x82, 0xfe, 0x96, 0x7b, 0x02, 0x72, 0xf9, 0x49, 0x66, 0x8e, 0x5f, 0xff, - 0xf4, 0xb4, 0xa3, 0x3a, 0xf3, 0x33, 0xb9, 0xc6, 0xa3, 0xb3, 0x2f, 0x47, - 0x2f, 0xd9, 0xe0, 0x43, 0x0e, 0x5f, 0xfe, 0x8f, 0x20, 0x22, 0x41, 0xec, - 0x0b, 0x0e, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x23, 0xd5, 0xf6, 0x9f, 0x7d, - 0x87, 0x2e, 0x92, 0x98, 0x7b, 0x3e, 0x34, 0xbf, 0xff, 0x9d, 0x41, 0xff, - 0x3b, 0x82, 0x0c, 0x1f, 0x77, 0x0e, 0x59, 0x4d, 0xd3, 0xc0, 0x99, 0xc7, - 0x84, 0xef, 0x0a, 0x11, 0x2e, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x58, 0x6b, - 0xfd, 0x21, 0x8c, 0xd6, 0x09, 0xcb, 0x29, 0x87, 0xc9, 0xb9, 0xa5, 0xff, - 0xff, 0xe8, 0xe0, 0xc4, 0x69, 0x4f, 0x05, 0x17, 0xbc, 0xb5, 0xbc, 0xb3, - 0x93, 0x9c, 0xbf, 0xca, 0x67, 0x18, 0xee, 0xc3, 0x45, 0xce, 0xbf, 0xff, - 0xff, 0xfa, 0x1a, 0x3c, 0xa7, 0x67, 0x7e, 0x7c, 0xee, 0xda, 0x93, 0xfe, - 0xab, 0x46, 0x86, 0x86, 0xf3, 0xce, 0xc5, 0xfc, 0xf9, 0xdd, 0xb3, 0x95, - 0x0b, 0xb8, 0x53, 0xc2, 0x56, 0x48, 0x78, 0x80, 0xc5, 0xd4, 0x8f, 0x8d, - 0x70, 0xbb, 0xe9, 0x4f, 0x9e, 0xf6, 0x90, 0x2f, 0xf2, 0x99, 0xc6, 0x3b, - 0xb0, 0xd1, 0x0f, 0x2f, 0x98, 0xee, 0xc3, 0x44, 0x4c, 0xbf, 0xb3, 0x6b, - 0xf5, 0xe0, 0x4e, 0x5f, 0xef, 0x7e, 0xfb, 0xf6, 0x36, 0x1c, 0xae, 0x22, - 0x58, 0x4b, 0xbc, 0x63, 0x7e, 0x06, 0xbe, 0x60, 0x4e, 0x5f, 0xe4, 0x6f, - 0x07, 0x37, 0xf1, 0xca, 0x43, 0xdd, 0xe1, 0x55, 0xff, 0xfa, 0x38, 0x0e, - 0xc6, 0xc9, 0xa2, 0x17, 0xac, 0x09, 0xcb, 0xfe, 0xef, 0x63, 0x64, 0xb3, - 0x90, 0x72, 0xde, 0xea, 0x24, 0x5d, 0x5e, 0xff, 0x93, 0xc9, 0xec, 0x04, - 0x70, 0xe5, 0xf4, 0xfd, 0xfe, 0x73, 0x95, 0x88, 0x85, 0x72, 0x8f, 0xcd, - 0xef, 0x60, 0x7a, 0x72, 0xff, 0xfe, 0xf7, 0x63, 0x80, 0xd6, 0x07, 0xdf, - 0xbb, 0x33, 0x87, 0x2e, 0xf2, 0xce, 0x5f, 0xfe, 0xce, 0xfd, 0x9f, 0x50, - 0x9b, 0xfa, 0x16, 0x72, 0xff, 0xd3, 0xc4, 0xbe, 0xe7, 0x35, 0x8d, 0x9c, - 0xac, 0x4c, 0x0b, 0x75, 0xce, 0x8b, 0xfe, 0x9b, 0x7f, 0xf2, 0x7c, 0x0e, - 0x6c, 0xe3, 0xec, 0xea, 0x1c, 0xbe, 0x97, 0x7e, 0xe8, 0xe5, 0xcf, 0xf4, - 0xd1, 0x0b, 0xad, 0xed, 0xcf, 0x2b, 0xf2, 0x5b, 0xf7, 0x72, 0x7f, 0xc4, - 0xe5, 0xf3, 0xf2, 0x36, 0x1c, 0xa0, 0x9e, 0x60, 0x0a, 0x6f, 0xd3, 0x4b, - 0x1c, 0x4e, 0x59, 0x4c, 0x5c, 0xa1, 0xe4, 0x23, 0x3b, 0x19, 0xb8, 0x97, - 0xea, 0x31, 0xef, 0x1f, 0xff, 0x09, 0x3d, 0x8e, 0xdb, 0x64, 0x57, 0xfe, - 0xe7, 0xf3, 0xe7, 0x66, 0x18, 0x09, 0xcb, 0xba, 0xe7, 0x2d, 0xf9, 0xca, - 0xc3, 0x51, 0xa1, 0x6b, 0xc0, 0xd2, 0x90, 0x88, 0x9f, 0x34, 0xdf, 0xff, - 0x62, 0x4b, 0x4a, 0x66, 0xf2, 0x79, 0xfe, 0xb0, 0xe5, 0x42, 0x22, 0x7a, - 0x6b, 0x7f, 0xcd, 0x53, 0x43, 0x99, 0xe4, 0xef, 0xe7, 0x2f, 0xb4, 0x93, - 0xb4, 0x0e, 0x53, 0x54, 0x7d, 0x4d, 0x42, 0x1d, 0xff, 0xcd, 0x53, 0x54, - 0xd0, 0x49, 0xe3, 0xe3, 0x35, 0x87, 0x2f, 0xe6, 0xab, 0xef, 0x7b, 0x93, - 0x9c, 0xb7, 0x4e, 0x53, 0x54, 0x78, 0xff, 0x9b, 0x5f, 0x07, 0x06, 0x63, - 0x97, 0x27, 0x8e, 0x5b, 0xc8, 0x6e, 0x3a, 0x45, 0x7f, 0xb7, 0xf6, 0xf2, - 0xfc, 0x55, 0x39, 0x7f, 0xe8, 0x98, 0x73, 0x63, 0xad, 0x68, 0x72, 0x9c, - 0xfd, 0xff, 0x38, 0xbf, 0xff, 0xfb, 0xbf, 0x85, 0x33, 0x93, 0x0e, 0x6c, - 0xee, 0x06, 0x35, 0xa8, 0x54, 0xe5, 0xff, 0xe4, 0x9a, 0x59, 0xbc, 0xbe, - 0x2d, 0xdc, 0x4e, 0x5c, 0xfb, 0x47, 0x2c, 0xd0, 0xc4, 0xe6, 0x55, 0x84, - 0xeb, 0x08, 0xba, 0xea, 0xe9, 0x97, 0x6d, 0xaa, 0x72, 0xf9, 0xe5, 0x00, - 0x39, 0x7e, 0xeb, 0xf9, 0xe4, 0x72, 0xfe, 0x4e, 0x0e, 0x67, 0x0e, 0x5f, - 0xe9, 0x6a, 0x34, 0xd4, 0x9a, 0xa6, 0xa8, 0xe5, 0xff, 0xcb, 0xf9, 0xa1, - 0xcd, 0xe4, 0x2f, 0x39, 0xcb, 0xda, 0x40, 0x1c, 0xac, 0x3e, 0x34, 0x47, - 0xbc, 0xdb, 0x6d, 0x94, 0xbf, 0x38, 0xfb, 0xb8, 0x51, 0x43, 0x41, 0x7e, - 0x7f, 0x4d, 0x9e, 0x39, 0x41, 0x44, 0xf8, 0x10, 0x04, 0xde, 0xfd, 0xd1, - 0x6a, 0x7b, 0x7b, 0x47, 0x2e, 0x77, 0x39, 0x6e, 0xa1, 0xe4, 0xb9, 0xa5, - 0xff, 0xc0, 0x49, 0xbe, 0x76, 0x13, 0x9f, 0xb5, 0x9c, 0xbf, 0xb8, 0x9b, - 0x5c, 0xd6, 0x8e, 0x5f, 0xc3, 0xff, 0x92, 0x78, 0x39, 0x7f, 0xe4, 0x56, - 0x06, 0x35, 0x08, 0xb3, 0x97, 0xf6, 0x6c, 0xfe, 0x59, 0xa3, 0x97, 0xd8, - 0x1c, 0x9c, 0xe5, 0xf3, 0x5f, 0xc8, 0x6a, 0x0e, 0x5d, 0xc8, 0x39, 0x41, - 0x57, 0xa3, 0x84, 0x2c, 0x27, 0xdc, 0xad, 0x23, 0x46, 0x6b, 0x78, 0x98, - 0x9b, 0x89, 0x6b, 0x31, 0xe9, 0x70, 0x9e, 0x78, 0xc3, 0x61, 0x16, 0xd1, - 0x65, 0xf9, 0xb8, 0xc0, 0xa1, 0xcb, 0xdf, 0xfb, 0x47, 0x2f, 0xff, 0xff, - 0xfb, 0x5f, 0x3b, 0x93, 0xc3, 0x7b, 0xcb, 0x5f, 0x3f, 0x67, 0x39, 0x1f, - 0x26, 0x57, 0x7f, 0x9f, 0x3b, 0xb6, 0x72, 0xb1, 0x1e, 0x2c, 0x27, 0xf0, - 0xf5, 0xdf, 0x80, 0xe5, 0xdb, 0x6d, 0x51, 0xcb, 0xdf, 0x24, 0xc3, 0x95, - 0x07, 0xac, 0xa8, 0xc2, 0xc7, 0xef, 0xff, 0xee, 0x7c, 0x1c, 0xd9, 0x9c, - 0x97, 0xc8, 0x0b, 0xcd, 0xa3, 0x97, 0xff, 0xff, 0x0e, 0xf0, 0xa8, 0xe0, - 0x7a, 0x93, 0x7c, 0xd6, 0x6f, 0x2e, 0x63, 0x67, 0x2b, 0x11, 0xb0, 0x2c, - 0x37, 0xde, 0xfe, 0x27, 0x39, 0x7f, 0xa5, 0x9d, 0xc5, 0xc3, 0x0e, 0x52, - 0x1e, 0xb7, 0x89, 0x2f, 0xff, 0xed, 0xe5, 0xa5, 0xe0, 0xfc, 0xda, 0x4e, - 0xce, 0x99, 0xc3, 0x96, 0x6b, 0x39, 0x58, 0x7e, 0xac, 0x61, 0xbf, 0xff, - 0xf3, 0x7f, 0x07, 0x19, 0xd4, 0x1c, 0xff, 0x7f, 0x7c, 0x76, 0xf1, 0x53, - 0x97, 0xf9, 0x50, 0xff, 0x1d, 0x18, 0x39, 0x7f, 0xb7, 0x96, 0x95, 0xfe, - 0x37, 0x39, 0x7f, 0x9d, 0xbf, 0xe6, 0x8f, 0x39, 0xca, 0x84, 0xc5, 0x31, - 0xcd, 0x0d, 0x04, 0xe2, 0xff, 0xfc, 0x38, 0x1e, 0xfe, 0xde, 0x93, 0xdd, - 0x47, 0x01, 0xcb, 0xfc, 0x39, 0xb3, 0xe4, 0x97, 0x23, 0x95, 0xc4, 0x46, - 0xe9, 0x5a, 0xed, 0x6c, 0x39, 0x50, 0x6f, 0x3f, 0x23, 0xbe, 0x07, 0x92, - 0x73, 0x97, 0xfb, 0xdd, 0x41, 0x07, 0xd5, 0x9c, 0xbf, 0xd3, 0xc2, 0xc6, - 0x37, 0x01, 0xca, 0x91, 0xf4, 0xb9, 0xad, 0xfb, 0xbf, 0x1f, 0x34, 0x72, - 0xa0, 0xf2, 0xb0, 0x86, 0xff, 0xe7, 0xe4, 0xbe, 0x78, 0x62, 0x59, 0xe3, - 0x95, 0x0b, 0x94, 0x38, 0xee, 0x90, 0x96, 0xe4, 0x66, 0xbd, 0x8c, 0x0d, - 0xc8, 0x46, 0x1a, 0xdf, 0x90, 0x59, 0xac, 0xe5, 0xff, 0xf7, 0x13, 0xf6, - 0x9c, 0x7c, 0xd7, 0xe0, 0x5e, 0x78, 0xe5, 0xff, 0xa1, 0x9a, 0x84, 0xdf, - 0xd0, 0xb3, 0x96, 0x91, 0xca, 0x13, 0xcf, 0xfc, 0xfa, 0xfd, 0x00, 0xd4, - 0xfe, 0x39, 0x79, 0xfd, 0xa3, 0x97, 0x7f, 0x39, 0xca, 0x91, 0xb5, 0xe0, - 0xe5, 0xfb, 0x25, 0xd7, 0x91, 0xcb, 0x87, 0xd3, 0x1e, 0x47, 0x48, 0x6f, - 0xf3, 0x8f, 0xde, 0xf6, 0x02, 0x72, 0xfe, 0xfd, 0x9f, 0x03, 0xbb, 0x67, - 0x2f, 0xfa, 0x1b, 0xee, 0x0e, 0xf0, 0xa9, 0xcb, 0xb9, 0x23, 0x95, 0x08, - 0xe7, 0xdc, 0xb9, 0x0d, 0x38, 0x68, 0xb3, 0xab, 0xfd, 0xc8, 0x0c, 0x76, - 0x24, 0x72, 0xff, 0xfa, 0x3d, 0xf0, 0x7f, 0xda, 0xf9, 0x9e, 0xdb, 0xcf, - 0x1c, 0xa4, 0x44, 0x67, 0xe6, 0x57, 0xff, 0x76, 0x15, 0xf9, 0xe1, 0x7f, - 0x47, 0x8e, 0x5f, 0xef, 0x9b, 0xc9, 0x3b, 0xfa, 0xce, 0x50, 0x0f, 0xf8, - 0x51, 0xaf, 0xfe, 0xcd, 0x98, 0x1f, 0x9e, 0x55, 0x1b, 0xd1, 0xcb, 0xff, - 0x72, 0x6f, 0x9a, 0x84, 0x9d, 0xfc, 0x72, 0xa1, 0x15, 0xa1, 0x21, 0xfd, - 0x2a, 0xe7, 0x01, 0xcb, 0xff, 0xef, 0x83, 0x1a, 0x89, 0xc7, 0x03, 0xd4, - 0x98, 0xe5, 0xff, 0xff, 0xda, 0xe0, 0xc4, 0xdf, 0x3e, 0xf9, 0x25, 0x9b, - 0xfb, 0x36, 0x0e, 0x68, 0xe5, 0x71, 0x19, 0x22, 0xa3, 0x5e, 0x4c, 0x07, - 0xf8, 0x6f, 0xd1, 0xcb, 0xa6, 0x91, 0xca, 0x83, 0x47, 0xc0, 0xbb, 0xff, - 0x87, 0xda, 0xd8, 0x9e, 0x8c, 0x19, 0x8e, 0x5f, 0xb8, 0x9a, 0x8d, 0xce, - 0x56, 0x1f, 0x6b, 0xa2, 0xdf, 0xe9, 0xda, 0x13, 0x49, 0x3d, 0xa3, 0x97, - 0xe1, 0xf7, 0x73, 0x68, 0xe5, 0xfa, 0x6d, 0x3f, 0x15, 0x39, 0x79, 0xdb, - 0xe4, 0x1e, 0xa6, 0x15, 0x54, 0x91, 0xc0, 0x84, 0x1c, 0x84, 0x75, 0xff, - 0x75, 0x39, 0x37, 0x5f, 0x38, 0x72, 0xff, 0xff, 0xfe, 0x06, 0x87, 0x1f, - 0x7f, 0x81, 0xef, 0xff, 0x07, 0x37, 0x96, 0x7f, 0x38, 0xe3, 0xee, 0x72, - 0x98, 0x8c, 0x94, 0x39, 0xbc, 0xee, 0xc3, 0x45, 0x30, 0xac, 0x3c, 0xa6, - 0x11, 0x5f, 0xfb, 0x07, 0x79, 0x6b, 0xd1, 0xc9, 0x8e, 0x5e, 0xc4, 0x01, - 0xcb, 0x61, 0xcb, 0xdb, 0x8e, 0x00, 0xd5, 0xec, 0x1b, 0xa4, 0x44, 0xfb, - 0xb5, 0xdd, 0x3c, 0xc7, 0x2f, 0x69, 0x02, 0x72, 0xe0, 0xcc, 0x72, 0xfb, - 0x9d, 0x7f, 0x90, 0x79, 0xb8, 0x32, 0xb1, 0xcb, 0xfd, 0xf3, 0x79, 0x0c, - 0x66, 0x8e, 0x52, 0x1f, 0xdb, 0xa3, 0x5f, 0xff, 0x80, 0x9a, 0xf9, 0xd7, - 0xd7, 0xa2, 0x6d, 0x77, 0x0e, 0x5f, 0xc9, 0xd7, 0x49, 0xe0, 0xe5, 0xe9, - 0x46, 0xe7, 0x2f, 0xf2, 0xc3, 0xd8, 0x9f, 0x1b, 0x39, 0x58, 0x7f, 0xdb, - 0x96, 0x38, 0xed, 0xda, 0xd1, 0xcb, 0x61, 0xcb, 0xff, 0x4c, 0x8a, 0xa7, - 0x87, 0x36, 0xbe, 0x70, 0xd3, 0xec, 0x17, 0xbf, 0xff, 0xc3, 0x8c, 0xf7, - 0xa3, 0xda, 0x98, 0x71, 0xbf, 0x90, 0xd4, 0x1c, 0xbf, 0xf3, 0x21, 0x7d, - 0xcd, 0x62, 0x09, 0xca, 0x84, 0x52, 0x75, 0xa2, 0xfd, 0xc8, 0xd9, 0x1c, - 0x39, 0x7f, 0x38, 0xfc, 0x0c, 0x09, 0xca, 0x84, 0xde, 0x32, 0x30, 0x04, - 0x22, 0xfc, 0xa6, 0xff, 0xa1, 0xb6, 0x24, 0xf9, 0xbf, 0x8e, 0x53, 0x56, - 0xcd, 0xa8, 0x81, 0x49, 0xe1, 0x4f, 0x22, 0x20, 0xc7, 0x1a, 0xac, 0x35, - 0x59, 0x1a, 0x76, 0xf1, 0x98, 0xa2, 0x6c, 0xd1, 0xb6, 0xf2, 0x34, 0x75, - 0xc3, 0x03, 0xb0, 0xe9, 0x01, 0x00, 0xc3, 0x5b, 0xd1, 0xe6, 0xec, 0x42, - 0xbf, 0xee, 0x3b, 0x7f, 0x1c, 0x2f, 0x39, 0xcb, 0xf9, 0xdb, 0x98, 0x50, - 0x27, 0x2f, 0xff, 0xf0, 0x72, 0x77, 0x1f, 0x6a, 0x19, 0xf1, 0x6b, 0x41, - 0x61, 0xcb, 0xf8, 0x3a, 0x78, 0xde, 0x47, 0x2a, 0x11, 0x20, 0xec, 0x57, - 0xfd, 0x13, 0x75, 0x21, 0x6e, 0x13, 0x94, 0xaa, 0x6a, 0x7c, 0x3c, 0x18, - 0x5f, 0x7e, 0x43, 0x7d, 0x82, 0xab, 0x59, 0xcb, 0xff, 0xff, 0xf7, 0x53, - 0xdd, 0xce, 0x46, 0xcf, 0x8b, 0xff, 0x6b, 0xe6, 0x6f, 0x2c, 0xfc, 0x41, - 0xa3, 0x96, 0xf2, 0x22, 0xd3, 0x44, 0xb7, 0xfe, 0x86, 0x7c, 0x17, 0xd2, - 0xe0, 0x4e, 0x5f, 0xff, 0xb3, 0x3a, 0x8c, 0xee, 0x7c, 0xd7, 0xfd, 0x86, - 0xb3, 0x97, 0xff, 0xde, 0xee, 0x03, 0xe2, 0xe3, 0x3c, 0x1c, 0x13, 0x97, - 0xf3, 0x87, 0x9c, 0xfe, 0x73, 0x97, 0xe8, 0xc1, 0xf6, 0xd9, 0xca, 0x61, - 0xec, 0xac, 0xc2, 0xfb, 0xc9, 0xcc, 0x39, 0x6d, 0xfe, 0x1e, 0x1e, 0x11, - 0x5b, 0x58, 0x98, 0xb3, 0xc3, 0xb2, 0x96, 0x9e, 0xd8, 0x9f, 0x7a, 0x37, - 0x0b, 0xff, 0xff, 0xf0, 0xe6, 0xf2, 0x4d, 0x0e, 0x6c, 0xee, 0x4d, 0xd8, - 0x19, 0xbe, 0x3b, 0x13, 0x61, 0xca, 0x44, 0x5f, 0x7e, 0x6d, 0x7f, 0xf9, - 0x03, 0xf1, 0x69, 0xf2, 0x02, 0xf3, 0x68, 0xe5, 0xd2, 0x91, 0xcb, 0x72, - 0x0f, 0x96, 0x74, 0xeb, 0xf4, 0xa3, 0x79, 0x68, 0xe5, 0xff, 0xff, 0xff, - 0xb0, 0x55, 0xf8, 0x9d, 0xfd, 0x49, 0x93, 0xd0, 0xb1, 0x75, 0x7a, 0x8a, - 0x67, 0x77, 0x04, 0x04, 0xa5, 0xff, 0xff, 0xcc, 0x46, 0xc3, 0xff, 0x3e, - 0x7f, 0x13, 0xe9, 0x9d, 0xff, 0xbb, 0xbb, 0x67, 0x2e, 0xfe, 0x7d, 0xd3, - 0x46, 0x42, 0x9d, 0x42, 0x82, 0xa1, 0x73, 0xef, 0xb2, 0xb0, 0x5e, 0x11, - 0x03, 0x1b, 0x75, 0xfe, 0x79, 0x62, 0xdc, 0x40, 0x72, 0xfb, 0x3b, 0x13, - 0x1c, 0xbc, 0xb6, 0x7c, 0xe9, 0xe9, 0xb9, 0x8d, 0xff, 0xff, 0xee, 0x30, - 0x73, 0x67, 0xcd, 0x26, 0x08, 0x3e, 0x0e, 0x6c, 0x1c, 0xd6, 0xc3, 0x97, - 0xfc, 0xcc, 0x75, 0xfc, 0xdb, 0x85, 0x9c, 0xac, 0x45, 0xdf, 0x1f, 0xaf, - 0xff, 0xc8, 0x3e, 0xee, 0x6d, 0x7a, 0x6c, 0x6b, 0x71, 0x01, 0xcb, 0xf4, - 0x37, 0xf3, 0x53, 0x1c, 0xbf, 0xf0, 0xce, 0x39, 0xb3, 0x5f, 0xc6, 0xe7, - 0x2f, 0xfc, 0x1e, 0xc6, 0xff, 0x1a, 0x9e, 0xc0, 0x21, 0xca, 0x84, 0x46, - 0x4e, 0x85, 0x48, 0x9a, 0xbe, 0x88, 0xbc, 0xb5, 0xfc, 0x2e, 0x2f, 0xfe, - 0x6f, 0x35, 0xfc, 0x2b, 0xa8, 0xe4, 0xc7, 0x2f, 0xb9, 0x27, 0x09, 0xcb, - 0xff, 0x0c, 0x99, 0xd4, 0xe8, 0xff, 0x39, 0xcb, 0xde, 0xc6, 0x99, 0xca, - 0x83, 0xe0, 0xc4, 0x0b, 0xdb, 0x79, 0xd3, 0x97, 0x60, 0x4e, 0x54, 0xea, - 0xea, 0x65, 0x29, 0x1f, 0x10, 0xdd, 0x23, 0x50, 0x82, 0xf1, 0x06, 0xc1, - 0xfb, 0xf2, 0x7b, 0x58, 0x03, 0x97, 0xee, 0xe6, 0xc4, 0xd8, 0x72, 0xf2, - 0x60, 0x0e, 0x5f, 0xc1, 0x81, 0xeb, 0xc8, 0xe5, 0xe8, 0x0c, 0x1c, 0xbf, - 0x67, 0xb4, 0xf3, 0x7c, 0x3c, 0x75, 0x96, 0x5f, 0x35, 0x6d, 0x49, 0xa4, - 0xd5, 0x9c, 0xbe, 0x47, 0x10, 0x9c, 0xb3, 0x7f, 0x0f, 0x5c, 0x26, 0xf5, - 0x24, 0x61, 0xa4, 0x26, 0x2f, 0xff, 0xdc, 0xff, 0x9c, 0x81, 0xc5, 0x53, - 0xbd, 0xcf, 0xa7, 0x2f, 0xbf, 0x7d, 0xfc, 0x72, 0xa4, 0xa8, 0x68, 0x24, - 0xea, 0x95, 0xcd, 0x19, 0x2f, 0x09, 0xfa, 0xb1, 0x47, 0x2f, 0xed, 0x31, - 0x8e, 0x2a, 0x9c, 0xa6, 0x88, 0xdc, 0xf8, 0x2e, 0xff, 0x0f, 0xcd, 0x9b, - 0xcb, 0x53, 0x1c, 0xba, 0x7d, 0xce, 0x5f, 0xba, 0xed, 0x70, 0x03, 0x94, - 0x13, 0xfd, 0x73, 0xad, 0xa1, 0x9b, 0xfd, 0xc9, 0x87, 0x3a, 0xfe, 0x39, - 0x50, 0x98, 0x3e, 0x42, 0x8d, 0x0c, 0x6f, 0xc9, 0xc0, 0xe0, 0x9c, 0xbf, - 0x03, 0x3d, 0xf6, 0x73, 0x97, 0xf9, 0xbf, 0x67, 0x7e, 0x6f, 0xa3, 0x95, - 0x07, 0xc6, 0xe5, 0x75, 0x24, 0x6e, 0x74, 0xcc, 0x61, 0x13, 0x7f, 0x77, - 0x19, 0x28, 0x59, 0xcb, 0xfd, 0xdc, 0x93, 0x8e, 0x6e, 0x72, 0xb0, 0xf7, - 0xfc, 0x5b, 0x7f, 0xff, 0xc2, 0xe0, 0xd4, 0xf8, 0x83, 0xe1, 0xcd, 0x9f, - 0x34, 0xd8, 0x9c, 0xbf, 0xbb, 0x83, 0xbc, 0x2a, 0x72, 0x85, 0x17, 0x1e, - 0x21, 0x6d, 0xa6, 0xf6, 0x24, 0xc7, 0x2f, 0xfc, 0x99, 0x37, 0xcd, 0x47, - 0x5d, 0xac, 0xe5, 0xff, 0x6f, 0x91, 0xbc, 0xc3, 0x0b, 0x39, 0x7f, 0x6f, - 0xae, 0xe3, 0xf0, 0xe5, 0xff, 0xff, 0x91, 0x7c, 0x4c, 0xdc, 0x7f, 0xf4, - 0x77, 0xe6, 0xc4, 0xf4, 0xd0, 0x72, 0x9d, 0x13, 0xfe, 0x2e, 0xa9, 0xd3, - 0x5a, 0x08, 0xe7, 0x50, 0xfd, 0x0d, 0x9b, 0xff, 0xec, 0x79, 0xfb, 0x09, - 0xed, 0x44, 0xf9, 0xa3, 0x97, 0xfd, 0x9c, 0x9e, 0x13, 0x98, 0x27, 0x2c, - 0xb3, 0x9f, 0x0d, 0xbd, 0xe1, 0xc0, 0x9c, 0xa8, 0x37, 0xdb, 0x91, 0xdf, - 0xdb, 0xeb, 0x30, 0x55, 0x39, 0x7c, 0xbf, 0xb0, 0x03, 0x97, 0xff, 0xa7, - 0x0f, 0x1d, 0x83, 0x9b, 0x38, 0x9a, 0x39, 0x58, 0x89, 0xe4, 0x2e, 0xfc, - 0x92, 0xff, 0x3f, 0xba, 0xf3, 0x7d, 0x59, 0xcb, 0xdf, 0xee, 0x03, 0x97, - 0xf6, 0xa3, 0x70, 0x72, 0x0e, 0x5c, 0x14, 0x39, 0x50, 0xb8, 0x33, 0x91, - 0xc5, 0x31, 0x11, 0x21, 0x89, 0xc8, 0x5f, 0xb9, 0x78, 0x9b, 0x68, 0x7f, - 0x61, 0x75, 0xfd, 0xe7, 0xef, 0xc0, 0xc1, 0xcb, 0xff, 0xde, 0xd7, 0xdd, - 0x7c, 0xf0, 0xc4, 0xb3, 0xc7, 0x2f, 0xf7, 0x92, 0x7c, 0xef, 0xfe, 0x39, - 0x7d, 0xed, 0x42, 0xa7, 0x2d, 0x31, 0xcb, 0xfb, 0x3f, 0xce, 0xb2, 0x73, - 0x96, 0xde, 0x0f, 0x07, 0x42, 0x55, 0x08, 0x8c, 0xc6, 0x4b, 0xfb, 0xaf, - 0x25, 0xf1, 0x0e, 0x5f, 0xfc, 0xaa, 0xaf, 0xed, 0x78, 0x63, 0x79, 0x1c, - 0xbf, 0xbc, 0x31, 0x2c, 0xf1, 0xca, 0x83, 0xf3, 0x92, 0x3d, 0xc9, 0xa3, - 0x96, 0x59, 0xcb, 0xdc, 0xcd, 0xce, 0x50, 0x4f, 0x13, 0xa2, 0xc0, 0x11, - 0xbf, 0xfc, 0xea, 0xf9, 0x58, 0x19, 0x67, 0x51, 0x67, 0x2f, 0xc9, 0xad, - 0x42, 0xce, 0x52, 0x22, 0x80, 0x4b, 0xf6, 0x25, 0x54, 0x2b, 0x34, 0xc2, - 0xf5, 0x53, 0x92, 0x18, 0x20, 0x21, 0x18, 0x50, 0x7f, 0x18, 0x2d, 0xf8, - 0x28, 0x2e, 0x13, 0x97, 0x01, 0x87, 0x2f, 0xff, 0x64, 0xdd, 0x81, 0x54, - 0x73, 0xdd, 0xfc, 0xe5, 0xa4, 0xa9, 0xf1, 0x74, 0x5e, 0x91, 0x16, 0x3c, - 0x84, 0x45, 0xff, 0xfe, 0x4c, 0xde, 0x5a, 0xf7, 0x61, 0x70, 0x81, 0xf9, - 0x0d, 0x41, 0xcb, 0xfc, 0xe3, 0xf1, 0x9a, 0x00, 0x4e, 0x5f, 0xfb, 0xfd, - 0x7c, 0x5f, 0xde, 0xbf, 0x60, 0xe5, 0xfb, 0x3d, 0xfe, 0x6e, 0x72, 0xf2, - 0xb9, 0xb9, 0xcb, 0xa2, 0x6f, 0x87, 0x8f, 0xe2, 0x9a, 0x14, 0x5d, 0xff, - 0x08, 0xbb, 0xff, 0xff, 0xf7, 0xe3, 0xf1, 0xb7, 0xde, 0x5c, 0x70, 0x7c, - 0xd7, 0xf1, 0xbf, 0x71, 0x07, 0x15, 0x39, 0x7f, 0xff, 0xdc, 0xf7, 0xf8, - 0x3f, 0x13, 0x3c, 0x30, 0x0f, 0x98, 0x81, 0x39, 0x7f, 0xfd, 0xce, 0x67, - 0xb5, 0xd4, 0xcf, 0x9d, 0x04, 0x1c, 0xa4, 0x45, 0xcf, 0xed, 0x15, 0x89, - 0xb3, 0xf6, 0x34, 0x4b, 0xf6, 0x0b, 0x3e, 0xac, 0xe5, 0xff, 0xdd, 0xc8, - 0x19, 0x87, 0x3d, 0xa7, 0x39, 0x69, 0x78, 0xfa, 0xf6, 0x8a, 0x6f, 0xff, - 0xc1, 0xc5, 0xfc, 0xda, 0xf4, 0x6a, 0x69, 0x3f, 0x27, 0x39, 0x7f, 0xff, - 0x79, 0x27, 0xc0, 0xfc, 0x5b, 0xcb, 0x89, 0x3b, 0xac, 0xe5, 0xfe, 0x9d, - 0xd6, 0x31, 0xc9, 0x8e, 0x5f, 0xf6, 0xf8, 0xa8, 0x17, 0x9f, 0x39, 0x88, - 0x92, 0x45, 0xeb, 0xfe, 0xc1, 0x9f, 0xe0, 0x1d, 0xe6, 0x39, 0x7f, 0xfd, - 0x9f, 0xf3, 0xe4, 0xdd, 0xfd, 0x54, 0xc1, 0x54, 0xe5, 0xff, 0x72, 0x78, - 0x9e, 0x7f, 0xf9, 0x39, 0xcb, 0xff, 0x7c, 0x9b, 0xbf, 0xaa, 0x98, 0x2a, - 0x9c, 0xbf, 0xc3, 0xf3, 0x5f, 0xed, 0xff, 0xc3, 0x95, 0x87, 0xff, 0xfa, - 0x25, 0x42, 0x38, 0x35, 0x0b, 0xeb, 0xff, 0xd3, 0xfc, 0xd7, 0x7f, 0xf9, - 0xed, 0x6a, 0x38, 0x72, 0xff, 0xfb, 0xb1, 0x3f, 0xc1, 0xcd, 0x8f, 0xde, - 0xc6, 0xe7, 0x2f, 0xff, 0xfb, 0x7d, 0x26, 0x37, 0xf3, 0xb9, 0xed, 0x64, - 0xff, 0x31, 0x02, 0x72, 0x82, 0x8c, 0x0c, 0x54, 0xbf, 0xa7, 0xf4, 0xc3, - 0x0b, 0x39, 0x7f, 0xff, 0x64, 0xf8, 0x81, 0x1f, 0xfb, 0xf2, 0x02, 0xf3, - 0x68, 0xe5, 0xff, 0x63, 0x79, 0xd4, 0xe7, 0x5c, 0xe5, 0x62, 0x7f, 0x29, - 0x18, 0x93, 0x91, 0x68, 0xbf, 0xcb, 0xd5, 0x3b, 0x23, 0x18, 0x2c, 0xea, - 0xc3, 0xc1, 0x91, 0xc7, 0xef, 0x09, 0x44, 0x2b, 0xe4, 0x3b, 0xd6, 0xa7, - 0xd3, 0xbd, 0x46, 0x6d, 0xe9, 0x44, 0x17, 0xfb, 0xc3, 0x9e, 0xee, 0x4e, - 0x72, 0xff, 0xcf, 0xce, 0xe7, 0xa0, 0x50, 0x07, 0x2f, 0xff, 0x87, 0x27, - 0xf8, 0x0f, 0xfd, 0x98, 0xb0, 0x36, 0x72, 0xfa, 0x5e, 0x49, 0xce, 0x5f, - 0xf6, 0x37, 0xbc, 0xb5, 0xf3, 0xc8, 0x72, 0xff, 0xd2, 0x8c, 0x07, 0x73, - 0x05, 0x87, 0x2f, 0xff, 0x75, 0x04, 0x3f, 0x3e, 0xb0, 0x73, 0xb8, 0x72, - 0xb1, 0x11, 0x13, 0x1e, 0x5f, 0xf7, 0x51, 0x71, 0x83, 0xed, 0x1c, 0xbf, - 0xff, 0xdf, 0xfb, 0x9f, 0xcd, 0xf3, 0xd3, 0x77, 0xf0, 0x79, 0x33, 0x68, - 0xe5, 0xf4, 0x32, 0x17, 0xf1, 0x18, 0xec, 0x23, 0x13, 0x7a, 0x85, 0x57, - 0x2c, 0x33, 0xe1, 0xe3, 0xaa, 0x09, 0x1e, 0xd4, 0x71, 0x97, 0xff, 0xf7, - 0x31, 0xd7, 0xf1, 0x57, 0xdf, 0xb9, 0xde, 0xc7, 0x8e, 0x5f, 0x67, 0x26, - 0x91, 0xcb, 0xff, 0xfb, 0x03, 0xdf, 0xf5, 0xf3, 0xa9, 0xee, 0xe7, 0x23, - 0x61, 0xcb, 0xa1, 0x78, 0x88, 0x31, 0x23, 0xb4, 0x1c, 0xbe, 0x4e, 0x3e, - 0xe7, 0x2e, 0x4f, 0x21, 0xb2, 0xd0, 0x85, 0xff, 0xc9, 0xb1, 0x03, 0xf2, - 0x26, 0x0b, 0xb6, 0x72, 0xff, 0xff, 0xf0, 0xa2, 0xbd, 0x79, 0xbe, 0x0f, - 0xfb, 0x5f, 0x33, 0x79, 0x67, 0xe2, 0x0d, 0x1c, 0xbf, 0x75, 0x20, 0x67, - 0x39, 0x68, 0x5a, 0x2a, 0x76, 0x42, 0x0a, 0xb4, 0x99, 0x0f, 0xa1, 0xe5, - 0x52, 0x4d, 0xd5, 0x23, 0x4c, 0xa8, 0x67, 0xd1, 0x65, 0x23, 0xb5, 0x25, - 0xbc, 0xf1, 0x7f, 0xb0, 0xe1, 0x78, 0xf4, 0xef, 0xd0, 0x3e, 0x4d, 0x87, - 0x2f, 0xbd, 0xa7, 0x01, 0xcb, 0xff, 0xba, 0x9f, 0x13, 0x9f, 0xce, 0xfc, - 0x61, 0xcb, 0xe4, 0xeb, 0xce, 0x72, 0xfb, 0x64, 0x7a, 0x0e, 0x5f, 0xb5, - 0x9e, 0x4d, 0x1c, 0xbf, 0xf9, 0x3d, 0xd4, 0xcc, 0x08, 0xe3, 0x67, 0x2f, - 0xff, 0xbf, 0xc4, 0xee, 0x33, 0xa9, 0xf1, 0xb5, 0xb0, 0xe5, 0xef, 0x63, - 0x67, 0x2f, 0x67, 0xf3, 0x89, 0xf8, 0x79, 0x4e, 0xfd, 0xfb, 0x4c, 0x5f, - 0xc7, 0x2f, 0xee, 0xbc, 0xff, 0x25, 0xe3, 0x97, 0xf3, 0xcd, 0xf7, 0x51, - 0x87, 0x2f, 0xcf, 0xc1, 0xdd, 0x0e, 0x54, 0x22, 0xcd, 0x0b, 0x3a, 0x63, - 0xe2, 0xfa, 0x0a, 0xad, 0x2c, 0x28, 0x54, 0x89, 0x89, 0x08, 0x45, 0x31, - 0x1a, 0xc9, 0xc6, 0x16, 0x5e, 0x87, 0x3d, 0xf0, 0xfa, 0x16, 0x72, 0xff, - 0x76, 0x10, 0x5f, 0x8a, 0x9c, 0xbf, 0xa1, 0x05, 0xf8, 0xa9, 0xcb, 0xf9, - 0xc1, 0xce, 0x27, 0x3e, 0x1e, 0xf7, 0x4c, 0xaf, 0xff, 0xff, 0x7c, 0x5c, - 0x67, 0xbe, 0x64, 0x93, 0x60, 0xe6, 0xbe, 0x40, 0x5e, 0x6d, 0x1c, 0xbf, - 0x85, 0x9f, 0x1b, 0xd0, 0x0e, 0x54, 0x91, 0x5e, 0xef, 0xd4, 0x89, 0xcb, - 0x01, 0xff, 0xf8, 0x7a, 0xde, 0xd7, 0x90, 0xe5, 0xe9, 0x81, 0xb9, 0xcb, - 0xd0, 0xaf, 0xc6, 0x1b, 0xb0, 0x0e, 0x58, 0x07, 0x2f, 0xe8, 0xe4, 0xf1, - 0xc9, 0xce, 0x5e, 0xfd, 0xf4, 0x72, 0xa4, 0x79, 0x9f, 0x4b, 0xef, 0xff, - 0xe4, 0xe7, 0xcc, 0x4c, 0x15, 0x7a, 0x98, 0xbc, 0x61, 0xcb, 0xff, 0xfe, - 0x49, 0xf9, 0x0b, 0xd7, 0xf1, 0xf2, 0x39, 0x01, 0xec, 0x2c, 0xe5, 0x62, - 0x30, 0xf8, 0xb5, 0x7e, 0x06, 0x93, 0x76, 0xce, 0x5f, 0xfb, 0x99, 0xbf, - 0x77, 0x85, 0xcf, 0x07, 0x2f, 0xff, 0xff, 0x73, 0x89, 0x3f, 0xce, 0xe7, - 0x86, 0x26, 0xee, 0x4f, 0x1b, 0xfb, 0xf6, 0x1c, 0xbf, 0xff, 0xfa, 0x15, - 0xec, 0x7c, 0x1c, 0xfd, 0x5f, 0x9b, 0xcb, 0x48, 0x3f, 0x62, 0x73, 0x97, - 0xed, 0xf4, 0x98, 0x27, 0x2b, 0x11, 0x45, 0xfb, 0xdd, 0x22, 0x68, 0x7d, - 0x8c, 0x82, 0xff, 0xee, 0x0e, 0xf9, 0xaf, 0xe6, 0x18, 0x59, 0xcb, 0xfe, - 0x45, 0x7b, 0x09, 0x3c, 0x2a, 0x72, 0xd2, 0x44, 0x40, 0x69, 0x1a, 0xff, - 0x87, 0xf9, 0x87, 0x3a, 0xfe, 0x39, 0x7f, 0xbb, 0x0d, 0x87, 0xae, 0xb3, - 0x97, 0xfc, 0xbc, 0xd7, 0xc9, 0x86, 0x16, 0x72, 0x82, 0x7d, 0xeb, 0x34, - 0xbf, 0xff, 0xe7, 0xe7, 0x73, 0xc9, 0x83, 0x3e, 0xa3, 0x04, 0x3d, 0x83, - 0x97, 0xde, 0xf9, 0x3f, 0x0e, 0x56, 0xe8, 0x89, 0x76, 0x3b, 0xff, 0xff, - 0x6f, 0x93, 0xff, 0xb5, 0xf3, 0x79, 0x7a, 0x1b, 0xf9, 0x9c, 0x00, 0x20, - 0xe5, 0xff, 0xe6, 0xdc, 0x67, 0x5f, 0xe8, 0x14, 0x14, 0x39, 0x7f, 0x4d, - 0xbc, 0xbf, 0x8f, 0x1c, 0xbf, 0xb2, 0x5e, 0x1c, 0x91, 0xcb, 0xfe, 0xeb, - 0xac, 0x73, 0xaf, 0xe3, 0x97, 0xd9, 0xc0, 0x36, 0x72, 0xa1, 0x16, 0xfd, - 0x31, 0xd1, 0x67, 0x8d, 0xef, 0xfe, 0xcf, 0x6b, 0xe7, 0x31, 0x3b, 0x01, - 0x39, 0x7f, 0x67, 0xb9, 0xcc, 0x91, 0xcb, 0xf8, 0x73, 0xa3, 0x8c, 0x39, - 0x7c, 0x39, 0xaf, 0x93, 0x1e, 0xc7, 0x8b, 0x6f, 0xfb, 0x17, 0xd8, 0x4e, - 0x7e, 0xd6, 0x72, 0x82, 0xbd, 0xc3, 0x84, 0x4a, 0x95, 0x32, 0x38, 0x4d, - 0xe1, 0x52, 0x85, 0x1c, 0x85, 0x47, 0x61, 0x56, 0xe4, 0x7a, 0x79, 0xf4, - 0x60, 0x3f, 0x9e, 0x6c, 0x84, 0xef, 0xd3, 0xbb, 0xff, 0x63, 0x63, 0x9f, - 0xe2, 0xb2, 0x01, 0xcb, 0xff, 0x0e, 0x7c, 0xe6, 0x74, 0x72, 0x63, 0x97, - 0xff, 0xfb, 0xae, 0x0d, 0x7c, 0x1c, 0xd8, 0x39, 0xac, 0x5c, 0x30, 0xe5, - 0x0a, 0x28, 0x74, 0x7f, 0x4d, 0x13, 0x28, 0x3a, 0x17, 0x72, 0x7f, 0x23, - 0x78, 0x73, 0x3c, 0x38, 0x6f, 0xec, 0xef, 0xd1, 0xdc, 0x07, 0x2f, 0xee, - 0xe0, 0xf8, 0x1f, 0x9c, 0xbf, 0xf2, 0x04, 0x30, 0x0f, 0x99, 0xbf, 0x8e, - 0x5f, 0xfa, 0x51, 0xad, 0x42, 0x4e, 0xfe, 0x39, 0x7e, 0x18, 0x5b, 0x84, - 0xe5, 0xfe, 0xc9, 0xbb, 0x9e, 0x80, 0x9c, 0xbf, 0x87, 0xce, 0xb4, 0xf1, - 0xcb, 0x48, 0xe5, 0x41, 0xbd, 0xf1, 0x65, 0xe1, 0x64, 0x1c, 0xbf, 0xff, - 0xfe, 0xee, 0x7b, 0x4f, 0x37, 0xc1, 0xcd, 0xe5, 0x9f, 0xce, 0x38, 0x1e, - 0xa4, 0xc7, 0x2e, 0xfd, 0x53, 0x94, 0x88, 0xb6, 0xe0, 0xdf, 0xa1, 0x05, - 0x7f, 0x80, 0x9e, 0xf7, 0xb1, 0xb3, 0x97, 0xf6, 0x4e, 0x39, 0xbe, 0x8e, - 0x5f, 0xfc, 0x20, 0xdb, 0xce, 0xa4, 0x2d, 0xc2, 0x72, 0xff, 0xff, 0xfd, - 0x2d, 0x6b, 0xf8, 0xf2, 0x07, 0x06, 0x6f, 0x83, 0x9c, 0x81, 0xf7, 0x73, - 0x68, 0xe5, 0xff, 0xdb, 0xcb, 0x58, 0xbd, 0xe3, 0xbd, 0x83, 0x95, 0xba, - 0x33, 0x79, 0x08, 0x7b, 0x68, 0xe5, 0x62, 0x69, 0x9f, 0xc6, 0x25, 0xf4, - 0xa6, 0xd3, 0x9c, 0xbf, 0x67, 0x19, 0xdc, 0x39, 0x58, 0x6e, 0x44, 0x4a, - 0xfe, 0xcd, 0xe5, 0x00, 0x83, 0x97, 0xe1, 0xce, 0xbf, 0x8e, 0x5a, 0x37, - 0x3d, 0x35, 0x96, 0xdf, 0x7c, 0x64, 0xed, 0x9c, 0xbf, 0x4f, 0xf3, 0xf8, - 0x98, 0xe5, 0xff, 0xff, 0x0c, 0x03, 0x79, 0x6b, 0xf8, 0xf0, 0xe0, 0x53, - 0x39, 0x31, 0xca, 0x74, 0x4a, 0x78, 0xb6, 0xa1, 0x78, 0x50, 0x26, 0x18, - 0x5d, 0xba, 0x0a, 0x1f, 0x4c, 0x4d, 0xd7, 0x07, 0x86, 0xb0, 0x0d, 0x04, - 0xd3, 0x51, 0xbd, 0x79, 0xcb, 0xf7, 0x2d, 0x85, 0x1f, 0x61, 0x77, 0x7e, - 0x92, 0x73, 0x37, 0x39, 0x7b, 0x5d, 0xc3, 0x97, 0xec, 0xd4, 0xf8, 0xd9, - 0xca, 0xdc, 0xfb, 0x66, 0x28, 0xe8, 0xe5, 0xff, 0xf4, 0xf8, 0xc0, 0xf5, - 0x31, 0x5f, 0x8a, 0xff, 0x07, 0x2f, 0xfe, 0x92, 0x7b, 0xb9, 0xce, 0x67, - 0xb4, 0x72, 0xff, 0xbe, 0x7d, 0xf2, 0x6c, 0x81, 0x61, 0xca, 0x44, 0x6b, - 0xcc, 0xab, 0xd4, 0x4b, 0xff, 0xd1, 0xbc, 0xb5, 0xe7, 0x9f, 0x68, 0x73, - 0x73, 0x97, 0xfd, 0xd9, 0xd3, 0x07, 0x79, 0x68, 0xe5, 0xff, 0x6f, 0xdc, - 0x60, 0xe7, 0xed, 0x67, 0x2f, 0xff, 0x9b, 0xc6, 0x6b, 0x3d, 0x36, 0x2a, - 0x38, 0x03, 0x96, 0x94, 0x23, 0x23, 0x0e, 0x90, 0xf6, 0xfe, 0x4d, 0xc1, - 0xc7, 0x09, 0xcb, 0xd9, 0xc0, 0x1c, 0xbf, 0x69, 0x30, 0x40, 0x72, 0xd8, - 0x87, 0x85, 0xa1, 0xcb, 0xf2, 0x00, 0x19, 0xc3, 0x95, 0xd4, 0x5e, 0x8b, - 0x86, 0x89, 0xaf, 0xb6, 0xbd, 0x9d, 0x39, 0x72, 0x2c, 0xe5, 0xff, 0xff, - 0xb7, 0x93, 0xef, 0xf0, 0x7f, 0xda, 0xf9, 0x9b, 0xcb, 0x3f, 0x10, 0x68, - 0xe5, 0x2d, 0x11, 0xdb, 0x42, 0xd7, 0xb6, 0xd1, 0xa6, 0x72, 0xbe, 0x26, - 0x57, 0x39, 0x7e, 0x42, 0xcf, 0x6c, 0x9a, 0xff, 0xff, 0xfd, 0x1b, 0xeb, - 0xf8, 0xdf, 0xe7, 0x70, 0x3f, 0x07, 0x3f, 0x57, 0xe6, 0x80, 0x04, 0xf1, - 0xcb, 0xf4, 0x0e, 0xef, 0x39, 0xcb, 0xff, 0xff, 0xff, 0x63, 0x23, 0xb0, - 0xbf, 0x66, 0xb5, 0x1c, 0xe4, 0x0e, 0x4f, 0x9f, 0xeb, 0xf9, 0x86, 0x16, - 0x72, 0xf7, 0xfc, 0x54, 0xe5, 0x2d, 0x17, 0x3b, 0x70, 0x9a, 0xbf, 0x38, - 0x3e, 0xbc, 0xe7, 0x2b, 0x0f, 0x55, 0x0a, 0xef, 0x20, 0x20, 0xe5, 0xfc, - 0x11, 0xce, 0xbf, 0x8e, 0x5f, 0xbd, 0xbc, 0x93, 0x87, 0x2b, 0x0f, 0x57, - 0x45, 0x95, 0x3a, 0x24, 0x40, 0xe1, 0x7f, 0xa7, 0xfe, 0x3c, 0xb4, 0xf1, - 0xcb, 0xff, 0x42, 0xbb, 0x5f, 0xe0, 0xcd, 0xf5, 0x67, 0x2b, 0x0f, 0xef, - 0x73, 0x5b, 0xff, 0x66, 0x03, 0x5f, 0x39, 0xa0, 0xe8, 0xe5, 0xfe, 0xe6, - 0x33, 0xa9, 0xc9, 0x8e, 0x5d, 0x9e, 0x09, 0xfa, 0xe2, 0x0d, 0xe4, 0x1f, - 0x1c, 0xbf, 0xa5, 0xa7, 0x5f, 0xfa, 0x39, 0x53, 0x9e, 0x53, 0x8d, 0xdf, - 0xb3, 0xbd, 0x79, 0x1c, 0xbf, 0xbc, 0x9c, 0x9f, 0x18, 0x72, 0xa1, 0x92, - 0x95, 0x91, 0x84, 0x2a, 0x61, 0xbc, 0x62, 0xe9, 0x28, 0x6f, 0x89, 0x0b, - 0x84, 0x77, 0x63, 0x36, 0x78, 0x58, 0x8c, 0x27, 0xf5, 0x09, 0x7f, 0xdd, - 0xb6, 0xc8, 0xb6, 0x89, 0xef, 0x3b, 0x30, 0xe5, 0xff, 0xa6, 0xf9, 0xe1, - 0xc6, 0xf1, 0x34, 0x72, 0x9a, 0x47, 0xb9, 0x03, 0x74, 0x72, 0xfe, 0xc5, - 0xc7, 0x5f, 0xa7, 0x2e, 0xf9, 0x31, 0xca, 0xf8, 0x78, 0xc1, 0x2c, 0xbf, - 0xfe, 0xde, 0x43, 0x1f, 0x16, 0x30, 0xaf, 0x92, 0x73, 0x95, 0x08, 0xc8, - 0xc5, 0x14, 0x24, 0xbf, 0x73, 0xe0, 0xec, 0x6c, 0xe5, 0xf7, 0x5c, 0x10, - 0x72, 0xf7, 0x73, 0x87, 0x2a, 0x0f, 0xa9, 0xcb, 0x76, 0x88, 0x6f, 0xe9, - 0xe6, 0x93, 0x4b, 0x93, 0x9c, 0xbf, 0x2d, 0x03, 0x81, 0x39, 0x69, 0x8e, - 0x5d, 0x0b, 0x39, 0x6f, 0x1c, 0xae, 0x1a, 0x77, 0x16, 0xa0, 0x9e, 0xcf, - 0x4e, 0x6f, 0x72, 0x26, 0x39, 0x7b, 0x4f, 0xb9, 0xca, 0x73, 0x75, 0xe1, - 0xdb, 0xa6, 0x73, 0x97, 0xf3, 0xb7, 0x1e, 0xc9, 0xce, 0x5f, 0xc9, 0xcd, - 0xe4, 0x30, 0x72, 0xff, 0x07, 0xb1, 0xbc, 0xb3, 0xc7, 0x2b, 0xa7, 0xc3, - 0xe2, 0xdb, 0xff, 0x6d, 0xc0, 0xfb, 0x89, 0xb3, 0x02, 0x72, 0x9a, 0xa5, - 0x47, 0x90, 0x6d, 0x90, 0x80, 0x45, 0xc5, 0x90, 0x08, 0xbf, 0xf0, 0x8f, - 0xdb, 0x22, 0xbf, 0xcd, 0xe4, 0x87, 0xf7, 0xd1, 0xcb, 0xf6, 0xed, 0xb8, - 0x80, 0xe5, 0xc2, 0xa9, 0xcb, 0x69, 0x0f, 0x03, 0xf2, 0x9b, 0xff, 0xfa, - 0x16, 0x38, 0xcd, 0xfc, 0x2f, 0xd5, 0xc6, 0x78, 0xe5, 0xff, 0xff, 0xf2, - 0x77, 0xf5, 0xad, 0xe5, 0xf3, 0x68, 0x71, 0x70, 0xcf, 0x9f, 0x67, 0x9d, - 0xf7, 0x39, 0x7f, 0xfe, 0x8e, 0x43, 0x31, 0x70, 0xc9, 0x26, 0xbf, 0x59, - 0xca, 0x84, 0xf5, 0x26, 0x74, 0xe9, 0x47, 0x96, 0x76, 0xe1, 0x15, 0x7f, - 0x73, 0x21, 0x58, 0x13, 0x97, 0x85, 0xd6, 0x72, 0xe0, 0x41, 0xcb, 0xc3, - 0xf6, 0x73, 0x95, 0x23, 0xfc, 0x42, 0xc1, 0x1b, 0xf0, 0xb5, 0x35, 0x4f, - 0xe5, 0x38, 0xd4, 0x16, 0x35, 0x70, 0x9c, 0x69, 0x47, 0xf2, 0xd1, 0xd6, - 0x62, 0x5f, 0x64, 0xf1, 0xdf, 0xca, 0x10, 0xa1, 0x9d, 0xa8, 0xca, 0x71, - 0x72, 0xb2, 0xa0, 0x99, 0x3b, 0xe7, 0xbc, 0xe2, 0x5a, 0x4a, 0x8d, 0x9a, - 0x53, 0xef, 0x27, 0x59, 0x17, 0x2f, 0x0b, 0xb5, 0x86, 0x3b, 0xcb, 0x44, - 0x04, 0xa1, 0xf6, 0x9b, 0x88, 0xd2, 0x90, 0xf5, 0x3c, 0xef, 0xea, 0x54, - 0xc7, 0xf1, 0xa8, 0x6c, 0x87, 0x6b, 0x70, 0x97, 0xdb, 0x94, 0xd9, 0xf6, - 0x52, 0xb6, 0xd4, 0x33, 0xef, 0xff, 0xef, 0xd8, 0xa6, 0xfe, 0xe4, 0x66, - 0xed, 0x20, 0xbb, 0xaa, 0x72, 0x94, 0x55, 0xb2, 0x92, 0x9d, 0x6f, 0xe7, - 0x4f, 0x69, 0x04, 0xe5, 0xe4, 0xe6, 0x1c, 0xa6, 0xb3, 0xc6, 0xd1, 0x5d, - 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0x9d, 0x5d, 0x9b, 0x9c, 0xbf, 0xfd, 0xff, - 0xe2, 0x83, 0x1d, 0x45, 0xe6, 0x8e, 0x59, 0x48, 0x45, 0xce, 0x12, 0xee, - 0x68, 0xb1, 0x7b, 0xff, 0x93, 0x8a, 0x6d, 0xbc, 0xfe, 0xd3, 0x80, 0xe5, - 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0xa3, 0x5f, 0xf9, 0xe4, 0xa6, 0x71, 0x8e, - 0xec, 0x34, 0x4d, 0x0b, 0xe1, 0x8c, 0xdc, 0xe5, 0x62, 0x28, 0x16, 0x69, - 0xe4, 0xbb, 0xfd, 0xf5, 0xf6, 0x29, 0xe4, 0x9c, 0xe5, 0x28, 0x7d, 0x10, - 0x5f, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xab, 0xd7, 0xf6, 0x6c, 0x81, 0xef, - 0xe7, 0x2f, 0xe4, 0x08, 0x63, 0x90, 0x72, 0xff, 0xfe, 0xdc, 0x03, 0xfa, - 0xfe, 0x84, 0x30, 0x05, 0xc6, 0x78, 0xe5, 0x94, 0xc4, 0x77, 0x70, 0xd3, - 0xa5, 0xff, 0x4b, 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x15, 0xb2, 0xff, 0xa4, - 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x48, 0x2b, 0x29, 0x87, 0xf4, 0xe6, 0x97, - 0xff, 0x28, 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x24, 0x35, 0xff, 0xb4, - 0xa6, 0x79, 0x03, 0x83, 0x31, 0xcb, 0xce, 0xec, 0x3c, 0x60, 0x6a, 0x83, - 0xe7, 0x61, 0xfd, 0xdd, 0x6b, 0x39, 0x7f, 0xe9, 0x76, 0x3d, 0xa6, 0xa3, - 0x4d, 0x58, 0x9c, 0xbe, 0xf7, 0xb3, 0x68, 0xe5, 0xff, 0xe6, 0x8c, 0xd1, - 0x9a, 0x8e, 0xc2, 0xc5, 0xfa, 0x9c, 0x39, 0x6d, 0xce, 0x5c, 0x82, 0x72, - 0xfe, 0x80, 0xc7, 0x9c, 0x27, 0x28, 0x27, 0xa7, 0x30, 0x97, 0x85, 0x6f, - 0xbd, 0xa4, 0xd8, 0x72, 0xff, 0xe4, 0x19, 0xe1, 0x5f, 0xa0, 0x04, 0x6e, - 0x72, 0xfb, 0x04, 0x1a, 0x39, 0x7d, 0x3e, 0xb7, 0x43, 0x95, 0x87, 0x8b, - 0xa2, 0x1b, 0xf3, 0x87, 0xec, 0x09, 0xcb, 0xff, 0x73, 0xdf, 0x45, 0xd9, - 0x82, 0xc3, 0x97, 0xcc, 0x77, 0x61, 0xa2, 0xc4, 0x5f, 0xb9, 0xc7, 0x1f, - 0x1c, 0xbc, 0x88, 0xd9, 0xcb, 0xdf, 0x8c, 0x8e, 0x5f, 0xe6, 0x46, 0x70, - 0x00, 0xf1, 0xca, 0x9d, 0x32, 0x8c, 0x28, 0xe1, 0xfa, 0xcb, 0x84, 0x9f, - 0xc3, 0x9f, 0x8e, 0xdf, 0xb3, 0x90, 0x2a, 0x9c, 0xb2, 0x1c, 0xb2, 0x1c, - 0xb4, 0x95, 0x34, 0x00, 0x10, 0xbf, 0x7d, 0xdb, 0xce, 0x41, 0xcb, 0xda, - 0x81, 0x39, 0x50, 0x78, 0xe8, 0x59, 0x4a, 0xa2, 0x3f, 0xad, 0xf7, 0xff, - 0x46, 0x6b, 0x04, 0x28, 0x08, 0x13, 0x97, 0x86, 0x27, 0x39, 0x42, 0x7b, - 0x9f, 0xa0, 0x5f, 0x47, 0x21, 0x67, 0x2a, 0x47, 0x87, 0xa2, 0x2b, 0xcb, - 0x7f, 0x1c, 0xbf, 0xfe, 0xf6, 0x6f, 0x21, 0xff, 0xce, 0x83, 0x01, 0x39, - 0x72, 0x00, 0xe5, 0x71, 0x10, 0x3e, 0x1c, 0xdb, 0x4f, 0xbe, 0xd9, 0xfb, - 0xe8, 0xe5, 0x90, 0xe5, 0x21, 0xb5, 0x98, 0x96, 0xff, 0x83, 0xdc, 0x5e, - 0x3f, 0x27, 0x39, 0x7e, 0xf7, 0x9e, 0x5a, 0x39, 0x7f, 0xef, 0xf3, 0x70, - 0xec, 0xee, 0x3c, 0xc7, 0x2b, 0x73, 0xeb, 0xd8, 0x51, 0x69, 0x1c, 0xbe, - 0xcc, 0x6f, 0x47, 0x2a, 0x0d, 0x9f, 0x84, 0x6e, 0xfc, 0x4e, 0x54, 0x26, - 0x67, 0x90, 0xa4, 0xe2, 0xc6, 0x88, 0x2f, 0xf6, 0xbe, 0xe7, 0x33, 0x26, - 0x39, 0x7e, 0x1f, 0x0f, 0xf3, 0x9c, 0xa8, 0x3d, 0xef, 0xcd, 0x6f, 0xee, - 0x48, 0x19, 0x93, 0x1c, 0xbe, 0x78, 0x4d, 0xb3, 0x95, 0x87, 0xa3, 0xc2, - 0xeb, 0xe9, 0x7d, 0xec, 0x1c, 0xbd, 0xc8, 0x91, 0xca, 0x73, 0xc0, 0xd8, - 0x49, 0x7f, 0x42, 0xf1, 0x39, 0x31, 0xcb, 0xef, 0xb1, 0xb5, 0xa3, 0x97, - 0xec, 0x0f, 0x63, 0xa7, 0x2f, 0xb8, 0x8d, 0xb5, 0x9c, 0xa1, 0x3c, 0xdd, - 0x13, 0xd0, 0x51, 0x2b, 0xa7, 0x4a, 0x84, 0xda, 0x51, 0x87, 0xa4, 0x6f, - 0x0c, 0x2b, 0xf9, 0x05, 0xd7, 0x1d, 0x39, 0x7f, 0xfa, 0x17, 0x12, 0x08, - 0xc7, 0x5f, 0x38, 0x72, 0x8e, 0x54, 0x8f, 0x4b, 0x6d, 0x1e, 0xf7, 0xb0, - 0x07, 0x2f, 0xe5, 0xa6, 0xb4, 0x81, 0x39, 0x79, 0xf8, 0xa9, 0xca, 0xfc, - 0xf2, 0x9b, 0x2d, 0xbf, 0xcc, 0x1c, 0xd8, 0x39, 0xa3, 0x97, 0xf9, 0xaf, - 0xe7, 0xd8, 0x17, 0x54, 0xe5, 0xfe, 0x93, 0xe0, 0xe7, 0xb4, 0x72, 0xb0, - 0xfa, 0xf7, 0x3a, 0xbf, 0xf6, 0x6f, 0x2e, 0xc6, 0x95, 0xec, 0x1c, 0xa9, - 0x2a, 0x2c, 0xdd, 0xf6, 0x62, 0x5e, 0x33, 0x74, 0x90, 0x61, 0x3d, 0xb4, - 0x45, 0x6d, 0xb3, 0x97, 0x4b, 0x47, 0x2c, 0xf2, 0x35, 0x7b, 0x8a, 0x5f, - 0x79, 0x05, 0xb2, 0x96, 0xfc, 0xe5, 0xa3, 0x0d, 0xa7, 0x48, 0xaf, 0xf9, - 0xc7, 0xda, 0xdf, 0x4e, 0xd6, 0x72, 0x9d, 0x17, 0x80, 0x5b, 0xfc, 0x96, - 0xfe, 0xea, 0x6b, 0x9c, 0xc3, 0x97, 0xfe, 0x4c, 0xf6, 0xb9, 0x9a, 0x8d, - 0xce, 0x5f, 0xfa, 0x1b, 0xfb, 0x3e, 0xb1, 0x70, 0xd6, 0x72, 0xe7, 0x6c, - 0xe5, 0x31, 0x18, 0xfd, 0x2d, 0xf1, 0xf6, 0xc4, 0x5b, 0xb3, 0x47, 0x2b, - 0x0f, 0x57, 0xe9, 0xfd, 0xff, 0xdd, 0x74, 0xf4, 0xb1, 0x51, 0xc0, 0x1c, - 0xbf, 0x0c, 0xd1, 0xd8, 0x39, 0x7e, 0x03, 0xec, 0xc0, 0x9c, 0xbf, 0x67, - 0x77, 0x76, 0xb3, 0x97, 0xc0, 0xd4, 0x09, 0xcb, 0xfd, 0xce, 0xba, 0x69, - 0x36, 0x1c, 0xb9, 0x54, 0x39, 0x50, 0x7d, 0x98, 0x42, 0xe6, 0x97, 0xff, - 0x77, 0x04, 0x5f, 0xdf, 0x25, 0x0b, 0x39, 0x48, 0x9c, 0xd3, 0xa1, 0x80, - 0x9c, 0x4a, 0x75, 0x09, 0x7f, 0x16, 0x5f, 0xcd, 0xc7, 0x38, 0xf3, 0x1c, - 0xbf, 0xe0, 0xc3, 0x3e, 0x80, 0x11, 0xb9, 0xcb, 0xfe, 0x7e, 0x62, 0xd3, - 0x6e, 0x16, 0x72, 0x98, 0x7e, 0xdf, 0x9e, 0x5f, 0x7a, 0x37, 0x91, 0xcb, - 0xf9, 0x01, 0xb6, 0x28, 0x03, 0x95, 0x39, 0xe9, 0x70, 0x8e, 0xf7, 0xb3, - 0xe9, 0xca, 0x84, 0xd6, 0xf2, 0x14, 0xae, 0xeb, 0xb4, 0x47, 0x7f, 0x0c, - 0x4a, 0x36, 0x41, 0xcb, 0xa0, 0x07, 0x2f, 0xed, 0x9c, 0x78, 0x4d, 0xb3, - 0x96, 0xc3, 0x94, 0x88, 0x84, 0x98, 0xb5, 0x62, 0xc2, 0x63, 0x7d, 0x3f, - 0xb1, 0x87, 0x2f, 0xf3, 0xab, 0xf7, 0xbd, 0x89, 0x1c, 0xa7, 0x3d, 0x9d, - 0xb2, 0x3b, 0xff, 0x77, 0x02, 0x14, 0xdf, 0x37, 0xf1, 0xcb, 0xfb, 0xe0, - 0x7e, 0xbf, 0x38, 0x72, 0xa7, 0x3f, 0x20, 0xa0, 0x5f, 0x3c, 0x26, 0xd9, - 0xcb, 0xff, 0x60, 0x7e, 0x66, 0xa3, 0x38, 0x03, 0x97, 0xf9, 0x03, 0xe1, - 0x7d, 0xf4, 0x72, 0xff, 0x7b, 0x49, 0xbe, 0x6f, 0xe3, 0x95, 0x07, 0xd0, - 0xe6, 0x75, 0x09, 0x86, 0x84, 0x8f, 0xa4, 0x63, 0x0a, 0x7a, 0x6a, 0x1b, - 0x5f, 0x76, 0xac, 0x69, 0xa4, 0x92, 0xd4, 0x89, 0x62, 0x15, 0xb3, 0x98, - 0x48, 0x90, 0x30, 0x8d, 0xc8, 0xd2, 0x55, 0x65, 0x64, 0x35, 0xb7, 0x86, - 0x1a, 0x42, 0x8e, 0x66, 0x8e, 0x46, 0xa8, 0xb8, 0x4f, 0xf6, 0x3d, 0xc7, - 0x94, 0xd8, 0x08, 0xd5, 0x86, 0x34, 0xcd, 0x47, 0x7b, 0xe8, 0xed, 0x7f, - 0x86, 0x3e, 0xdc, 0x25, 0x7e, 0xc7, 0x47, 0x7e, 0xda, 0x76, 0x47, 0x0e, - 0x5f, 0xf9, 0x23, 0xdd, 0x75, 0x70, 0x40, 0x72, 0xff, 0xf3, 0xf3, 0xe3, - 0xfb, 0xe7, 0xb7, 0x62, 0x09, 0xca, 0xea, 0x22, 0xf6, 0x1e, 0xdf, 0xd9, - 0xe8, 0x45, 0xe8, 0xe5, 0xfe, 0x0c, 0x4b, 0x39, 0x9a, 0x39, 0x7b, 0x5f, - 0x74, 0x72, 0xff, 0xfb, 0x37, 0x97, 0xbf, 0x9d, 0x4e, 0xba, 0xd3, 0x47, - 0x2f, 0xfb, 0xf7, 0xc0, 0xa6, 0xe2, 0xe7, 0x2f, 0x78, 0x60, 0xe5, 0xdd, - 0x52, 0x13, 0xfe, 0xc8, 0x5a, 0xcc, 0x4a, 0xb2, 0xc7, 0x32, 0x11, 0xfd, - 0x2a, 0x7d, 0x38, 0xa5, 0x17, 0x13, 0x22, 0x5e, 0x4d, 0xfd, 0x9c, 0x63, - 0xbb, 0x0d, 0x16, 0x6a, 0xff, 0xee, 0x75, 0xd4, 0x5f, 0xf3, 0x75, 0x02, - 0x72, 0xff, 0xd1, 0xc0, 0x7b, 0x5d, 0xc4, 0x09, 0xcb, 0xe4, 0x17, 0x9c, - 0xe5, 0x74, 0xf7, 0xf4, 0x7d, 0x7c, 0xa7, 0x63, 0xa7, 0x29, 0x43, 0xc5, - 0xda, 0x22, 0xa5, 0x13, 0x4b, 0x43, 0x97, 0x87, 0x65, 0xf2, 0x2f, 0xef, - 0x0e, 0x5f, 0x20, 0xf3, 0xf3, 0x97, 0xfa, 0x36, 0x7d, 0xf0, 0xc0, 0x0e, - 0x5c, 0xb5, 0x20, 0xff, 0x26, 0x24, 0xe9, 0x15, 0xd8, 0x87, 0x2e, 0xc0, - 0x9c, 0xbf, 0xf3, 0xc9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0xa0, 0x17, 0xf9, - 0x17, 0x0d, 0x7d, 0xc9, 0xce, 0x59, 0x49, 0x22, 0xb3, 0x05, 0x56, 0x2d, - 0xd4, 0xbb, 0xe7, 0xe6, 0xf2, 0x39, 0x7e, 0xf6, 0xa4, 0x80, 0x39, 0x58, - 0x79, 0x6e, 0x47, 0x7f, 0x49, 0x4c, 0x9a, 0x24, 0x72, 0x94, 0x3c, 0xf8, - 0x20, 0xbb, 0xfe, 0x9c, 0xbf, 0xb5, 0x0b, 0x18, 0x98, 0xe5, 0xba, 0x72, - 0xf7, 0xd1, 0x98, 0xe5, 0xd9, 0xec, 0x36, 0x00, 0x11, 0xa0, 0x22, 0x20, - 0x57, 0x6e, 0xf9, 0xa3, 0x97, 0xbf, 0x0e, 0x1c, 0xbf, 0xd9, 0xcf, 0x0c, - 0x2f, 0x47, 0x2d, 0xb6, 0x72, 0x90, 0xf8, 0xfa, 0x3a, 0x03, 0x2b, 0xe6, - 0x3b, 0xb0, 0xd1, 0x6f, 0xaf, 0x6d, 0xbf, 0x8e, 0x5f, 0xdf, 0x7c, 0xec, - 0x7e, 0x1c, 0xae, 0x1f, 0xe2, 0xcb, 0x80, 0x3f, 0x7d, 0x82, 0x93, 0x1c, - 0xbd, 0xd8, 0xe1, 0xcb, 0xf7, 0x53, 0x9d, 0x73, 0x97, 0xff, 0xbb, 0x13, - 0xfb, 0x3a, 0x39, 0xee, 0xa1, 0xcb, 0xcb, 0xc0, 0x9c, 0xb2, 0xce, 0x5f, - 0xf7, 0x62, 0x70, 0xe3, 0x7a, 0x52, 0x11, 0x73, 0x83, 0x93, 0x13, 0xba, - 0x4f, 0xd1, 0xcb, 0xf7, 0xa5, 0xaf, 0xba, 0x39, 0x7b, 0x5d, 0x09, 0xcb, - 0xf7, 0xdf, 0x0c, 0x00, 0xe5, 0x2c, 0xf1, 0xb6, 0x0e, 0xdf, 0xfd, 0xed, - 0x26, 0xa0, 0x73, 0xdd, 0x43, 0x97, 0x87, 0x3a, 0x72, 0x96, 0x7b, 0xbb, - 0x10, 0xaf, 0xc1, 0x86, 0xbf, 0xd6, 0x72, 0xff, 0x9f, 0x51, 0x82, 0x1e, - 0xc1, 0xcb, 0xff, 0xb1, 0x7c, 0xcd, 0xfa, 0x2e, 0xd7, 0x39, 0xcb, 0xb5, - 0xae, 0x1f, 0xf0, 0x9b, 0x54, 0x26, 0xf9, 0x90, 0x81, 0x42, 0x47, 0x85, - 0x55, 0xf3, 0xa0, 0xf8, 0xe5, 0xf8, 0x1a, 0xf4, 0x2c, 0xe5, 0xee, 0x47, - 0x8e, 0x5f, 0xd3, 0x38, 0x7a, 0x8b, 0x39, 0x7f, 0x79, 0x30, 0x30, 0xb3, - 0x95, 0xe3, 0xda, 0x6c, 0xba, 0xed, 0x09, 0xcb, 0xfb, 0x7d, 0x43, 0x31, - 0x67, 0x2a, 0x13, 0x05, 0xe1, 0x43, 0xbb, 0x68, 0x8f, 0xf1, 0x6b, 0xf9, - 0x26, 0x81, 0x18, 0x39, 0x7d, 0xd5, 0x42, 0xb3, 0x96, 0x91, 0xcb, 0xfc, - 0x00, 0x7f, 0xa6, 0xbc, 0xdc, 0xe5, 0x61, 0xe5, 0x38, 0x8d, 0x62, 0x23, - 0x85, 0xba, 0x9a, 0xb5, 0xfe, 0x68, 0x85, 0x04, 0x88, 0x82, 0xf9, 0x90, - 0xaa, 0x42, 0xf9, 0xa1, 0xb5, 0xc7, 0xbe, 0xc7, 0xda, 0x04, 0x41, 0x8c, - 0x97, 0x49, 0x5e, 0x85, 0xcd, 0xfc, 0xfb, 0xa8, 0xb7, 0xf1, 0xca, 0x51, - 0x30, 0x61, 0x86, 0xbd, 0xfc, 0x15, 0x35, 0xed, 0x6e, 0x72, 0xe6, 0xa9, - 0xab, 0x39, 0x79, 0x6f, 0xb9, 0xcb, 0xc0, 0x7e, 0x9c, 0xbb, 0x62, 0x1c, - 0xbe, 0xe7, 0x33, 0xe9, 0xcb, 0xf6, 0xa7, 0xc6, 0xd4, 0x6a, 0x11, 0x2d, - 0x04, 0x38, 0x3b, 0x30, 0xe3, 0x8c, 0x54, 0x26, 0x68, 0x90, 0xc7, 0xbf, - 0xff, 0xe6, 0x9a, 0x7b, 0xf7, 0x9d, 0x4c, 0x97, 0x63, 0x99, 0x82, 0xa9, - 0xcb, 0xff, 0xff, 0xc8, 0xc7, 0xe3, 0xf6, 0x59, 0xec, 0x0e, 0x9d, 0x79, - 0xc9, 0xe3, 0x73, 0x97, 0xee, 0x31, 0xdd, 0x86, 0x8a, 0x51, 0x7f, 0xfc, - 0xfe, 0x1c, 0x9f, 0x91, 0xd4, 0xee, 0x70, 0xe5, 0xe7, 0x92, 0x90, 0x8f, - 0x9c, 0x77, 0x01, 0xa5, 0xff, 0x49, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x93, - 0x96, 0x51, 0x68, 0x86, 0x74, 0x0a, 0x88, 0x56, 0xc9, 0x4f, 0x3a, 0xef, - 0x28, 0xed, 0x03, 0x7e, 0xc0, 0x39, 0x19, 0x5a, 0xa8, 0x6c, 0x8d, 0x45, - 0x23, 0x10, 0x6b, 0x85, 0xfc, 0xc4, 0xfc, 0x85, 0xca, 0xeb, 0xa6, 0x4e, - 0xc6, 0xf0, 0xf0, 0xb1, 0x04, 0x3a, 0x06, 0x1b, 0xba, 0xa4, 0x87, 0x7a, - 0x35, 0xdf, 0xc9, 0xf6, 0x47, 0xd7, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0x87, - 0xd7, 0xfe, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0x9a, 0xca, 0x61, - 0xff, 0xac, 0xd2, 0xff, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x11, 0x3a, 0xfe, - 0x99, 0x3d, 0xaf, 0xd6, 0x72, 0xff, 0xf3, 0x44, 0xab, 0x6d, 0x73, 0x85, - 0xa5, 0xf3, 0xe7, 0x76, 0xce, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x23, 0x15, - 0xf4, 0x2d, 0x80, 0x39, 0x7f, 0xfd, 0x29, 0xda, 0x28, 0x6a, 0xe7, 0x67, - 0x3e, 0x7c, 0xee, 0xd9, 0xca, 0xea, 0x21, 0xc0, 0x45, 0x7f, 0x67, 0xa3, - 0x37, 0xf1, 0xcb, 0xe4, 0xde, 0x4d, 0x59, 0xcb, 0xf7, 0xc9, 0x86, 0x02, - 0x72, 0xca, 0x42, 0x7e, 0x12, 0x30, 0xc6, 0x3e, 0xc2, 0xec, 0x48, 0xfc, - 0x5b, 0xb6, 0x51, 0x7f, 0xf9, 0x45, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, - 0x89, 0xe5, 0x7d, 0x1b, 0x23, 0xa7, 0x2f, 0xa0, 0x65, 0xa3, 0x97, 0xee, - 0xa0, 0xe6, 0xc3, 0x95, 0xc3, 0xec, 0x01, 0x1f, 0xd2, 0x1b, 0xef, 0xdf, - 0x92, 0x39, 0x7e, 0x70, 0xf6, 0x34, 0x72, 0xca, 0x04, 0xf2, 0x84, 0x8e, - 0x94, 0x45, 0x1b, 0x6f, 0x75, 0x0b, 0x8a, 0xb3, 0x94, 0x4a, 0x51, 0x87, - 0x5c, 0x7d, 0x1b, 0x3d, 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0x20, 0x5f, 0xf9, - 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4a, 0x8b, 0xfb, 0x9f, 0xf6, 0x05, - 0x87, 0x2f, 0xe6, 0x26, 0x6d, 0x76, 0x0e, 0x54, 0x1e, 0xee, 0x17, 0x59, - 0x4c, 0x47, 0xe2, 0xcd, 0x06, 0x15, 0x17, 0xee, 0x31, 0xdd, 0x86, 0x88, - 0xa1, 0x7a, 0x01, 0x87, 0x2c, 0xa6, 0x1e, 0x7f, 0xd3, 0x4b, 0xfc, 0xa6, - 0x71, 0x8e, 0xec, 0x34, 0x46, 0x4b, 0xf7, 0x18, 0xee, 0xc3, 0x44, 0xca, - 0xbf, 0x4b, 0x3c, 0xec, 0x39, 0x7e, 0x51, 0x6f, 0x25, 0x30, 0xf6, 0xf7, - 0x34, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x54, 0x8b, 0x09, 0xcb, 0x7d, 0x39, - 0x65, 0x30, 0xf5, 0xda, 0xcd, 0x3f, 0x10, 0xbf, 0xca, 0x67, 0x18, 0xee, - 0xc3, 0x45, 0x74, 0xbf, 0xca, 0x67, 0x18, 0xee, 0xc3, 0x45, 0x8a, 0xbf, - 0xf9, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x7a, 0x5f, 0xdd, 0x84, - 0xe2, 0x34, 0xce, 0x5f, 0xa1, 0x36, 0xd3, 0x68, 0xe5, 0xcd, 0xa8, 0xc3, - 0xdc, 0x73, 0x0b, 0xff, 0xff, 0xc1, 0xc6, 0xd4, 0x1c, 0x55, 0x57, 0xf6, - 0x90, 0x66, 0x86, 0x73, 0x37, 0x39, 0x7f, 0xfe, 0x98, 0x61, 0x6a, 0x66, - 0x91, 0xb0, 0xbb, 0xaa, 0x72, 0xed, 0x78, 0xe5, 0xd9, 0xa3, 0x97, 0x68, - 0x07, 0x2f, 0xc2, 0xeb, 0x18, 0x39, 0x7f, 0x7f, 0xae, 0xbc, 0x94, 0x6a, - 0xcf, 0xa5, 0xc5, 0xdb, 0x16, 0xfa, 0x2f, 0x7a, 0x78, 0x6b, 0x39, 0x7e, - 0xcf, 0x69, 0x16, 0x72, 0xff, 0xf4, 0x6f, 0xec, 0x99, 0x39, 0xed, 0x7e, - 0xd6, 0x72, 0xf3, 0xee, 0xa4, 0x22, 0x5c, 0x48, 0x3c, 0x4f, 0x58, 0xa8, - 0x03, 0x90, 0xc0, 0xd4, 0x3f, 0xe8, 0x2a, 0xad, 0xbd, 0x29, 0xee, 0x94, - 0x57, 0x7d, 0x10, 0xad, 0x49, 0x5c, 0xb7, 0xe4, 0xe8, 0xbc, 0xc7, 0x2f, - 0xd2, 0xc0, 0xfc, 0xc3, 0x94, 0xd0, 0x3d, 0x08, 0x27, 0xb9, 0x60, 0x39, - 0x7e, 0xcf, 0x27, 0xfa, 0x39, 0x73, 0x50, 0xd4, 0x8e, 0x53, 0x50, 0x7c, - 0x2d, 0x48, 0x5d, 0xa2, 0x28, 0xbf, 0x34, 0x66, 0xa3, 0x5c, 0xf1, 0xcb, - 0xfd, 0xf4, 0x73, 0x9c, 0x86, 0x1c, 0xa6, 0xa0, 0xfa, 0x1a, 0x46, 0x97, - 0xdc, 0x5f, 0xb7, 0x39, 0x7f, 0x35, 0x0d, 0x53, 0x42, 0x24, 0xb3, 0x97, - 0x99, 0x9d, 0x29, 0x79, 0x71, 0xa3, 0x97, 0x81, 0xc8, 0x39, 0x7f, 0x60, - 0x12, 0x64, 0x6c, 0xe5, 0xff, 0x9f, 0x5f, 0x35, 0xac, 0x94, 0xa0, 0xe5, - 0xff, 0xf8, 0x5d, 0x54, 0xe4, 0x4a, 0x59, 0xa0, 0x02, 0x0e, 0x50, 0x51, - 0x84, 0xa9, 0x77, 0x50, 0x2f, 0xff, 0xee, 0x26, 0xd3, 0xad, 0x48, 0xe7, - 0x13, 0x69, 0x9f, 0xce, 0x72, 0xf9, 0x3b, 0xf5, 0x67, 0x2f, 0xff, 0x22, - 0xbf, 0x30, 0x5f, 0x7d, 0x2a, 0xab, 0x9c, 0xa6, 0x1f, 0x90, 0x92, 0x5f, - 0xfe, 0x7d, 0x0e, 0x01, 0x4e, 0xa3, 0x1f, 0x87, 0x2e, 0x16, 0xce, 0x5f, - 0xc1, 0xc5, 0x7d, 0x8c, 0x39, 0x7d, 0xd8, 0x5b, 0x0e, 0x54, 0x1f, 0x3b, + 0xfe, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x11, 0x2a, 0xe0, 0x7e, 0x72, 0xf4, + 0x85, 0xac, 0xe5, 0xdc, 0xf8, 0xe5, 0xff, 0xf4, 0x76, 0x24, 0x2e, 0xaf, + 0x32, 0x8c, 0xf1, 0xcb, 0x9f, 0x47, 0x2a, 0x47, 0xfa, 0x11, 0x84, 0x4f, + 0xbf, 0xd8, 0xd8, 0xc7, 0xba, 0x87, 0x2f, 0xff, 0x6b, 0xf6, 0x74, 0x73, + 0x9f, 0x0b, 0xf4, 0xe5, 0xd9, 0xa3, 0x97, 0x9d, 0xd6, 0x68, 0x8b, 0x55, + 0x24, 0x44, 0xe2, 0x5a, 0xc5, 0xae, 0xde, 0x8e, 0x56, 0xcf, 0x1b, 0x45, + 0xf7, 0xff, 0xef, 0xdf, 0xb8, 0x3b, 0xde, 0x73, 0x2f, 0x23, 0x0e, 0x5c, + 0xb8, 0x39, 0x7f, 0xef, 0xdd, 0x41, 0xc9, 0xb7, 0x0d, 0x9c, 0xb8, 0x5b, + 0x39, 0x58, 0x7d, 0xdd, 0x16, 0x6d, 0x06, 0xff, 0xf4, 0xa3, 0x07, 0xdf, + 0xb8, 0x75, 0x0a, 0x9c, 0xbf, 0x82, 0x30, 0xb6, 0x7e, 0x72, 0xfe, 0x8e, + 0x43, 0xb7, 0x91, 0xcb, 0x82, 0x13, 0x97, 0xfc, 0xd8, 0xa6, 0x90, 0x79, + 0x91, 0xcb, 0x92, 0x73, 0x97, 0xfd, 0xef, 0xf6, 0xfa, 0x7c, 0xe9, 0xca, + 0x09, 0xe8, 0x20, 0xbd, 0x62, 0x30, 0x50, 0x5d, 0xe1, 0x13, 0x7f, 0xf2, + 0xf7, 0x0a, 0xc0, 0xfb, 0x85, 0x70, 0xa6, 0xa0, 0xe5, 0xfe, 0x4e, 0x8f, + 0xee, 0xaa, 0xce, 0x5c, 0x3a, 0x39, 0x50, 0x8a, 0x0c, 0x56, 0x13, 0x4b, + 0xff, 0x84, 0x63, 0x95, 0x33, 0x7a, 0xc6, 0xce, 0x5f, 0xe5, 0xa6, 0xb7, + 0xb8, 0x91, 0xcb, 0xff, 0xf6, 0x03, 0x49, 0xcb, 0x78, 0xb8, 0x1f, 0xde, + 0x47, 0x2f, 0xfe, 0x8c, 0x1f, 0x6b, 0xd9, 0x8d, 0xe8, 0xe5, 0x22, 0x62, + 0x3d, 0x45, 0x13, 0x3f, 0x2b, 0x5d, 0x9c, 0x94, 0xb4, 0x14, 0xb0, 0x36, + 0x69, 0xc0, 0x2f, 0x7f, 0xbd, 0x9b, 0x03, 0x13, 0x45, 0x3e, 0x9a, 0x7b, + 0xfa, 0x5d, 0x4e, 0x39, 0x31, 0xca, 0x83, 0xf5, 0x74, 0x5b, 0xfb, 0xa8, + 0xb8, 0x62, 0x1c, 0xbf, 0xd0, 0x09, 0xde, 0x50, 0xd6, 0x72, 0xc3, 0x07, + 0xc4, 0x25, 0x96, 0xfa, 0xd4, 0x32, 0x05, 0x78, 0x58, 0x62, 0x21, 0x39, + 0x39, 0x76, 0x46, 0x02, 0xa9, 0x12, 0xe1, 0x89, 0xc9, 0x7a, 0x25, 0x4c, + 0x5d, 0xd8, 0x77, 0x8c, 0x34, 0xb5, 0x19, 0xf3, 0x48, 0x7f, 0xa9, 0x08, + 0x2b, 0xff, 0xff, 0x9d, 0x9f, 0x53, 0x7b, 0xff, 0x7b, 0x81, 0xc5, 0x53, + 0xbd, 0xc5, 0x0e, 0x5f, 0xfe, 0xe1, 0x4a, 0xb6, 0xd7, 0x38, 0x78, 0x6f, + 0x9f, 0x3a, 0xd0, 0xe5, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0xa2, 0x5f, 0x77, + 0x37, 0x87, 0x2f, 0x24, 0xdc, 0x07, 0x2a, 0x0f, 0x07, 0xa4, 0x37, 0xff, + 0xf7, 0xe2, 0xea, 0xfc, 0xf2, 0xb0, 0x32, 0xce, 0xa3, 0x0e, 0x5f, 0xff, + 0x81, 0x29, 0xf8, 0x54, 0x35, 0x73, 0xaf, 0x7f, 0x3e, 0x75, 0xa1, 0xcb, + 0xff, 0xfb, 0xf1, 0x75, 0x7e, 0x79, 0x58, 0x19, 0x67, 0x51, 0x87, 0x2f, + 0xb7, 0xbc, 0x68, 0x72, 0x98, 0x88, 0x27, 0x5e, 0xbf, 0xff, 0x3c, 0x86, + 0x35, 0x9c, 0xac, 0x5f, 0x39, 0x59, 0xcb, 0x7d, 0x92, 0xab, 0xbc, 0x64, + 0x5b, 0xab, 0x08, 0x7a, 0xbd, 0xa8, 0x76, 0xf1, 0x22, 0xbf, 0xf0, 0x71, + 0x9f, 0x5a, 0x60, 0xa7, 0x8e, 0x5e, 0xc6, 0xf0, 0xe5, 0xfd, 0x93, 0x86, + 0x30, 0x27, 0x2f, 0x83, 0xd4, 0x98, 0xe5, 0x61, 0xe8, 0x39, 0x6d, 0xee, + 0xc0, 0x4e, 0x5f, 0xe8, 0x84, 0x11, 0xfd, 0xac, 0xe5, 0xcf, 0xf9, 0xcb, + 0xee, 0xa7, 0x7e, 0xf0, 0x88, 0xf3, 0x55, 0xb2, 0x62, 0x0e, 0x8e, 0x36, + 0x69, 0x7e, 0xda, 0xdd, 0xd6, 0x68, 0xaf, 0x57, 0xe4, 0xe0, 0x5f, 0xf3, + 0x9c, 0xba, 0x24, 0x72, 0xe8, 0x01, 0xcb, 0xfa, 0x75, 0x1a, 0x38, 0x80, + 0xe5, 0xff, 0x9c, 0x41, 0x9e, 0x81, 0x40, 0x1c, 0xa8, 0x3e, 0xc6, 0x86, + 0x36, 0xfb, 0x89, 0x8e, 0x6c, 0xd1, 0xcb, 0x40, 0x2c, 0xa4, 0x20, 0xaf, + 0xfe, 0xfa, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x12, 0x32, 0xff, 0xf7, + 0xd6, 0x3c, 0xbe, 0xe6, 0xd6, 0xee, 0xb3, 0x44, 0xf0, 0xbf, 0xfd, 0xf5, + 0x8f, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x3f, 0xaf, 0xff, 0x7d, 0x63, + 0xcb, 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x50, 0xcb, 0xff, 0x98, 0xf2, 0xfb, + 0x9b, 0x5b, 0xba, 0xcd, 0x14, 0x42, 0xff, 0xd2, 0xfb, 0xfe, 0xbe, 0x46, + 0xa2, 0x47, 0x2b, 0xea, 0x25, 0xa1, 0x4a, 0xff, 0xd3, 0x27, 0x79, 0xcf, + 0x07, 0x18, 0x72, 0xff, 0xc2, 0xff, 0x7c, 0x3f, 0xbc, 0xb4, 0x72, 0xfd, + 0xb5, 0xbb, 0xac, 0xd1, 0x48, 0xaf, 0xfe, 0xef, 0x17, 0xde, 0x9f, 0xba, + 0x89, 0xce, 0x5f, 0xfc, 0xfc, 0xeb, 0xad, 0xc0, 0x3e, 0x28, 0xc3, 0x97, + 0xfd, 0x12, 0x8d, 0xcf, 0x1b, 0x9c, 0xe5, 0xe7, 0x97, 0xdc, 0x47, 0xfb, + 0x9a, 0x01, 0x1c, 0x52, 0xaf, 0xff, 0xee, 0x3f, 0x54, 0x5e, 0x7a, 0x07, + 0xda, 0x71, 0xff, 0x0e, 0x5f, 0xfe, 0x97, 0xdd, 0xb8, 0x1f, 0xc9, 0xbc, + 0x61, 0xcb, 0xfa, 0x59, 0xde, 0xbc, 0x8e, 0x5f, 0xff, 0xd8, 0x1e, 0xc2, + 0x9f, 0x7c, 0x2e, 0x0d, 0x6a, 0x00, 0x52, 0xdf, 0x61, 0x58, 0x02, 0xd0, + 0x19, 0x19, 0xff, 0x53, 0x5d, 0x7f, 0xc9, 0x6d, 0x0b, 0x6f, 0xff, 0xbb, + 0x1d, 0x45, 0x75, 0xac, 0x10, 0x34, 0xc3, 0x97, 0xcb, 0x77, 0x59, 0xa2, + 0x50, 0x5f, 0xfa, 0x00, 0xc7, 0x97, 0x61, 0xf6, 0x72, 0xa4, 0x8b, 0xcd, + 0xa8, 0x89, 0x75, 0xff, 0xe1, 0x7f, 0x69, 0x41, 0xfe, 0x43, 0x8c, 0x39, + 0x7d, 0xf5, 0xe5, 0xf7, 0x0f, 0xe5, 0x85, 0xf5, 0x3b, 0x6e, 0x3d, 0x2a, + 0x42, 0xb0, 0x63, 0x11, 0x5c, 0xb3, 0x04, 0x74, 0x6b, 0x8c, 0xd3, 0x71, + 0xc3, 0xb1, 0x5f, 0xaa, 0x80, 0x5a, 0xe1, 0xd6, 0xb5, 0x0f, 0x0f, 0xe5, + 0x92, 0x70, 0x47, 0x53, 0x7f, 0xfb, 0xeb, 0x1e, 0x5f, 0x73, 0x6b, 0x77, + 0x59, 0xa2, 0x73, 0x5f, 0xfe, 0xfa, 0xc7, 0x97, 0xdc, 0xda, 0xdd, 0xd6, + 0x68, 0xa2, 0x57, 0xfd, 0xfb, 0xee, 0x4d, 0x4f, 0x88, 0x10, 0xe5, 0xfc, + 0x9a, 0x9a, 0x48, 0x03, 0x97, 0xfa, 0x27, 0x51, 0xa3, 0x88, 0x0e, 0x5d, + 0x2f, 0xa1, 0x45, 0x37, 0x50, 0x94, 0x2e, 0xbf, 0xfd, 0xf7, 0x43, 0x80, + 0x80, 0x6f, 0x70, 0xd9, 0xca, 0xda, 0x22, 0xc0, 0x7f, 0x5b, 0x54, 0x11, + 0xa5, 0xaf, 0xe3, 0x8b, 0xbf, 0x6d, 0x6e, 0xeb, 0x34, 0x43, 0x8b, 0xfb, + 0xf5, 0xed, 0x20, 0x4e, 0x5b, 0xee, 0x1f, 0x0f, 0x4d, 0x2f, 0xfa, 0x37, + 0x8b, 0xec, 0x73, 0x23, 0x97, 0xcb, 0x77, 0x59, 0xa2, 0x2f, 0x5f, 0x85, + 0xc0, 0xfa, 0x39, 0x7e, 0xc9, 0xa4, 0xfa, 0x39, 0x5b, 0x3f, 0xcf, 0x17, + 0x28, 0x4d, 0x7f, 0x60, 0x7b, 0x80, 0x73, 0x97, 0xd1, 0xff, 0x0f, 0xa3, + 0x95, 0xa3, 0xd4, 0x6c, 0xb2, 0xe1, 0x9c, 0xe5, 0xff, 0x78, 0x61, 0x8a, + 0x07, 0xb0, 0x72, 0xa0, 0xf4, 0x10, 0x5e, 0xed, 0x72, 0x72, 0xfb, 0xd2, + 0x85, 0x4a, 0x53, 0x0d, 0xdb, 0x8c, 0x5f, 0x9e, 0x7f, 0x67, 0x4e, 0x5b, + 0xec, 0xea, 0x93, 0xf2, 0x16, 0xb3, 0x42, 0x13, 0xae, 0x62, 0xb6, 0xd0, + 0x82, 0xff, 0xff, 0xf8, 0x5f, 0xee, 0x7f, 0xc3, 0xa2, 0xa9, 0xee, 0xe2, + 0x4b, 0x5f, 0x31, 0x58, 0x91, 0xcb, 0xf6, 0x69, 0x81, 0x83, 0x97, 0xfe, + 0x79, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x89, 0x91, 0x6f, 0xab, 0x47, 0xce, + 0xe1, 0x0c, 0xc2, 0x7b, 0xde, 0xc6, 0x1c, 0xbb, 0xac, 0x39, 0x7e, 0xda, + 0xdd, 0xd6, 0x68, 0xb7, 0x96, 0xfb, 0x07, 0xce, 0x11, 0xcc, 0x17, 0xbf, + 0xfd, 0xf5, 0x8f, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x49, 0xae, 0x6a, + 0x9a, 0xb3, 0x97, 0xf6, 0x78, 0x62, 0x18, 0x72, 0xfe, 0xe4, 0x0a, 0x6d, + 0xc0, 0x72, 0xee, 0xfd, 0xe1, 0x0f, 0xf3, 0xa4, 0x2e, 0x57, 0x50, 0xbb, + 0x9d, 0x29, 0x4f, 0x19, 0x1b, 0x36, 0xa1, 0x49, 0xc4, 0xd5, 0x48, 0x6b, + 0x5f, 0xef, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x0e, 0xaf, 0xdb, 0x5b, 0xba, + 0xcd, 0x12, 0xc2, 0xfb, 0x00, 0xc4, 0x39, 0x7e, 0xfa, 0xc7, 0x97, 0xdc, + 0x3d, 0x56, 0x86, 0x97, 0xfb, 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x46, 0x0b, + 0xff, 0xfb, 0x4e, 0x06, 0x99, 0xf4, 0x5f, 0xd2, 0xcf, 0x60, 0x4e, 0x5f, + 0x7d, 0x96, 0x68, 0xe5, 0xff, 0xff, 0x4b, 0x5f, 0x57, 0xd7, 0x99, 0x7d, + 0xcd, 0xb5, 0x1d, 0x99, 0x9a, 0x39, 0x7e, 0xcf, 0x02, 0x16, 0x72, 0xff, + 0xf4, 0x79, 0x01, 0x12, 0x0f, 0x60, 0x56, 0x72, 0xfd, 0xb5, 0xbb, 0xac, + 0xd1, 0x1e, 0xaf, 0xb4, 0xfc, 0xf1, 0x39, 0x74, 0xbe, 0xe1, 0xec, 0xf8, + 0xd2, 0xff, 0xfe, 0x7f, 0xa3, 0xfe, 0x77, 0x04, 0x18, 0x3e, 0xee, 0x1c, + 0xb7, 0xde, 0x53, 0xc3, 0x99, 0xcb, 0x64, 0xef, 0x0a, 0x11, 0x2f, 0xbf, + 0x6d, 0x6e, 0xeb, 0x34, 0x58, 0x6b, 0xfd, 0x21, 0x8c, 0xd6, 0x09, 0xcb, + 0x92, 0x47, 0x2d, 0xf7, 0x0f, 0xeb, 0x93, 0x40, 0x18, 0x5f, 0xff, 0xfe, + 0x8d, 0x8c, 0x46, 0xbe, 0xf8, 0x28, 0xce, 0x65, 0xae, 0x65, 0x9b, 0x9c, + 0xe5, 0xfe, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x17, 0x3a, 0xff, 0xff, 0xff, + 0xe8, 0xe1, 0x79, 0x4e, 0xbe, 0xfc, 0xf9, 0xd6, 0x9f, 0x67, 0xfd, 0x5e, + 0x16, 0x8e, 0x13, 0x99, 0xe7, 0x5b, 0x3e, 0x7c, 0xeb, 0x43, 0x95, 0x0b, + 0xbe, 0x53, 0xc2, 0x5a, 0x48, 0x98, 0x82, 0xb5, 0xd4, 0x8f, 0x9d, 0x90, + 0xd2, 0xe9, 0xbf, 0x9f, 0x38, 0x10, 0x6f, 0xf7, 0xdc, 0xda, 0xdd, 0xd6, + 0x68, 0x87, 0x97, 0xcb, 0x77, 0x59, 0xa2, 0x26, 0x5f, 0xd9, 0xc1, 0xfb, + 0x30, 0x27, 0x2f, 0xf7, 0xbf, 0x7e, 0x7b, 0x1c, 0x4e, 0x56, 0xd1, 0x2c, + 0x25, 0xde, 0x31, 0xbf, 0x03, 0x5f, 0x30, 0x27, 0x2f, 0xf2, 0x37, 0x83, + 0x9c, 0xf8, 0xe5, 0x21, 0xee, 0xec, 0xaa, 0xff, 0xfd, 0x1b, 0x07, 0x63, + 0x8c, 0xd1, 0x0c, 0xd6, 0x04, 0xe5, 0xff, 0x77, 0xb1, 0xc6, 0x59, 0xb8, + 0x39, 0x6f, 0x75, 0x12, 0x2e, 0xaf, 0x7f, 0xc9, 0xe4, 0xf6, 0x02, 0x36, + 0x72, 0xfa, 0x7e, 0xff, 0x39, 0xca, 0xc4, 0x42, 0xb9, 0x47, 0xe6, 0xf7, + 0xb0, 0x3d, 0x39, 0x7f, 0xff, 0x7b, 0xb1, 0xb0, 0x6b, 0x03, 0xef, 0xdd, + 0x79, 0xb3, 0x97, 0x79, 0x87, 0x2f, 0xff, 0x67, 0x54, 0x9f, 0x50, 0x9c, + 0xfa, 0x18, 0x72, 0xff, 0xd3, 0xc4, 0x94, 0xcd, 0xeb, 0x1b, 0x39, 0x58, + 0x98, 0x07, 0x2b, 0x9d, 0x17, 0xfd, 0x32, 0xff, 0xe4, 0xf8, 0x1c, 0xe3, + 0xb7, 0xe3, 0xd4, 0x39, 0x7d, 0x2e, 0xa9, 0xa3, 0x97, 0x3a, 0x86, 0x88, + 0x5d, 0x6f, 0x72, 0x79, 0x1f, 0x92, 0x5f, 0xbb, 0x93, 0xfe, 0x27, 0x2f, + 0x9f, 0x71, 0xc4, 0xe5, 0x04, 0xf3, 0x00, 0x53, 0x7e, 0x9a, 0x58, 0xe2, + 0x72, 0xdf, 0x71, 0x72, 0x77, 0x70, 0x8c, 0xec, 0x66, 0xe2, 0x5f, 0xa8, + 0xc7, 0x3c, 0x7f, 0xfc, 0x24, 0x78, 0xbb, 0x34, 0x22, 0xbf, 0xf6, 0xff, + 0x9f, 0x3b, 0x30, 0xc0, 0x4e, 0x5d, 0xd7, 0x39, 0x6f, 0xce, 0x56, 0x1a, + 0x8d, 0x0b, 0x5e, 0x06, 0xbe, 0xc2, 0x22, 0x7c, 0xd3, 0x7f, 0xfd, 0x89, + 0x2d, 0x7d, 0xce, 0x64, 0xf3, 0xa8, 0xb3, 0x95, 0x08, 0x8a, 0xe9, 0xb5, + 0xff, 0x35, 0x5c, 0x26, 0xf3, 0xc9, 0xdf, 0xce, 0x5f, 0x69, 0x27, 0xe1, + 0x0e, 0x53, 0x54, 0x7d, 0x8d, 0x42, 0x25, 0xff, 0xcd, 0x53, 0x55, 0xc2, + 0x24, 0xf1, 0xf1, 0x7a, 0xc3, 0x97, 0xfe, 0xe1, 0x33, 0xca, 0x4e, 0xfb, + 0x49, 0x8e, 0x5f, 0xcd, 0x52, 0x9d, 0xee, 0x4e, 0x72, 0xdd, 0x39, 0x4d, + 0x51, 0xe3, 0x7e, 0x6b, 0x7c, 0x1c, 0x19, 0x8e, 0x5c, 0x9e, 0x39, 0x6f, + 0x21, 0xb8, 0xe9, 0x15, 0xfe, 0xe7, 0xdc, 0xcb, 0xf1, 0x54, 0xe5, 0xff, + 0xa2, 0x61, 0xce, 0x2e, 0xc6, 0x21, 0xca, 0x73, 0xf7, 0xfc, 0xe2, 0xff, + 0xff, 0xee, 0xfe, 0x14, 0xcd, 0xcc, 0x39, 0xc7, 0xb8, 0x18, 0xd6, 0xa1, + 0x53, 0x97, 0xff, 0x92, 0x69, 0x67, 0x32, 0xf8, 0xc7, 0x71, 0x39, 0x73, + 0xf0, 0x1c, 0xb7, 0x09, 0x89, 0xcc, 0xab, 0x09, 0xd5, 0x91, 0x75, 0xd5, + 0xd3, 0x2e, 0x68, 0xa9, 0xcb, 0xe7, 0x94, 0x00, 0xe5, 0xfb, 0xaf, 0xe7, + 0x91, 0xcb, 0xf9, 0x36, 0x39, 0x9b, 0x39, 0x7f, 0xa5, 0xa8, 0xd3, 0x52, + 0x6a, 0x9a, 0xa3, 0x97, 0xff, 0x33, 0xe6, 0x87, 0x39, 0x90, 0xbc, 0xe7, + 0x2f, 0x69, 0x00, 0x72, 0xb0, 0xf8, 0xd1, 0x1e, 0xf3, 0x6d, 0xb6, 0x52, + 0xfc, 0xe3, 0xee, 0xe1, 0x4f, 0xa6, 0x82, 0xff, 0xff, 0xe8, 0x9f, 0xe6, + 0xbf, 0x8e, 0x7d, 0xdc, 0x66, 0x78, 0x60, 0x00, 0x83, 0x97, 0xde, 0x9b, + 0x3c, 0x72, 0x82, 0x89, 0x87, 0x75, 0xa0, 0xa6, 0x64, 0x04, 0x01, 0x86, + 0x85, 0xfb, 0xa2, 0xd4, 0xda, 0x70, 0x1c, 0xb9, 0xdc, 0xe5, 0xba, 0x87, + 0x90, 0xe6, 0x77, 0xff, 0x01, 0x26, 0xf9, 0xd8, 0x4d, 0xfe, 0xd6, 0x72, + 0xfe, 0xda, 0x70, 0x6f, 0x5a, 0x39, 0x7f, 0x0f, 0xfe, 0x49, 0xe0, 0xe5, + 0xff, 0x91, 0x58, 0x18, 0xd4, 0x23, 0x0e, 0x5f, 0xd9, 0xc7, 0xf9, 0x66, + 0x8e, 0x5f, 0x60, 0x72, 0x73, 0x97, 0xcd, 0x7f, 0x21, 0xa8, 0x39, 0x76, + 0xe0, 0xe5, 0x05, 0x71, 0xa7, 0x08, 0x56, 0x4f, 0xc9, 0x5a, 0x47, 0xb2, + 0xd6, 0xfb, 0x31, 0x36, 0xd2, 0xd8, 0x63, 0xd2, 0xe1, 0x3c, 0xf1, 0x87, + 0x12, 0x2e, 0x02, 0xcb, 0xf3, 0x71, 0x81, 0x43, 0x97, 0xbf, 0xf6, 0x8e, + 0x5f, 0xff, 0xff, 0xf6, 0xbe, 0x77, 0x27, 0x86, 0xf9, 0x96, 0xbe, 0x7e, + 0xbd, 0xee, 0x3e, 0x4c, 0xaf, 0x3f, 0x3e, 0x75, 0xa1, 0xca, 0xc4, 0x78, + 0x2c, 0x9f, 0xc3, 0xd7, 0x7e, 0x03, 0x97, 0x34, 0x6a, 0x8e, 0x5e, 0xf9, + 0x25, 0x9c, 0xa8, 0x3d, 0x55, 0x46, 0x18, 0x3d, 0x7f, 0xff, 0x6f, 0xe0, + 0xe7, 0x1c, 0xdc, 0xbe, 0x40, 0x5e, 0x6d, 0x1c, 0xbf, 0xff, 0xf8, 0x79, + 0x85, 0x47, 0x03, 0xd4, 0x9b, 0xe6, 0xb3, 0x99, 0x6f, 0x1b, 0x39, 0x58, + 0x8d, 0x81, 0x61, 0xbe, 0xf7, 0xf1, 0x39, 0xcb, 0xfd, 0x2c, 0xee, 0x32, + 0x16, 0x72, 0x90, 0xf5, 0xbc, 0x49, 0x7f, 0xff, 0x73, 0x2d, 0x33, 0x07, + 0xe7, 0x02, 0x76, 0x74, 0xcd, 0x9c, 0xb3, 0x59, 0xca, 0xc3, 0xf5, 0x5b, + 0x0d, 0xff, 0xff, 0x9b, 0xf8, 0x38, 0xbe, 0xa0, 0xe7, 0xfc, 0xfb, 0xe3, + 0xb7, 0x8a, 0x9c, 0xbf, 0xca, 0x87, 0xf8, 0xe8, 0xc1, 0xcb, 0xfd, 0xcc, + 0xb4, 0xaf, 0xf1, 0xc9, 0xcb, 0xfc, 0xed, 0xff, 0x34, 0x79, 0xce, 0x54, + 0x26, 0x29, 0x8e, 0x68, 0x68, 0x27, 0x17, 0xff, 0xe1, 0xc0, 0xf7, 0xf6, + 0xf4, 0x9e, 0xea, 0x38, 0x0e, 0x5f, 0xe1, 0xce, 0x3f, 0x24, 0xc9, 0x1c, + 0xad, 0xa2, 0x37, 0x4a, 0xd7, 0x6b, 0x89, 0xca, 0x83, 0x79, 0xf9, 0x1d, + 0xf0, 0x3c, 0x93, 0x9c, 0xbf, 0xde, 0xea, 0x08, 0x14, 0x61, 0xcb, 0xff, + 0xfb, 0xa9, 0x83, 0x88, 0x1c, 0x80, 0x3a, 0xdf, 0x67, 0x2f, 0xf4, 0xf0, + 0xc1, 0x8e, 0x40, 0x72, 0xa4, 0x8b, 0xee, 0x4d, 0x1d, 0x5a, 0xfd, 0xdf, + 0x8f, 0x9a, 0x39, 0x50, 0x7b, 0x38, 0x61, 0x7f, 0xf3, 0xee, 0x5f, 0x3c, + 0x31, 0x2c, 0xf1, 0xca, 0x85, 0xd0, 0x5c, 0x77, 0x48, 0x4b, 0x6e, 0x33, + 0x5e, 0xc6, 0x06, 0xe4, 0x23, 0x19, 0xd7, 0xe4, 0x16, 0x6b, 0x39, 0x7f, + 0xfd, 0xb4, 0xff, 0x87, 0x8f, 0x9a, 0xfc, 0x0c, 0xcf, 0x1c, 0xbf, 0xf4, + 0x2f, 0x50, 0x9c, 0xfa, 0x18, 0x72, 0xd2, 0x39, 0x42, 0x79, 0xff, 0x9f, + 0x5f, 0xa0, 0x1a, 0x9f, 0xc7, 0x2f, 0x3f, 0xb4, 0x72, 0xef, 0xe7, 0x39, + 0x52, 0x36, 0xbb, 0x1c, 0xbf, 0x64, 0xba, 0xf2, 0x39, 0x70, 0xfa, 0x63, + 0xc8, 0xe9, 0x0d, 0xfe, 0x71, 0x53, 0xbd, 0x80, 0x9c, 0xbf, 0xbf, 0x5f, + 0xc0, 0xf2, 0xd9, 0xcb, 0xfe, 0x86, 0xfb, 0x83, 0xcc, 0x2a, 0x72, 0xed, + 0xc8, 0xe5, 0x42, 0x39, 0xb9, 0x2e, 0x43, 0x3d, 0x9a, 0x30, 0xea, 0xff, + 0x6e, 0x03, 0x1d, 0x89, 0x1c, 0xbf, 0xfe, 0x8f, 0x7c, 0x1f, 0xf8, 0x3e, + 0x67, 0x9a, 0x67, 0x8e, 0x52, 0x22, 0x2f, 0xf3, 0x2b, 0xff, 0xbb, 0x0a, + 0xfc, 0xf0, 0xbf, 0xa3, 0xc7, 0x2f, 0xf7, 0xce, 0x64, 0x9d, 0xfd, 0x87, + 0x28, 0x07, 0xfc, 0x28, 0xd7, 0xff, 0x67, 0x1c, 0x0f, 0xcf, 0x2a, 0x8d, + 0xe8, 0xe5, 0xff, 0xb7, 0x37, 0xcd, 0x42, 0x4e, 0xfe, 0x39, 0x50, 0x8a, + 0xd0, 0x90, 0xfe, 0x95, 0x73, 0x80, 0xe5, 0xff, 0xf7, 0xc1, 0x8d, 0x44, + 0xe3, 0x81, 0xea, 0x4c, 0x72, 0xff, 0xff, 0xed, 0x6c, 0x62, 0x6f, 0x8a, + 0x79, 0x25, 0x9c, 0xfb, 0x38, 0x8e, 0x68, 0xe5, 0x6d, 0x19, 0x02, 0xa3, + 0x5e, 0x4c, 0x03, 0xf8, 0x6f, 0x51, 0xcb, 0xa6, 0x91, 0xca, 0x83, 0x47, + 0xb0, 0xbb, 0xff, 0x87, 0xda, 0xe2, 0x9e, 0x8c, 0x19, 0x8e, 0x5f, 0xb6, + 0x9a, 0x8e, 0x4e, 0x56, 0x1f, 0x6b, 0xa2, 0xdf, 0xe9, 0xf8, 0x49, 0xa4, + 0x9e, 0xd1, 0xcb, 0xf0, 0xfb, 0xb9, 0xc0, 0x72, 0xfd, 0x36, 0x9f, 0x6a, + 0x9c, 0xbc, 0xed, 0xee, 0x0f, 0x53, 0x0a, 0xaa, 0x48, 0xe1, 0x42, 0x0d, + 0xc2, 0x3e, 0xff, 0xba, 0x9b, 0x9b, 0xaf, 0x9b, 0x39, 0x7f, 0xff, 0xff, + 0x03, 0x43, 0x8f, 0xcf, 0xc0, 0xf7, 0xff, 0x83, 0x9c, 0xcb, 0x3f, 0x9c, + 0x71, 0xf9, 0x39, 0x4b, 0x46, 0x4a, 0x1c, 0xde, 0x77, 0x59, 0xa2, 0x98, + 0x56, 0x1e, 0x52, 0xc8, 0xaf, 0xfd, 0x83, 0xcc, 0xb5, 0xe8, 0xdc, 0xc7, + 0x2f, 0xfc, 0xfc, 0xe2, 0x6d, 0x19, 0x0a, 0x9c, 0xbd, 0x88, 0x03, 0x96, + 0xc3, 0x97, 0xb9, 0x1c, 0x01, 0xab, 0xe2, 0x37, 0x48, 0x8d, 0xdd, 0xa0, + 0x3b, 0x4d, 0xd3, 0xcc, 0x72, 0xcd, 0x9c, 0xb9, 0x02, 0x72, 0x9a, 0xcd, + 0x46, 0x84, 0xae, 0x0c, 0xc7, 0x2f, 0xb7, 0xd7, 0xf9, 0x07, 0xfb, 0x88, + 0x2c, 0x24, 0xbf, 0xdf, 0x39, 0x90, 0xc6, 0x68, 0xe5, 0x21, 0xfd, 0xba, + 0x35, 0xff, 0xf8, 0x09, 0xaf, 0x9d, 0x7d, 0x7a, 0x26, 0xd7, 0x70, 0xe5, + 0xfc, 0x9d, 0x74, 0x9e, 0x0e, 0x5e, 0x94, 0x72, 0x72, 0xff, 0x30, 0x3d, + 0x89, 0xf1, 0xb3, 0x95, 0x87, 0xfd, 0xc9, 0x63, 0x8e, 0xdd, 0xad, 0x1c, + 0xb6, 0x1c, 0xbf, 0xf4, 0xc8, 0xaa, 0x78, 0x73, 0x83, 0xe6, 0xcd, 0x3f, + 0x11, 0x7b, 0xff, 0xfc, 0x38, 0xbf, 0x7a, 0x3d, 0xa9, 0x87, 0x1b, 0xf9, + 0x0d, 0x41, 0xcb, 0xff, 0x2e, 0x19, 0xdc, 0xd6, 0x20, 0x9c, 0xa8, 0x45, + 0x27, 0x5a, 0x2f, 0xdb, 0x8e, 0x31, 0xb3, 0x97, 0xf3, 0x8f, 0xc0, 0xc0, + 0x9c, 0xa8, 0x4d, 0xe3, 0x23, 0x00, 0x42, 0x2f, 0xca, 0x6f, 0xfa, 0x1b, + 0x5a, 0x4f, 0x9c, 0xf8, 0xe5, 0x35, 0x6c, 0xe2, 0x28, 0x14, 0x9e, 0x15, + 0x12, 0x22, 0x0c, 0x71, 0x8a, 0xc3, 0x51, 0x71, 0xa7, 0x73, 0x19, 0x82, + 0x26, 0xcd, 0x1b, 0x76, 0xe3, 0x47, 0x64, 0x3f, 0xbb, 0x19, 0x30, 0x08, + 0x06, 0x1a, 0xde, 0x8f, 0x37, 0x8a, 0x15, 0xff, 0x6d, 0xdb, 0xf8, 0xe1, + 0x79, 0xce, 0x5f, 0xce, 0xdc, 0xc2, 0x81, 0x39, 0x7f, 0xff, 0x83, 0x93, + 0xb8, 0xfb, 0x50, 0xbf, 0x8c, 0x62, 0x0a, 0xce, 0x5f, 0xc1, 0xd3, 0xc7, + 0x32, 0x39, 0x50, 0x89, 0x07, 0x62, 0xbf, 0xe8, 0x9b, 0xa9, 0x0c, 0x70, + 0x9c, 0xa5, 0x53, 0x53, 0xd9, 0xe0, 0xc2, 0xfb, 0xf2, 0x1b, 0xec, 0x15, + 0x5a, 0xce, 0x5f, 0xff, 0xff, 0xba, 0x9e, 0xee, 0x6e, 0x38, 0xfc, 0x67, + 0xfc, 0x1f, 0x33, 0x99, 0x67, 0xe2, 0x0d, 0x1c, 0xb7, 0x91, 0x16, 0x9a, + 0x25, 0xbf, 0xf4, 0x2f, 0xe0, 0xbe, 0x99, 0x02, 0x72, 0xff, 0xfd, 0x99, + 0xd4, 0x5f, 0x73, 0xe6, 0xbf, 0xec, 0x35, 0x9c, 0xbf, 0xfe, 0xf7, 0x70, + 0x1f, 0x19, 0x19, 0xe0, 0xe0, 0x9c, 0xb3, 0x67, 0x2f, 0xe7, 0x0e, 0xf7, + 0xfc, 0xe7, 0x2f, 0xd1, 0x83, 0xe6, 0x87, 0x29, 0x53, 0xea, 0x58, 0x93, + 0x0c, 0x2f, 0xbc, 0x9b, 0xc3, 0x96, 0xe7, 0xe1, 0xe8, 0xe1, 0x85, 0xb5, + 0x89, 0x9a, 0xbc, 0x61, 0x74, 0xc4, 0xfe, 0xc4, 0xfb, 0xd1, 0xc7, 0xdf, + 0xff, 0xff, 0x67, 0x32, 0x4d, 0x0e, 0x71, 0xee, 0x4d, 0xd8, 0x19, 0xbe, + 0x3a, 0xd3, 0x89, 0xcb, 0xff, 0xfe, 0xc1, 0x57, 0xe6, 0xe3, 0x8a, 0x7b, + 0x58, 0xaa, 0x6d, 0xf9, 0x39, 0x42, 0x8e, 0xe5, 0x21, 0x07, 0x48, 0x9a, + 0x67, 0xf1, 0x92, 0x5f, 0xfe, 0x40, 0xfc, 0x62, 0x7c, 0x80, 0xbc, 0xda, + 0x39, 0x74, 0xa4, 0x72, 0xdb, 0x83, 0xe5, 0x9d, 0x3a, 0xfd, 0x28, 0xe6, + 0x5a, 0x39, 0x7f, 0xff, 0xff, 0xec, 0x15, 0x7e, 0x27, 0x7f, 0xfb, 0x32, + 0x7a, 0x18, 0x2e, 0xaf, 0x53, 0xee, 0x77, 0x90, 0x40, 0x4a, 0x5f, 0xff, + 0xfc, 0xb4, 0x6c, 0x3f, 0xef, 0xe7, 0xf1, 0x3e, 0x97, 0xdf, 0xfb, 0xcb, + 0xb6, 0x72, 0xef, 0xe7, 0xe5, 0x34, 0x84, 0x29, 0xd4, 0x28, 0xaa, 0x17, + 0x6c, 0xbb, 0x2d, 0xbd, 0xe1, 0x1e, 0x31, 0xb8, 0x5f, 0xe7, 0x96, 0x31, + 0xc4, 0x07, 0x2f, 0xb3, 0xb1, 0x31, 0xcb, 0xcc, 0x5f, 0xce, 0x9e, 0x9b, + 0x98, 0xdf, 0xff, 0xfe, 0xda, 0xc7, 0x38, 0xfc, 0xd2, 0x60, 0x83, 0xe0, + 0xe7, 0x11, 0xcd, 0x71, 0x39, 0x7f, 0xb1, 0xd9, 0xf1, 0xa4, 0x30, 0xe5, + 0xff, 0xe9, 0x46, 0xbb, 0xfe, 0xf3, 0xde, 0x46, 0x1c, 0xa5, 0xa2, 0x07, + 0x93, 0x6a, 0xc4, 0xc8, 0xf7, 0x0f, 0xfb, 0xff, 0xf2, 0x0f, 0xbb, 0x9c, + 0x1e, 0x9b, 0x1a, 0xdc, 0x40, 0x72, 0xf9, 0xbf, 0x9a, 0x98, 0xe5, 0xbc, + 0x72, 0xa0, 0xdc, 0x39, 0x3d, 0xff, 0x86, 0x71, 0xce, 0x3a, 0xfe, 0x39, + 0x39, 0x7f, 0xe0, 0xf6, 0x39, 0xf8, 0xd4, 0xf8, 0x81, 0x0e, 0x54, 0x22, + 0x32, 0x74, 0x2a, 0x44, 0xe2, 0x34, 0x51, 0xe8, 0x49, 0x7f, 0x0a, 0xbb, + 0xff, 0x9b, 0xcd, 0x7f, 0x0a, 0xea, 0x37, 0x31, 0xcb, 0xed, 0xc9, 0xc2, + 0x72, 0xff, 0xc3, 0x25, 0xf5, 0x3a, 0x3f, 0xce, 0x72, 0xf7, 0xb3, 0x87, + 0x39, 0x50, 0x7c, 0x38, 0x81, 0x79, 0xa6, 0x74, 0xe5, 0xd8, 0x13, 0x95, + 0x3a, 0xe2, 0x3c, 0xa5, 0x70, 0x62, 0x43, 0xa4, 0x6a, 0x10, 0x7e, 0x20, + 0xe2, 0x3d, 0x7e, 0x4f, 0x6b, 0x00, 0x72, 0xfd, 0xdc, 0xe2, 0x9c, 0x4e, + 0x5e, 0x4c, 0x01, 0xcb, 0xf8, 0x30, 0x3d, 0x79, 0x1c, 0xbd, 0x01, 0x83, + 0x97, 0xec, 0xf6, 0x9e, 0x6f, 0x87, 0x8e, 0xc2, 0xcb, 0xe6, 0xad, 0xa9, + 0x70, 0xcd, 0x59, 0xcb, 0xe4, 0x71, 0x09, 0xcb, 0x37, 0xf0, 0xf6, 0x02, + 0x71, 0x52, 0x46, 0x22, 0x42, 0x66, 0xff, 0xfd, 0xbf, 0xf7, 0xb8, 0x1c, + 0x55, 0x3b, 0xdc, 0x50, 0xe5, 0xf7, 0xef, 0xcf, 0x8e, 0x54, 0x95, 0x0d, + 0x04, 0x9d, 0x52, 0xb9, 0xa3, 0x26, 0xd9, 0x3f, 0x55, 0xe8, 0xe5, 0xfd, + 0xa5, 0xad, 0xc5, 0x53, 0x95, 0xc2, 0x8d, 0xcf, 0x82, 0xef, 0xf0, 0xfc, + 0xe3, 0xcc, 0xb5, 0x31, 0xcb, 0xa7, 0xe4, 0xe5, 0xfb, 0xae, 0xd7, 0x00, + 0x39, 0x41, 0x3f, 0xd7, 0x3a, 0xe0, 0x19, 0xbf, 0xdb, 0x98, 0x73, 0xaf, + 0xe3, 0x95, 0x09, 0x84, 0x64, 0x29, 0x10, 0xc6, 0xfc, 0x9b, 0x0e, 0x09, + 0xcb, 0xf0, 0x33, 0xca, 0x4e, 0x72, 0xff, 0x37, 0xec, 0xef, 0xce, 0x74, + 0x72, 0xa0, 0xf8, 0x9c, 0xaa, 0xa4, 0x8d, 0xbe, 0x99, 0x8c, 0x22, 0x2f, + 0xee, 0xe2, 0xe5, 0x0c, 0x39, 0x7f, 0xbb, 0x92, 0x71, 0xce, 0x4e, 0x56, + 0x1e, 0xff, 0x8b, 0x6f, 0xff, 0xf8, 0x5c, 0x1a, 0x9f, 0x10, 0x7c, 0x39, + 0xc7, 0xe6, 0x9b, 0x13, 0x97, 0xf7, 0x70, 0x79, 0x85, 0x4e, 0x50, 0xa2, + 0xe3, 0xc4, 0x2d, 0xb4, 0xde, 0xc4, 0x98, 0xe5, 0xff, 0x93, 0x26, 0xf9, + 0xa8, 0xeb, 0xb5, 0x9c, 0xbf, 0xee, 0x72, 0x39, 0x98, 0x61, 0x87, 0x2f, + 0xee, 0x75, 0xdc, 0x7d, 0x9c, 0xbf, 0xff, 0xf2, 0x33, 0x69, 0x9c, 0x8f, + 0xfe, 0x8e, 0xfc, 0xe2, 0x9e, 0x9a, 0x0e, 0x53, 0xa2, 0x7f, 0xc5, 0xd5, + 0x3a, 0x6b, 0x41, 0x1c, 0xea, 0x1f, 0xa1, 0xb3, 0x7f, 0xfd, 0x8f, 0x3f, + 0x61, 0x3d, 0xa8, 0x9f, 0x34, 0x72, 0xff, 0xb3, 0x73, 0xc2, 0x6f, 0x04, + 0xe5, 0x98, 0x73, 0xe1, 0xb7, 0xbc, 0x38, 0x13, 0x95, 0x06, 0xfb, 0x92, + 0x3b, 0xfb, 0x9d, 0x66, 0x0a, 0xa7, 0x2f, 0x98, 0xa4, 0x00, 0xe5, 0xff, + 0xe9, 0xc3, 0xb7, 0x58, 0xe7, 0x1d, 0xa6, 0x8e, 0x56, 0x22, 0x75, 0x0b, + 0xbf, 0x23, 0xbf, 0xcf, 0xee, 0xbc, 0xca, 0x30, 0xe5, 0xef, 0xf9, 0x01, + 0xcb, 0xfb, 0x51, 0xc8, 0x37, 0x07, 0x2e, 0x0a, 0x1c, 0xa8, 0x5c, 0x17, + 0xc8, 0xe2, 0x96, 0x88, 0x90, 0xc4, 0xdc, 0x2f, 0x9c, 0xbc, 0x4d, 0x74, + 0x3f, 0xc4, 0xba, 0xfe, 0xf3, 0xf7, 0xe0, 0x60, 0xe5, 0xff, 0xef, 0x69, + 0x4d, 0x7c, 0xf0, 0xc4, 0xb3, 0xc7, 0x2f, 0xf7, 0x92, 0x7c, 0xef, 0xfe, + 0x39, 0x7d, 0xed, 0x42, 0xa7, 0x2d, 0x31, 0xcb, 0xfb, 0x3f, 0xce, 0xae, + 0x73, 0x96, 0xe6, 0x0f, 0x07, 0x42, 0x55, 0x08, 0x8c, 0xc6, 0x4b, 0xfb, + 0xaf, 0x26, 0x6d, 0x0e, 0x5f, 0xfc, 0xaa, 0xaf, 0xed, 0x78, 0x63, 0x99, + 0x1c, 0xbf, 0xbc, 0x31, 0x2c, 0xf1, 0xca, 0x83, 0xf3, 0x92, 0x3d, 0xc9, + 0xa3, 0x96, 0x61, 0xcb, 0xdb, 0xce, 0x4e, 0x50, 0x4f, 0x13, 0xa2, 0xc0, + 0x11, 0xbf, 0xfc, 0xea, 0xf9, 0x58, 0x19, 0x67, 0x51, 0x87, 0x2f, 0xc9, + 0xad, 0x43, 0x0e, 0x52, 0x22, 0x80, 0x4b, 0xf8, 0xa5, 0x54, 0x2b, 0x33, + 0xc2, 0xf5, 0x53, 0x52, 0x18, 0x20, 0x21, 0x18, 0x50, 0x7f, 0x18, 0x2d, + 0xf8, 0x28, 0x2e, 0x13, 0x97, 0xb4, 0x1e, 0x4e, 0x5c, 0x05, 0x9c, 0xbf, + 0xfd, 0x93, 0x76, 0x05, 0x51, 0xcf, 0x77, 0xf3, 0x94, 0xa9, 0xf1, 0x74, + 0x5e, 0xbe, 0x22, 0x8e, 0x50, 0x80, 0xa4, 0x47, 0x9e, 0xe1, 0x93, 0x7f, + 0xff, 0x93, 0x39, 0x96, 0xbd, 0xd8, 0x64, 0x20, 0x7e, 0x43, 0x50, 0x72, + 0xff, 0x38, 0xfc, 0x5e, 0x80, 0x13, 0x97, 0xfe, 0xff, 0x5f, 0x18, 0xa7, + 0x5f, 0xb0, 0x72, 0xfd, 0x9e, 0xff, 0x39, 0x39, 0x79, 0x5c, 0xe4, 0xe5, + 0xd1, 0x37, 0xc3, 0xc7, 0xf1, 0x4d, 0x0a, 0x2e, 0xbf, 0x84, 0x55, 0xff, + 0xff, 0xfb, 0xf1, 0xf8, 0xdb, 0xf3, 0x2d, 0xb8, 0x3e, 0x6b, 0xf8, 0xe7, + 0xb8, 0x83, 0x8a, 0x9c, 0xbf, 0xff, 0xde, 0xff, 0x07, 0xe2, 0x67, 0x86, + 0x01, 0xf3, 0x10, 0x27, 0x2f, 0xf9, 0x98, 0xcf, 0x8c, 0x6b, 0xe3, 0x23, + 0x95, 0xb4, 0x51, 0xb1, 0x8a, 0xff, 0xfb, 0x7b, 0xcf, 0x6b, 0xa9, 0x9f, + 0x3a, 0x08, 0x39, 0x48, 0x7e, 0x9f, 0x91, 0xd6, 0x27, 0x89, 0xd8, 0xe8, + 0xaf, 0xd8, 0x2b, 0x51, 0x87, 0x2f, 0xfe, 0xee, 0x40, 0xcc, 0x39, 0xed, + 0x39, 0xcb, 0x4b, 0xc7, 0xd5, 0xc0, 0x51, 0x7f, 0xfe, 0x0e, 0x33, 0xe7, + 0x07, 0xa3, 0x53, 0x49, 0xf7, 0x39, 0xcb, 0xff, 0xfb, 0xc9, 0x3e, 0x07, + 0xe3, 0x1e, 0x5b, 0x49, 0xdd, 0x87, 0x2f, 0xf4, 0xee, 0xc1, 0x8d, 0xcc, + 0x72, 0xff, 0xb9, 0xc5, 0x40, 0xcc, 0xf9, 0xbc, 0x44, 0x92, 0x2f, 0x5f, + 0xf6, 0x0c, 0xff, 0x00, 0xef, 0x31, 0xcb, 0xff, 0xec, 0xff, 0x7f, 0x26, + 0xef, 0xea, 0xa6, 0x0a, 0xa7, 0x2f, 0xfb, 0x73, 0xc4, 0xf3, 0xff, 0xb9, + 0xce, 0x5f, 0xfb, 0xe4, 0xdd, 0xfd, 0x54, 0xc1, 0x54, 0xe5, 0xfe, 0x1f, + 0x9a, 0xfd, 0xa7, 0xfb, 0x39, 0x58, 0x7f, 0xdf, 0xa2, 0x54, 0x23, 0x7f, + 0x50, 0xbd, 0xbf, 0xfd, 0x3f, 0xcd, 0x77, 0xff, 0x9e, 0xd6, 0xa3, 0x67, + 0x2f, 0xff, 0xbb, 0x13, 0xfc, 0x1c, 0xe2, 0xfd, 0xec, 0x72, 0x72, 0xff, + 0xff, 0xb9, 0xd2, 0x63, 0x7f, 0x3b, 0x9e, 0xd6, 0x4f, 0xf3, 0x10, 0x27, + 0x28, 0x28, 0xc0, 0xc5, 0x4b, 0xfa, 0x7f, 0x4c, 0x30, 0xc3, 0x97, 0xff, + 0xf6, 0x4f, 0x88, 0x11, 0xff, 0xbf, 0x20, 0x2f, 0x36, 0x8e, 0x5f, 0xf6, + 0x37, 0x9d, 0x4d, 0xf5, 0xce, 0x56, 0x27, 0xf2, 0x91, 0x89, 0x39, 0x16, + 0x8b, 0xfc, 0xbd, 0x53, 0xb2, 0x48, 0x02, 0xce, 0xac, 0x3b, 0xd7, 0x1f, + 0x67, 0x30, 0x93, 0x42, 0xbd, 0xc3, 0xbd, 0x8a, 0x7d, 0x3b, 0xd4, 0x66, + 0xbe, 0x94, 0x41, 0x7f, 0xbc, 0x39, 0xee, 0xe4, 0xe7, 0x2f, 0xfc, 0xfb, + 0xee, 0x7a, 0x05, 0x00, 0x72, 0xff, 0xf8, 0x72, 0x7f, 0x80, 0xff, 0xd9, + 0x8c, 0x03, 0x67, 0x2f, 0xa5, 0xe4, 0x9c, 0xe5, 0xff, 0x63, 0x7c, 0xcb, + 0x5f, 0x3c, 0x87, 0x2f, 0xfd, 0x28, 0xc0, 0x77, 0x30, 0x56, 0x72, 0xff, + 0xf7, 0x50, 0x43, 0xf1, 0x45, 0x8e, 0x77, 0x0e, 0x56, 0x22, 0x1e, 0x63, + 0xcb, 0xfe, 0xea, 0x32, 0x30, 0x7d, 0xa3, 0x97, 0xff, 0xfb, 0xff, 0x6f, + 0xf9, 0xbe, 0x7a, 0x6e, 0xfe, 0x0f, 0x26, 0x70, 0x1c, 0xbe, 0x85, 0xc3, + 0x3e, 0x23, 0x1d, 0x64, 0x62, 0x6f, 0x50, 0xaa, 0xe1, 0x66, 0x7b, 0x3c, + 0x75, 0x41, 0x23, 0xe0, 0x8e, 0x2e, 0xff, 0xfe, 0xde, 0x3b, 0x3e, 0x2a, + 0xfc, 0xf7, 0x3b, 0xd8, 0xf1, 0xcb, 0xec, 0xdc, 0xd2, 0x39, 0x7f, 0xf9, + 0x54, 0xe6, 0x5a, 0xf8, 0x14, 0xe3, 0x01, 0x39, 0x7f, 0xd9, 0x34, 0xb3, + 0xb9, 0xc7, 0x47, 0x2f, 0xff, 0xc1, 0xef, 0xfa, 0xf9, 0xd4, 0xf7, 0x73, + 0x71, 0xc4, 0xe5, 0xfd, 0x9c, 0x8e, 0x60, 0x0e, 0x56, 0x22, 0x1c, 0x56, + 0xee, 0x86, 0x62, 0x6a, 0xca, 0x91, 0xed, 0x40, 0x61, 0x85, 0x68, 0x39, + 0x7c, 0x9b, 0x7e, 0x4e, 0x5c, 0x9e, 0x43, 0x65, 0xa1, 0x0b, 0xff, 0x93, + 0x8a, 0x07, 0xe4, 0x4c, 0x17, 0x6c, 0xe5, 0xff, 0xff, 0xe1, 0x45, 0x7a, + 0xf3, 0x7c, 0x1f, 0xf8, 0x3e, 0x67, 0x32, 0xcf, 0xc4, 0x1a, 0x39, 0x7e, + 0xea, 0x40, 0xce, 0x72, 0xd0, 0xc4, 0x54, 0xf1, 0x84, 0x15, 0x69, 0x32, + 0x1f, 0x43, 0xca, 0xa4, 0x9b, 0xaa, 0x46, 0x99, 0x7a, 0x6f, 0xc2, 0x72, + 0xa1, 0xb1, 0x0e, 0xca, 0x4a, 0x3a, 0x4b, 0x78, 0xda, 0xff, 0x63, 0xb4, + 0x78, 0xfd, 0x3f, 0x29, 0xbf, 0x40, 0xf9, 0x38, 0x9c, 0xbe, 0xf6, 0x9c, + 0x07, 0x2f, 0xfe, 0xea, 0x7c, 0x4d, 0xff, 0x3b, 0xed, 0x67, 0x2f, 0x93, + 0xaf, 0x39, 0xcb, 0xee, 0x31, 0xe8, 0x39, 0x7e, 0xd6, 0x79, 0x34, 0x72, + 0xff, 0xe4, 0xf7, 0x53, 0x30, 0x23, 0x8d, 0x9c, 0xbd, 0xb4, 0x54, 0xe5, + 0xff, 0xf7, 0xf8, 0x9d, 0xc5, 0xf5, 0x3e, 0x36, 0xc5, 0x9c, 0xbd, 0xec, + 0x6c, 0xe5, 0xec, 0xfe, 0x71, 0x3f, 0x0f, 0x29, 0xdf, 0xbf, 0xe1, 0xc5, + 0xfc, 0x72, 0xfe, 0xeb, 0xcf, 0xf2, 0x5e, 0x39, 0x7f, 0x3c, 0xca, 0x6a, + 0x30, 0xe5, 0xf9, 0xf6, 0x3c, 0xa1, 0xca, 0x84, 0x59, 0xa1, 0x6f, 0x4c, + 0x7c, 0x5d, 0x41, 0x55, 0xdf, 0x85, 0x0a, 0x91, 0x2d, 0x21, 0x08, 0xa6, + 0x23, 0x61, 0x3b, 0xa1, 0x0c, 0x23, 0x7d, 0x0e, 0x7b, 0xe1, 0xf4, 0x30, + 0xe5, 0xfe, 0xec, 0x20, 0xbe, 0xd5, 0x39, 0x7f, 0x42, 0x0b, 0xed, 0x53, + 0x97, 0xf3, 0x83, 0x7b, 0x4d, 0xfc, 0x3d, 0xee, 0x99, 0x5f, 0xff, 0xfe, + 0xf8, 0xc8, 0xcf, 0x7c, 0xc9, 0x27, 0x11, 0xcd, 0x7c, 0x80, 0xbc, 0xda, + 0x39, 0x7f, 0x0a, 0xfe, 0x37, 0xa0, 0x1c, 0xa9, 0x22, 0xbd, 0xdf, 0xa9, + 0x13, 0x96, 0x03, 0xff, 0xf0, 0xf5, 0xbd, 0xaf, 0x21, 0xcb, 0xd3, 0x03, + 0x93, 0x97, 0xa1, 0x5f, 0x8b, 0x37, 0x60, 0x1c, 0xb0, 0x0e, 0x5f, 0xd1, + 0xb9, 0xe3, 0x73, 0x9c, 0xbd, 0xfb, 0xe8, 0xe5, 0x48, 0xf3, 0x14, 0x2f, + 0xbf, 0xff, 0x93, 0x7f, 0x31, 0x30, 0x55, 0xea, 0x63, 0x31, 0x67, 0x2f, + 0xff, 0xf9, 0x27, 0xdc, 0x33, 0x5f, 0xc7, 0xc8, 0xdc, 0x07, 0xb0, 0xc3, + 0x95, 0x88, 0xc3, 0xda, 0xd5, 0xf8, 0x1a, 0x4e, 0x5b, 0x39, 0x7f, 0xed, + 0xe7, 0x3d, 0xe6, 0x19, 0x3c, 0x1c, 0xbf, 0xff, 0xfd, 0xbd, 0xa4, 0xff, + 0x3b, 0x9e, 0x18, 0x9b, 0xb9, 0x3c, 0x73, 0xef, 0xd6, 0x72, 0xff, 0xff, + 0xe8, 0x57, 0xb1, 0xf0, 0x73, 0xf5, 0x7e, 0x73, 0x2d, 0x20, 0xa9, 0x13, + 0x9c, 0xbf, 0x73, 0xa4, 0xc1, 0x39, 0x58, 0x8a, 0x1f, 0xde, 0xa9, 0x13, + 0x42, 0xec, 0x63, 0xf7, 0xff, 0x6c, 0x79, 0xcd, 0x7f, 0x30, 0xc3, 0x0e, + 0x5f, 0xf2, 0x2b, 0xd8, 0x49, 0xe1, 0x53, 0x96, 0x92, 0x22, 0x03, 0x48, + 0xd7, 0xfc, 0x3f, 0xcc, 0x39, 0xd7, 0xf1, 0xcb, 0xfd, 0xd8, 0x6c, 0x3d, + 0x76, 0x1c, 0xbf, 0xe6, 0x66, 0xbe, 0x4c, 0x30, 0xc3, 0x94, 0x13, 0xef, + 0x61, 0xa5, 0xff, 0xff, 0x3e, 0xfb, 0x9e, 0x4c, 0x19, 0xf5, 0x18, 0x21, + 0xec, 0x1c, 0xbe, 0xf7, 0xc9, 0xf6, 0x72, 0xb9, 0x44, 0x4b, 0xb1, 0xdf, + 0xff, 0xfb, 0x9c, 0x9f, 0xfe, 0x0f, 0x9c, 0xcb, 0xd0, 0xdf, 0xcc, 0xd8, + 0x01, 0x07, 0x2f, 0xff, 0x36, 0xe3, 0x3b, 0x3f, 0x40, 0xa0, 0xa1, 0xcb, + 0xfa, 0x6e, 0x65, 0xfc, 0x78, 0xe5, 0xff, 0xfd, 0x28, 0xdf, 0x32, 0xd7, + 0xce, 0xc2, 0x0b, 0xed, 0x53, 0x97, 0xf6, 0x4b, 0xc3, 0x92, 0x39, 0x7f, + 0xdd, 0x76, 0x0e, 0x75, 0xfc, 0x72, 0xfb, 0x36, 0x06, 0xce, 0x54, 0x26, + 0x2b, 0xc9, 0x8f, 0x57, 0xb4, 0x59, 0xe3, 0x7b, 0xff, 0xb3, 0xda, 0xf9, + 0xbc, 0x4e, 0xc0, 0x4e, 0x5f, 0xd9, 0xed, 0xef, 0x24, 0x72, 0x8e, 0x5f, + 0xb3, 0xa3, 0x8b, 0x39, 0x40, 0x36, 0x22, 0x17, 0x7c, 0x39, 0xaf, 0x93, + 0x1f, 0xf7, 0x97, 0xaf, 0xfb, 0x19, 0xd8, 0x4d, 0xfe, 0xd6, 0x72, 0x82, + 0xbe, 0xe7, 0x84, 0x4a, 0x95, 0x2e, 0x38, 0x3e, 0x61, 0x52, 0x85, 0x1b, + 0x85, 0x47, 0x61, 0x56, 0xe4, 0x7a, 0x79, 0xf4, 0x6b, 0xff, 0xa5, 0xf1, + 0x86, 0x1a, 0x87, 0x77, 0xfd, 0x0c, 0x1c, 0x0e, 0xd2, 0x73, 0x97, 0xfc, + 0xd8, 0xe7, 0xf8, 0xac, 0x80, 0x72, 0xa4, 0x7e, 0x78, 0x71, 0x7f, 0xe1, + 0xcf, 0x9b, 0xce, 0x8e, 0x4c, 0x72, 0xff, 0xff, 0x75, 0xc1, 0xaf, 0x83, + 0x9c, 0x47, 0x35, 0x8c, 0x85, 0x9c, 0xa1, 0x45, 0x0e, 0x8f, 0xeb, 0x85, + 0x32, 0xbc, 0xa1, 0x77, 0x29, 0x0b, 0x3c, 0xc6, 0xb0, 0xf0, 0xc2, 0xbf, + 0xb3, 0xaa, 0x0f, 0x20, 0x39, 0x7f, 0x77, 0x07, 0xc0, 0xfc, 0xe5, 0xff, + 0x90, 0x21, 0x80, 0x7c, 0xce, 0x7c, 0x72, 0xff, 0x6b, 0x50, 0x93, 0xbf, + 0x8e, 0x5f, 0xca, 0x8e, 0x6a, 0x36, 0x72, 0xd2, 0x83, 0xe0, 0xfc, 0xce, + 0xfc, 0x30, 0xc7, 0x09, 0xcb, 0xfd, 0x93, 0x77, 0x3d, 0x01, 0x39, 0x7f, + 0x0f, 0x9d, 0x89, 0xe3, 0x96, 0x91, 0xca, 0x83, 0x7b, 0xe2, 0xcb, 0xc2, + 0xb8, 0x39, 0x7f, 0xff, 0xfd, 0xdc, 0xf6, 0x9e, 0x6f, 0x83, 0x9c, 0xcb, + 0x3f, 0x9c, 0x70, 0x3d, 0x49, 0x8e, 0x5d, 0xfa, 0xa7, 0x29, 0x11, 0x6d, + 0xb1, 0xbf, 0x42, 0x0a, 0xff, 0x01, 0x3d, 0xef, 0x63, 0x67, 0x2f, 0xec, + 0x9c, 0x73, 0x9d, 0x1c, 0xbf, 0xf8, 0x40, 0xd3, 0x3a, 0x90, 0xc7, 0x09, + 0xcb, 0xff, 0xff, 0xf4, 0xb5, 0xaf, 0xe3, 0xc8, 0x1c, 0x19, 0xbe, 0x0e, + 0x6e, 0x07, 0xdd, 0xce, 0x03, 0x97, 0xff, 0x73, 0x2d, 0x63, 0x39, 0x8e, + 0xf6, 0x0e, 0x57, 0x28, 0xcd, 0xdc, 0x21, 0xed, 0xa3, 0x95, 0x89, 0xa5, + 0xff, 0x18, 0x8a, 0x85, 0x36, 0x9c, 0xe5, 0xfb, 0x79, 0xcc, 0xb4, 0x72, + 0xf2, 0xfb, 0x87, 0x2d, 0x93, 0x9e, 0x2e, 0xca, 0x6e, 0x99, 0x0e, 0x56, + 0x22, 0x58, 0x55, 0xf8, 0x94, 0x5f, 0xd9, 0xcc, 0xa0, 0x10, 0x72, 0xfc, + 0x39, 0xd7, 0xf1, 0xca, 0xe4, 0xf4, 0xd8, 0x5b, 0x7c, 0x9c, 0x73, 0x67, + 0x2a, 0x0f, 0x1b, 0xa4, 0x77, 0xdf, 0x17, 0x3b, 0x67, 0x2f, 0xd3, 0xfc, + 0xfe, 0x26, 0x39, 0x7f, 0xff, 0xc3, 0x00, 0xe6, 0x5a, 0xfe, 0x3c, 0x38, + 0x14, 0xcd, 0xcc, 0x72, 0x9d, 0x12, 0x9e, 0x2d, 0xa8, 0x5f, 0x08, 0x09, + 0x7e, 0x17, 0x73, 0x0a, 0x14, 0x28, 0x98, 0x9b, 0xae, 0x0f, 0x0d, 0x60, + 0x1a, 0x09, 0xa6, 0xa3, 0x79, 0xf4, 0x33, 0xbf, 0x86, 0x4f, 0x12, 0x15, + 0x21, 0x77, 0x7e, 0x92, 0x6f, 0x39, 0x39, 0x7b, 0x5d, 0xc3, 0x97, 0xec, + 0xd4, 0xf8, 0xd9, 0xca, 0xe4, 0xfb, 0x66, 0x28, 0xe8, 0xe5, 0xff, 0xff, + 0x47, 0xb5, 0xdc, 0xe7, 0x1f, 0x9f, 0x81, 0x89, 0xfe, 0x2a, 0xa9, 0xcb, + 0xff, 0xe9, 0xf1, 0x61, 0xea, 0x62, 0xbf, 0x15, 0xfe, 0x0e, 0x5f, 0xfd, + 0x24, 0xf7, 0x73, 0x7b, 0xcf, 0x68, 0xe5, 0xff, 0x7c, 0x53, 0xc9, 0xc6, + 0x05, 0x67, 0x29, 0x11, 0xad, 0x32, 0xaf, 0x51, 0x2f, 0xff, 0x47, 0x32, + 0xd7, 0x9e, 0x7e, 0x01, 0xce, 0x4e, 0x5f, 0xf7, 0x67, 0x4c, 0x1e, 0x65, + 0xa3, 0x97, 0xfd, 0xcf, 0x71, 0x63, 0x9f, 0xb5, 0x9c, 0xbf, 0xfe, 0x6f, + 0x17, 0xac, 0xf4, 0xd8, 0xa8, 0xe0, 0x0e, 0x5a, 0x50, 0x8c, 0x8c, 0x3a, + 0x43, 0xdb, 0xf9, 0x39, 0x06, 0xdc, 0x27, 0x2f, 0x66, 0xc0, 0x72, 0xfd, + 0xa4, 0xc1, 0x01, 0xcb, 0x62, 0x1e, 0x16, 0x87, 0x2f, 0xc8, 0x00, 0x66, + 0xce, 0x57, 0x51, 0x7a, 0x2e, 0x1a, 0x26, 0xbe, 0xe0, 0xf6, 0x74, 0xe5, + 0xc8, 0xc3, 0x97, 0xff, 0xfe, 0xe6, 0x4f, 0xcf, 0xc1, 0xff, 0x83, 0xe6, + 0x73, 0x2c, 0xfc, 0x41, 0xa3, 0x94, 0xc4, 0x47, 0x70, 0x0b, 0x5e, 0x68, + 0x9c, 0x39, 0xca, 0xf8, 0x99, 0x5c, 0xe5, 0xf9, 0x0b, 0x36, 0x84, 0xd7, + 0xff, 0xff, 0xdc, 0xeb, 0xf8, 0xe7, 0xe7, 0x70, 0x3f, 0x07, 0x3f, 0x57, + 0xe6, 0x80, 0x04, 0xf1, 0xcb, 0xff, 0xff, 0xcd, 0x8e, 0x05, 0x8c, 0x8f, + 0x6b, 0x3d, 0xad, 0xa6, 0x2c, 0x70, 0x27, 0x2a, 0x11, 0xff, 0x90, 0x89, + 0xbf, 0x40, 0xf2, 0xf3, 0x9c, 0xbf, 0xff, 0xff, 0xf6, 0x2e, 0x3b, 0x0c, + 0xf6, 0x6b, 0x51, 0xbd, 0xc0, 0xe4, 0xf9, 0xfe, 0xbf, 0x98, 0x61, 0x87, + 0x2f, 0x7f, 0xb5, 0x4e, 0x53, 0x11, 0x72, 0xd2, 0x13, 0x57, 0xe7, 0x02, + 0x8f, 0x39, 0xca, 0xc3, 0xd3, 0x42, 0xab, 0xc8, 0x08, 0x39, 0x7f, 0x04, + 0x73, 0xaf, 0xe3, 0x97, 0xef, 0x73, 0x24, 0xd9, 0xca, 0xc3, 0xd5, 0xd1, + 0x65, 0x4e, 0x89, 0x10, 0x38, 0x5e, 0xdb, 0xa8, 0x72, 0xfd, 0x1e, 0x62, + 0x78, 0xe5, 0xa7, 0x73, 0xc4, 0xfc, 0x76, 0xff, 0xd0, 0xaf, 0x07, 0xf8, + 0x33, 0x28, 0xc3, 0x95, 0x87, 0xdd, 0xc9, 0x4d, 0xff, 0xb3, 0x01, 0xaf, + 0x9b, 0xd0, 0x74, 0x72, 0xff, 0x6f, 0x17, 0xd4, 0xdc, 0xc7, 0x2d, 0xe0, + 0x9f, 0xae, 0x20, 0xdf, 0xec, 0x5a, 0x7b, 0x7f, 0xb0, 0xe5, 0x61, 0xed, + 0xa1, 0x3d, 0xe4, 0x1f, 0x1c, 0xbf, 0xa5, 0xa7, 0x67, 0xfa, 0x39, 0x53, + 0x9e, 0x53, 0x8d, 0xdf, 0xb3, 0xbd, 0x79, 0x1c, 0xbf, 0xbc, 0x9b, 0x9f, + 0x16, 0x72, 0xa1, 0x95, 0xa4, 0x13, 0x1c, 0x8d, 0x15, 0x53, 0x0e, 0x63, + 0x17, 0x49, 0x43, 0x7b, 0x8d, 0x19, 0x84, 0xdd, 0x8c, 0xd1, 0xe1, 0x62, + 0x30, 0xd6, 0xd4, 0x3c, 0xbf, 0x6a, 0x68, 0x45, 0xc0, 0x4f, 0x79, 0xd7, + 0x87, 0x2f, 0xfd, 0x37, 0xcf, 0x0e, 0x37, 0x89, 0xa3, 0x95, 0xc3, 0x1e, + 0xe4, 0x0d, 0xd1, 0xcb, 0xfb, 0x19, 0x1d, 0x7e, 0x9c, 0xbb, 0xe4, 0xc7, + 0x2b, 0xe1, 0xe3, 0x04, 0xb2, 0xff, 0xfb, 0x99, 0x0c, 0x7c, 0x60, 0xc2, + 0xbe, 0x49, 0xce, 0x54, 0x23, 0x23, 0x14, 0x50, 0x92, 0xfd, 0xbf, 0x83, + 0xc5, 0xb3, 0x97, 0xdd, 0x70, 0x41, 0xcb, 0xdd, 0xcd, 0x9c, 0xa8, 0x3e, + 0xa7, 0x2d, 0xe0, 0x21, 0xbf, 0xa7, 0x9a, 0x5c, 0x36, 0xe7, 0x39, 0x7e, + 0x62, 0x07, 0x02, 0x72, 0xd3, 0x1c, 0xba, 0x18, 0x72, 0xde, 0x39, 0x5b, + 0x34, 0xee, 0x2d, 0x41, 0x3d, 0x9e, 0x9c, 0xde, 0xdc, 0x4c, 0x72, 0xf6, + 0x9f, 0x93, 0x94, 0xe6, 0xeb, 0xc3, 0xb7, 0x4c, 0xe7, 0x2f, 0xe7, 0x6e, + 0x3d, 0x93, 0x9c, 0xbf, 0x93, 0x7c, 0xc8, 0x60, 0xe5, 0xfe, 0x0f, 0x63, + 0x99, 0x67, 0x8e, 0x57, 0x4f, 0x87, 0xc5, 0xb7, 0xfe, 0x69, 0x03, 0xed, + 0xa7, 0x1c, 0x09, 0xcb, 0x86, 0x63, 0x94, 0xd5, 0x2a, 0x53, 0x83, 0x7c, + 0x84, 0x02, 0x2e, 0x30, 0x80, 0x45, 0xff, 0x84, 0x7b, 0x42, 0x25, 0x10, + 0x6f, 0xf3, 0x79, 0x21, 0xfd, 0xf4, 0x72, 0xfd, 0xcb, 0x6e, 0x20, 0x39, + 0x70, 0xaa, 0x72, 0xda, 0x43, 0xc0, 0xfc, 0xa6, 0xff, 0xfc, 0xc1, 0xc5, + 0xf3, 0xe1, 0x7e, 0xb2, 0x33, 0xc7, 0x2f, 0xff, 0xb2, 0x77, 0x15, 0xfc, + 0xd4, 0x31, 0xf9, 0xf1, 0xca, 0x84, 0x53, 0x6d, 0x52, 0xff, 0xff, 0xf9, + 0x3b, 0xfb, 0x18, 0xf2, 0xf9, 0xc0, 0x38, 0xc8, 0x5f, 0xc5, 0x27, 0x9d, + 0xf9, 0x39, 0x7f, 0xfe, 0x8d, 0xc2, 0xf1, 0x90, 0xb9, 0x26, 0xbf, 0x61, + 0xca, 0x85, 0x48, 0x53, 0x3a, 0x76, 0x19, 0xde, 0x22, 0x69, 0x08, 0x9b, + 0xfb, 0x79, 0x0a, 0xc0, 0x9c, 0xbc, 0x2e, 0xc3, 0x97, 0x02, 0x0e, 0x5e, + 0x15, 0x27, 0x39, 0x52, 0x3f, 0xb4, 0x2c, 0x11, 0xbf, 0x0b, 0x53, 0x54, + 0xff, 0x75, 0x0d, 0x41, 0x67, 0x08, 0xac, 0xd5, 0xc2, 0x33, 0x86, 0x8f, + 0xe7, 0x85, 0xd6, 0xa2, 0x72, 0x0e, 0x78, 0xef, 0xe5, 0x08, 0x40, 0xcf, + 0x06, 0x65, 0x3a, 0xa5, 0x59, 0x50, 0x6b, 0x9e, 0xaa, 0xe6, 0x73, 0xa5, + 0x25, 0x47, 0x4d, 0x29, 0xf7, 0x73, 0xac, 0x4c, 0x97, 0x83, 0xda, 0xc9, + 0xd5, 0xe5, 0xb8, 0x82, 0x51, 0x5f, 0x0e, 0xe2, 0x34, 0xb2, 0x7d, 0x4f, + 0xb7, 0x7a, 0x98, 0x5d, 0xfc, 0x6b, 0xbc, 0x61, 0xdc, 0xdc, 0x25, 0xda, + 0x4a, 0x83, 0x52, 0x56, 0x8f, 0x04, 0x34, 0xef, 0xff, 0xef, 0xd7, 0xf7, + 0x9f, 0x6e, 0x33, 0x9e, 0x18, 0x2e, 0xea, 0x9c, 0xaf, 0xaa, 0xbb, 0xd2, + 0x54, 0x4d, 0xfc, 0xe9, 0xed, 0x20, 0x9c, 0xbc, 0x9b, 0xc3, 0x94, 0xd6, + 0x78, 0xda, 0x2b, 0xbf, 0x6d, 0x6e, 0xeb, 0x34, 0x53, 0xab, 0xb3, 0x93, + 0x97, 0xff, 0xbf, 0xfc, 0x50, 0x63, 0xa8, 0xcc, 0xd1, 0xcb, 0x7d, 0x84, + 0x5c, 0xe1, 0x2f, 0x26, 0x8c, 0x17, 0xbf, 0xf9, 0x37, 0xf5, 0xa3, 0xcf, + 0xed, 0x38, 0x0e, 0x5f, 0xb6, 0xb7, 0x75, 0x9a, 0x2a, 0x35, 0xff, 0x9e, + 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x68, 0x5f, 0x0c, 0x67, 0x27, 0x2b, + 0x11, 0x42, 0xc3, 0x4f, 0x26, 0x5f, 0xe5, 0x1f, 0x8f, 0xdf, 0x24, 0xe7, + 0x2b, 0xe9, 0xf4, 0x41, 0x7d, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0xaf, 0x5f, + 0xd9, 0xc6, 0x07, 0xbf, 0x9c, 0xbf, 0x90, 0x21, 0x8d, 0xc1, 0xcb, 0xff, + 0xfb, 0x90, 0x0f, 0xec, 0x50, 0x21, 0x80, 0x32, 0x33, 0xc7, 0x2d, 0xf7, + 0x11, 0xdb, 0xb3, 0x4e, 0x97, 0xa8, 0x59, 0x7e, 0xda, 0xdd, 0xd6, 0x68, + 0xad, 0x97, 0xfd, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x20, 0xad, 0xf7, + 0x0f, 0xed, 0xcd, 0x2f, 0xfe, 0xfa, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, + 0x12, 0x1a, 0xff, 0xda, 0xfb, 0x9e, 0x40, 0xe0, 0xcc, 0x72, 0xf3, 0xba, + 0xcf, 0x18, 0x1a, 0xa0, 0xfa, 0x16, 0x81, 0x77, 0x5a, 0xce, 0x5f, 0xfa, + 0x5d, 0x8f, 0x69, 0xa8, 0xd3, 0x56, 0x27, 0x2f, 0xbd, 0xec, 0xe0, 0x39, + 0x7f, 0xfb, 0x85, 0xb8, 0x59, 0xa8, 0xec, 0x30, 0x5f, 0xa9, 0xb3, 0x96, + 0xe4, 0xe5, 0xc8, 0x27, 0x2f, 0xe8, 0x0c, 0x79, 0xc2, 0x72, 0x82, 0x7a, + 0x73, 0x09, 0x78, 0x56, 0xfb, 0xda, 0x4e, 0x27, 0x2f, 0xfe, 0x41, 0x9e, + 0x15, 0x50, 0x00, 0x8e, 0x4e, 0x5f, 0x60, 0x83, 0x47, 0x2f, 0xa7, 0xd7, + 0x28, 0x72, 0xb0, 0xf1, 0x74, 0x43, 0x7e, 0x70, 0xa9, 0x02, 0x72, 0xff, + 0xdb, 0xf2, 0x82, 0xeb, 0xc1, 0x59, 0xcb, 0xe5, 0xbb, 0xac, 0xd1, 0x62, + 0x2f, 0xdb, 0xdb, 0x8f, 0x8e, 0x5e, 0x44, 0x6c, 0xe5, 0xef, 0xc6, 0x47, + 0x2f, 0xf2, 0xe3, 0x36, 0x00, 0x78, 0xe5, 0x4e, 0x99, 0x36, 0x13, 0xec, + 0xf9, 0x85, 0xc2, 0x4f, 0xe1, 0xcf, 0xc7, 0x6f, 0xd9, 0xb8, 0x15, 0x4e, + 0x59, 0x0e, 0x59, 0x0e, 0x5a, 0x4a, 0x9a, 0x00, 0x08, 0x5f, 0x94, 0x69, + 0x9b, 0x83, 0x97, 0xb5, 0x02, 0x72, 0xa0, 0xf1, 0x50, 0xaa, 0x95, 0x44, + 0x6f, 0x5b, 0x6f, 0xfe, 0x8c, 0xd6, 0x08, 0x50, 0x10, 0x27, 0x2f, 0x0c, + 0x4e, 0x72, 0x84, 0xf7, 0x3f, 0x40, 0xbe, 0x8d, 0xc3, 0x0e, 0x54, 0x8f, + 0x0f, 0x44, 0x57, 0x98, 0xfe, 0x39, 0x7f, 0xfd, 0xec, 0xe6, 0x43, 0xff, + 0x9d, 0x06, 0x02, 0x72, 0xe4, 0x01, 0xca, 0xda, 0x20, 0x7c, 0x38, 0xd1, + 0x3e, 0xfb, 0x8f, 0xef, 0xa3, 0x96, 0x43, 0x94, 0x86, 0xd6, 0x62, 0x5b, + 0xfe, 0x0f, 0x71, 0x98, 0xfb, 0x9c, 0xe5, 0xfb, 0xde, 0x79, 0x68, 0xe5, + 0xff, 0xbf, 0xce, 0x43, 0xc7, 0xb8, 0xf3, 0x1c, 0xae, 0x4f, 0xaf, 0x89, + 0x45, 0xa4, 0x72, 0xfb, 0x31, 0xbd, 0x1c, 0xa8, 0x36, 0x7e, 0x11, 0xbb, + 0xf1, 0x39, 0x50, 0x99, 0x9e, 0x42, 0x93, 0x6b, 0x1a, 0x20, 0xbf, 0xda, + 0x53, 0x37, 0x99, 0x31, 0xcb, 0xf0, 0xf8, 0x7f, 0x9c, 0xe5, 0x41, 0xee, + 0xfe, 0x69, 0x7f, 0x6e, 0x40, 0xcc, 0x98, 0xe5, 0xf3, 0xc2, 0x34, 0x39, + 0x58, 0x7a, 0x1b, 0x2e, 0xbe, 0x92, 0x9d, 0x83, 0x97, 0xb7, 0x12, 0x39, + 0x4e, 0x6f, 0xf8, 0x91, 0xdf, 0xd0, 0xcc, 0x4d, 0xcc, 0x72, 0xf9, 0x48, + 0xe0, 0xd1, 0xcb, 0xf6, 0x07, 0xb1, 0xd3, 0x97, 0xdb, 0x46, 0xda, 0xce, + 0x50, 0x9e, 0x6e, 0x89, 0xe8, 0x28, 0x94, 0xd3, 0x9d, 0x42, 0x6c, 0xc8, + 0xc1, 0xd2, 0x27, 0x86, 0x0d, 0xfc, 0x82, 0xec, 0x8e, 0x9c, 0xbf, 0xfd, + 0x0c, 0x89, 0x04, 0x63, 0xaf, 0x9b, 0x39, 0x47, 0x2a, 0x47, 0xa4, 0xd1, + 0x1e, 0xf7, 0xb0, 0x07, 0x2f, 0xe6, 0x26, 0xb4, 0x81, 0x39, 0x79, 0xf6, + 0xa9, 0xca, 0xfc, 0xf2, 0x9b, 0x2d, 0xbf, 0xcb, 0x1c, 0xe2, 0x39, 0xa3, + 0x97, 0xf9, 0xaf, 0xe2, 0x90, 0x2e, 0xa9, 0xcb, 0xfd, 0x27, 0xc1, 0xcf, + 0x68, 0xe5, 0x61, 0xf5, 0x72, 0x73, 0x7f, 0xec, 0xe6, 0x5d, 0x8d, 0x2b, + 0xd8, 0x39, 0x52, 0x54, 0x55, 0xcb, 0xec, 0xc4, 0x9b, 0x66, 0xe9, 0x20, + 0xc2, 0x77, 0x80, 0x8a, 0xcd, 0x0e, 0x5d, 0x2d, 0x1c, 0xb3, 0xc8, 0xd5, + 0x72, 0x27, 0x7d, 0xe4, 0x16, 0xca, 0x5b, 0xf3, 0x96, 0x8c, 0x36, 0x9d, + 0x22, 0xbf, 0xe7, 0x1f, 0x6b, 0x9d, 0x3b, 0x59, 0xca, 0x74, 0x5e, 0x01, + 0x6f, 0xf2, 0x5b, 0xfb, 0xa9, 0xad, 0xef, 0x0e, 0x5f, 0xf9, 0x33, 0xda, + 0xde, 0x6a, 0x39, 0x39, 0x7f, 0xe8, 0x6d, 0x49, 0xf5, 0x8c, 0x86, 0xb3, + 0x97, 0x3b, 0x67, 0x29, 0x68, 0xc6, 0xe9, 0x6f, 0x8f, 0xb8, 0xa2, 0x5d, + 0x9a, 0x39, 0x58, 0x7a, 0xaa, 0x1f, 0xdf, 0xfd, 0xd7, 0x4f, 0x4b, 0x15, + 0x1c, 0x01, 0xcb, 0xf0, 0xcd, 0x1d, 0x83, 0x97, 0xe0, 0x3f, 0x1c, 0x09, + 0xcb, 0xf6, 0x77, 0x97, 0x6b, 0x39, 0x7c, 0x0d, 0x40, 0x9c, 0xbf, 0xdb, + 0xeb, 0xa6, 0x93, 0x89, 0xcb, 0x95, 0x43, 0x95, 0x07, 0xd9, 0x84, 0x2e, + 0x69, 0x7f, 0xf7, 0x70, 0x45, 0xfd, 0xf2, 0x50, 0xc3, 0x94, 0x89, 0xcd, + 0x3a, 0x18, 0x09, 0xc4, 0xa7, 0x50, 0x97, 0xf1, 0x65, 0xfc, 0xdc, 0x6f, + 0x6f, 0x31, 0xcb, 0xfe, 0x0c, 0x2d, 0x40, 0x02, 0x39, 0x39, 0x7f, 0xcf, + 0xbc, 0x62, 0x34, 0x86, 0x1c, 0xa5, 0x9f, 0xa7, 0xe7, 0x77, 0xde, 0x8e, + 0x64, 0x72, 0xfe, 0x40, 0x34, 0x14, 0x01, 0xca, 0x9c, 0xf4, 0x76, 0x47, + 0x7b, 0xd8, 0xa1, 0xca, 0x84, 0xd5, 0xf2, 0x14, 0x6e, 0xe9, 0xc0, 0x47, + 0x7f, 0x0c, 0x4a, 0x38, 0xc1, 0xcb, 0xa0, 0x07, 0x2f, 0xee, 0x3b, 0x78, + 0x46, 0x87, 0x2d, 0x87, 0x29, 0x11, 0x07, 0x31, 0x6b, 0x05, 0x84, 0xc2, + 0xfa, 0x7f, 0x62, 0xce, 0x5f, 0xe7, 0x55, 0x4e, 0xf6, 0x24, 0x72, 0x9c, + 0xf6, 0x1a, 0x11, 0xdf, 0xfb, 0xb8, 0x10, 0xa7, 0x39, 0xcf, 0x8e, 0x5f, + 0xdf, 0x02, 0xa3, 0xef, 0x67, 0x2a, 0x73, 0xf1, 0x0a, 0x05, 0xf3, 0xc2, + 0x34, 0x39, 0x7f, 0xec, 0x0f, 0xcc, 0xd4, 0x66, 0xc0, 0x72, 0xff, 0x20, + 0x7c, 0x2f, 0xce, 0x8e, 0x5f, 0xef, 0x69, 0x39, 0xce, 0x7c, 0x72, 0xa0, + 0xfa, 0x1c, 0xce, 0xa1, 0x30, 0xc0, 0x91, 0xf4, 0x88, 0x61, 0x4f, 0x4d, + 0x43, 0x6b, 0xc0, 0xd5, 0x8d, 0x70, 0xc9, 0x2d, 0x48, 0x96, 0x21, 0x5f, + 0x39, 0x84, 0x89, 0x03, 0x08, 0xcc, 0x8d, 0x1d, 0x56, 0x55, 0xc3, 0x53, + 0x98, 0x61, 0xa4, 0x28, 0xe6, 0x67, 0xdc, 0x6a, 0x8c, 0x84, 0xf7, 0x63, + 0xd8, 0x79, 0x4d, 0x40, 0x8d, 0x54, 0x63, 0x4b, 0xd4, 0x77, 0x9e, 0x8e, + 0xc7, 0xf8, 0x63, 0x34, 0x84, 0xa2, 0x91, 0xd0, 0x5f, 0xb8, 0x1d, 0x71, + 0xb3, 0x97, 0xfe, 0x48, 0xf7, 0x5d, 0x5c, 0x10, 0x1c, 0xbf, 0xfc, 0xfb, + 0xf8, 0xfe, 0xf9, 0xee, 0x56, 0x82, 0x72, 0xba, 0x88, 0xbe, 0x27, 0xb7, + 0xf6, 0x7a, 0x11, 0x9a, 0x39, 0x7f, 0x83, 0x12, 0xcd, 0xe6, 0x8e, 0x5e, + 0xd2, 0x9a, 0x39, 0x7f, 0xfd, 0x9c, 0xcb, 0xdf, 0xcf, 0xf7, 0xae, 0xc4, + 0xd1, 0xcb, 0xfe, 0xfd, 0xf0, 0x29, 0xc8, 0xb9, 0xcb, 0xde, 0x18, 0x39, + 0x77, 0x7e, 0xc2, 0x7f, 0xd9, 0x0b, 0x59, 0x89, 0x58, 0x58, 0xe6, 0x42, + 0x3d, 0xa5, 0x55, 0x0e, 0x2b, 0xea, 0xe2, 0x5c, 0x4b, 0xc8, 0xbf, 0xb3, + 0x6b, 0x77, 0x59, 0xa2, 0xcd, 0x5f, 0xfd, 0xbe, 0xbf, 0xd6, 0x7f, 0x37, + 0x50, 0x27, 0x2f, 0xfd, 0x1b, 0x07, 0xb5, 0xdc, 0x40, 0x9c, 0xbf, 0x64, + 0xd2, 0x8e, 0x4e, 0x5f, 0x20, 0xbc, 0xe7, 0x2b, 0xa8, 0x88, 0x13, 0xed, + 0x14, 0xdf, 0x7d, 0xec, 0x74, 0xe5, 0x7d, 0x3d, 0x3e, 0x02, 0xfa, 0xfa, + 0x9c, 0x22, 0x1c, 0xbc, 0x64, 0x97, 0xc8, 0xc5, 0x36, 0x72, 0xf9, 0x07, + 0x7f, 0x9c, 0xbf, 0xd1, 0xc5, 0x4f, 0x0c, 0x00, 0xe5, 0xcc, 0xfb, 0x07, + 0xf5, 0x31, 0x1f, 0x48, 0xae, 0xc4, 0x39, 0x76, 0x04, 0xe5, 0xff, 0x9e, + 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x80, 0x5f, 0xe4, 0x64, 0x35, 0xf7, + 0x27, 0x39, 0x6f, 0xb2, 0x45, 0x6e, 0x0a, 0xb0, 0x5b, 0xa9, 0x97, 0xcf, + 0xbe, 0x64, 0x72, 0xfd, 0xed, 0x49, 0x00, 0x72, 0xb0, 0xf2, 0xdc, 0x8e, + 0xfe, 0x97, 0xdc, 0x9a, 0x24, 0x72, 0xbe, 0x9e, 0x84, 0x10, 0x5d, 0xff, + 0x4e, 0x5f, 0xda, 0x86, 0x0c, 0x4c, 0x72, 0xdd, 0x39, 0x79, 0x41, 0x98, + 0xe5, 0xd9, 0xec, 0x35, 0xe0, 0x11, 0xa0, 0x22, 0x1c, 0x57, 0x2e, 0xf9, + 0xa3, 0x97, 0xbf, 0x0e, 0x1c, 0xbf, 0xd9, 0xbf, 0x0c, 0x33, 0x47, 0x2c, + 0xd0, 0xe5, 0x21, 0xf1, 0x74, 0x74, 0x06, 0x57, 0xcb, 0x77, 0x59, 0xa2, + 0xdf, 0x5e, 0x68, 0xfe, 0x39, 0x7f, 0x29, 0xe7, 0x5b, 0xec, 0xe5, 0x6c, + 0xfe, 0x98, 0x5c, 0x01, 0xeb, 0x95, 0x6c, 0xe5, 0xf6, 0x0a, 0x4c, 0x72, + 0xf7, 0x63, 0x67, 0x2f, 0xdd, 0x4d, 0xf5, 0xce, 0x5f, 0xfe, 0xec, 0x4f, + 0xec, 0xe8, 0xe7, 0xba, 0x87, 0x2f, 0x33, 0x02, 0x72, 0xcc, 0x39, 0x7f, + 0xdd, 0x89, 0xc3, 0x8d, 0xeb, 0xec, 0x22, 0xe7, 0x07, 0x26, 0x27, 0x74, + 0x95, 0x07, 0x2f, 0xde, 0x96, 0x94, 0xd1, 0xcb, 0xda, 0xe8, 0x4e, 0x5f, + 0x94, 0xf0, 0xc0, 0x0e, 0x53, 0x0f, 0x17, 0x88, 0xed, 0xff, 0xde, 0xd2, + 0x6a, 0x07, 0x3d, 0xd4, 0x39, 0x78, 0x73, 0xa7, 0x29, 0x87, 0xbb, 0xc5, + 0x0a, 0xfc, 0x18, 0x6b, 0xfd, 0x87, 0x2f, 0xf9, 0xf5, 0x18, 0x21, 0xec, + 0x1c, 0xbf, 0xfb, 0x19, 0xbc, 0xe7, 0xa2, 0xed, 0x73, 0x9c, 0xbb, 0x5a, + 0xd9, 0xff, 0x09, 0xb5, 0x42, 0x6f, 0x99, 0x08, 0x14, 0x24, 0x78, 0x55, + 0x5f, 0x3a, 0x0f, 0x8e, 0x5f, 0x81, 0xaf, 0x43, 0x0e, 0x5e, 0xdc, 0x78, + 0xe5, 0xfd, 0x33, 0x87, 0xa8, 0xc3, 0x97, 0xf7, 0x93, 0x03, 0x0c, 0x39, + 0x5e, 0x3d, 0xa6, 0xcb, 0xae, 0xd0, 0x9c, 0xbf, 0xb9, 0xd4, 0x2f, 0x18, + 0x72, 0xa1, 0x30, 0x5d, 0x94, 0x3b, 0xb6, 0x88, 0xff, 0x16, 0xbf, 0x92, + 0x68, 0x11, 0x83, 0x97, 0xdd, 0x54, 0x2c, 0x39, 0x69, 0x1c, 0xbf, 0xc0, + 0x07, 0xfa, 0x6b, 0xce, 0x4e, 0x56, 0x1e, 0x53, 0x88, 0xd6, 0x22, 0x38, + 0x5b, 0xa9, 0xab, 0x5f, 0xf9, 0x88, 0x4f, 0xc8, 0x88, 0x2f, 0x79, 0x0a, + 0x8e, 0x4b, 0xd0, 0x66, 0x68, 0x6d, 0x6d, 0xef, 0xb1, 0xf5, 0x81, 0x10, + 0x63, 0x25, 0xd2, 0x57, 0xa1, 0x73, 0x7f, 0x3f, 0x3f, 0x58, 0xfe, 0x39, + 0x5f, 0x53, 0x15, 0x18, 0x72, 0xdf, 0xc1, 0xfb, 0xaf, 0x6b, 0x93, 0x97, + 0x35, 0x4d, 0x59, 0xcb, 0xcc, 0x7e, 0x4e, 0x5e, 0x03, 0xf4, 0xe5, 0xdc, + 0x50, 0xe5, 0xf6, 0xf7, 0x8a, 0x1c, 0xbf, 0x6a, 0x7c, 0x6f, 0xeb, 0x50, + 0x89, 0x58, 0x21, 0xc1, 0xd9, 0x87, 0x1c, 0x62, 0xa1, 0x33, 0x54, 0x86, + 0x3d, 0xff, 0xff, 0x70, 0xe9, 0xef, 0xde, 0x7f, 0xb9, 0x2e, 0xc6, 0xf3, + 0x05, 0x53, 0x97, 0xff, 0xff, 0x91, 0x6f, 0xb7, 0xec, 0xb3, 0xd8, 0x1d, + 0x3b, 0x33, 0x73, 0xc7, 0x27, 0x2f, 0xdb, 0x5b, 0xba, 0xcd, 0x14, 0xa2, + 0xff, 0xf9, 0xfc, 0x39, 0x3e, 0xe3, 0xa9, 0xdc, 0xd9, 0xcb, 0xcf, 0x2f, + 0xb0, 0x8f, 0x9c, 0x77, 0x01, 0xa5, 0xff, 0x4b, 0xee, 0x6d, 0x6e, 0xeb, + 0x34, 0x49, 0xcb, 0x7d, 0x62, 0x22, 0x1d, 0x06, 0xa2, 0x16, 0xe1, 0x93, + 0xce, 0xba, 0x4a, 0x3b, 0x50, 0xdf, 0xf9, 0x2e, 0x46, 0x58, 0xaa, 0x22, + 0xe3, 0x52, 0x48, 0xc4, 0x1a, 0xe1, 0x81, 0x31, 0x46, 0xe1, 0x78, 0xca, + 0xe9, 0x33, 0xb1, 0xd9, 0x3c, 0x2c, 0x41, 0x0e, 0xa1, 0x86, 0xfe, 0xa9, + 0x26, 0x3e, 0x8d, 0x7f, 0xf2, 0x7e, 0x31, 0xf7, 0xdf, 0xb6, 0xb7, 0x75, + 0x9a, 0x21, 0xf5, 0xff, 0x9e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x53, + 0x5b, 0xee, 0x22, 0x01, 0x86, 0x97, 0xfb, 0xee, 0x6d, 0x6e, 0xeb, 0x34, + 0x44, 0xeb, 0xf2, 0x7b, 0x5f, 0xb0, 0xe5, 0xee, 0xc4, 0xc7, 0x2a, 0x63, + 0xc6, 0xe9, 0x4d, 0xff, 0xee, 0x14, 0xab, 0x6d, 0x73, 0x87, 0x86, 0xf9, + 0xf3, 0xad, 0x0e, 0x5f, 0xb6, 0xb7, 0x75, 0x9a, 0x23, 0x15, 0xff, 0xfd, + 0xf8, 0xba, 0xbf, 0x3c, 0xac, 0x0c, 0xb3, 0xa8, 0xc3, 0x97, 0xd0, 0xc5, + 0x80, 0xe5, 0xff, 0xf4, 0xa7, 0xe1, 0x50, 0xd5, 0xce, 0xbd, 0xfc, 0xf9, + 0xd6, 0x87, 0x2b, 0xa8, 0x87, 0x01, 0x15, 0xfd, 0x9e, 0x8c, 0xe7, 0xc7, + 0x2f, 0xfd, 0xe5, 0x60, 0x65, 0x9d, 0x46, 0x1c, 0xbf, 0xe5, 0x60, 0x65, + 0x9d, 0x46, 0x1c, 0xbf, 0x33, 0xf1, 0x75, 0x7e, 0x1f, 0xb7, 0x8f, 0xaf, + 0x93, 0x99, 0x35, 0x67, 0x2f, 0xdf, 0x26, 0x18, 0x09, 0xcb, 0x7d, 0x85, + 0x5f, 0x52, 0x23, 0xc6, 0x46, 0x1a, 0x76, 0x1c, 0xa2, 0x47, 0xa8, 0x51, + 0xf9, 0x09, 0xa1, 0x45, 0xff, 0xef, 0xac, 0x79, 0x7d, 0xcd, 0xad, 0xdd, + 0x66, 0x89, 0xe5, 0x7d, 0x1c, 0x63, 0xa7, 0x2f, 0xa0, 0x65, 0xa3, 0x97, + 0xee, 0xa0, 0xe7, 0x13, 0x95, 0xb3, 0xec, 0x01, 0x1a, 0x84, 0x37, 0xdf, + 0xbe, 0xe4, 0x72, 0xfc, 0xe1, 0xec, 0x68, 0xe5, 0xbe, 0x84, 0xf2, 0x84, + 0x8e, 0xbe, 0xa2, 0x8d, 0xb7, 0xaa, 0x85, 0xdc, 0xb9, 0xca, 0xa5, 0x2e, + 0x07, 0xb0, 0x91, 0xf4, 0x6d, 0x37, 0xed, 0xad, 0xdd, 0x66, 0x88, 0x81, + 0x7f, 0xe7, 0x97, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0x95, 0x17, 0xf6, 0xff, + 0xec, 0x0a, 0xce, 0x5f, 0xcb, 0x4c, 0xe0, 0xec, 0x1c, 0xa8, 0x3d, 0xdc, + 0x2e, 0xb7, 0xdc, 0x47, 0xeb, 0x0d, 0x06, 0x15, 0x37, 0xed, 0xad, 0xdd, + 0x66, 0x88, 0xa1, 0x7a, 0x01, 0x87, 0x2d, 0xf7, 0x0f, 0x3d, 0x43, 0x4b, + 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x23, 0x25, 0xfb, 0x6b, 0x77, 0x59, + 0xa2, 0x65, 0x5f, 0xa5, 0x9e, 0x75, 0x9c, 0xbf, 0x7d, 0x63, 0xcb, 0xee, + 0x1e, 0xdf, 0x26, 0x97, 0xed, 0xad, 0xdd, 0x66, 0x8a, 0x91, 0x61, 0x39, + 0x65, 0x0e, 0x5b, 0xee, 0x1e, 0xb3, 0x59, 0xa7, 0xe2, 0x17, 0xfb, 0xee, + 0x6d, 0x6e, 0xeb, 0x34, 0x57, 0x4b, 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, + 0x2c, 0x55, 0xff, 0xcc, 0x79, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x89, 0xe9, + 0x7f, 0x76, 0x13, 0x69, 0xc3, 0x9c, 0xbf, 0x42, 0x34, 0x4e, 0x03, 0x97, + 0x37, 0xf5, 0x67, 0xb8, 0xe6, 0x37, 0xff, 0xff, 0x83, 0x8d, 0xfd, 0x1c, + 0x55, 0x57, 0xf6, 0x90, 0x66, 0x85, 0xef, 0x39, 0x39, 0x7f, 0xfe, 0x98, + 0x61, 0x9f, 0x73, 0x48, 0xd8, 0x5d, 0xd5, 0x39, 0x76, 0xbc, 0x72, 0xec, + 0xd1, 0xcb, 0xb4, 0x03, 0x97, 0xe1, 0x76, 0x0c, 0x1c, 0xbf, 0xbf, 0xd7, + 0x5e, 0x5f, 0x5a, 0xb3, 0xe9, 0x71, 0x76, 0xc5, 0x94, 0x17, 0xbd, 0x3c, + 0x35, 0x9c, 0xbf, 0x67, 0xb4, 0x8c, 0x39, 0x7f, 0xfa, 0x39, 0xf6, 0x4c, + 0x9b, 0xf6, 0xbf, 0x6b, 0x39, 0x79, 0xf9, 0xfb, 0x08, 0x97, 0x12, 0x0f, + 0x13, 0xd6, 0x2a, 0x02, 0xdc, 0x30, 0x75, 0x0f, 0xfa, 0x0a, 0xab, 0x9f, + 0x4a, 0x7e, 0xaf, 0xaa, 0xf0, 0xe2, 0x15, 0xc9, 0x2b, 0xa6, 0xfc, 0x9d, + 0x17, 0x98, 0xe5, 0xfa, 0x58, 0x1f, 0x98, 0x72, 0xb8, 0x43, 0xd0, 0x82, + 0x7b, 0x98, 0x03, 0x97, 0xec, 0xf2, 0x7f, 0xa3, 0x97, 0x35, 0x0d, 0x48, + 0xe5, 0x35, 0x07, 0xc2, 0xd4, 0x85, 0xf8, 0x51, 0x45, 0xfb, 0x85, 0x9a, + 0x8d, 0x6f, 0xc7, 0x2f, 0xf2, 0x83, 0x9b, 0xdc, 0x2c, 0xe5, 0x35, 0x07, + 0xd1, 0xc3, 0x1a, 0xdf, 0x6d, 0x9e, 0xe4, 0xe5, 0xfc, 0xd4, 0x35, 0x5c, + 0x24, 0x49, 0x87, 0x2f, 0x2f, 0x3a, 0x52, 0xf3, 0x23, 0x47, 0x2f, 0x03, + 0x70, 0x72, 0xfe, 0xc0, 0x24, 0xc8, 0xd9, 0xcb, 0xff, 0x3e, 0xbe, 0x6b, + 0x59, 0x29, 0x41, 0xcb, 0xff, 0xf0, 0xba, 0xa9, 0xb8, 0x94, 0xb3, 0x40, + 0x04, 0x1c, 0xbf, 0xcf, 0xef, 0xf3, 0x05, 0x53, 0x94, 0x14, 0x7a, 0xaa, + 0x5d, 0xd4, 0x00, 0x2a, 0x5f, 0xff, 0xdb, 0x4e, 0x07, 0x67, 0xd8, 0xde, + 0xd3, 0x81, 0x7f, 0xce, 0x72, 0xf9, 0x3a, 0xa3, 0x0e, 0x5f, 0xfe, 0x45, + 0x7e, 0x60, 0xbf, 0x3a, 0x55, 0x57, 0x39, 0x4b, 0x3f, 0x11, 0x23, 0xbf, + 0xfc, 0xfa, 0x1c, 0x07, 0xde, 0xa2, 0xdf, 0x67, 0x2e, 0x16, 0xce, 0x5f, + 0xc1, 0xc5, 0x7d, 0x8b, 0x39, 0x7d, 0xd8, 0x62, 0xce, 0x54, 0x1f, 0x3b, 0x8b, 0xf8, 0xba, 0xfc, 0x14, 0x99, 0x1b, 0x39, 0x7f, 0xf7, 0xc8, 0x81, - 0x85, 0xfc, 0xf9, 0xdd, 0xb3, 0x95, 0x07, 0xea, 0x25, 0x37, 0xfe, 0xee, - 0x4d, 0xd4, 0xec, 0x72, 0x0e, 0x5c, 0xfb, 0x9c, 0xbf, 0xcf, 0xa7, 0xef, - 0xe3, 0x39, 0xca, 0x13, 0xcb, 0xfc, 0x5e, 0xa7, 0x5c, 0x3f, 0x90, 0xe2, - 0x43, 0x7b, 0x86, 0x2b, 0x86, 0xb7, 0x48, 0x46, 0x16, 0x1e, 0x85, 0x17, - 0xd2, 0x0d, 0xa8, 0x44, 0xde, 0x17, 0xf1, 0xcb, 0xc2, 0x9a, 0x39, 0x66, - 0xda, 0x06, 0xda, 0x06, 0xee, 0x8e, 0x9c, 0xbe, 0xe6, 0xc7, 0x59, 0xcb, - 0xf0, 0xe7, 0xa1, 0xb3, 0x97, 0xe5, 0x8b, 0xfb, 0x47, 0x2f, 0x46, 0x70, - 0xe5, 0xff, 0xe6, 0x3f, 0x1f, 0xc9, 0xa8, 0x18, 0x01, 0xcb, 0x4b, 0xa7, - 0xc5, 0xf4, 0x6e, 0xb7, 0x45, 0x9f, 0x21, 0x13, 0x58, 0x9b, 0x43, 0x0a, - 0xd0, 0x5b, 0x44, 0x9f, 0xc3, 0x6a, 0xf9, 0xd3, 0xea, 0xce, 0x5e, 0xd6, - 0xd6, 0xd1, 0xcb, 0xdc, 0xc0, 0x9c, 0xbf, 0xcf, 0xe8, 0x9b, 0x48, 0xb3, - 0x94, 0xa9, 0xe7, 0xf4, 0x72, 0xff, 0x44, 0x87, 0x37, 0xf6, 0x1c, 0xbf, - 0xfe, 0x4e, 0xbb, 0x20, 0x43, 0x34, 0xa3, 0x93, 0x9c, 0xbf, 0xfe, 0xf6, - 0x83, 0xcc, 0x45, 0x7a, 0xdb, 0x8c, 0xe7, 0x2f, 0x84, 0x38, 0xa9, 0xcb, - 0xdd, 0xfd, 0x67, 0x2a, 0x49, 0xe6, 0x61, 0x1a, 0x39, 0x70, 0x8f, 0xa6, - 0x5a, 0x50, 0xf2, 0x97, 0xe4, 0x57, 0xf7, 0xb5, 0x34, 0x0c, 0xe7, 0x2f, - 0xc2, 0xaa, 0x66, 0x8e, 0x5f, 0x9b, 0x7f, 0x3b, 0x0e, 0x5f, 0xfd, 0x8d, - 0xb8, 0x31, 0x9d, 0x70, 0x68, 0xe5, 0xff, 0xb4, 0xfb, 0xc0, 0xb8, 0x71, - 0x53, 0x94, 0x88, 0xd1, 0xe9, 0x38, 0x94, 0x79, 0x12, 0xe8, 0xe9, 0xcb, - 0x04, 0xe5, 0x2c, 0xd3, 0x88, 0xb5, 0xf0, 0x87, 0xe2, 0xa7, 0x2f, 0xec, - 0xd3, 0x6e, 0x33, 0x9c, 0xac, 0x3f, 0x37, 0x20, 0x12, 0x5b, 0xf7, 0xea, - 0xe8, 0x30, 0x72, 0xf2, 0xd3, 0x47, 0x2f, 0xfb, 0x05, 0xe5, 0xa9, 0x37, - 0x39, 0xcb, 0xe9, 0x69, 0x04, 0xe5, 0xa2, 0x47, 0xb7, 0xb9, 0xd5, 0xfe, - 0x7e, 0x4a, 0x18, 0x8c, 0x39, 0x50, 0xab, 0xf3, 0x23, 0x00, 0x48, 0x6a, - 0xf4, 0xb1, 0xca, 0x85, 0xdf, 0xf2, 0x8b, 0xff, 0xca, 0xbe, 0x6f, 0xef, - 0x46, 0x6c, 0x46, 0x1c, 0xbf, 0xc3, 0x9a, 0xf3, 0xb8, 0x9c, 0xa5, 0x4f, - 0xf3, 0x62, 0x65, 0xff, 0xff, 0x93, 0x9c, 0x8f, 0xbe, 0x41, 0xfe, 0x59, - 0xa0, 0xfe, 0xfc, 0x91, 0xcb, 0xff, 0xf8, 0x71, 0x5c, 0x1f, 0x9a, 0xf7, - 0x71, 0x7f, 0x60, 0x07, 0x2a, 0x11, 0x9b, 0x8d, 0xf7, 0xfb, 0xf7, 0xd2, - 0x4c, 0x8d, 0x9c, 0xa4, 0x4d, 0x23, 0xb0, 0xf2, 0x12, 0x1b, 0xdd, 0x81, - 0x39, 0x7b, 0x7f, 0x2c, 0xe5, 0x30, 0xdc, 0xb8, 0xdd, 0xfa, 0x70, 0xf1, - 0x1b, 0x39, 0x7f, 0xbe, 0xbe, 0xc4, 0x99, 0x1b, 0x39, 0x7f, 0xbf, 0xe4, - 0xeb, 0x8c, 0xf1, 0xcb, 0xfe, 0xd4, 0x2c, 0x3d, 0x81, 0x61, 0xcb, 0x90, - 0x70, 0xfb, 0x55, 0x35, 0xa8, 0x46, 0x88, 0x61, 0x4b, 0x7f, 0x05, 0xf8, - 0x0d, 0xbc, 0x39, 0x7b, 0xbf, 0x76, 0x1c, 0xbf, 0xe8, 0x58, 0xe3, 0x38, - 0x80, 0x39, 0x7e, 0x0b, 0xeb, 0x58, 0x72, 0xa4, 0x7f, 0xfa, 0x21, 0xfc, - 0xde, 0xff, 0xa2, 0x58, 0x9a, 0xd7, 0xf0, 0x72, 0xff, 0xde, 0x85, 0xee, - 0xc4, 0xdf, 0x38, 0x72, 0xfd, 0xdc, 0xe2, 0x68, 0xe5, 0xe1, 0x49, 0x6e, - 0x7c, 0xfe, 0x40, 0xbf, 0xf3, 0xe0, 0x20, 0x5c, 0x38, 0xa9, 0xca, 0x9d, - 0x30, 0xe9, 0x42, 0x7c, 0x06, 0x77, 0xf9, 0xf7, 0xd7, 0xbd, 0x8d, 0x67, - 0x2f, 0xff, 0x27, 0x3a, 0xf8, 0xc0, 0xe7, 0x00, 0x87, 0x2f, 0xfa, 0x25, - 0xa1, 0x80, 0x3a, 0xce, 0x5f, 0xca, 0xfa, 0x30, 0x58, 0x72, 0xff, 0xa5, - 0xf7, 0xc9, 0xd4, 0x1f, 0x1c, 0xbf, 0xfd, 0x19, 0xbf, 0xbb, 0x1e, 0x18, - 0x06, 0x8e, 0x5d, 0x00, 0x39, 0x77, 0x56, 0x72, 0x98, 0x6b, 0x74, 0x2d, - 0x48, 0x8f, 0xe7, 0x2d, 0xf1, 0xd7, 0xee, 0xd7, 0xa7, 0x4e, 0x1c, 0xbf, - 0xbf, 0xd7, 0xb5, 0x9e, 0x39, 0x7f, 0x7e, 0xd3, 0x49, 0x91, 0xb3, 0x97, - 0x67, 0x4e, 0x5e, 0x6d, 0xb6, 0xca, 0x5f, 0xfe, 0xf2, 0x7b, 0x5d, 0x4d, - 0xbf, 0xbc, 0x89, 0x14, 0x50, 0xd0, 0x52, 0xa9, 0x8b, 0x20, 0xeb, 0x97, - 0xf8, 0xd3, 0xf3, 0x6b, 0xff, 0xfe, 0x4f, 0x4a, 0x07, 0x3d, 0xd4, 0xcf, - 0x42, 0xd3, 0x92, 0x39, 0x52, 0x5f, 0x87, 0x0b, 0x6e, 0x10, 0x32, 0x1f, - 0x68, 0x4f, 0x34, 0x2b, 0xf9, 0x19, 0xf2, 0xcd, 0xfa, 0x6e, 0x04, 0x81, - 0x8c, 0xd7, 0xd1, 0xa9, 0x6c, 0x4b, 0xbf, 0xed, 0xe5, 0xad, 0x60, 0x5f, - 0xc7, 0x2d, 0x87, 0x2f, 0xb8, 0x2f, 0xb0, 0xe5, 0x41, 0xf6, 0xaa, 0x74, - 0x82, 0x17, 0x81, 0xac, 0x39, 0x67, 0x39, 0x7a, 0x3b, 0xa3, 0x95, 0xb9, - 0xac, 0x41, 0x0b, 0xff, 0x43, 0x3e, 0x60, 0xc7, 0xed, 0x3d, 0x1c, 0xbf, - 0xff, 0x9f, 0xc9, 0xd7, 0x5f, 0xcc, 0xd4, 0x67, 0x30, 0x4e, 0x5f, 0xfd, - 0xa7, 0xdf, 0x5a, 0xc1, 0x06, 0xde, 0x1c, 0xbf, 0xfc, 0x8c, 0xd4, 0x6d, - 0xe7, 0xa5, 0x2c, 0xd1, 0xca, 0xe2, 0x6a, 0x2b, 0x21, 0x14, 0x4f, 0x2c, - 0xec, 0x47, 0xbe, 0xe7, 0x70, 0x4e, 0x52, 0x1f, 0x6b, 0xa6, 0x5f, 0xc3, - 0xf3, 0xee, 0xa3, 0x0e, 0x5f, 0x7a, 0x37, 0x6c, 0xe5, 0x31, 0x53, 0xd7, - 0x65, 0x03, 0x00, 0x81, 0xb3, 0x0b, 0xff, 0xf7, 0xbf, 0xfb, 0xe1, 0x80, - 0x3f, 0x81, 0xf4, 0x64, 0x72, 0xe6, 0xfa, 0x72, 0xff, 0xf4, 0x0b, 0x3e, - 0xf1, 0xc0, 0x9e, 0xec, 0x1c, 0xbf, 0x97, 0xf3, 0xb8, 0x07, 0x39, 0x7f, - 0x37, 0xac, 0xc1, 0x9c, 0xe5, 0x61, 0xee, 0xa1, 0x7d, 0xf4, 0x6a, 0x36, - 0x1c, 0xbf, 0xfa, 0x05, 0xfd, 0x28, 0x55, 0xdb, 0xf1, 0xca, 0xe9, 0xf3, - 0xfe, 0x47, 0x7b, 0xe3, 0xb0, 0xe5, 0x42, 0x7c, 0x2c, 0x5a, 0x00, 0xc6, - 0xa1, 0x4f, 0xe8, 0x43, 0xed, 0x11, 0xdf, 0x2f, 0xec, 0x09, 0xcb, 0xe4, - 0x0e, 0x2c, 0xe5, 0xf3, 0xb8, 0x80, 0xe5, 0x9b, 0x83, 0xc1, 0x54, 0x86, - 0xef, 0xd6, 0x72, 0xff, 0x36, 0xf3, 0x64, 0xa1, 0xac, 0xe5, 0x21, 0xfc, - 0x74, 0xa7, 0x43, 0x17, 0xfa, 0x1f, 0x9d, 0x6d, 0xc2, 0x52, 0xe6, 0xdb, - 0x29, 0x41, 0x3c, 0xc6, 0xcc, 0xef, 0x79, 0x1a, 0xca, 0x28, 0x68, 0xef, - 0xed, 0xd8, 0x9a, 0xea, 0x1c, 0xbe, 0xfe, 0x5f, 0xf8, 0xe5, 0x22, 0x7f, - 0x93, 0x43, 0x73, 0x50, 0x9d, 0xf1, 0x86, 0xd9, 0x75, 0xf7, 0x31, 0xda, - 0xce, 0x5c, 0xde, 0x8e, 0x5b, 0x0e, 0x5b, 0x7c, 0x35, 0x1e, 0x18, 0xbe, - 0xde, 0x4d, 0x0d, 0xce, 0x5f, 0xfd, 0xad, 0x04, 0x60, 0x3d, 0x8f, 0x68, - 0xe5, 0x42, 0x25, 0x30, 0x9f, 0xf2, 0x9b, 0xfd, 0xd4, 0x79, 0x79, 0x27, - 0x39, 0x7f, 0xef, 0x27, 0x1c, 0x1b, 0x5e, 0xce, 0x9c, 0xbf, 0xe4, 0x6c, - 0x73, 0xc9, 0xf8, 0x0e, 0x5f, 0x93, 0x81, 0x89, 0xce, 0x5f, 0xe7, 0xe7, - 0xb4, 0x28, 0xa9, 0xcb, 0xff, 0xda, 0xc5, 0x73, 0xfe, 0x38, 0x63, 0xb0, - 0x72, 0xa4, 0x9c, 0x0e, 0xe5, 0xe8, 0x66, 0xd6, 0x83, 0xd3, 0x97, 0x28, - 0xd1, 0x9d, 0xff, 0xff, 0x9d, 0x3d, 0x1d, 0x1c, 0xf7, 0x53, 0xec, 0xa3, - 0x62, 0x08, 0x0e, 0x5f, 0x99, 0x8b, 0x8d, 0x1c, 0xae, 0xa2, 0x4d, 0xdb, - 0x2f, 0x62, 0x70, 0xe5, 0xfe, 0x92, 0x2f, 0xbb, 0xbb, 0x59, 0xcb, 0xe7, - 0xe4, 0x48, 0xe5, 0xff, 0x3e, 0xff, 0x37, 0xd6, 0x0a, 0xa7, 0x2a, 0x74, - 0x58, 0x6e, 0x36, 0xb3, 0x7f, 0x10, 0xdf, 0x75, 0xad, 0x16, 0x72, 0xf0, - 0xc0, 0x0e, 0x5e, 0x85, 0xe7, 0xc3, 0xc0, 0xd1, 0x2d, 0xff, 0xa3, 0x7e, - 0xc2, 0xd9, 0xd4, 0x98, 0xe5, 0x42, 0x78, 0xb9, 0x0d, 0x24, 0x7f, 0xe1, - 0xa5, 0xfc, 0x21, 0xd6, 0x91, 0x67, 0x2f, 0xcc, 0x79, 0xf1, 0xb3, 0x97, - 0xe8, 0xe0, 0x70, 0x4e, 0x56, 0x1f, 0xe0, 0x96, 0xf8, 0xa6, 0xfd, 0x1b, - 0x69, 0xdf, 0xce, 0x5f, 0xfd, 0x00, 0x8e, 0xac, 0x5d, 0x5e, 0xa1, 0xcb, - 0x34, 0x8e, 0x5f, 0xdd, 0x81, 0x6d, 0xf7, 0x39, 0x7f, 0xe1, 0x9a, 0x30, - 0x67, 0xcd, 0xfc, 0x72, 0x82, 0x7d, 0xae, 0x5d, 0x79, 0x5f, 0xab, 0x39, - 0x7f, 0xf2, 0x07, 0xb0, 0xc8, 0x03, 0x88, 0x0e, 0x5f, 0x9f, 0x53, 0xa7, - 0x0e, 0x5f, 0xff, 0xe7, 0x1d, 0xe4, 0xa3, 0x78, 0x9b, 0x30, 0x70, 0x2f, - 0x23, 0xc5, 0xea, 0xa0, 0xa2, 0x5d, 0x65, 0x17, 0xe5, 0x7c, 0xee, 0x27, - 0x2f, 0x0f, 0xf3, 0x9c, 0xa7, 0x3c, 0x5f, 0x13, 0xd2, 0x22, 0x24, 0x5a, - 0x2a, 0x15, 0x70, 0x84, 0xb7, 0x85, 0x6b, 0x43, 0x78, 0x41, 0x09, 0x0e, - 0x88, 0x3f, 0x8d, 0x8a, 0xe6, 0xa1, 0xab, 0x39, 0x79, 0x23, 0x87, 0x29, - 0xa4, 0x6f, 0x3a, 0x43, 0x7f, 0xf7, 0x11, 0x70, 0xd6, 0x38, 0xbd, 0xe0, - 0xe5, 0x48, 0xfa, 0xe6, 0x25, 0xbe, 0x41, 0x70, 0x9c, 0xbd, 0x3a, 0xd0, - 0xe5, 0x04, 0xde, 0x89, 0x05, 0xfa, 0x59, 0xb2, 0x24, 0x72, 0xf6, 0x72, - 0x0e, 0x56, 0xe8, 0xc4, 0x46, 0x0e, 0x10, 0x74, 0xa6, 0xfe, 0x4d, 0xf5, - 0xdc, 0x61, 0xcb, 0xff, 0xec, 0xf6, 0xb2, 0x6e, 0xc6, 0xcc, 0xef, 0x60, - 0xe5, 0xff, 0xff, 0xf9, 0x33, 0x7d, 0x26, 0x37, 0xf3, 0x37, 0x96, 0x93, - 0xda, 0x4d, 0xc2, 0x1f, 0xe7, 0x39, 0x7f, 0xfe, 0x41, 0x0f, 0xcf, 0xbe, - 0x4d, 0x3a, 0x0f, 0xf2, 0x39, 0x7c, 0xf3, 0xf5, 0x0e, 0x54, 0xc9, 0xc1, - 0x89, 0x77, 0x94, 0x76, 0x42, 0x2b, 0x6d, 0x62, 0xf7, 0xfc, 0x91, 0xcb, - 0xf9, 0xfc, 0x0f, 0xa3, 0x23, 0x97, 0xfa, 0x5f, 0x60, 0x47, 0xf5, 0x9c, - 0xaf, 0x88, 0x82, 0x9c, 0x79, 0xcb, 0xef, 0xf4, 0x49, 0x14, 0x6d, 0xb6, - 0xca, 0x5e, 0x57, 0x02, 0x72, 0xfe, 0xeb, 0xf1, 0x91, 0xe3, 0x97, 0x38, - 0x4e, 0x5f, 0xdc, 0x7d, 0x75, 0xe4, 0x72, 0xdb, 0x9c, 0xb9, 0x1b, 0x39, - 0x77, 0xd0, 0x1c, 0xa9, 0x8d, 0x80, 0x05, 0xef, 0x49, 0xc2, 0x72, 0xe6, - 0xdb, 0x39, 0x52, 0x46, 0xe6, 0x0b, 0x30, 0xb5, 0x10, 0xb4, 0x44, 0xd8, - 0xe5, 0xef, 0x7d, 0x01, 0x45, 0x0f, 0x5a, 0xff, 0xbb, 0x8b, 0x40, 0xcf, - 0xfe, 0x8e, 0x5f, 0xf2, 0x07, 0x16, 0x93, 0x23, 0x67, 0x2f, 0xff, 0x38, - 0x73, 0x05, 0x5d, 0x6b, 0x04, 0x07, 0x2f, 0xbb, 0xfb, 0xab, 0x08, 0x81, - 0x59, 0xcd, 0xff, 0xfd, 0x27, 0xd6, 0xa3, 0x27, 0xfe, 0x41, 0xe0, 0xbb, - 0x67, 0x2d, 0x01, 0x44, 0xc2, 0x1d, 0xd6, 0x93, 0x7b, 0xf4, 0x6a, 0x97, - 0xf2, 0x2d, 0x98, 0x2c, 0x39, 0x7c, 0xf3, 0xeb, 0xa7, 0x2b, 0x87, 0x9f, - 0xa2, 0xca, 0x92, 0xbc, 0x30, 0x8e, 0xef, 0x1a, 0xfa, 0x47, 0x59, 0xe7, - 0x9b, 0xf6, 0xcf, 0xbd, 0x4f, 0x1c, 0xbf, 0xec, 0xf7, 0x63, 0x9e, 0xc6, - 0x1c, 0xbd, 0x1c, 0x98, 0xe5, 0x42, 0xfc, 0xe6, 0x47, 0x80, 0x90, 0xd7, - 0xe9, 0x93, 0xcb, 0xfa, 0x02, 0xc0, 0x96, 0x6d, 0x9c, 0x5e, 0xd3, 0xcc, - 0x72, 0xff, 0xfb, 0x99, 0xbe, 0x6c, 0x80, 0x8e, 0x7b, 0x00, 0x72, 0xff, - 0xe4, 0x0b, 0xf9, 0x35, 0x92, 0xce, 0x9c, 0xb9, 0xf6, 0x8e, 0x5b, 0x3a, - 0x7b, 0x7e, 0x42, 0xad, 0xd1, 0xdf, 0xc1, 0xd1, 0x85, 0x5d, 0xe1, 0x66, - 0xd1, 0xcb, 0xff, 0xfb, 0x7d, 0x0b, 0xeb, 0xb9, 0x2c, 0xea, 0x73, 0xae, - 0x72, 0xfb, 0x37, 0x9f, 0x61, 0xcb, 0xfe, 0x10, 0xe0, 0xff, 0x2c, 0xd1, - 0xcb, 0xfd, 0xf7, 0xc3, 0x93, 0xa7, 0x0e, 0x5f, 0x79, 0x34, 0x87, 0x2b, - 0x13, 0x2d, 0x41, 0xfe, 0x2d, 0x39, 0x30, 0x9c, 0x7e, 0x6b, 0x7f, 0xf4, - 0xf1, 0xf4, 0x1f, 0xca, 0x4f, 0xdf, 0xce, 0x5f, 0xf7, 0x50, 0x28, 0xd3, - 0x81, 0x43, 0x97, 0xf9, 0xe5, 0x81, 0xe6, 0xb4, 0x72, 0xfa, 0x33, 0xe8, - 0x4e, 0x5f, 0xe5, 0x53, 0xcf, 0xd6, 0xda, 0xce, 0x5f, 0xec, 0x9b, 0xb9, - 0xa7, 0x13, 0x97, 0xfe, 0x0e, 0x6f, 0x2d, 0x7b, 0x4e, 0x03, 0x95, 0xc3, - 0xf2, 0xfc, 0xca, 0xff, 0xe4, 0x5f, 0xc6, 0x75, 0x3a, 0xc4, 0xd1, 0xcb, - 0xfd, 0x92, 0xcf, 0xda, 0x6e, 0x27, 0x2b, 0x87, 0xf9, 0xd4, 0x6b, 0xff, - 0xfc, 0x83, 0x9b, 0xf9, 0x57, 0xf7, 0x63, 0xb9, 0xb1, 0xe4, 0x72, 0x82, - 0xa8, 0x8d, 0x86, 0x68, 0x47, 0xc8, 0x55, 0x7a, 0x13, 0xfb, 0x08, 0xae, - 0x18, 0x39, 0x7f, 0xc1, 0x4e, 0x46, 0xc0, 0x6a, 0x47, 0x2e, 0x85, 0x9c, - 0xa8, 0x3d, 0x1e, 0x9d, 0xd7, 0x51, 0x0f, 0xe6, 0x6b, 0xff, 0x46, 0x9f, - 0xa8, 0x16, 0x24, 0xe7, 0x2a, 0x15, 0xd4, 0xe4, 0xa5, 0xd7, 0x87, 0x5f, - 0xe4, 0x77, 0xa0, 0x7c, 0x72, 0xff, 0x27, 0x53, 0x92, 0x9a, 0x0e, 0x5f, - 0xff, 0x93, 0xf6, 0x7d, 0xdc, 0x0f, 0xa7, 0xe2, 0x6e, 0x03, 0x97, 0xcf, - 0xc8, 0x91, 0xcb, 0xff, 0xf9, 0x05, 0xd0, 0x41, 0xc8, 0xeb, 0xa7, 0xa3, - 0xa7, 0x28, 0x4f, 0xdf, 0xc4, 0x37, 0xe4, 0xf6, 0xbf, 0x9c, 0xe5, 0xff, - 0xe1, 0x40, 0x7b, 0x76, 0x27, 0x3e, 0xc0, 0x4e, 0x5f, 0xf7, 0x7e, 0x87, - 0xff, 0x68, 0x10, 0x72, 0xa1, 0x11, 0x2e, 0x99, 0x41, 0x4f, 0x19, 0x21, - 0xa2, 0xb2, 0x1f, 0x42, 0xce, 0xfd, 0xcf, 0xd9, 0xd8, 0x39, 0x7f, 0x72, - 0x69, 0x27, 0xb4, 0x72, 0xc3, 0x07, 0xb1, 0x85, 0x37, 0xfa, 0x67, 0x99, - 0xf7, 0x96, 0x8e, 0x5f, 0xcf, 0x3a, 0x4c, 0x8d, 0x9c, 0xbf, 0xff, 0xce, - 0xdf, 0xb3, 0xbf, 0x03, 0x93, 0x49, 0xf9, 0x3f, 0x7f, 0x39, 0x58, 0x8c, - 0xc7, 0x36, 0x12, 0xfb, 0xfa, 0x7c, 0x19, 0xf1, 0xb3, 0x97, 0xfd, 0x13, - 0xfd, 0x97, 0x7f, 0x79, 0xce, 0x56, 0x1f, 0x6f, 0x0b, 0xec, 0xd2, 0x39, - 0x7e, 0x8e, 0x73, 0x3a, 0x72, 0xfe, 0x17, 0x56, 0x17, 0x07, 0x29, 0xa0, - 0x7d, 0x12, 0x15, 0xfc, 0x9e, 0xfa, 0x27, 0x55, 0x53, 0x97, 0xff, 0xe4, - 0x64, 0x2f, 0x4f, 0xcc, 0x5f, 0xec, 0x79, 0x1c, 0xb9, 0x36, 0x1c, 0xb7, - 0x4e, 0x54, 0x8f, 0xf9, 0xad, 0x57, 0xf1, 0x8b, 0xc1, 0x85, 0x9c, 0xbf, - 0xd8, 0x0c, 0x9a, 0x37, 0xd1, 0xca, 0x83, 0xd0, 0xc1, 0xcb, 0xfb, 0xaf, - 0x28, 0xd4, 0x8e, 0x5f, 0xf6, 0x75, 0x37, 0xd7, 0x7f, 0xd1, 0xcb, 0xb0, - 0x58, 0x7d, 0x00, 0x2d, 0xbf, 0x85, 0xc0, 0x1c, 0x13, 0x97, 0xe4, 0xdb, - 0xce, 0x2a, 0x72, 0xe5, 0x64, 0x72, 0xfd, 0xd4, 0xd8, 0x8c, 0x39, 0x76, - 0x76, 0x47, 0x82, 0xc1, 0x8a, 0x5a, 0x26, 0x76, 0xdb, 0x2f, 0x36, 0xdb, - 0x65, 0x2f, 0xfd, 0xc1, 0xfd, 0xfe, 0xe4, 0xd0, 0xb3, 0x8a, 0x1a, 0x0b, - 0xf7, 0x52, 0x64, 0x6c, 0xe5, 0x98, 0x72, 0xa1, 0x11, 0x98, 0xa5, 0xc2, - 0x9b, 0xfd, 0x01, 0xc9, 0x40, 0xb0, 0xe5, 0x43, 0x23, 0x2a, 0x43, 0x79, - 0x1f, 0xcb, 0x5c, 0x27, 0xe6, 0x87, 0x8f, 0x21, 0x34, 0xb8, 0x44, 0xf4, - 0xd1, 0xe1, 0x46, 0x30, 0x83, 0xd4, 0x22, 0x3c, 0x59, 0xfc, 0x31, 0x1b, - 0x86, 0x97, 0xd2, 0xeb, 0xee, 0x73, 0x3a, 0x72, 0xfe, 0xea, 0x6d, 0x6d, - 0x7e, 0xa9, 0xca, 0x83, 0xd8, 0x61, 0x15, 0x9a, 0x67, 0x2c, 0x87, 0x2f, - 0xfb, 0xd1, 0xcd, 0x76, 0x07, 0xc7, 0x2c, 0xd3, 0x39, 0x7f, 0xde, 0x8e, - 0x6b, 0xb0, 0x3e, 0x39, 0x76, 0xa0, 0xe5, 0xe5, 0x86, 0x0e, 0x5f, 0xe1, - 0xf3, 0xcd, 0xa8, 0xf1, 0xca, 0x43, 0xcf, 0x71, 0xcb, 0xe4, 0x7c, 0x61, - 0xcb, 0xff, 0x66, 0xc1, 0xcd, 0x4c, 0x30, 0x13, 0x97, 0xcc, 0x0c, 0x4e, - 0x72, 0xe0, 0x41, 0xcb, 0xda, 0x4e, 0x1c, 0xac, 0x3d, 0x50, 0x11, 0xf8, - 0x5a, 0xff, 0x4b, 0x05, 0x03, 0x82, 0x72, 0xf7, 0xb4, 0xa4, 0x27, 0xc9, - 0x82, 0xb3, 0x1c, 0x75, 0x94, 0x04, 0x02, 0x41, 0xa8, 0x4a, 0x78, 0xba, - 0xed, 0x41, 0xcb, 0xcb, 0x0c, 0x1c, 0xbf, 0xc3, 0xe7, 0x9b, 0x51, 0xe3, - 0x94, 0x87, 0x9e, 0xe3, 0x97, 0xc8, 0xf8, 0xc3, 0x97, 0xfe, 0xcd, 0x83, - 0x9a, 0x98, 0x60, 0x27, 0x2f, 0x98, 0x18, 0x9c, 0xe5, 0xfd, 0x30, 0x11, - 0xad, 0xe6, 0x39, 0x70, 0x20, 0xe5, 0xed, 0x27, 0x0e, 0x56, 0x22, 0x1d, - 0x84, 0x60, 0x32, 0xf0, 0xb5, 0xfe, 0x96, 0x0a, 0x07, 0x04, 0xe5, 0xfc, - 0x2e, 0x1c, 0x55, 0x48, 0x5c, 0xa0, 0x08, 0xae, 0x08, 0x32, 0x50, 0xe4, - 0xd0, 0x88, 0xeb, 0x28, 0x08, 0x04, 0x83, 0x50, 0xc6, 0xf1, 0xe5, 0xff, - 0xdc, 0x8d, 0xf4, 0x30, 0xbc, 0xdf, 0xc7, 0x2f, 0xff, 0xce, 0x1c, 0xc1, - 0x57, 0xe8, 0xc0, 0xce, 0x9c, 0x39, 0x79, 0xf9, 0x39, 0xe4, 0x12, 0x5f, - 0x4b, 0x37, 0x91, 0xe4, 0x12, 0x5e, 0xd2, 0x04, 0xf2, 0x09, 0x2e, 0x6d, - 0xb3, 0xc8, 0x24, 0xa6, 0x22, 0xa6, 0x62, 0xaf, 0x18, 0x36, 0x53, 0x73, - 0xf8, 0xb2, 0x09, 0x0a, 0x1b, 0xfb, 0xfb, 0x3b, 0x98, 0x2a, 0x9c, 0xbc, - 0xe2, 0x0f, 0x8b, 0xec, 0x91, 0x39, 0x83, 0xc8, 0x60, 0x2d, 0x14, 0x63, - 0x3d, 0xf1, 0xad, 0xf6, 0xde, 0x3f, 0x4e, 0x5b, 0x1a, 0xd1, 0x42, 0x07, - 0xdb, 0x48, 0xe5, 0xfd, 0x2f, 0xe7, 0xf2, 0x4e, 0x52, 0xfc, 0xab, 0x87, - 0xb8, 0x72, 0xa6, 0x3d, 0x9e, 0x98, 0xdf, 0xf4, 0x0c, 0x86, 0x00, 0xeb, - 0x39, 0x68, 0x39, 0x7f, 0x92, 0x5f, 0xbe, 0xba, 0x87, 0x2f, 0xec, 0xd8, - 0xeb, 0xce, 0x9c, 0xb4, 0x8a, 0x5e, 0x7e, 0x4e, 0x52, 0x8a, 0x54, 0x1b, - 0x96, 0x08, 0xac, 0x76, 0xf4, 0x01, 0x85, 0x14, 0x35, 0xb4, 0xb4, 0x60, - 0x8c, 0x25, 0x2a, 0x13, 0x1b, 0xc8, 0x7a, 0x5f, 0xb8, 0x05, 0xa6, 0x8e, - 0x5f, 0xdf, 0x46, 0x5a, 0xe8, 0x4e, 0x61, 0xa8, 0xbe, 0xfd, 0xf9, 0x23, - 0x96, 0x59, 0xcb, 0xb2, 0x41, 0x36, 0x93, 0x11, 0xdf, 0xfd, 0x9b, 0xfb, - 0x48, 0x30, 0x07, 0x59, 0xcb, 0xec, 0x99, 0x16, 0x72, 0xa7, 0x3e, 0x56, - 0xd0, 0xef, 0xe6, 0x44, 0xd2, 0x80, 0x14, 0xb2, 0x1c, 0xbf, 0xe9, 0xff, - 0x90, 0x7b, 0xfb, 0x89, 0xcb, 0xf9, 0x21, 0x73, 0xe3, 0x67, 0x2f, 0xd9, - 0x3a, 0xf1, 0x67, 0x2f, 0x69, 0x38, 0x72, 0x84, 0xf1, 0x3c, 0x51, 0x7f, - 0x0b, 0x80, 0x1f, 0xe8, 0xe5, 0xfc, 0x8a, 0xfd, 0x85, 0xa8, 0x14, 0xc3, - 0x70, 0x43, 0x87, 0x9a, 0x72, 0xf1, 0x0d, 0x62, 0x79, 0xe8, 0x48, 0x31, - 0x9d, 0xdf, 0x0e, 0x4f, 0xf9, 0xcb, 0xfe, 0xcf, 0x7c, 0x1c, 0x07, 0xdd, - 0xce, 0x54, 0x97, 0x74, 0x02, 0x57, 0x8d, 0x4a, 0x91, 0xf0, 0xdb, 0xb1, - 0x95, 0x81, 0x3c, 0x5c, 0xf5, 0x29, 0x87, 0xc6, 0x9b, 0x64, 0x77, 0xff, - 0xe9, 0xf9, 0xcc, 0x0b, 0xaf, 0xaf, 0xe1, 0x89, 0x8e, 0x5f, 0xff, 0xfe, - 0xff, 0x9f, 0xcc, 0x2e, 0x0d, 0x6b, 0x15, 0xcf, 0xf8, 0xe1, 0x8e, 0xc1, - 0xcb, 0xfe, 0x51, 0x6e, 0x1e, 0xc0, 0xfe, 0x72, 0xfb, 0x6b, 0xbf, 0xfd, - 0x39, 0x79, 0xb6, 0xdb, 0x29, 0x74, 0xa0, 0xa2, 0x86, 0x82, 0xa1, 0x37, - 0xb9, 0xd5, 0xb1, 0xef, 0x73, 0xae, 0x24, 0xdf, 0xff, 0x27, 0xa6, 0xce, - 0x71, 0xe6, 0xce, 0x67, 0x8e, 0x5f, 0xca, 0xc7, 0x39, 0x9d, 0x39, 0x7f, - 0x4f, 0x34, 0x9a, 0x5c, 0x9c, 0xe5, 0xff, 0xe0, 0x2d, 0xe5, 0xf2, 0x03, - 0x3a, 0xe3, 0x87, 0x2f, 0x92, 0x07, 0xc7, 0x2f, 0x4e, 0xe2, 0x72, 0xb8, - 0x88, 0x9e, 0xa6, 0xf8, 0x82, 0xff, 0xca, 0xff, 0xa9, 0x27, 0x27, 0xfc, - 0x07, 0x2f, 0x3e, 0xed, 0x9c, 0xa5, 0x4f, 0x8b, 0xa8, 0x97, 0xe9, 0xf8, - 0x90, 0xb3, 0x97, 0xff, 0xd1, 0xf7, 0xc3, 0x00, 0x7f, 0x03, 0xe8, 0xc8, - 0xe5, 0x35, 0x49, 0xf7, 0x64, 0x2f, 0xd2, 0x12, 0x4e, 0x47, 0xe2, 0x8b, - 0xef, 0xa1, 0xea, 0x1c, 0xbf, 0xf3, 0xfb, 0x4d, 0xe7, 0x40, 0xfe, 0x39, - 0x7f, 0xff, 0xec, 0xf4, 0x30, 0x73, 0x06, 0x25, 0xee, 0xba, 0xc7, 0x36, - 0x1c, 0xa9, 0xd1, 0x98, 0x12, 0x46, 0xcf, 0xef, 0x7d, 0x0c, 0xc7, 0x2f, - 0x49, 0x04, 0xe5, 0xf4, 0xff, 0x76, 0x9b, 0x39, 0x7f, 0xd1, 0xd7, 0x4f, - 0x4c, 0x8d, 0x9c, 0xbf, 0xf0, 0x33, 0x88, 0x0c, 0x07, 0x16, 0x72, 0xff, - 0xf2, 0xb1, 0xae, 0x47, 0x47, 0x3d, 0x0b, 0x39, 0x7f, 0xda, 0x1c, 0xd8, - 0x93, 0x23, 0x67, 0x2f, 0xff, 0xef, 0xde, 0x76, 0x7f, 0x3f, 0xb3, 0xa3, - 0x9e, 0xea, 0x1c, 0xbf, 0x44, 0xc3, 0xfe, 0x8e, 0x56, 0x26, 0x16, 0x89, - 0x3d, 0x3b, 0xf2, 0xf5, 0xc8, 0x27, 0x2f, 0xe7, 0x10, 0x67, 0x95, 0x39, - 0x50, 0xaa, 0x5e, 0x73, 0x29, 0x10, 0x38, 0xd8, 0x95, 0x68, 0xe7, 0xd1, - 0xa4, 0xec, 0x3c, 0xdb, 0x15, 0xbe, 0x1f, 0x46, 0xd9, 0xcb, 0xee, 0xfe, - 0xb8, 0x39, 0x73, 0xe8, 0xe5, 0xdf, 0xb4, 0xce, 0x53, 0x54, 0x7f, 0x2e, - 0x48, 0x24, 0x7f, 0x8b, 0x5c, 0xea, 0x34, 0x1f, 0x6f, 0x79, 0xab, 0x84, - 0x33, 0x4a, 0x14, 0xed, 0x1c, 0xad, 0xa9, 0x12, 0x34, 0x63, 0xc8, 0x9c, - 0x5b, 0x9e, 0x52, 0x4c, 0xa5, 0x0d, 0x86, 0x5b, 0x6e, 0x52, 0x6e, 0x15, - 0x8c, 0xf9, 0x92, 0xaa, 0x37, 0x94, 0x50, 0x92, 0x98, 0x1a, 0xd6, 0x26, - 0x94, 0xc3, 0xc9, 0x57, 0xeb, 0x97, 0x3b, 0xda, 0x4c, 0x1b, 0xc6, 0xe6, - 0x08, 0xd8, 0x9a, 0x6a, 0xa3, 0x2f, 0xcf, 0x54, 0x91, 0x3f, 0x53, 0xcd, - 0x3f, 0x94, 0x4b, 0xb1, 0x2d, 0xb5, 0x0d, 0xb9, 0x43, 0x9f, 0x65, 0xdd, - 0x6d, 0x46, 0x05, 0x7e, 0x5e, 0x23, 0x80, 0xe5, 0xf3, 0x1d, 0xd8, 0x68, - 0xa2, 0x97, 0xff, 0xe7, 0x04, 0x33, 0xa9, 0xae, 0xa7, 0xbb, 0x82, 0x72, - 0xb8, 0x88, 0x11, 0x2e, 0xbf, 0x28, 0xb7, 0x92, 0x90, 0x8c, 0x9c, 0x85, - 0x3d, 0xfe, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x2e, 0x85, 0xff, 0xca, 0x3c, - 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0x2d, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, - 0xbc, 0x97, 0x3e, 0xc3, 0x96, 0x53, 0x0f, 0x33, 0x6c, 0xd2, 0xa1, 0xf9, - 0xdd, 0x67, 0x84, 0x4c, 0x8a, 0xb2, 0x13, 0x6c, 0x84, 0xc4, 0xc7, 0x2b, - 0x40, 0xec, 0xbf, 0xe1, 0xbd, 0xc6, 0xbd, 0x4b, 0x5f, 0xf2, 0x2f, 0xe8, - 0x1b, 0x21, 0x3d, 0x7f, 0xf9, 0x45, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, - 0x89, 0x65, 0x77, 0xfd, 0x39, 0x7f, 0x90, 0x3d, 0xc4, 0x15, 0x4e, 0x5f, - 0x75, 0xfd, 0xf9, 0xcb, 0xee, 0xc3, 0x5a, 0xce, 0x5e, 0xfd, 0x8e, 0x72, - 0xa4, 0x89, 0x74, 0x32, 0x6b, 0x23, 0xfa, 0x4b, 0x7f, 0x07, 0xdf, 0xbc, - 0xb4, 0x72, 0xf9, 0x1a, 0xe2, 0x73, 0x97, 0xbc, 0xeb, 0x39, 0x7f, 0xee, - 0xc7, 0x51, 0x5f, 0x69, 0xc0, 0x72, 0xff, 0x9e, 0x5a, 0xff, 0xd1, 0xed, - 0x1c, 0xbf, 0x87, 0xdc, 0x87, 0x61, 0xcb, 0xd3, 0xbe, 0x8e, 0x5f, 0x31, - 0xdd, 0x86, 0x88, 0xcd, 0x7f, 0x24, 0x2e, 0x7c, 0x6c, 0xe5, 0xc3, 0x23, - 0x96, 0x59, 0xcb, 0xf2, 0x73, 0xae, 0xa7, 0x0f, 0x55, 0x65, 0xdf, 0x45, - 0xaf, 0xe7, 0x92, 0x71, 0xf8, 0x72, 0xff, 0xed, 0x27, 0xfa, 0xc1, 0xfe, - 0x59, 0xa3, 0x97, 0xb5, 0x1b, 0x9c, 0xa9, 0x2a, 0x21, 0x09, 0xfe, 0x1d, - 0x21, 0x67, 0x07, 0x57, 0x08, 0x31, 0x4e, 0xd1, 0x67, 0x91, 0x6f, 0xfb, - 0x8e, 0xdf, 0x52, 0x39, 0x07, 0x2f, 0xfa, 0x5a, 0xc8, 0xf9, 0x1a, 0x59, - 0xcb, 0xed, 0xfb, 0x1a, 0x39, 0x7d, 0xa8, 0xf6, 0x8e, 0x56, 0x1e, 0x2e, - 0x88, 0xef, 0xfe, 0xf2, 0x71, 0xc1, 0xf3, 0x79, 0x42, 0xce, 0x5f, 0x86, - 0x25, 0xa7, 0x39, 0x48, 0x7d, 0xbb, 0x11, 0xed, 0xd3, 0x97, 0xff, 0xff, - 0x79, 0x17, 0xc4, 0xcd, 0xc7, 0xff, 0x47, 0x7e, 0x6c, 0x4f, 0x4d, 0x07, - 0x2d, 0x98, 0x88, 0x8f, 0x08, 0xdf, 0xe7, 0x96, 0xb4, 0xe3, 0x23, 0x97, - 0xfe, 0xf3, 0x88, 0x3e, 0x7d, 0xcd, 0xdb, 0x39, 0x7d, 0xef, 0x42, 0xce, - 0x56, 0x1f, 0x32, 0xa8, 0x97, 0xff, 0xbd, 0x0c, 0x4f, 0x22, 0xe6, 0xd2, - 0x09, 0xcb, 0xfc, 0xbc, 0xe0, 0x07, 0xf0, 0x1c, 0xb4, 0x8e, 0x52, 0x22, - 0x39, 0xd2, 0x7e, 0x9a, 0x5f, 0x81, 0x1e, 0x80, 0x9c, 0xa4, 0x4c, 0x1d, - 0xe1, 0x61, 0xf9, 0x85, 0xff, 0xf7, 0xfe, 0xd6, 0xf2, 0x81, 0x06, 0xbe, - 0x7e, 0x27, 0x2f, 0x47, 0xa0, 0xe5, 0x04, 0xfc, 0x36, 0x2a, 0xde, 0xee, - 0x09, 0xca, 0x43, 0x7f, 0xf9, 0x25, 0xdd, 0x98, 0xe5, 0xfe, 0xdf, 0x43, - 0x9c, 0x0c, 0x1c, 0xa4, 0x3c, 0xb7, 0x18, 0xbe, 0xf3, 0xf6, 0x0e, 0x5f, - 0x7b, 0xbf, 0xed, 0x9c, 0xbf, 0xd9, 0x1c, 0x79, 0x27, 0x4e, 0x5f, 0xe4, - 0x6f, 0x51, 0xd7, 0x6b, 0x39, 0x5c, 0x3e, 0x7f, 0x18, 0xd6, 0xe8, 0xd1, - 0x42, 0x15, 0xc2, 0x3a, 0xff, 0xf2, 0x77, 0xf6, 0xb0, 0xf7, 0xfd, 0x6f, - 0x27, 0x39, 0x58, 0x88, 0x67, 0x35, 0xbd, 0xf7, 0x1a, 0x47, 0x2f, 0xff, - 0x7e, 0x05, 0xa0, 0xe0, 0x07, 0x1e, 0x63, 0x97, 0xf9, 0x3a, 0x90, 0x33, - 0x7e, 0x72, 0xff, 0x27, 0x33, 0x07, 0x7f, 0x1c, 0xa8, 0x3e, 0x57, 0x33, - 0xbf, 0xf7, 0xe1, 0xe6, 0x7f, 0xd8, 0x5e, 0x1c, 0xac, 0x4c, 0xc3, 0x84, - 0x5d, 0x85, 0x76, 0x88, 0x2f, 0xff, 0xb7, 0x92, 0x70, 0x3d, 0xff, 0x98, - 0xce, 0xe1, 0xcb, 0x91, 0xb3, 0x97, 0x6d, 0x61, 0xca, 0xd1, 0xb0, 0xf0, - 0xbd, 0xfd, 0xa8, 0xf6, 0xba, 0x87, 0x2f, 0xc3, 0x8b, 0xe6, 0x1c, 0xbe, - 0xe6, 0xcc, 0x09, 0xca, 0xc3, 0xf7, 0x59, 0x6f, 0xe4, 0xd7, 0xc0, 0x4d, - 0xe4, 0x72, 0xff, 0x40, 0xf9, 0x27, 0x18, 0x39, 0x7f, 0xf9, 0x38, 0x93, - 0xc0, 0xe7, 0x79, 0xfe, 0xc3, 0x94, 0x04, 0x50, 0x09, 0x1f, 0x8c, 0x69, - 0xab, 0x67, 0x15, 0xc4, 0x2b, 0xe7, 0x41, 0x91, 0x78, 0x49, 0x72, 0x51, - 0xea, 0xb0, 0x82, 0xdc, 0xe1, 0x1f, 0xe6, 0x84, 0x77, 0x21, 0x56, 0xb2, - 0x7e, 0xc7, 0x3e, 0xf0, 0xe4, 0x03, 0x60, 0xc6, 0xef, 0xa8, 0xd4, 0x7c, - 0x85, 0xb2, 0x10, 0x5b, 0x70, 0x98, 0xfb, 0x0c, 0xfb, 0xce, 0xe0, 0x39, - 0x7e, 0x70, 0xbb, 0xee, 0x72, 0xef, 0x29, 0xd3, 0xc2, 0x71, 0xbb, 0xff, - 0xff, 0xbf, 0xde, 0x4a, 0x38, 0xfb, 0x17, 0xa0, 0xf6, 0x38, 0x17, 0x76, - 0xce, 0x52, 0x8a, 0x93, 0xf2, 0x3a, 0xc1, 0x2e, 0xbf, 0xfc, 0xa2, 0xde, - 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, 0xd2, 0xbf, 0xfc, 0xa2, 0xde, 0x4a, - 0x67, 0x18, 0xee, 0xc3, 0x44, 0xe2, 0xbf, 0xf3, 0xc9, 0x4c, 0xe3, 0x1d, - 0xd8, 0x68, 0xa0, 0x57, 0xda, 0x1d, 0xe4, 0x72, 0xca, 0x2c, 0xfb, 0xbc, - 0x97, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xb8, 0x17, 0xf0, 0xe7, 0x98, 0x9a, - 0x39, 0x74, 0x21, 0xcb, 0xfc, 0x32, 0x84, 0x0e, 0x2c, 0xe5, 0x62, 0x29, - 0x96, 0x69, 0xd2, 0xcf, 0xc5, 0x6f, 0xd2, 0x51, 0x56, 0x82, 0xa7, 0x29, - 0x43, 0xed, 0x83, 0xdb, 0x9c, 0x07, 0x2f, 0xd3, 0x4a, 0x06, 0x47, 0x28, - 0xe5, 0x61, 0xb3, 0x12, 0x8b, 0xe8, 0x06, 0x36, 0x72, 0xe4, 0x53, 0x88, - 0x8a, 0x14, 0x9f, 0xa3, 0xf7, 0xfd, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, - 0x49, 0x59, 0x4e, 0xa2, 0x0d, 0xcf, 0x6e, 0x6c, 0x07, 0x2f, 0xf3, 0xf8, - 0x72, 0x77, 0x13, 0x97, 0xf4, 0x9f, 0x93, 0x86, 0x0e, 0x5f, 0xd8, 0x2f, - 0xbc, 0xb4, 0x72, 0xfe, 0x85, 0xf3, 0x03, 0xe3, 0x97, 0x3a, 0x81, 0x46, - 0x8a, 0xa3, 0x13, 0x18, 0xf0, 0xbb, 0x45, 0xb5, 0x3b, 0x6b, 0xc9, 0x2a, - 0xc3, 0x49, 0x86, 0xf3, 0x2c, 0x02, 0x18, 0xda, 0x8c, 0xf3, 0xd1, 0x97, - 0xec, 0x87, 0xd5, 0xff, 0x95, 0x75, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0xd4, - 0x5f, 0xf9, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4a, 0xab, 0x91, 0xb3, - 0x94, 0x72, 0xca, 0x2a, 0x8b, 0x95, 0xa6, 0x79, 0x2f, 0x68, 0x5e, 0xfe, - 0xce, 0x31, 0xdd, 0x86, 0x88, 0xa5, 0x7c, 0x9a, 0x87, 0x39, 0x7f, 0x85, - 0xc1, 0xaf, 0x63, 0x0e, 0x5c, 0xb5, 0x34, 0x7a, 0x5e, 0x20, 0xa5, 0x11, - 0x74, 0xf0, 0x8b, 0xbf, 0xca, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x68, 0xbb, - 0xfe, 0x9c, 0xbf, 0xf0, 0x71, 0x69, 0xcc, 0xd4, 0xd0, 0x72, 0xff, 0xff, - 0x9f, 0xfd, 0x77, 0x03, 0xf7, 0xee, 0x93, 0xef, 0x93, 0x53, 0x7d, 0x39, - 0x7f, 0xfa, 0x64, 0x4e, 0xcd, 0x9e, 0x8f, 0x40, 0x4e, 0x5e, 0x47, 0x6c, - 0xe5, 0x22, 0x62, 0xad, 0x67, 0xd3, 0x38, 0xad, 0x2a, 0xf9, 0x8e, 0xec, - 0x34, 0x53, 0xeb, 0xbd, 0x07, 0x2b, 0x87, 0x89, 0xe2, 0xeb, 0xff, 0x7a, - 0x68, 0xf7, 0x5e, 0x6f, 0x98, 0x72, 0xff, 0xf2, 0x2c, 0x7f, 0xea, 0x73, - 0x35, 0x34, 0x1c, 0xbf, 0xfb, 0xff, 0x73, 0xf9, 0xb4, 0xc7, 0x9b, 0x47, - 0x2f, 0xfe, 0xc9, 0xbf, 0x19, 0xf4, 0xc7, 0x9b, 0x47, 0x2f, 0xbf, 0xea, - 0x70, 0xe5, 0x94, 0x6a, 0xd5, 0x8a, 0xc4, 0x65, 0xb9, 0x08, 0x54, 0x22, - 0x74, 0x21, 0x4a, 0xf2, 0x56, 0xda, 0x45, 0xff, 0xe5, 0x16, 0xf2, 0x53, - 0x38, 0xc7, 0x76, 0x1a, 0x26, 0xa5, 0xfd, 0x9c, 0x63, 0xbb, 0x0d, 0x15, - 0xda, 0xff, 0xfe, 0x6d, 0x4e, 0xe6, 0xd2, 0x79, 0x25, 0xf0, 0x63, 0xda, - 0x39, 0x4a, 0x22, 0x69, 0x0e, 0x6f, 0x6a, 0x16, 0x72, 0xe5, 0x89, 0xcb, - 0xe6, 0x3b, 0xb0, 0xd1, 0x5f, 0x2f, 0x36, 0xdb, 0x65, 0x2c, 0x25, 0x14, - 0x34, 0x15, 0xc3, 0xef, 0x5a, 0x75, 0xe9, 0x46, 0xe7, 0x2f, 0x4d, 0x9d, - 0x39, 0x7f, 0xec, 0xeb, 0x6f, 0xed, 0x46, 0x4e, 0x72, 0xde, 0x39, 0x7f, - 0xc9, 0xcc, 0x9d, 0x25, 0x81, 0x39, 0x5c, 0x3c, 0x97, 0x11, 0xbf, 0x6f, - 0xb5, 0xdf, 0xfe, 0x9c, 0xb7, 0x0e, 0x51, 0xca, 0x42, 0xf3, 0x82, 0x37, - 0x4e, 0xa9, 0xca, 0xe9, 0xb8, 0x71, 0xfb, 0x29, 0x0a, 0x92, 0xa7, 0x1c, - 0xc8, 0x42, 0xcc, 0x44, 0xe3, 0xa2, 0x3b, 0xa8, 0x44, 0x7e, 0x43, 0xb7, - 0x08, 0x4b, 0xff, 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4f, - 0x6b, 0xe8, 0xda, 0x7d, 0xce, 0x5e, 0x41, 0x01, 0xca, 0xe9, 0xe0, 0x6c, - 0x25, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x5c, 0x2b, 0x29, 0x07, 0xb1, 0x84, - 0x97, 0xff, 0x28, 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x24, 0xf5, 0x43, - 0x29, 0x9e, 0x78, 0xc0, 0xa4, 0x50, 0xac, 0xb5, 0x56, 0x42, 0x22, 0x68, - 0x79, 0x72, 0x53, 0x6f, 0x61, 0x31, 0xa8, 0x78, 0x6c, 0x27, 0xbf, 0xca, - 0x67, 0x18, 0xee, 0xc3, 0x44, 0x54, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x53, - 0x2b, 0xf9, 0x3b, 0x8f, 0xb8, 0x0e, 0x59, 0x4c, 0x3e, 0x1d, 0xb3, 0x4b, - 0xff, 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4c, 0xeb, 0xff, - 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x51, 0xaa, 0x9d, 0x37, - 0xc0, 0xc2, 0x85, 0x52, 0xbf, 0x2c, 0x5f, 0xf9, 0xe4, 0xa6, 0x71, 0x8e, - 0xec, 0x34, 0x47, 0x4b, 0xff, 0xb9, 0x3a, 0x9a, 0x1c, 0xf6, 0xa1, 0x67, - 0x29, 0x44, 0x48, 0xc2, 0x5d, 0xdf, 0xf4, 0xe5, 0xf3, 0x19, 0xfb, 0x0e, - 0x5f, 0xb0, 0x43, 0x93, 0x9c, 0xbf, 0xd1, 0x0c, 0xce, 0x73, 0x0e, 0x52, - 0x1e, 0xc0, 0x93, 0xdf, 0xb3, 0x8c, 0xfd, 0x53, 0x97, 0xfe, 0x1c, 0x55, - 0xe6, 0xd7, 0x60, 0x27, 0x2f, 0x4c, 0xfe, 0x39, 0x7c, 0xc7, 0x76, 0x1a, - 0x29, 0xa5, 0xfb, 0x37, 0x6d, 0xfa, 0x72, 0xff, 0xed, 0x60, 0x86, 0x3e, - 0x35, 0x3d, 0x80, 0x43, 0x94, 0x14, 0xca, 0x90, 0xaa, 0x63, 0xfe, 0x0e, - 0x89, 0x76, 0x8a, 0x6f, 0xff, 0xfb, 0x07, 0xda, 0x46, 0x60, 0xe9, 0x9d, - 0x4e, 0xb3, 0xec, 0xe7, 0x2f, 0xfb, 0x4f, 0xbe, 0x4d, 0x1d, 0xd1, 0xcb, - 0xba, 0x82, 0x8a, 0x2f, 0x34, 0x5f, 0xfd, 0x2e, 0xa0, 0xcf, 0xaf, 0xe3, - 0x93, 0x1c, 0xbc, 0x0f, 0x21, 0xcb, 0xfd, 0xa6, 0x27, 0x38, 0x93, 0x9c, - 0xa7, 0x3d, 0x0d, 0x0e, 0x5f, 0xef, 0xdc, 0x59, 0xf2, 0x7d, 0x1c, 0xbf, + 0x86, 0x7c, 0xf9, 0xd6, 0x87, 0x2a, 0x0f, 0xd0, 0x4a, 0x6f, 0xfd, 0xdc, + 0x9b, 0xa9, 0xd8, 0xdc, 0x1c, 0xb9, 0xf9, 0x39, 0x7f, 0x9f, 0x4f, 0xdf, + 0xc6, 0x73, 0x94, 0x27, 0x97, 0xf8, 0xbd, 0x4e, 0xb8, 0xff, 0x21, 0xc4, + 0x8c, 0x47, 0x67, 0xcc, 0x86, 0xb7, 0x48, 0x46, 0x16, 0x3e, 0x85, 0x0a, + 0x84, 0x1c, 0x10, 0x89, 0xbc, 0x2f, 0xe3, 0x97, 0x85, 0x34, 0x72, 0xcd, + 0xf0, 0x86, 0xda, 0x06, 0xee, 0x8e, 0x9c, 0xbe, 0xdf, 0x17, 0x61, 0xcb, + 0xf0, 0xe7, 0xa1, 0xb3, 0x97, 0xe6, 0x0b, 0xfb, 0x47, 0x2f, 0x46, 0x6c, + 0xe5, 0xff, 0xe5, 0xbe, 0xdf, 0xc9, 0xa8, 0x18, 0x01, 0xcb, 0x4b, 0xa7, + 0xc4, 0xa0, 0xdd, 0x72, 0x8b, 0x2d, 0xc2, 0x26, 0xb1, 0x36, 0x85, 0x96, + 0x20, 0xb6, 0x89, 0x3f, 0x86, 0xcd, 0xf3, 0xa2, 0x8c, 0x39, 0x7b, 0x5c, + 0x1c, 0x07, 0x2f, 0x6f, 0x02, 0x72, 0xff, 0x3f, 0xa2, 0x6d, 0x23, 0x0e, + 0x52, 0xa7, 0x9f, 0xd1, 0xcb, 0xfd, 0x12, 0x1c, 0xe7, 0xd8, 0x72, 0xff, + 0xf9, 0x3a, 0xeb, 0x81, 0x0c, 0xd2, 0x8d, 0xce, 0x72, 0xff, 0xfb, 0xda, + 0x0e, 0xf1, 0x15, 0xeb, 0x6e, 0x33, 0x9c, 0xbe, 0x10, 0xe2, 0xa7, 0x2f, + 0x77, 0xf6, 0x1c, 0xa9, 0x27, 0x97, 0x84, 0x48, 0xe5, 0xb2, 0x3e, 0x99, + 0x69, 0x43, 0xca, 0x5f, 0x91, 0x5f, 0xde, 0xd4, 0xd0, 0x33, 0x9c, 0xbf, + 0x0a, 0xa9, 0x9a, 0x39, 0x7e, 0x6d, 0xfc, 0xeb, 0x39, 0x7f, 0xf6, 0x36, + 0xe0, 0xc5, 0xf5, 0xc1, 0xa3, 0x97, 0xfe, 0xd3, 0xf3, 0x02, 0xe1, 0xc5, + 0x4e, 0x52, 0x23, 0x47, 0xa4, 0xe2, 0x51, 0xe4, 0x4b, 0xa3, 0xa7, 0x2c, + 0x13, 0x94, 0xc3, 0x4e, 0x22, 0xd7, 0xc2, 0x1f, 0x8a, 0x9c, 0xbf, 0xb3, + 0x4d, 0xb8, 0xce, 0x72, 0xb0, 0xfc, 0xdc, 0x80, 0x49, 0x6f, 0xdb, 0xff, + 0x4e, 0xb3, 0x97, 0xca, 0xe8, 0x30, 0x72, 0xa0, 0xf3, 0x3f, 0x29, 0xbc, + 0xc4, 0xd1, 0xcb, 0xfe, 0xc1, 0x79, 0x6a, 0x4d, 0xce, 0x72, 0xfa, 0x5a, + 0x41, 0x39, 0x68, 0x91, 0xed, 0xf2, 0x75, 0x7f, 0x9f, 0x72, 0x85, 0xa2, + 0xce, 0x54, 0x2b, 0x40, 0xc8, 0xc0, 0x12, 0x1a, 0xbd, 0x78, 0x72, 0x21, + 0x77, 0xfc, 0xa2, 0xff, 0xf2, 0xaf, 0x9c, 0xfb, 0xd1, 0x9c, 0x51, 0x67, + 0x2f, 0xf0, 0xe6, 0xbc, 0xee, 0x27, 0x29, 0x53, 0xfc, 0xe2, 0x99, 0x7f, + 0xff, 0xe4, 0xde, 0xe1, 0x4f, 0x20, 0xff, 0x2c, 0xd0, 0x7f, 0x7d, 0xc8, + 0xe5, 0xff, 0xfc, 0x38, 0xae, 0x0f, 0xcd, 0x7b, 0xb8, 0xc5, 0x20, 0x07, + 0x2a, 0x11, 0x97, 0x8d, 0xd7, 0xfb, 0xf7, 0xd2, 0x4c, 0x8d, 0x9c, 0xa4, + 0x4d, 0x1b, 0xb0, 0xf0, 0x12, 0x1b, 0xdd, 0x81, 0x39, 0x7b, 0x9f, 0x30, + 0xe5, 0x2c, 0xdc, 0xb8, 0xdd, 0xfa, 0x70, 0xed, 0x1b, 0x39, 0x7f, 0x94, + 0x7e, 0x29, 0x32, 0x36, 0x72, 0xff, 0x7f, 0xb9, 0xd9, 0x19, 0xe3, 0x97, + 0xfd, 0xa8, 0x60, 0x7b, 0x02, 0xb3, 0x97, 0x20, 0xe1, 0xf6, 0xaa, 0x6b, + 0x50, 0x8d, 0x00, 0xc2, 0x92, 0xf4, 0xbf, 0xd1, 0xcb, 0xf8, 0x2f, 0xb0, + 0x34, 0xc3, 0x97, 0xba, 0xa7, 0x13, 0x97, 0xfd, 0x0c, 0x1c, 0x5e, 0xd0, + 0x07, 0x2f, 0xc1, 0x7d, 0x6b, 0x0e, 0x54, 0x8f, 0xfb, 0x44, 0x1f, 0x9b, + 0xdf, 0xf4, 0x4b, 0x13, 0x5a, 0xfe, 0x0e, 0x5f, 0xfb, 0xd0, 0xce, 0x56, + 0x9c, 0xe6, 0xce, 0x5f, 0xbb, 0x9b, 0x4d, 0x1c, 0xbc, 0x29, 0x2e, 0x4f, + 0x9f, 0xc8, 0x17, 0xfe, 0x7c, 0x04, 0x0b, 0x87, 0x15, 0x39, 0x53, 0xa6, + 0x1d, 0x28, 0x4f, 0x80, 0xce, 0xff, 0x3f, 0x3a, 0xf7, 0xb1, 0xac, 0xe5, + 0xcc, 0x91, 0xcb, 0xfe, 0x7c, 0x58, 0x73, 0x60, 0x43, 0x97, 0x26, 0xc2, + 0x79, 0xdd, 0x17, 0xbf, 0xe8, 0x96, 0x86, 0x00, 0xec, 0x39, 0x7e, 0xf4, + 0x60, 0xac, 0xe5, 0xf7, 0x3e, 0x86, 0x1c, 0xa5, 0x4f, 0x27, 0x92, 0x6b, + 0xfe, 0x92, 0x9e, 0x4e, 0xa0, 0xf8, 0xe5, 0xff, 0xe8, 0xce, 0x7d, 0xd8, + 0xf0, 0xc0, 0x34, 0x72, 0xe8, 0x01, 0xcb, 0xba, 0xc3, 0x94, 0xb3, 0x5b, + 0xa1, 0x6a, 0x44, 0x7a, 0x39, 0x27, 0x8e, 0x7f, 0x76, 0xbd, 0x3a, 0x6c, + 0xe5, 0xfd, 0xfe, 0xbd, 0xac, 0xf1, 0xcb, 0xfb, 0xfe, 0x1d, 0x26, 0x46, + 0xce, 0x5d, 0x9d, 0x39, 0x79, 0xb6, 0xdb, 0x29, 0x7f, 0xfb, 0xc9, 0xed, + 0x75, 0x1a, 0x29, 0xb8, 0x91, 0x4f, 0xa6, 0x82, 0x95, 0x4c, 0x59, 0x07, + 0x5c, 0xbf, 0xc6, 0xbf, 0x9b, 0x5f, 0xff, 0xf2, 0x7a, 0x50, 0x39, 0xee, + 0xa6, 0x7a, 0x18, 0x9b, 0x91, 0xca, 0x93, 0x20, 0x50, 0x2d, 0xb8, 0x40, + 0xb8, 0x7d, 0x72, 0x4e, 0x83, 0xd3, 0x42, 0xb7, 0x71, 0x9f, 0x30, 0xdf, + 0xb0, 0x85, 0x01, 0x68, 0xc6, 0xe9, 0xe8, 0xd4, 0xb8, 0xa5, 0xdf, 0xf7, + 0x32, 0xd6, 0xb0, 0x2f, 0xe3, 0x96, 0xc3, 0x97, 0xdb, 0x17, 0xe2, 0x72, + 0xa0, 0xfb, 0x55, 0x3a, 0x41, 0x0b, 0xc0, 0xd6, 0x1c, 0xb3, 0x9c, 0xbd, + 0x1d, 0xd1, 0xca, 0xe4, 0xd6, 0x20, 0x85, 0xff, 0xa1, 0x7f, 0x30, 0x63, + 0xfe, 0x1f, 0x47, 0x2f, 0xff, 0xe7, 0xf2, 0x75, 0xd9, 0xf3, 0x35, 0x19, + 0xbc, 0x13, 0x97, 0xff, 0x69, 0xf9, 0xd6, 0xb0, 0x40, 0xd3, 0x0e, 0x5f, + 0xfe, 0x45, 0xea, 0x1a, 0x67, 0xa5, 0x2c, 0xd1, 0xca, 0xda, 0x6a, 0x0c, + 0x21, 0x14, 0x5f, 0x2c, 0xf1, 0x46, 0xbe, 0xdf, 0x70, 0x4e, 0x52, 0x1f, + 0x6b, 0xa6, 0x5f, 0xc3, 0xf1, 0x4d, 0x46, 0x1c, 0xbe, 0xf4, 0x72, 0xd9, + 0xca, 0x5a, 0xa7, 0x8e, 0xca, 0x05, 0x01, 0x03, 0x65, 0xf7, 0xff, 0xef, + 0x7e, 0xa7, 0x86, 0x00, 0xfe, 0x02, 0x83, 0x23, 0x97, 0x37, 0xd3, 0x97, + 0xff, 0xa0, 0x56, 0xa6, 0xdc, 0x09, 0xee, 0xc1, 0xcb, 0xf9, 0x9f, 0x3b, + 0x80, 0x73, 0x97, 0xf3, 0x7a, 0xcc, 0x19, 0xce, 0x56, 0x1e, 0xea, 0x17, + 0xdf, 0x46, 0xa3, 0x89, 0xcb, 0xff, 0xa0, 0x5f, 0xd2, 0x85, 0x5d, 0xbf, + 0x1c, 0xae, 0x9f, 0x3f, 0xe4, 0x77, 0xbe, 0x3a, 0xce, 0x54, 0x27, 0xbc, + 0xb5, 0x80, 0x0c, 0x6a, 0x14, 0xde, 0x84, 0x3f, 0x01, 0x1d, 0xf3, 0x14, + 0x81, 0x39, 0x7c, 0x81, 0xc6, 0x1c, 0xbe, 0x77, 0x10, 0x1c, 0xb3, 0x70, + 0x78, 0x2a, 0x90, 0xdd, 0xfb, 0x0e, 0x5f, 0xe6, 0xde, 0x6c, 0x94, 0x35, + 0x9c, 0xa4, 0x3f, 0x8e, 0x94, 0xe8, 0x62, 0xff, 0xd0, 0x8c, 0xef, 0x2e, + 0xd7, 0xed, 0x1c, 0xbf, 0xd0, 0xfb, 0xeb, 0x6e, 0x12, 0x97, 0x36, 0xd9, + 0x4a, 0x09, 0xe6, 0x36, 0x67, 0x7b, 0xc8, 0xd6, 0x53, 0xe9, 0xa3, 0xbf, + 0xb9, 0x5a, 0x6b, 0xa8, 0x72, 0xfb, 0xf9, 0x7f, 0xe3, 0x94, 0x8a, 0x8f, + 0xa6, 0x86, 0xdb, 0x0b, 0xb5, 0x0b, 0x1f, 0x18, 0xb4, 0x2e, 0xbe, 0xde, + 0x3b, 0x59, 0xcb, 0x9b, 0xd1, 0xcb, 0x61, 0xcb, 0x73, 0x86, 0xa3, 0xc3, + 0x17, 0xdc, 0xcb, 0x84, 0xe4, 0xe5, 0xff, 0xda, 0xd0, 0x46, 0x03, 0xd8, + 0xf6, 0x8e, 0x54, 0x22, 0x57, 0x09, 0xff, 0x2a, 0xbf, 0xdd, 0x47, 0x97, + 0x92, 0x73, 0x97, 0xfe, 0xf2, 0x6d, 0xc1, 0xc1, 0xec, 0xe9, 0xcb, 0xfe, + 0x46, 0xc7, 0x3c, 0x9f, 0x80, 0xe5, 0xf9, 0x36, 0x18, 0x9c, 0xe5, 0xfe, + 0x7d, 0xfb, 0x42, 0x8a, 0x9c, 0xbf, 0xfd, 0xac, 0x57, 0x3f, 0xdb, 0x86, + 0x3b, 0x07, 0x2a, 0x49, 0xc0, 0xf2, 0x5e, 0x86, 0x6d, 0x68, 0x3d, 0x39, + 0x72, 0x8d, 0x19, 0xdf, 0xff, 0xf9, 0xd3, 0xd1, 0xd1, 0xcf, 0x75, 0x14, + 0x94, 0x71, 0x41, 0x01, 0xcb, 0xf2, 0xf1, 0x91, 0xa3, 0x95, 0xd4, 0x49, + 0x3b, 0x5d, 0xec, 0x4d, 0x9c, 0xbf, 0xd2, 0x46, 0x77, 0x97, 0x6b, 0x39, + 0x7c, 0xfb, 0x89, 0x1c, 0xbf, 0xe7, 0xe7, 0xe7, 0x3a, 0xc1, 0x54, 0xe5, + 0x4e, 0x8b, 0x0e, 0x46, 0xd8, 0x6f, 0xe2, 0x1b, 0xee, 0xb5, 0xa3, 0x0e, + 0x5e, 0x18, 0x01, 0xcb, 0xd0, 0xcc, 0xf8, 0x78, 0x1a, 0x25, 0xbf, 0xf4, + 0x73, 0xd8, 0x62, 0xfa, 0x93, 0x1c, 0xa8, 0x4f, 0x17, 0x21, 0xa4, 0x8f, + 0xfb, 0x34, 0xbf, 0x84, 0x3a, 0xd2, 0x30, 0xe5, 0xf9, 0x6f, 0x3e, 0x36, + 0x72, 0xfd, 0x1b, 0x0e, 0x09, 0xca, 0xc3, 0xfc, 0x12, 0xdf, 0x14, 0xdf, + 0xa1, 0xa2, 0x77, 0xf3, 0x97, 0xff, 0x40, 0x23, 0xac, 0x17, 0x57, 0xa8, + 0x72, 0xdc, 0x31, 0xcb, 0xfb, 0xb0, 0x2d, 0xbf, 0x27, 0x2f, 0xfc, 0x33, + 0x46, 0x0c, 0xf9, 0xcf, 0x8e, 0x50, 0x4f, 0xb5, 0xcb, 0xaf, 0x2a, 0xa3, + 0x0e, 0x5f, 0xfc, 0x81, 0xec, 0x2e, 0x00, 0xe2, 0x03, 0x97, 0xe7, 0xd4, + 0xe9, 0xb3, 0x97, 0xff, 0xf9, 0xc7, 0x99, 0x7d, 0x6f, 0x13, 0x8e, 0x0e, + 0x05, 0xe4, 0x78, 0xbd, 0x54, 0x14, 0x4c, 0x30, 0xa2, 0xfc, 0xaf, 0x9d, + 0xc4, 0xe5, 0xe1, 0xfe, 0x73, 0x94, 0xe7, 0x8b, 0xe2, 0x7a, 0x44, 0x44, + 0x8b, 0x45, 0x42, 0xae, 0x10, 0x96, 0xec, 0xa9, 0x88, 0x6f, 0x08, 0x31, + 0x21, 0xd0, 0xff, 0xf1, 0xb1, 0xdc, 0xd4, 0x35, 0x67, 0x2f, 0x24, 0x6c, + 0xe5, 0x70, 0xc6, 0xf3, 0xa4, 0x37, 0xff, 0x6d, 0x19, 0x0d, 0x63, 0x8c, + 0xe6, 0x0e, 0x54, 0x8f, 0xb2, 0x62, 0x6b, 0xe4, 0x17, 0x09, 0xcb, 0xd3, + 0xb1, 0x0e, 0x50, 0x4d, 0xe8, 0x90, 0x5f, 0xa5, 0x9c, 0x62, 0x47, 0x2f, + 0x66, 0xe0, 0xe5, 0x72, 0x8c, 0x44, 0x60, 0xd9, 0x07, 0x4a, 0x6e, 0x19, + 0x8e, 0x5f, 0xc9, 0xce, 0xbb, 0x8b, 0x39, 0x7f, 0xfd, 0x9e, 0xd6, 0x4d, + 0xd8, 0xe3, 0x9d, 0xec, 0x1c, 0xbf, 0xff, 0xff, 0x26, 0x73, 0xa4, 0xc6, + 0xfe, 0x67, 0x32, 0xd2, 0x7b, 0x49, 0xc8, 0x43, 0xfc, 0xe7, 0x2f, 0xff, + 0xc8, 0x21, 0xf8, 0xa7, 0x93, 0x4e, 0x83, 0xfc, 0x8e, 0x5f, 0x3c, 0xfd, + 0x43, 0x95, 0x89, 0xcc, 0xcc, 0x2e, 0x25, 0xde, 0x51, 0xe3, 0x08, 0xa6, + 0x8a, 0xf7, 0xbf, 0xdc, 0x8e, 0x5f, 0xcf, 0xe0, 0x28, 0x32, 0x39, 0x7f, + 0xa4, 0xa4, 0x08, 0xfe, 0xc3, 0x95, 0xf1, 0x10, 0x13, 0x8f, 0x39, 0x75, + 0xfe, 0x89, 0x27, 0xd6, 0xdb, 0x6c, 0xa5, 0xd9, 0xd3, 0x97, 0x95, 0xc0, + 0x9c, 0xbf, 0xba, 0xfb, 0x5c, 0x78, 0xe5, 0xce, 0x13, 0x97, 0xf6, 0xdf, + 0x5d, 0x79, 0x1c, 0xb7, 0x27, 0x2e, 0x46, 0xce, 0x5c, 0xa0, 0x0e, 0x54, + 0xc6, 0xbc, 0x02, 0xf7, 0xa4, 0xe1, 0x39, 0x73, 0x6d, 0x9c, 0xa9, 0x23, + 0x6f, 0x05, 0x96, 0x5a, 0x88, 0x3a, 0x22, 0x6c, 0x72, 0xf7, 0x94, 0x01, + 0x4f, 0xa7, 0xad, 0x7f, 0xdd, 0xc6, 0x20, 0x67, 0xff, 0x47, 0x2f, 0xf9, + 0x03, 0x8c, 0x49, 0x91, 0xb3, 0x97, 0xff, 0x9c, 0x39, 0x82, 0xae, 0xb5, + 0x82, 0x03, 0x97, 0xdd, 0xfd, 0xd5, 0x84, 0x40, 0xb0, 0xe6, 0xf0, 0xc7, + 0x4e, 0x5f, 0xff, 0xd2, 0x7d, 0x6a, 0x32, 0x7f, 0xe4, 0x1d, 0x8b, 0xb6, + 0x72, 0xd0, 0x14, 0x59, 0xaa, 0x76, 0x83, 0x75, 0xa4, 0xe9, 0x3d, 0x1b, + 0x7d, 0xfc, 0x8c, 0x5e, 0x0a, 0xce, 0x5f, 0x3c, 0xfa, 0xe9, 0xca, 0xd9, + 0xe7, 0xe8, 0xb2, 0xbe, 0x2e, 0x00, 0xc8, 0x58, 0x23, 0xbc, 0xc6, 0xbc, + 0x91, 0xea, 0xf9, 0xe6, 0xfd, 0xc5, 0x4e, 0xa7, 0x8e, 0x5f, 0xf6, 0x7b, + 0xb1, 0xbf, 0x62, 0xce, 0x5e, 0x8d, 0xcc, 0x72, 0xa1, 0x90, 0x13, 0x91, + 0xeb, 0x24, 0x38, 0x3a, 0x64, 0xf3, 0x87, 0x20, 0x68, 0x12, 0xb6, 0x87, + 0x17, 0xb4, 0xf3, 0x1c, 0xbf, 0xfd, 0x9c, 0xe7, 0x18, 0x08, 0xe7, 0xb0, + 0x07, 0x2e, 0x50, 0x07, 0x2b, 0x67, 0xc4, 0x04, 0xab, 0xff, 0x90, 0x2f, + 0xe4, 0xd6, 0x4b, 0x3a, 0x72, 0xe7, 0xe0, 0x39, 0x6c, 0xe9, 0xed, 0xf9, + 0x0a, 0xb9, 0x4c, 0x8f, 0x6f, 0xe2, 0xfb, 0x78, 0x57, 0xc0, 0x72, 0xff, + 0xfe, 0xe7, 0x42, 0xfa, 0xee, 0x4b, 0x3a, 0x9b, 0xeb, 0x9c, 0xbe, 0xce, + 0x67, 0xe2, 0x72, 0xff, 0x84, 0x38, 0x3f, 0xcb, 0x34, 0x72, 0xfd, 0x1c, + 0xeb, 0xf0, 0x1c, 0xbf, 0xca, 0x78, 0x72, 0x74, 0xd9, 0xcb, 0xef, 0x26, + 0x90, 0xe5, 0x62, 0x6a, 0xc8, 0x3f, 0xb5, 0xa7, 0x26, 0x01, 0xc0, 0x95, + 0x7e, 0x69, 0x7f, 0xf4, 0xf0, 0xa0, 0x3f, 0x94, 0x9f, 0xbf, 0x9c, 0xbf, + 0xee, 0xa0, 0x53, 0x87, 0x81, 0x43, 0x97, 0xf9, 0xe5, 0x81, 0xde, 0xb4, + 0x72, 0xfa, 0x31, 0x40, 0x9c, 0xbf, 0xca, 0xa7, 0x9f, 0xad, 0xb5, 0x9c, + 0xbf, 0xd9, 0x37, 0x73, 0x4e, 0x27, 0x2f, 0xfc, 0x1c, 0xe6, 0x5a, 0xf6, + 0x9c, 0x07, 0x2b, 0x67, 0xe5, 0xf9, 0x95, 0xff, 0xc8, 0xcf, 0x8b, 0xea, + 0x75, 0x69, 0xa3, 0x97, 0xfb, 0x25, 0x9f, 0xf0, 0xee, 0x27, 0x2b, 0x67, + 0xfb, 0xd4, 0x6b, 0xff, 0xfc, 0x83, 0x9c, 0xf9, 0x57, 0xf7, 0x63, 0xb9, + 0xc5, 0xe4, 0x72, 0x82, 0xa8, 0x8d, 0x66, 0x68, 0x45, 0xb8, 0x55, 0x7a, + 0x14, 0x1c, 0x48, 0xae, 0x18, 0x39, 0x7f, 0xc1, 0x4d, 0xc7, 0x10, 0x6a, + 0x47, 0x2e, 0x86, 0x1c, 0xa8, 0x3d, 0x1e, 0x9d, 0xd7, 0x51, 0x0f, 0xe6, + 0x6b, 0xff, 0x46, 0x9f, 0xa8, 0x15, 0xa4, 0xe7, 0x2a, 0x15, 0xd5, 0x64, + 0xa5, 0xe7, 0x87, 0x5f, 0xe4, 0x77, 0xa0, 0x7c, 0x72, 0xff, 0xfa, 0x37, + 0x9c, 0x53, 0xc0, 0xfc, 0x74, 0x81, 0x39, 0x7f, 0x93, 0xa9, 0xb9, 0x4d, + 0x07, 0x2f, 0xff, 0xc9, 0xfa, 0xd4, 0xe4, 0x0f, 0xa7, 0xda, 0x72, 0x03, + 0x97, 0xcf, 0xb8, 0x91, 0xcb, 0xff, 0xf9, 0x05, 0xd0, 0x41, 0xb8, 0xeb, + 0xa7, 0xa3, 0xa7, 0x28, 0x4f, 0xdf, 0xc4, 0x37, 0xe4, 0xf6, 0xbf, 0x9c, + 0xe5, 0xff, 0xe1, 0x40, 0x7b, 0x95, 0xa6, 0xd4, 0x80, 0x9c, 0xbf, 0xee, + 0xa8, 0x1f, 0xfd, 0xa0, 0x41, 0xca, 0x84, 0x43, 0xba, 0x5d, 0x05, 0x3c, + 0x34, 0x86, 0x83, 0x08, 0x7d, 0x0b, 0x1b, 0xf6, 0xff, 0x5f, 0x60, 0xe5, + 0xfd, 0xb9, 0xa4, 0x9e, 0xd1, 0xcb, 0x0c, 0x1e, 0xc6, 0x14, 0xdf, 0xe9, + 0x9e, 0x67, 0xe6, 0x5a, 0x39, 0x7f, 0x3c, 0xe9, 0x32, 0x36, 0x72, 0xff, + 0xff, 0x3b, 0x7e, 0xce, 0xfc, 0x0e, 0x4d, 0x27, 0xdc, 0xfd, 0xfc, 0xe5, + 0x62, 0x33, 0x1c, 0xd8, 0x4b, 0xef, 0xe9, 0xf0, 0x67, 0xc6, 0xce, 0x5f, + 0xf4, 0x4e, 0xa4, 0xbb, 0xfb, 0xce, 0x72, 0xb0, 0xfb, 0x36, 0x5f, 0x6e, + 0x18, 0xe5, 0xfa, 0x37, 0xbc, 0xe9, 0xcb, 0xf8, 0x5d, 0x58, 0x64, 0x1c, + 0xae, 0x10, 0xfa, 0x64, 0x2d, 0xf9, 0x3d, 0xf4, 0x4e, 0xaa, 0xa7, 0x2f, + 0xff, 0xc8, 0xb8, 0x66, 0x9f, 0x78, 0xcf, 0xd6, 0xf2, 0x39, 0x72, 0x71, + 0x39, 0x6e, 0x9c, 0xa9, 0x1f, 0xf3, 0x5a, 0xaf, 0xe3, 0x17, 0x83, 0x0c, + 0x39, 0x7f, 0xb0, 0x19, 0x34, 0x73, 0xa3, 0x95, 0x07, 0xa1, 0x83, 0x97, + 0xf7, 0x5e, 0x51, 0xa9, 0x1c, 0xbf, 0xec, 0xea, 0x73, 0xae, 0xff, 0xa3, + 0x97, 0x60, 0xac, 0xfa, 0x00, 0x5b, 0x7f, 0x0b, 0x80, 0x38, 0x27, 0x2f, + 0xc8, 0xd3, 0x36, 0xa9, 0xcb, 0x95, 0x91, 0xcb, 0xf7, 0x53, 0x8a, 0x2c, + 0xe5, 0xd9, 0xd9, 0x1e, 0x0a, 0xc6, 0x29, 0x88, 0x98, 0x68, 0xd7, 0x79, + 0xb6, 0xdb, 0x29, 0x7f, 0xed, 0x8f, 0xee, 0xa6, 0x4d, 0x0c, 0x39, 0xf4, + 0xd0, 0x5f, 0xba, 0x93, 0x23, 0x67, 0x2c, 0xb3, 0x95, 0x08, 0x8c, 0xc5, + 0x2d, 0x94, 0xdf, 0xe8, 0x0e, 0x4a, 0x05, 0x67, 0x2a, 0x19, 0x22, 0xf3, + 0x8d, 0xc9, 0x47, 0x23, 0xf6, 0x6b, 0x84, 0xfc, 0xd0, 0xf1, 0xdc, 0x26, + 0x59, 0x08, 0xae, 0x9a, 0xbc, 0x28, 0xc6, 0x10, 0x7a, 0x84, 0x47, 0x8b, + 0x3f, 0x86, 0x1b, 0x70, 0xd1, 0x50, 0xba, 0xfb, 0x7b, 0xce, 0x9c, 0xbf, + 0xba, 0x9c, 0x1c, 0x1f, 0xaa, 0x72, 0xa0, 0xf6, 0x16, 0x45, 0x6e, 0x1c, + 0xe5, 0x90, 0xe5, 0xff, 0x7a, 0x37, 0xae, 0xc0, 0xf8, 0xe5, 0xb8, 0x73, + 0x97, 0xfd, 0xe8, 0xde, 0xbb, 0x03, 0xe3, 0x97, 0x6a, 0x0e, 0x5e, 0x60, + 0x60, 0xe5, 0xfe, 0x1f, 0x3c, 0xda, 0x8f, 0x1c, 0xa4, 0x3c, 0xf7, 0x1c, + 0xbe, 0x47, 0xc5, 0x9c, 0xbf, 0xf6, 0x71, 0x1c, 0xd4, 0xc3, 0x01, 0x39, + 0x7c, 0xb0, 0xc4, 0xe7, 0x2e, 0x04, 0x1c, 0xbd, 0xa4, 0xd9, 0xca, 0xc3, + 0xd5, 0x01, 0x1f, 0x85, 0xaf, 0xf4, 0xb0, 0x50, 0x38, 0x27, 0x2f, 0x7b, + 0x5f, 0x61, 0x3e, 0x5c, 0x16, 0x98, 0xe3, 0xac, 0xa0, 0x20, 0x12, 0x0d, + 0x42, 0x53, 0xc5, 0xd7, 0x6a, 0x0e, 0x5e, 0x60, 0x60, 0xe5, 0xfe, 0x1f, + 0x3c, 0xda, 0x8f, 0x1c, 0xa4, 0x3c, 0xf7, 0x1c, 0xbe, 0x47, 0xc5, 0x9c, + 0xbf, 0xf6, 0x71, 0x1c, 0xd4, 0xc3, 0x01, 0x39, 0x7c, 0xb0, 0xc4, 0xe7, + 0x2f, 0xe9, 0x80, 0x8d, 0x6f, 0x31, 0xcb, 0x81, 0x07, 0x2f, 0x69, 0x36, + 0x72, 0xb1, 0x10, 0xeb, 0x23, 0x01, 0x97, 0x85, 0xaf, 0xf4, 0xb0, 0x50, + 0x38, 0x27, 0x2f, 0xe1, 0x70, 0xe2, 0xbf, 0x61, 0x72, 0x8c, 0x22, 0xd8, + 0x20, 0xb9, 0x43, 0xb3, 0x42, 0x27, 0xac, 0xa0, 0x20, 0x12, 0x0d, 0x43, + 0x1b, 0xc7, 0x97, 0xff, 0x6e, 0x39, 0xd0, 0xc3, 0x33, 0x9f, 0x1c, 0xbf, + 0xff, 0x38, 0x73, 0x05, 0x55, 0x06, 0x06, 0x74, 0xd9, 0xcb, 0xcf, 0xb9, + 0xcf, 0x20, 0x92, 0xfa, 0x59, 0xcc, 0x8f, 0x20, 0x92, 0xf6, 0x90, 0x27, + 0x90, 0x49, 0x73, 0x6d, 0x9e, 0x41, 0x25, 0x2d, 0x15, 0x33, 0x15, 0x78, + 0xc1, 0xb2, 0x9b, 0x9f, 0xc5, 0x90, 0x48, 0xfa, 0x6f, 0xef, 0xec, 0xee, + 0x60, 0xaa, 0x72, 0xf3, 0x88, 0x3e, 0x2f, 0xb4, 0x44, 0xe6, 0x26, 0xe1, + 0x82, 0xc4, 0x51, 0x8c, 0xf3, 0xc6, 0xd7, 0xcd, 0x31, 0xfa, 0x72, 0xd8, + 0xd6, 0x8a, 0x00, 0x3e, 0xda, 0x47, 0x2f, 0xe9, 0x7f, 0x3f, 0x92, 0x72, + 0x97, 0xce, 0x1e, 0xe1, 0xcb, 0xff, 0x76, 0x3c, 0x83, 0x0c, 0x8d, 0x1c, + 0xa5, 0x4f, 0x77, 0x44, 0x35, 0x32, 0x2c, 0x7b, 0x08, 0xeb, 0xfe, 0x81, + 0x90, 0xc0, 0x1d, 0x87, 0x2d, 0x07, 0x2f, 0xf2, 0x4b, 0xf7, 0xd7, 0x50, + 0xe5, 0xfd, 0x9c, 0x5d, 0x99, 0xd3, 0x96, 0x91, 0x4b, 0xcf, 0xb9, 0xca, + 0x51, 0x4a, 0x83, 0x72, 0xb1, 0x16, 0x0e, 0xde, 0x80, 0x2c, 0xa7, 0xd3, + 0x5b, 0x4c, 0x46, 0x10, 0xc2, 0x52, 0xa1, 0x31, 0xcc, 0x87, 0xad, 0xfb, + 0x60, 0x62, 0x68, 0xe5, 0xfc, 0xa0, 0xcb, 0x5d, 0x09, 0xcc, 0x35, 0x17, + 0xdf, 0xbe, 0xe4, 0x72, 0xcc, 0x39, 0x76, 0x48, 0x26, 0xd2, 0x62, 0x3b, + 0xff, 0xb3, 0x9f, 0x69, 0x06, 0x00, 0xec, 0x39, 0x7d, 0x93, 0x23, 0x0e, + 0x54, 0xe7, 0xca, 0xda, 0x1d, 0xfc, 0xb8, 0x9a, 0x50, 0x02, 0x96, 0x43, + 0x97, 0xfd, 0x3f, 0xf2, 0x0f, 0x7f, 0x71, 0x39, 0x7f, 0x24, 0x32, 0x7c, + 0x6c, 0xe5, 0xfb, 0x27, 0x66, 0x30, 0xe5, 0xed, 0x26, 0xce, 0x50, 0x9e, + 0x27, 0x8a, 0x2f, 0xe1, 0x70, 0x03, 0xfd, 0x1c, 0xbf, 0x91, 0x55, 0x21, + 0x9f, 0x42, 0x98, 0x6e, 0x08, 0x6c, 0xf3, 0x4e, 0x5e, 0x21, 0xac, 0x4f, + 0x3d, 0x09, 0x06, 0x33, 0xbb, 0xe1, 0xc9, 0xff, 0x39, 0x7f, 0xd9, 0xef, + 0x83, 0x80, 0x53, 0x93, 0x95, 0x25, 0xe2, 0xd0, 0x95, 0xe4, 0x30, 0x95, + 0x29, 0xd9, 0xb7, 0x63, 0x2c, 0x02, 0x78, 0xb9, 0x6a, 0x53, 0x0f, 0x8d, + 0x1a, 0x11, 0xdf, 0xff, 0xa7, 0xde, 0xf0, 0x2e, 0xce, 0xbf, 0x86, 0x26, + 0x39, 0x7f, 0xff, 0xfb, 0xfd, 0xff, 0x30, 0xb8, 0x35, 0xac, 0x57, 0x3f, + 0xdb, 0x86, 0x3b, 0x07, 0x2f, 0xfb, 0xeb, 0x1c, 0x3d, 0x81, 0xfc, 0xe5, + 0xf7, 0x07, 0x7f, 0x50, 0xe5, 0xe6, 0xdb, 0x6c, 0xa5, 0xd2, 0x82, 0x9f, + 0x4d, 0x05, 0x42, 0x6f, 0x93, 0xab, 0x63, 0xdf, 0x27, 0x7b, 0x48, 0xbf, + 0xfe, 0x4f, 0x4d, 0x9b, 0xdb, 0xcd, 0x9b, 0xcf, 0x1c, 0xbf, 0x95, 0x8d, + 0xef, 0x3a, 0x72, 0xfe, 0x9e, 0x69, 0x70, 0xdb, 0x9c, 0xe5, 0xff, 0xe0, + 0x31, 0xe5, 0xf2, 0x03, 0x3b, 0x23, 0x67, 0x2f, 0x92, 0x07, 0xc7, 0x2f, + 0x4e, 0xe2, 0x72, 0xb6, 0x88, 0x9e, 0xa6, 0xf8, 0x82, 0xff, 0xca, 0xff, + 0xa9, 0x26, 0xe7, 0xfc, 0x07, 0x2f, 0x3f, 0x2d, 0x9c, 0xa5, 0x4f, 0x8b, + 0xa8, 0x97, 0xe9, 0xf6, 0x90, 0xc3, 0x97, 0xff, 0xd0, 0xa7, 0x86, 0x00, + 0xfe, 0x02, 0x83, 0x23, 0x94, 0xd5, 0x27, 0xdb, 0x90, 0xc0, 0x48, 0x49, + 0x39, 0x1f, 0x8a, 0x2f, 0x94, 0x0f, 0x50, 0xe5, 0xff, 0x9f, 0xda, 0x6f, + 0x3a, 0x07, 0xf1, 0xcb, 0xff, 0xff, 0x67, 0xa1, 0x63, 0x98, 0x31, 0x2f, + 0x75, 0xd8, 0x39, 0xc4, 0xe5, 0x4e, 0x8c, 0xb0, 0x91, 0xb6, 0x7f, 0x79, + 0x40, 0xcc, 0x72, 0xf4, 0x90, 0x4e, 0x5f, 0x4e, 0xa7, 0x03, 0x67, 0x2f, + 0xfa, 0x3a, 0xe9, 0xe9, 0x91, 0xb3, 0x97, 0xfe, 0x06, 0x6d, 0x01, 0x80, + 0xdb, 0x0e, 0x5f, 0xfe, 0x56, 0x35, 0xb8, 0xe8, 0xe7, 0xa1, 0x87, 0x2f, + 0xfb, 0x43, 0x9c, 0x52, 0x64, 0x6c, 0xe5, 0xff, 0xfd, 0xfb, 0xce, 0xbf, + 0xe7, 0xf6, 0x74, 0x73, 0xdd, 0x43, 0x97, 0xe8, 0x98, 0x7f, 0xd1, 0xca, + 0xc4, 0xc2, 0xd1, 0x27, 0xa7, 0x7e, 0x5e, 0xb9, 0x04, 0xe5, 0xfc, 0xe2, + 0x0c, 0xf2, 0xa7, 0x2a, 0x15, 0x4a, 0xce, 0x65, 0x21, 0xf7, 0x1b, 0x12, + 0x9d, 0x1c, 0xfa, 0x34, 0x9e, 0x27, 0x8d, 0x05, 0x6f, 0x87, 0xd0, 0xd0, + 0xe5, 0xf7, 0x7f, 0x64, 0x1c, 0xb9, 0xf4, 0x72, 0xef, 0xf8, 0x73, 0x94, + 0xd5, 0x1f, 0xcb, 0x91, 0x89, 0x1f, 0xe2, 0xd7, 0x3f, 0xde, 0x11, 0xf7, + 0xb7, 0x5a, 0xb8, 0x43, 0xf0, 0xd0, 0xa8, 0xe1, 0x72, 0xc6, 0xa4, 0x49, + 0xc2, 0xc7, 0xb1, 0x39, 0x37, 0x3c, 0xa4, 0x99, 0x4a, 0x1a, 0x0c, 0xbb, + 0x1c, 0xa5, 0x21, 0xab, 0x1a, 0x92, 0xe5, 0x53, 0x73, 0x28, 0x95, 0x25, + 0x51, 0x35, 0xb2, 0xcd, 0x29, 0x8b, 0x72, 0xaf, 0x99, 0x2e, 0x77, 0xb4, + 0x9f, 0x17, 0x8e, 0xa0, 0x11, 0xc3, 0xf0, 0xec, 0x43, 0x2f, 0xcf, 0x54, + 0x96, 0x0f, 0x53, 0xe8, 0x7f, 0x94, 0x55, 0xc5, 0x2d, 0xb5, 0x06, 0x92, + 0x86, 0xd4, 0x97, 0x6f, 0xc1, 0x18, 0x0d, 0xf9, 0x98, 0x8e, 0x03, 0x97, + 0xcb, 0x77, 0x59, 0xa2, 0x8a, 0x5f, 0xff, 0x9c, 0x10, 0xbe, 0xa6, 0xba, + 0x9e, 0xee, 0x09, 0xca, 0xda, 0x20, 0x44, 0xba, 0xf3, 0xcb, 0xec, 0x23, + 0x27, 0x21, 0x4f, 0x7f, 0xfe, 0x0a, 0x4c, 0x31, 0xed, 0x7b, 0x95, 0xa0, + 0xce, 0x72, 0xdf, 0x58, 0x89, 0x0d, 0x1c, 0xdf, 0xef, 0xb9, 0xb5, 0xbb, + 0xac, 0xd1, 0x74, 0x2f, 0xfe, 0xfa, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, + 0x12, 0x5a, 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x79, 0x2e, 0x7e, 0x27, 0x2d, + 0xf7, 0x0f, 0x31, 0xa1, 0xa5, 0x43, 0xf5, 0x7e, 0xcf, 0x08, 0xa9, 0x15, + 0x64, 0x27, 0x17, 0x09, 0x99, 0x8e, 0x98, 0x83, 0xd9, 0xc0, 0x41, 0xbd, + 0xf6, 0xbd, 0x4b, 0xf3, 0xf1, 0x5f, 0xe8, 0x3c, 0x61, 0x41, 0x7f, 0xfb, + 0xeb, 0x1e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x59, 0x5d, 0xff, 0x4e, + 0x5f, 0xe4, 0x0f, 0x71, 0x05, 0x53, 0x97, 0xdd, 0x7f, 0x7e, 0x72, 0xfb, + 0xb0, 0xd6, 0xc3, 0x97, 0xbf, 0x5b, 0x9c, 0xa9, 0x22, 0x5d, 0x0c, 0x9a, + 0xc8, 0xd4, 0x25, 0xbf, 0x83, 0xef, 0xde, 0x5a, 0x39, 0x7c, 0x8d, 0x71, + 0x39, 0xcb, 0xde, 0x76, 0x1c, 0xbf, 0x7f, 0xe4, 0xec, 0x1c, 0xbf, 0xf7, + 0x63, 0xa8, 0xaf, 0xb4, 0xe0, 0x39, 0x7f, 0xcf, 0x2d, 0x7f, 0xe8, 0xf6, + 0x8e, 0x5f, 0xc3, 0xed, 0xc3, 0xac, 0xe5, 0xcf, 0xa3, 0x97, 0xff, 0xe7, + 0x79, 0x3f, 0x7e, 0x64, 0xff, 0xf9, 0x3b, 0x07, 0x2a, 0x73, 0xed, 0x98, + 0x5a, 0xf9, 0x6e, 0xeb, 0x34, 0x46, 0x6b, 0xf9, 0x21, 0x93, 0xe3, 0x67, + 0x2e, 0x19, 0x1c, 0xb3, 0x0e, 0x5f, 0x93, 0x7d, 0x7f, 0xbb, 0x3d, 0x56, + 0x17, 0x28, 0x2d, 0x7f, 0x3c, 0x93, 0x6f, 0xb3, 0x97, 0xff, 0x69, 0x3f, + 0xd6, 0x0f, 0xf2, 0xcd, 0x1c, 0xbd, 0xa8, 0xe4, 0xe5, 0x4e, 0xaa, 0xf6, + 0x45, 0x01, 0x3f, 0xc3, 0xa4, 0x84, 0xce, 0xc9, 0x19, 0x08, 0x31, 0x4e, + 0xd1, 0x67, 0x91, 0x6f, 0xfb, 0x6e, 0xdf, 0x52, 0x37, 0x07, 0x2f, 0xfa, + 0x5a, 0xc8, 0xf9, 0x1a, 0x61, 0xcb, 0xee, 0x7b, 0x1a, 0x39, 0x7d, 0xa8, + 0xf6, 0x8e, 0x56, 0x1e, 0x2e, 0x88, 0xef, 0xfe, 0xf2, 0x6d, 0xc1, 0xf3, + 0x99, 0x43, 0x0e, 0x5f, 0x86, 0x25, 0xa7, 0x39, 0x48, 0x7d, 0xbc, 0x51, + 0xed, 0xd3, 0x97, 0xff, 0xff, 0x79, 0x19, 0xb4, 0xce, 0x47, 0xff, 0x47, + 0x7e, 0x71, 0x4f, 0x4d, 0x07, 0x2d, 0x98, 0x88, 0x8f, 0x08, 0xdf, 0xe7, + 0x96, 0xb4, 0xe3, 0x23, 0x97, 0xfe, 0xf3, 0x88, 0x3e, 0x29, 0x9c, 0xb6, + 0x72, 0xfb, 0xde, 0x86, 0x1c, 0xac, 0x3e, 0x55, 0x50, 0xef, 0xff, 0x7a, + 0x16, 0x9e, 0x46, 0x4d, 0xa4, 0x13, 0x97, 0xf9, 0x99, 0xb0, 0x0f, 0xe0, + 0x39, 0x69, 0x1c, 0xa4, 0x44, 0x73, 0xa4, 0xa8, 0x69, 0x7e, 0x04, 0x7a, + 0x02, 0x72, 0x91, 0x30, 0x67, 0x85, 0x87, 0xe5, 0xf7, 0xff, 0xdf, 0xfb, + 0x5c, 0xca, 0x04, 0x1a, 0xf9, 0xf8, 0x9c, 0xbd, 0x1e, 0x83, 0x94, 0x13, + 0xf0, 0xe2, 0xab, 0x7b, 0xb8, 0x27, 0x29, 0x0d, 0xff, 0xe4, 0x97, 0x76, + 0x63, 0x97, 0xfb, 0x9d, 0x0e, 0x6c, 0x30, 0x72, 0x90, 0xf2, 0xdc, 0x62, + 0xff, 0xbd, 0xac, 0xd8, 0x07, 0xf0, 0x1c, 0xbe, 0xf3, 0xf6, 0x0e, 0x5f, + 0x7b, 0xbf, 0xb4, 0x39, 0x7f, 0xb2, 0x36, 0xf2, 0x4e, 0x9c, 0xbf, 0xc8, + 0xde, 0xa3, 0xae, 0xd6, 0x72, 0xb6, 0x7c, 0xfe, 0x31, 0xae, 0x51, 0xa0, + 0x84, 0x2c, 0x84, 0x6d, 0xff, 0xe4, 0xef, 0xed, 0x61, 0xef, 0xfa, 0xe6, + 0x4e, 0x72, 0xa1, 0x39, 0x0c, 0x8c, 0x29, 0xcd, 0x6f, 0x29, 0x9c, 0x31, + 0xcb, 0xff, 0xdf, 0x81, 0x88, 0x38, 0x01, 0xc7, 0x98, 0xe5, 0xfe, 0x4e, + 0xa4, 0x0c, 0xdf, 0x9c, 0xbf, 0xc9, 0xbc, 0xc1, 0xe7, 0xc7, 0x2a, 0x0f, + 0x95, 0xcc, 0xef, 0xfd, 0xf8, 0x77, 0x9f, 0xf6, 0x19, 0x87, 0x2b, 0x13, + 0x30, 0xd9, 0x17, 0x61, 0x5d, 0xa2, 0x0b, 0xff, 0xee, 0x64, 0x9b, 0x0f, + 0x7f, 0xde, 0x2f, 0xb8, 0x72, 0xe4, 0x6c, 0xe5, 0xdc, 0x18, 0x72, 0xb4, + 0x6c, 0x3c, 0x2f, 0x7f, 0x6a, 0x3d, 0xae, 0xa1, 0xcb, 0xf0, 0xe3, 0x37, + 0x87, 0x2f, 0xb7, 0xc7, 0x02, 0x72, 0xb0, 0xfd, 0xd8, 0x5b, 0xf9, 0x35, + 0xf0, 0x13, 0x99, 0x1c, 0xbf, 0xd0, 0x3e, 0x49, 0xc6, 0x0e, 0x5f, 0xfe, + 0x4d, 0xa4, 0xf0, 0x39, 0xdd, 0xff, 0xc4, 0xe5, 0x01, 0x14, 0x02, 0x47, + 0xe3, 0x1a, 0x6a, 0xd9, 0xe4, 0x71, 0x0a, 0xf9, 0xd0, 0x24, 0x5e, 0x12, + 0x5c, 0x95, 0xb2, 0xac, 0x25, 0x79, 0x38, 0x47, 0xf9, 0xa1, 0x1d, 0xb8, + 0x55, 0xb0, 0x9f, 0xb1, 0xce, 0xbc, 0x39, 0x00, 0xd8, 0x31, 0xd8, 0x6a, + 0x36, 0x4f, 0x21, 0x71, 0x84, 0x13, 0x48, 0x4c, 0x29, 0x0c, 0xfb, 0xce, + 0xe0, 0x39, 0x7e, 0x70, 0xbb, 0xf2, 0x72, 0xef, 0x7d, 0xe9, 0xe1, 0x38, + 0xdd, 0xff, 0xff, 0xdf, 0xf3, 0x2f, 0xae, 0x3e, 0xc6, 0x68, 0x3d, 0x8d, + 0x85, 0xdd, 0xb3, 0x95, 0xf5, 0x52, 0x7e, 0x47, 0x54, 0x25, 0xf7, 0xff, + 0xbe, 0xb1, 0xe5, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x26, 0x95, 0xff, 0xef, + 0xac, 0x79, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x89, 0xc5, 0x7f, 0xe7, 0x97, + 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0xa0, 0x57, 0xda, 0x1e, 0x64, 0x72, 0xdf, + 0x58, 0x7d, 0xfe, 0x4c, 0xbf, 0x6d, 0x6e, 0xeb, 0x34, 0x5c, 0x0b, 0xf8, + 0x73, 0xcb, 0x4d, 0x1c, 0xba, 0x10, 0xe5, 0xf7, 0x7f, 0x79, 0x1c, 0xbf, + 0xc3, 0x28, 0x40, 0xe3, 0x0e, 0x56, 0x23, 0x25, 0x86, 0x9d, 0x2c, 0xf0, + 0xaf, 0xe4, 0x77, 0xe9, 0x7d, 0x57, 0x84, 0x54, 0xe5, 0x7d, 0x3f, 0xc8, + 0x4a, 0xb9, 0xc0, 0x72, 0xfd, 0x34, 0xa0, 0x64, 0x72, 0x8e, 0x56, 0x1b, + 0x31, 0x28, 0xbe, 0x80, 0x63, 0x67, 0x2e, 0x4f, 0xbb, 0x44, 0x50, 0xa4, + 0xa8, 0x3f, 0x7f, 0xd2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x12, 0x4a, 0xdf, + 0x7a, 0x88, 0x47, 0x3d, 0xb9, 0xb0, 0x1c, 0xbf, 0xcf, 0xe1, 0xc9, 0xdc, + 0x4e, 0x5c, 0xab, 0x67, 0x2f, 0xe9, 0x3e, 0xe7, 0x0c, 0x1c, 0xbf, 0xb0, + 0x5f, 0x99, 0x68, 0xe5, 0xff, 0xfb, 0xf1, 0x75, 0x7c, 0xac, 0x0c, 0xb3, + 0xa8, 0xc3, 0x97, 0xf4, 0x33, 0x78, 0x1f, 0x1c, 0xb9, 0xfe, 0x85, 0x34, + 0x05, 0x46, 0x39, 0x31, 0x98, 0x67, 0x65, 0xcc, 0x2d, 0xd2, 0xb5, 0x4e, + 0xdb, 0xd3, 0x4a, 0xb1, 0xcc, 0x59, 0xc4, 0xcb, 0x40, 0x86, 0x4e, 0xa3, + 0x6f, 0xf4, 0x66, 0x3c, 0x63, 0x6a, 0xbf, 0xf2, 0xaf, 0xf7, 0x36, 0xb7, + 0x75, 0x9a, 0x2d, 0x45, 0xff, 0x9e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, + 0x55, 0x5c, 0x8d, 0x9c, 0xa3, 0x96, 0xfa, 0xaa, 0x2e, 0xd8, 0x9b, 0xe4, + 0xce, 0x01, 0x7b, 0xfb, 0x36, 0xb7, 0x75, 0x9a, 0x22, 0x95, 0xff, 0x9d, + 0xd9, 0x9b, 0x00, 0xfe, 0x03, 0x97, 0xfe, 0x8f, 0x6b, 0x36, 0x01, 0xfc, + 0x07, 0x2f, 0x93, 0x50, 0xe7, 0x2f, 0xf0, 0xb8, 0x35, 0xec, 0x59, 0xcb, + 0x99, 0xf7, 0xa8, 0xcf, 0x13, 0xed, 0x1f, 0xf8, 0x82, 0xbe, 0xa6, 0xa4, + 0xf1, 0x84, 0x5f, 0xef, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x1a, 0x2e, 0xff, + 0xa7, 0x2f, 0xfc, 0x1c, 0x62, 0x6f, 0x35, 0x34, 0x1c, 0xbf, 0xff, 0xe7, + 0xff, 0x5d, 0xc0, 0xa8, 0xa6, 0x91, 0x4f, 0x26, 0xa6, 0x50, 0xe5, 0xff, + 0xe9, 0x91, 0x3b, 0x36, 0x7a, 0x3d, 0x01, 0x39, 0x79, 0x1d, 0xb3, 0x94, + 0x89, 0x88, 0xb5, 0x9f, 0x4c, 0xda, 0xc4, 0xab, 0xe5, 0xbb, 0xac, 0xd1, + 0x4f, 0xae, 0xf4, 0x1c, 0xad, 0x9e, 0x27, 0x8b, 0xaf, 0xfd, 0xe9, 0xa3, + 0xdd, 0x79, 0xbe, 0x61, 0xcb, 0xdf, 0xf7, 0xf3, 0x97, 0xff, 0x91, 0x83, + 0xff, 0x53, 0x79, 0xa9, 0xa0, 0xe5, 0xff, 0xdf, 0xfb, 0x7f, 0xcd, 0xa5, + 0xbc, 0xda, 0x39, 0x7f, 0xf6, 0x4d, 0xf8, 0xcf, 0xa5, 0xbc, 0xda, 0x39, + 0x7d, 0xff, 0x53, 0x67, 0x2d, 0xf5, 0xab, 0x56, 0x61, 0x11, 0x94, 0xe4, + 0x21, 0x50, 0x8b, 0xa8, 0x4e, 0x3e, 0x29, 0x5e, 0x4a, 0x68, 0x91, 0x7f, + 0xfb, 0xeb, 0x1e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x6a, 0x5f, 0xd9, + 0xb5, 0xbb, 0xac, 0xd1, 0x5d, 0xaf, 0xff, 0x67, 0x02, 0x79, 0x25, 0xf0, + 0x63, 0xda, 0x39, 0x47, 0x2e, 0x6f, 0xef, 0x4f, 0x61, 0xb4, 0xda, 0xfa, + 0x8c, 0x34, 0x84, 0x8d, 0xed, 0x43, 0x0e, 0x5c, 0xc1, 0x39, 0x7c, 0xb7, + 0x75, 0x9a, 0x2b, 0xe5, 0xe6, 0xdb, 0x6c, 0xa5, 0x84, 0xa7, 0xd3, 0x41, + 0x5b, 0x3f, 0x06, 0x27, 0x5e, 0x94, 0x72, 0x72, 0xf4, 0xd9, 0xd3, 0x97, + 0xfe, 0xce, 0xb6, 0xfe, 0xd4, 0x64, 0xe7, 0x2d, 0xe3, 0x97, 0xfc, 0x9b, + 0xc9, 0xd2, 0x58, 0x13, 0x95, 0xb3, 0xc9, 0x71, 0x1b, 0xf7, 0x3c, 0x1d, + 0xfd, 0x43, 0x96, 0xd9, 0xca, 0x39, 0x48, 0x5e, 0x6c, 0x46, 0xe9, 0xd5, + 0x39, 0x5d, 0x37, 0x0e, 0x3f, 0x6f, 0xb0, 0xa9, 0x2a, 0x71, 0xcc, 0x84, + 0x34, 0xc4, 0x4e, 0x3a, 0x23, 0xba, 0x84, 0x47, 0xe4, 0x2d, 0x21, 0x07, + 0x7f, 0xfb, 0xeb, 0x1e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x7b, 0x5f, + 0x47, 0x03, 0xf2, 0x72, 0xf2, 0x08, 0x0e, 0x57, 0x4f, 0x03, 0x89, 0x2d, + 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0xe1, 0x5b, 0xec, 0x1e, 0xc6, 0x12, 0x5f, + 0xfd, 0xf5, 0xe5, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x24, 0xf5, 0x43, 0x2d, + 0x8a, 0x78, 0xe6, 0xe4, 0x56, 0xac, 0xb7, 0x15, 0xc2, 0x56, 0x68, 0xc7, + 0x77, 0x29, 0xcf, 0xb0, 0x98, 0xd4, 0x3c, 0xb8, 0x94, 0x5f, 0xef, 0xb9, + 0xb5, 0xbb, 0xac, 0xd1, 0x15, 0x2f, 0xdb, 0x5b, 0xba, 0xcd, 0x14, 0xca, + 0xfe, 0x4e, 0xe3, 0xf2, 0x03, 0x96, 0xfb, 0x87, 0xc2, 0xd0, 0xd2, 0xff, + 0xf7, 0xd6, 0x3c, 0xbe, 0xe6, 0xd6, 0xee, 0xb3, 0x44, 0xce, 0xbf, 0xfd, + 0xf5, 0x8f, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x46, 0xaa, 0x74, 0xe0, + 0x43, 0x0a, 0x25, 0x4a, 0xfc, 0xb5, 0x7f, 0xe7, 0x97, 0xdc, 0xda, 0xdd, + 0xd6, 0x68, 0x8e, 0x97, 0xff, 0x6e, 0x7f, 0xba, 0x1c, 0xf6, 0xa1, 0x87, + 0x2b, 0xea, 0x24, 0xe1, 0x32, 0xef, 0xfa, 0x72, 0xf9, 0x6b, 0xfd, 0x67, + 0x2f, 0xd8, 0x21, 0xc9, 0xce, 0x5f, 0xe8, 0x85, 0xe6, 0xf7, 0x87, 0x29, + 0x0f, 0x60, 0x49, 0xef, 0xd9, 0xb5, 0xfe, 0xa9, 0xcb, 0xff, 0x0e, 0x2a, + 0xf3, 0x6b, 0xb0, 0x13, 0x97, 0xa6, 0x7f, 0x1c, 0xbe, 0x5b, 0xba, 0xcd, + 0x14, 0xd2, 0xfd, 0x9c, 0xb6, 0xfd, 0x39, 0x7f, 0xf6, 0xb0, 0x43, 0x1f, + 0x1a, 0x9f, 0x10, 0x21, 0xca, 0x0a, 0x65, 0x48, 0x55, 0x31, 0xfe, 0xc7, + 0x44, 0xbb, 0x45, 0x37, 0xff, 0xfd, 0x83, 0xed, 0x22, 0xf0, 0x74, 0xbe, + 0xa7, 0x56, 0xa4, 0xe7, 0x2f, 0xfb, 0x4f, 0xce, 0x4d, 0x1d, 0xd1, 0xcb, + 0xba, 0x82, 0x8a, 0x1f, 0x33, 0xdf, 0xfd, 0x2e, 0xa0, 0xcf, 0xaf, 0xe3, + 0x73, 0x1c, 0xbc, 0x0f, 0x21, 0xcb, 0xfd, 0xa5, 0xa6, 0xf6, 0x93, 0x9c, + 0xa7, 0x3d, 0x0d, 0x0e, 0x5f, 0xef, 0xdc, 0x57, 0xf2, 0x7d, 0x1c, 0xbf, 0xe6, 0xdc, 0x0f, 0xef, 0x67, 0x4e, 0x5d, 0xdf, 0xce, 0x56, 0x1e, 0x88, 0x0e, 0x6f, 0xf7, 0x61, 0x00, 0xfe, 0xfc, 0xe5, 0xff, 0x87, 0xff, 0x77, - 0x26, 0x94, 0x6e, 0x72, 0xd3, 0x1c, 0xbf, 0x67, 0x5c, 0x42, 0x72, 0xa7, - 0x37, 0x00, 0x12, 0xba, 0x15, 0x39, 0x7f, 0x38, 0x34, 0xd1, 0x34, 0x4d, - 0x11, 0xcb, 0xf9, 0x21, 0x73, 0xe3, 0x67, 0x2f, 0xff, 0xb3, 0xdd, 0xc9, - 0x71, 0xc7, 0xdd, 0x79, 0x1c, 0xba, 0x00, 0x72, 0xff, 0x3e, 0xf0, 0xc4, - 0x62, 0x9c, 0x44, 0x90, 0x97, 0x7d, 0x4e, 0xac, 0x4f, 0x6d, 0x1e, 0x7a, - 0x44, 0x22, 0xfa, 0x86, 0x7d, 0xf8, 0x1d, 0x89, 0x68, 0xe5, 0xe6, 0xde, - 0x73, 0x97, 0xfd, 0x00, 0x7f, 0x03, 0xe8, 0xc8, 0xe5, 0x74, 0xf6, 0x04, - 0x7a, 0xa1, 0x14, 0x3e, 0x84, 0x05, 0x94, 0x6a, 0xd7, 0xe2, 0x20, 0x60, - 0x2f, 0x99, 0x1a, 0x53, 0x21, 0xf3, 0xb9, 0x6f, 0x21, 0x2e, 0x02, 0x11, - 0x84, 0x46, 0x88, 0x7d, 0x28, 0x3b, 0xec, 0x3b, 0xaf, 0xdc, 0x63, 0xbb, - 0x0d, 0x15, 0x52, 0xff, 0xcf, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x6d, - 0x59, 0x4c, 0x3f, 0xf5, 0x9a, 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, - 0xbf, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x2c, 0x65, 0xdb, 0x52, 0x39, 0x65, - 0x30, 0xf3, 0xa6, 0x34, 0xbf, 0x69, 0x9d, 0x85, 0x4e, 0x5f, 0xe1, 0xfe, - 0x59, 0xa7, 0xf1, 0xcb, 0xf9, 0xaa, 0x0b, 0x56, 0xd5, 0x8a, 0xa7, 0x2f, - 0xf8, 0x7f, 0x9e, 0x69, 0x47, 0x27, 0x39, 0x77, 0x3c, 0x72, 0xf9, 0xe5, - 0x81, 0x39, 0x7f, 0x7b, 0x38, 0x1c, 0x13, 0x96, 0xc0, 0x9e, 0x6f, 0x88, - 0x6f, 0x2b, 0x2c, 0x39, 0x65, 0x31, 0x35, 0x65, 0x99, 0xf4, 0xf9, 0xcf, - 0x45, 0x93, 0x44, 0xf6, 0x45, 0x13, 0xdb, 0xe4, 0x6f, 0xf7, 0xee, 0x31, - 0xdd, 0x86, 0x8b, 0x55, 0x7f, 0xe7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, - 0x41, 0x2f, 0xd0, 0xde, 0xde, 0x70, 0xe5, 0x94, 0xc4, 0x55, 0x2c, 0xd3, - 0xea, 0x5d, 0xff, 0x9d, 0xbf, 0x67, 0x54, 0x7e, 0x78, 0xe5, 0xfe, 0x81, - 0x04, 0x35, 0xba, 0xce, 0x5d, 0xc8, 0x39, 0x52, 0x3c, 0xad, 0xa3, 0x4b, - 0xe6, 0x3b, 0xb0, 0xd1, 0x71, 0x2f, 0xef, 0xdf, 0x70, 0xe7, 0x0e, 0x57, - 0x0f, 0x77, 0x45, 0xd7, 0xb9, 0x0b, 0x39, 0x7c, 0xfb, 0x49, 0x39, 0xcb, - 0xf7, 0x7f, 0x57, 0x04, 0xe5, 0xf8, 0x38, 0xd7, 0x1d, 0x39, 0x7b, 0x69, - 0x18, 0x72, 0x82, 0x7e, 0x5c, 0x29, 0xda, 0x2a, 0xbf, 0xcb, 0x79, 0x69, - 0x03, 0x87, 0x2f, 0xa1, 0x58, 0xd1, 0xcb, 0xb5, 0xb6, 0x72, 0xfe, 0x5b, - 0xec, 0x8e, 0x6d, 0x1c, 0xbf, 0xf2, 0x07, 0x36, 0x2f, 0x25, 0xbc, 0x8e, - 0x54, 0x1f, 0x9e, 0x19, 0x5f, 0xd9, 0xc7, 0xf7, 0xf0, 0x72, 0xff, 0xf9, - 0xc6, 0x13, 0x6b, 0x49, 0xac, 0xee, 0x6d, 0x9c, 0xa0, 0x9f, 0xfe, 0xc2, - 0xdb, 0xff, 0x90, 0x7f, 0x96, 0x6b, 0x48, 0x1c, 0x39, 0x53, 0x1f, 0x3f, - 0x89, 0x2c, 0xa4, 0x2b, 0x93, 0xc8, 0x41, 0x70, 0x8b, 0xa3, 0x8f, 0x09, - 0x70, 0x19, 0x09, 0x96, 0x88, 0xbd, 0x08, 0xdf, 0xb1, 0x83, 0x5f, 0x9a, - 0x4d, 0x1c, 0x0a, 0xc1, 0xcb, 0xff, 0x26, 0xed, 0x16, 0xb9, 0xf3, 0xe7, - 0x76, 0xce, 0x5f, 0x76, 0x3c, 0xc3, 0x94, 0xd4, 0x8f, 0xbc, 0x29, 0xb7, - 0xff, 0x9a, 0x25, 0x5b, 0x6b, 0x9c, 0x2d, 0x2f, 0x9f, 0x3b, 0xb6, 0x72, - 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x74, 0xaf, 0xd0, 0x2e, 0x18, 0x39, 0x7a, - 0x3d, 0xb4, 0x72, 0xfb, 0x03, 0x81, 0x39, 0x7f, 0xcf, 0xb2, 0x3d, 0xaf, - 0xd8, 0xd3, 0x39, 0x7d, 0xa9, 0xdf, 0xe9, 0xcb, 0x28, 0xd1, 0x2a, 0x2b, - 0x88, 0x51, 0x48, 0xa3, 0x18, 0xd0, 0xd3, 0xa4, 0xae, 0x3e, 0x24, 0x3e, - 0x40, 0xbf, 0xfe, 0xc1, 0xf2, 0x2f, 0xb0, 0x82, 0xfc, 0x54, 0xe5, 0xfd, - 0x99, 0xa6, 0x7a, 0x0e, 0x5f, 0xd3, 0xc7, 0x9d, 0x5f, 0xce, 0x51, 0xcb, - 0xff, 0xa3, 0x80, 0xf9, 0xae, 0xc2, 0xdc, 0x4e, 0x5f, 0xe8, 0xe7, 0xde, - 0xf7, 0x00, 0x72, 0xa4, 0x7f, 0x5d, 0x45, 0xbf, 0xa4, 0xf2, 0x71, 0x61, - 0xcb, 0xff, 0xd9, 0xe8, 0x6f, 0xec, 0xfa, 0xc5, 0xc3, 0x59, 0xcb, 0x28, - 0xd5, 0x26, 0x47, 0x90, 0x85, 0x98, 0x88, 0x4b, 0x2b, 0x89, 0xd0, 0xae, - 0x35, 0x3b, 0xec, 0x6d, 0xaa, 0x59, 0xcb, 0xf8, 0x63, 0x75, 0xbf, 0x8e, - 0x5f, 0xfe, 0x6d, 0xc3, 0xd8, 0xdf, 0xd1, 0xd7, 0x6b, 0x39, 0x64, 0xe1, - 0xfd, 0xf4, 0xb6, 0xff, 0xff, 0xbf, 0xe4, 0xb5, 0xd7, 0x4e, 0x73, 0x9f, - 0xee, 0x9c, 0x7d, 0x1c, 0xbf, 0xf0, 0xbb, 0x7e, 0xce, 0xbc, 0xce, 0x72, - 0xff, 0xfe, 0xe8, 0xfe, 0xed, 0x79, 0x2e, 0xe2, 0xb8, 0x19, 0xbf, 0x39, - 0x73, 0x30, 0xe5, 0x41, 0xfb, 0xaa, 0xc3, 0x7f, 0x9f, 0xda, 0x8e, 0xfd, - 0x98, 0xe5, 0xe9, 0x42, 0xce, 0x5e, 0x57, 0x52, 0x39, 0x7f, 0xe9, 0x67, - 0x38, 0xf2, 0x9f, 0x1b, 0x39, 0x7f, 0xf6, 0x06, 0x25, 0x1c, 0x8f, 0xae, - 0x27, 0x2f, 0xfd, 0xb3, 0x24, 0xb0, 0xa6, 0xc8, 0x09, 0xca, 0x5a, 0x21, - 0x5d, 0x0e, 0xe7, 0x52, 0x75, 0x53, 0x13, 0x35, 0x72, 0x16, 0xbd, 0x22, - 0x73, 0x6d, 0x0e, 0x78, 0x7b, 0xec, 0x31, 0x6b, 0xaa, 0xd2, 0xc6, 0x55, - 0xfd, 0xfe, 0x96, 0x7b, 0xb1, 0xf4, 0x4e, 0x5f, 0xfb, 0xc8, 0xc4, 0x0b, - 0x8a, 0xb0, 0x72, 0xff, 0xa3, 0x7e, 0xbe, 0xbd, 0x0d, 0x9c, 0xa8, 0x3f, - 0x7e, 0x1e, 0xdd, 0xff, 0x4e, 0x5f, 0x87, 0x3a, 0xfe, 0x39, 0x7f, 0x49, - 0xf3, 0x64, 0x04, 0xe5, 0x34, 0x0f, 0x51, 0xa9, 0x93, 0x5f, 0x27, 0xf2, - 0x83, 0x97, 0xe7, 0x9a, 0x49, 0xe3, 0x97, 0xfe, 0x80, 0xf2, 0x24, 0x9b, - 0xfb, 0x0e, 0x54, 0x91, 0x10, 0x02, 0x2f, 0x14, 0x5f, 0xfa, 0x39, 0xae, - 0xa3, 0x19, 0xfc, 0xe7, 0x2f, 0xff, 0xfa, 0x03, 0xdc, 0xdf, 0xc2, 0xfd, - 0x03, 0xeb, 0x4f, 0xc6, 0x1c, 0xbf, 0xd9, 0x98, 0xaa, 0xaf, 0x23, 0x94, - 0xaa, 0x26, 0x7c, 0xcd, 0x7e, 0xcd, 0x33, 0xd0, 0x72, 0xff, 0xf2, 0x37, - 0xa6, 0x75, 0x37, 0xf7, 0x39, 0x07, 0x2f, 0xff, 0xf9, 0xdb, 0xfb, 0x9c, - 0x17, 0xde, 0x4c, 0x8f, 0x6b, 0x37, 0xf1, 0xca, 0xc4, 0x6e, 0xf0, 0x9d, - 0xd3, 0x2f, 0xdb, 0x13, 0x98, 0x13, 0x97, 0xff, 0xda, 0xea, 0x6b, 0xdd, - 0xc0, 0xa6, 0xb0, 0x4e, 0x5e, 0xec, 0x0e, 0x1f, 0xbf, 0xe5, 0x37, 0xfa, - 0x17, 0x88, 0xb8, 0x6b, 0x39, 0x7f, 0xa4, 0xbd, 0x20, 0xef, 0x23, 0x94, - 0xc3, 0xe8, 0x98, 0xd2, 0xff, 0xf6, 0x73, 0x8f, 0x2d, 0x0e, 0x2f, 0xee, - 0xe7, 0x2f, 0x3b, 0xb0, 0xd1, 0x26, 0x2f, 0x6d, 0x26, 0x8e, 0x53, 0x0f, - 0x1f, 0x68, 0xa2, 0xfc, 0xc6, 0x89, 0xa4, 0xd5, 0x34, 0x0e, 0x5f, 0xfe, - 0xde, 0x5a, 0xcd, 0x8e, 0xbc, 0x56, 0x34, 0x72, 0xff, 0x66, 0xfe, 0xf3, - 0xcb, 0x47, 0x2a, 0x11, 0x79, 0x87, 0x7c, 0x4d, 0xbf, 0xc2, 0xfe, 0xd3, - 0x3f, 0x13, 0x97, 0xff, 0xc0, 0x40, 0x37, 0x89, 0xb0, 0x73, 0xdd, 0x43, - 0x97, 0xf9, 0xf7, 0xd3, 0xbc, 0xb4, 0x72, 0xdc, 0xc4, 0x41, 0xf5, 0x42, - 0xb1, 0x1b, 0xc9, 0x0b, 0x6b, 0xff, 0xfd, 0xfb, 0xef, 0x83, 0x0d, 0xfd, - 0xf0, 0xc0, 0x33, 0x7f, 0x1c, 0xa9, 0x2b, 0xc7, 0xc8, 0x4d, 0x30, 0x8f, - 0x90, 0x93, 0x5c, 0x38, 0x7b, 0x18, 0x66, 0x89, 0xaf, 0xe0, 0x81, 0xa1, - 0xa0, 0x6d, 0x9c, 0xbd, 0xa4, 0x09, 0xcb, 0xf8, 0x63, 0x75, 0xbf, 0x8e, - 0x5f, 0xf4, 0x33, 0xdf, 0xf7, 0x90, 0xd9, 0xcb, 0xfc, 0xc4, 0xe6, 0xa6, - 0x87, 0x39, 0x7f, 0xf7, 0xfa, 0xeb, 0xcb, 0xaf, 0x28, 0x13, 0x95, 0xb9, - 0xfb, 0xf0, 0xce, 0xee, 0xa4, 0xc9, 0x8f, 0x70, 0x71, 0x65, 0xbe, 0x85, - 0x95, 0xf7, 0x91, 0x6e, 0x72, 0xca, 0x9c, 0xbf, 0xbb, 0xa8, 0xf4, 0x04, - 0xe5, 0x61, 0xbf, 0x41, 0x2a, 0xc3, 0xff, 0xf3, 0x05, 0xff, 0x47, 0x7c, - 0x93, 0xae, 0x18, 0x72, 0xff, 0xfc, 0xec, 0xe4, 0x74, 0x73, 0xd8, 0xa3, - 0x6d, 0xb6, 0x52, 0xa4, 0x8b, 0x2d, 0x10, 0xf8, 0xe6, 0xfe, 0x63, 0x3f, - 0x60, 0xc1, 0xcb, 0xff, 0xd9, 0xbc, 0x86, 0x25, 0xc8, 0xf3, 0xf8, 0xe5, - 0xff, 0x9f, 0xd1, 0xcd, 0x76, 0x07, 0xc7, 0x2f, 0xd9, 0x24, 0x7d, 0x87, - 0x28, 0x4f, 0x97, 0x47, 0xb5, 0x24, 0x67, 0xff, 0x0a, 0xeb, 0xcb, 0x7e, - 0x9c, 0xbf, 0xfc, 0x31, 0x2e, 0x73, 0xfd, 0xd3, 0x8f, 0xa3, 0x97, 0xff, - 0xda, 0xc5, 0x47, 0x3d, 0xac, 0x90, 0xbb, 0x67, 0x2c, 0x9d, 0x44, 0xd7, - 0x92, 0xe9, 0x11, 0xbd, 0xb2, 0x16, 0xd7, 0xdb, 0x51, 0xdd, 0x1c, 0xa8, - 0x3c, 0xec, 0x29, 0xbf, 0xbc, 0x3f, 0xcf, 0xbb, 0x59, 0xcb, 0xff, 0xd1, - 0x38, 0xe6, 0x4f, 0xe5, 0x60, 0x64, 0x72, 0xff, 0xce, 0x33, 0xf5, 0xd6, - 0x9a, 0x43, 0x94, 0xe8, 0xbb, 0x13, 0x46, 0xd2, 0xaf, 0x36, 0xdb, 0x65, - 0x2f, 0xa7, 0x5a, 0x68, 0xa2, 0x86, 0x82, 0xe8, 0x09, 0xcb, 0x71, 0xcf, - 0x28, 0x4d, 0x2f, 0xd1, 0x82, 0xeb, 0x39, 0x7f, 0xe7, 0x97, 0x53, 0x70, - 0x71, 0xc2, 0x72, 0xff, 0xff, 0xce, 0x2c, 0xe6, 0x6c, 0x81, 0xf2, 0xe3, - 0x04, 0x39, 0xbf, 0x8e, 0x50, 0x11, 0x9e, 0x24, 0xbf, 0x9f, 0xdf, 0xe9, - 0x47, 0x27, 0x8e, 0x4e, 0x72, 0xfe, 0xd6, 0x93, 0x04, 0x07, 0x2f, 0x73, - 0x1a, 0xce, 0x5f, 0xfa, 0x1b, 0xfb, 0x3e, 0xb1, 0x70, 0xd6, 0x72, 0xb8, - 0x89, 0x05, 0x96, 0x78, 0x7e, 0xa1, 0x1e, 0xb9, 0x0c, 0x5b, 0xff, 0xff, - 0xc8, 0x20, 0xfa, 0x39, 0xce, 0x63, 0x78, 0xd7, 0x83, 0x00, 0x5b, 0xc8, - 0xe5, 0xff, 0xfe, 0xf0, 0xe0, 0x1c, 0x41, 0xce, 0x63, 0x78, 0x07, 0xdc, - 0xe5, 0xf9, 0x3d, 0x3e, 0x36, 0x72, 0xff, 0xa1, 0x9d, 0x1f, 0xfd, 0x1a, - 0x39, 0x7f, 0xf2, 0x6d, 0x43, 0x21, 0x78, 0x17, 0x59, 0xcb, 0xff, 0xf7, - 0xbb, 0x92, 0xf8, 0xce, 0xa7, 0xb7, 0x62, 0x70, 0xe5, 0x49, 0x3d, 0x94, - 0x79, 0xe3, 0x02, 0xca, 0x7a, 0x72, 0x28, 0xb7, 0xff, 0xff, 0x3a, 0x7b, - 0xfe, 0x3e, 0x99, 0xd4, 0x98, 0x5d, 0xbf, 0x67, 0x56, 0x72, 0xff, 0x97, - 0x1c, 0xd9, 0x9c, 0x89, 0x8e, 0x5f, 0xfb, 0x8c, 0x5c, 0x6f, 0xac, 0xd9, - 0x87, 0x2f, 0xf0, 0x83, 0x6f, 0x03, 0x8b, 0x39, 0x7f, 0x0f, 0xcd, 0xbc, - 0xe4, 0x1c, 0xa8, 0x45, 0x3e, 0x20, 0xb9, 0xad, 0xff, 0x63, 0x83, 0xe6, - 0x05, 0xe4, 0x72, 0xff, 0xf3, 0xcf, 0xd4, 0x81, 0xc9, 0x93, 0x88, 0x72, - 0xb1, 0x52, 0xcf, 0x55, 0x80, 0xe7, 0xa8, 0x71, 0x78, 0xb5, 0xb3, 0x9b, - 0xf0, 0xe7, 0x5f, 0xc7, 0x2f, 0xfd, 0x28, 0x19, 0xfe, 0xf0, 0x7f, 0x91, - 0xcb, 0xf8, 0x5c, 0x20, 0xdc, 0x07, 0x29, 0xad, 0x12, 0xd3, 0x13, 0x69, - 0x0a, 0xfb, 0xd3, 0xe0, 0x4e, 0x5f, 0xf2, 0x2b, 0xf7, 0x80, 0x5a, 0x68, - 0xe5, 0x4c, 0x7b, 0xfb, 0x64, 0x77, 0x9b, 0x6d, 0xb3, 0x97, 0xff, 0xec, - 0x5f, 0x86, 0x01, 0x81, 0xd6, 0x2e, 0x18, 0x51, 0x43, 0x41, 0x7f, 0xec, - 0xdf, 0xe0, 0xe6, 0xce, 0x26, 0x8e, 0x5f, 0xcc, 0xea, 0x40, 0xb0, 0xe5, - 0x41, 0xf7, 0x62, 0x15, 0xfe, 0xe4, 0x79, 0x18, 0x81, 0x39, 0x7e, 0x94, - 0xd9, 0x8c, 0x39, 0x6e, 0x1c, 0xa6, 0xa0, 0xfa, 0xe0, 0xcb, 0xe9, 0x45, - 0x62, 0xa6, 0xb4, 0x84, 0x9f, 0x51, 0x86, 0x1a, 0x5a, 0x84, 0x5d, 0xef, - 0x4b, 0xa7, 0x2c, 0x87, 0x2f, 0xee, 0xc7, 0xc6, 0x24, 0xe7, 0x2f, 0xff, - 0x4d, 0xd7, 0x5e, 0x71, 0x55, 0x7f, 0x1f, 0x1c, 0xbf, 0xb8, 0xfc, 0x18, - 0x91, 0xcb, 0xff, 0xe7, 0xf7, 0x73, 0x67, 0x53, 0xe6, 0xb4, 0x8b, 0x39, - 0x7f, 0xe4, 0x92, 0x73, 0x78, 0x18, 0xd1, 0xca, 0x68, 0xe9, 0xa5, 0x04, - 0x43, 0x0c, 0x38, 0x9c, 0x25, 0x9e, 0x53, 0xba, 0x4a, 0x35, 0x6d, 0xd6, - 0x3b, 0x49, 0xb2, 0x21, 0x69, 0x39, 0x84, 0xa1, 0xb4, 0x18, 0xc0, 0x72, - 0x71, 0xb1, 0x57, 0xa6, 0x46, 0xa9, 0xbc, 0x70, 0x08, 0x61, 0x34, 0x3f, - 0x79, 0x1a, 0xaf, 0x61, 0xb6, 0xf0, 0x99, 0x04, 0x3d, 0x46, 0x32, 0x5d, - 0x4e, 0x2c, 0x7a, 0x5a, 0xfe, 0xda, 0xc7, 0xd8, 0xd9, 0xef, 0xff, 0x73, - 0x1b, 0x0f, 0x72, 0x61, 0xce, 0x48, 0xe5, 0xee, 0x63, 0x59, 0xcb, 0xff, - 0x43, 0x7f, 0x67, 0xd6, 0x2e, 0x1a, 0xce, 0x57, 0x11, 0x5e, 0xb4, 0xbf, - 0x0f, 0xdf, 0xff, 0x3a, 0xe3, 0x8c, 0xe7, 0xea, 0xf3, 0xf7, 0xd1, 0xca, - 0xc4, 0x41, 0xfe, 0x61, 0x7f, 0xb8, 0xcf, 0xdc, 0x2b, 0x83, 0x97, 0xff, - 0x47, 0x3e, 0xf9, 0x3d, 0xdc, 0x0a, 0x1c, 0xbf, 0xf7, 0x46, 0x27, 0xfb, - 0xde, 0xbb, 0x59, 0xca, 0x84, 0x5e, 0xce, 0x69, 0x88, 0xb7, 0x9a, 0x9b, - 0x51, 0x23, 0x97, 0x9f, 0x93, 0x9c, 0xb9, 0xb6, 0xce, 0x5e, 0x76, 0x28, - 0xc3, 0x6c, 0xd8, 0xed, 0xfd, 0x1c, 0x79, 0x27, 0x4e, 0x5f, 0xb1, 0x7d, - 0x70, 0x9c, 0xb2, 0x90, 0xe9, 0xaa, 0x02, 0x9b, 0x91, 0xe6, 0xaa, 0x54, - 0xc9, 0x7d, 0xd3, 0x15, 0xf2, 0x15, 0x6f, 0x5d, 0x74, 0x0c, 0xac, 0x4d, - 0x43, 0x83, 0xc5, 0xfb, 0x17, 0x9b, 0x34, 0xda, 0x2c, 0xa9, 0x3b, 0xbe, - 0x60, 0xcf, 0xd5, 0xef, 0x1a, 0xa7, 0x0a, 0x17, 0x08, 0xee, 0xca, 0x04, - 0x04, 0x36, 0x84, 0xe3, 0x53, 0x83, 0xbe, 0x95, 0xa5, 0xfd, 0xa7, 0x34, - 0xbf, 0xb5, 0x13, 0x49, 0x26, 0x39, 0x7f, 0xde, 0x81, 0x40, 0x66, 0xfe, - 0x39, 0x7d, 0xb6, 0xe2, 0x03, 0x97, 0x44, 0xf8, 0x7b, 0x9f, 0x4e, 0x2c, - 0xa6, 0x91, 0x75, 0xf6, 0x11, 0x77, 0xfe, 0x76, 0x29, 0xf8, 0x12, 0x59, - 0x23, 0x97, 0xee, 0x31, 0xdd, 0x86, 0x88, 0xd5, 0x79, 0x5d, 0xf4, 0x72, - 0xca, 0x4e, 0x89, 0x3c, 0x40, 0xf1, 0xa5, 0xff, 0xfe, 0xd9, 0x03, 0xe5, - 0x1f, 0x63, 0x87, 0x02, 0xeb, 0x70, 0x9c, 0xbf, 0x71, 0x8e, 0xec, 0x34, - 0x54, 0xab, 0x9d, 0x86, 0x88, 0x69, 0x65, 0x30, 0xf5, 0xdc, 0xd2, 0xfd, - 0xc6, 0x3b, 0xb0, 0xd1, 0x1f, 0x2f, 0xfe, 0xff, 0x80, 0x67, 0x52, 0x61, - 0x80, 0x1c, 0xbf, 0xfe, 0x17, 0xf4, 0xa1, 0x5f, 0x91, 0xed, 0x40, 0x0e, - 0x5e, 0x79, 0x29, 0x88, 0xcb, 0xd1, 0xa7, 0xd4, 0x6b, 0xff, 0x3c, 0xf1, - 0xd4, 0xe2, 0x42, 0xce, 0x5f, 0xe8, 0xe6, 0x0f, 0xb3, 0xa7, 0x2f, 0x2f, - 0x14, 0xdb, 0x3e, 0xef, 0xa7, 0xb4, 0xa2, 0x3a, 0xa2, 0x16, 0x37, 0xff, - 0xfd, 0x2f, 0xf8, 0xab, 0xeb, 0x03, 0x1b, 0xeb, 0xef, 0x95, 0x45, 0x4e, - 0x5e, 0x6d, 0x56, 0x1c, 0xbf, 0x6f, 0xbc, 0xb3, 0xc7, 0x2b, 0x47, 0x93, - 0xf8, 0xfd, 0xff, 0xe6, 0x89, 0x56, 0xda, 0xe7, 0x0b, 0x4b, 0xe7, 0xce, - 0xed, 0x9c, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x58, 0xeb, 0xfd, 0x88, 0x33, - 0xfb, 0x3a, 0x72, 0xe7, 0xd1, 0xcb, 0xfa, 0x7f, 0xbc, 0xe6, 0x70, 0xe5, - 0x48, 0xf1, 0xdc, 0x5a, 0xff, 0x85, 0xd5, 0xea, 0x40, 0xce, 0x72, 0xff, - 0xfc, 0x09, 0x4e, 0xd1, 0x43, 0x57, 0x3b, 0x39, 0xf3, 0xe7, 0x76, 0xce, - 0x5c, 0x92, 0x39, 0x7f, 0xbc, 0x39, 0xb3, 0xaf, 0x23, 0x94, 0x13, 0xca, - 0xc1, 0x6b, 0xf2, 0x7b, 0xc9, 0xe3, 0x97, 0xdc, 0xe6, 0x6d, 0x9c, 0xac, - 0x3c, 0xc7, 0x27, 0xbf, 0x67, 0x33, 0x26, 0x39, 0x65, 0x21, 0x5d, 0x64, - 0xf0, 0xb7, 0x91, 0x1e, 0x31, 0xaa, 0x68, 0x8f, 0x33, 0x10, 0xf4, 0xe0, - 0x61, 0x6b, 0xa6, 0xdf, 0xa4, 0x17, 0x9a, 0x25, 0xaa, 0x72, 0xfe, 0x68, - 0x0e, 0x75, 0xfc, 0x72, 0xff, 0x38, 0x34, 0xfe, 0xf3, 0x9c, 0xb9, 0x6c, - 0x39, 0x42, 0x79, 0x3e, 0x32, 0xbf, 0xf6, 0x37, 0xcc, 0x17, 0xde, 0x5a, - 0x39, 0x7e, 0xeb, 0xae, 0x04, 0xe5, 0xf6, 0xba, 0x8d, 0x9c, 0xbf, 0x43, - 0x7e, 0xce, 0x9c, 0xbd, 0x1f, 0x70, 0xe5, 0x7c, 0x44, 0x76, 0x13, 0x09, - 0x1e, 0x8a, 0x2f, 0x80, 0xb4, 0xe1, 0xcb, 0xf9, 0x3c, 0x98, 0xe2, 0x72, - 0xff, 0xff, 0xa3, 0x83, 0x81, 0xce, 0xf5, 0x19, 0xd4, 0xf6, 0x9f, 0x73, - 0x97, 0xfc, 0xfb, 0x8e, 0x7b, 0x58, 0xd9, 0xca, 0x44, 0x75, 0x35, 0x91, - 0x74, 0xab, 0xf6, 0x5b, 0xfa, 0x38, 0x0d, 0xbf, 0xfc, 0x72, 0xff, 0xa0, - 0x7c, 0xd2, 0x7f, 0x7f, 0x07, 0x2f, 0xff, 0x47, 0x61, 0x6c, 0xea, 0x7b, - 0x31, 0x67, 0x2f, 0x80, 0x04, 0xfa, 0x72, 0xfd, 0x2d, 0x4f, 0x8d, 0x9c, - 0xbc, 0xee, 0xc3, 0x45, 0xa0, 0xbf, 0xf3, 0xb7, 0xb4, 0xc7, 0xe4, 0xf8, - 0xd9, 0xcb, 0xf8, 0x10, 0x31, 0xed, 0x1c, 0xa8, 0x46, 0x13, 0x0a, 0xb8, - 0x50, 0x04, 0x4b, 0xff, 0xff, 0xe4, 0xe7, 0x5c, 0x52, 0x3c, 0x9d, 0x8d, - 0x77, 0x35, 0xcc, 0x66, 0x78, 0xe5, 0xff, 0xff, 0xef, 0xf4, 0xfc, 0x96, - 0x90, 0x39, 0xc9, 0xd3, 0x5d, 0x70, 0x6b, 0x04, 0xe5, 0xfd, 0x13, 0xad, - 0xdc, 0x4e, 0x5f, 0xff, 0xbb, 0x8d, 0xf9, 0x71, 0x9e, 0xee, 0x60, 0xb0, - 0xe5, 0xff, 0xf9, 0x3d, 0x2c, 0xe7, 0x1e, 0x5f, 0x45, 0xfd, 0xa3, 0x95, - 0x25, 0x73, 0xe1, 0x32, 0x61, 0xe2, 0x24, 0x72, 0x1c, 0xdd, 0x3c, 0x17, - 0x9d, 0x3c, 0x78, 0xb3, 0x62, 0xa5, 0xd8, 0xb3, 0x97, 0xff, 0x3e, 0xfb, - 0x3a, 0xd6, 0x9e, 0x18, 0x59, 0xca, 0xe1, 0xef, 0xb8, 0xb5, 0xff, 0xf9, - 0x3d, 0xa7, 0xdf, 0x5a, 0xce, 0xa6, 0xbf, 0x9c, 0xe5, 0xff, 0xf7, 0xf3, - 0xf1, 0x3d, 0x3f, 0xfc, 0x96, 0x9a, 0xd0, 0xe5, 0x75, 0x16, 0x02, 0xb1, - 0x7f, 0x69, 0xfe, 0xe6, 0xfe, 0x39, 0x7f, 0x90, 0x38, 0xbf, 0x98, 0x13, - 0x97, 0xff, 0xdf, 0xf3, 0x90, 0x38, 0xaa, 0x77, 0xb9, 0xf4, 0xe5, 0x9a, - 0x67, 0x2b, 0x87, 0xcf, 0xfa, 0x95, 0xfe, 0x5f, 0xe3, 0xed, 0x7f, 0xc3, - 0x95, 0x24, 0x7a, 0x72, 0x13, 0x7b, 0x64, 0x77, 0xf3, 0xb5, 0xe0, 0xad, - 0x0e, 0x5f, 0xfc, 0xed, 0xfb, 0x3b, 0xa9, 0xb3, 0x27, 0x39, 0x7e, 0x9b, - 0xb8, 0x07, 0x39, 0x5d, 0x44, 0xe0, 0x97, 0x6c, 0x46, 0xbf, 0xff, 0xd9, - 0x9e, 0xd4, 0x4d, 0xd8, 0xd8, 0x38, 0x1e, 0xc6, 0x8e, 0x5f, 0x85, 0x8f, - 0xa4, 0x39, 0x7f, 0xff, 0x70, 0x62, 0x37, 0xf9, 0xaf, 0x0c, 0x07, 0xb1, - 0xe3, 0x97, 0x27, 0x4e, 0x5f, 0x48, 0x5f, 0xe9, 0xcb, 0xfc, 0x17, 0x07, - 0x38, 0xe0, 0x39, 0x7d, 0xc6, 0x35, 0xb6, 0x72, 0xf9, 0x56, 0x83, 0xb6, - 0x72, 0xb0, 0xf3, 0xdc, 0x9e, 0x91, 0x14, 0x43, 0x08, 0x2a, 0x84, 0xe0, - 0xf0, 0x99, 0xad, 0x71, 0xc5, 0xbf, 0x86, 0x2d, 0xe7, 0x6b, 0x43, 0x97, - 0xfe, 0xfb, 0xe5, 0x51, 0x58, 0xc1, 0x83, 0x97, 0xef, 0xbe, 0x18, 0x01, - 0xca, 0xdd, 0x10, 0xfc, 0x1e, 0xd8, 0x81, 0x7e, 0x8f, 0x67, 0x60, 0xe5, - 0xff, 0xff, 0xee, 0xa0, 0x71, 0x27, 0xec, 0x47, 0xcc, 0xde, 0x5a, 0x4f, - 0x38, 0xe1, 0xcb, 0xff, 0x66, 0xf2, 0xd4, 0xdc, 0x7f, 0x68, 0xe5, 0xff, - 0xef, 0x6b, 0x26, 0xec, 0x6c, 0xce, 0xf6, 0x0e, 0x5f, 0xe7, 0x06, 0x96, - 0xfb, 0xf8, 0xe5, 0x62, 0x20, 0x1d, 0x32, 0xff, 0x86, 0x22, 0x6c, 0xd8, - 0x9c, 0x39, 0x53, 0xa7, 0x70, 0xc2, 0x60, 0x3b, 0x8c, 0x30, 0x7c, 0x43, - 0x7e, 0xf9, 0x34, 0x92, 0x63, 0x95, 0x0a, 0x99, 0xf2, 0x3e, 0xb4, 0x50, - 0xbf, 0xfb, 0xa9, 0xf3, 0x07, 0x13, 0x8f, 0xb0, 0xe5, 0xff, 0xc8, 0x2e, - 0x11, 0xc0, 0xf6, 0x34, 0x72, 0xf7, 0xd8, 0xe1, 0xcb, 0xff, 0xfd, 0xd8, - 0x1c, 0x06, 0xb0, 0x3d, 0x89, 0xd7, 0xf8, 0x84, 0xe5, 0xf9, 0x3d, 0xe8, - 0x91, 0xca, 0x55, 0x32, 0xc6, 0x22, 0xf1, 0x07, 0xc3, 0xdb, 0x18, 0x6f, - 0xff, 0xe8, 0x9b, 0x03, 0xd8, 0xd9, 0xdc, 0xf0, 0xc4, 0x2c, 0xe5, 0xfd, - 0xbe, 0xbe, 0xcf, 0xf8, 0x9c, 0xbf, 0xe8, 0x67, 0x52, 0x67, 0x79, 0xce, - 0x52, 0xd1, 0x8e, 0xeb, 0x60, 0x33, 0xbf, 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, - 0xe5, 0xfc, 0x33, 0xbf, 0x50, 0x4e, 0x5f, 0xf2, 0x7e, 0x32, 0xe4, 0x60, - 0x4e, 0x5f, 0xff, 0xf7, 0x72, 0x4c, 0xea, 0x76, 0x33, 0x92, 0xf0, 0xc2, - 0xf4, 0x72, 0xfb, 0xf8, 0xdc, 0x27, 0x29, 0xd1, 0xdb, 0xa2, 0xcf, 0x1c, - 0x36, 0xcb, 0x7d, 0xb5, 0x1c, 0x9c, 0xe5, 0x42, 0x70, 0xb9, 0x19, 0x13, - 0x9e, 0xdf, 0xee, 0x32, 0x6c, 0x4e, 0xfe, 0x72, 0xff, 0xc9, 0xb0, 0x73, - 0x5e, 0x55, 0x18, 0x72, 0xff, 0x7b, 0xad, 0x69, 0xd7, 0x98, 0xe5, 0xfd, - 0x0c, 0x17, 0xdf, 0xc7, 0x2a, 0x48, 0xa4, 0x6b, 0x40, 0x59, 0xbd, 0xfa, - 0x3d, 0x3e, 0x36, 0x72, 0xff, 0xdb, 0xb0, 0x5e, 0x77, 0x92, 0x74, 0xe5, - 0x70, 0xfa, 0x3f, 0x29, 0xbc, 0xe2, 0x03, 0x97, 0xff, 0xff, 0xc9, 0xff, - 0x3b, 0x93, 0x4c, 0xfc, 0x9b, 0xdd, 0xfc, 0x1a, 0xc4, 0xd8, 0x18, 0x39, - 0x7e, 0xf7, 0x5c, 0x55, 0x39, 0x7f, 0xc3, 0xfc, 0xe1, 0xee, 0x0c, 0x1c, - 0xb6, 0x05, 0x1c, 0xb9, 0x08, 0x46, 0x14, 0x5f, 0xfc, 0x06, 0x00, 0x73, - 0xda, 0x77, 0x13, 0x97, 0x96, 0xfb, 0x9c, 0xae, 0x1e, 0xf8, 0x10, 0xaa, - 0x15, 0xa8, 0xe4, 0x36, 0x52, 0x13, 0x6e, 0x46, 0x31, 0x80, 0x7f, 0x09, - 0x8b, 0xfd, 0x9d, 0x99, 0x3a, 0x8b, 0x39, 0x7f, 0xa5, 0x9c, 0xd0, 0xc4, - 0xe7, 0x2f, 0x6d, 0xe4, 0xe7, 0x2f, 0xfa, 0x06, 0x19, 0xc4, 0x85, 0x9c, - 0xbd, 0x9d, 0x73, 0x97, 0xe9, 0x83, 0xff, 0xe2, 0x72, 0x82, 0x78, 0xce, - 0x37, 0x79, 0xad, 0x16, 0x72, 0xff, 0xfc, 0xee, 0x0d, 0x40, 0x3d, 0x88, - 0x1c, 0x19, 0x8e, 0x74, 0xbf, 0xbf, 0xd8, 0xde, 0x31, 0x98, 0xd9, 0xcb, - 0xfe, 0xdd, 0x79, 0x83, 0xed, 0xbc, 0x39, 0x79, 0x59, 0x7e, 0x72, 0xfd, - 0xd8, 0xe4, 0xeb, 0x39, 0x7f, 0xbf, 0x71, 0xee, 0x3c, 0xc7, 0x2d, 0xbc, - 0xc7, 0xb8, 0xd9, 0x4d, 0x22, 0x29, 0x9d, 0xee, 0xb1, 0x33, 0x67, 0x34, - 0x18, 0x70, 0xd6, 0x2b, 0x0d, 0xdc, 0xcd, 0x0c, 0xfa, 0x40, 0xef, 0x82, - 0x81, 0xa8, 0xe6, 0x2f, 0x0e, 0x00, 0xe5, 0xa0, 0xe5, 0x00, 0xd5, 0xf8, - 0x6e, 0xe7, 0xf1, 0xca, 0xe1, 0xb7, 0xe9, 0x0d, 0xf2, 0xe3, 0x9a, 0x39, - 0x7f, 0xdc, 0xce, 0xe4, 0xff, 0x13, 0x47, 0x2b, 0x0f, 0xf9, 0x08, 0x7f, - 0x22, 0xbf, 0x90, 0x7f, 0x96, 0x68, 0xe5, 0xff, 0xb3, 0xd1, 0xb8, 0x1f, - 0xbd, 0x43, 0x96, 0x59, 0xcb, 0xf9, 0x07, 0xf9, 0x66, 0xbe, 0x1e, 0x7e, - 0xc3, 0xea, 0x55, 0x18, 0x9e, 0x7c, 0xb2, 0x8d, 0x5b, 0x7a, 0x8a, 0xd2, - 0x23, 0x87, 0x99, 0xc8, 0x65, 0x0c, 0xd0, 0xc6, 0x4f, 0x92, 0xf7, 0xd5, - 0x87, 0x8b, 0x21, 0xa3, 0xb9, 0x12, 0x46, 0x49, 0x34, 0x35, 0x38, 0x62, - 0xb8, 0xf9, 0x3b, 0x2c, 0xfd, 0xe3, 0x61, 0x04, 0x62, 0xa3, 0x1d, 0xa6, - 0xa5, 0xc2, 0xfa, 0x5b, 0xbe, 0xdc, 0x69, 0x3f, 0x61, 0xe5, 0x7f, 0x6d, - 0x20, 0x46, 0x26, 0x39, 0x7a, 0x1c, 0x4e, 0x5f, 0x67, 0x5f, 0xc7, 0x2c, - 0xd0, 0xc3, 0xeb, 0xe9, 0x80, 0x8d, 0x5f, 0xff, 0xfe, 0xeb, 0x8f, 0xb5, - 0x09, 0x2c, 0xda, 0x1f, 0x47, 0x61, 0x5f, 0xe3, 0x68, 0xe5, 0xf6, 0x68, - 0x08, 0x72, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x6b, 0x2f, 0xf2, 0xd1, 0x6f, - 0x36, 0x74, 0xe5, 0xfd, 0x9b, 0x5a, 0x71, 0x61, 0xcb, 0xdc, 0x85, 0x9c, - 0xbf, 0xbb, 0x9a, 0x89, 0xf6, 0x8e, 0x5f, 0xf4, 0x94, 0xce, 0x31, 0xdd, - 0x86, 0x8a, 0x0d, 0x58, 0x7e, 0xee, 0x63, 0x7d, 0x93, 0x47, 0x8e, 0x5f, - 0xf4, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0x97, 0xff, 0xda, 0x49, 0xdf, 0x4e, - 0x2f, 0xee, 0xc4, 0xc7, 0x2f, 0xfc, 0xe2, 0x0c, 0xf4, 0x0a, 0x00, 0xe5, - 0x79, 0x11, 0x5b, 0x69, 0xf6, 0x51, 0xa4, 0xac, 0xa6, 0x0d, 0xe4, 0xf9, - 0x84, 0x28, 0x69, 0x31, 0x9f, 0x0b, 0xd7, 0x09, 0x3e, 0x90, 0x09, 0x17, - 0xd8, 0x62, 0x5f, 0xfe, 0x51, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, - 0x8b, 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0xea, 0x54, 0x3a, 0xbc, - 0xf9, 0x43, 0x13, 0x0d, 0xd9, 0x0b, 0xa4, 0x8f, 0x71, 0x72, 0xf5, 0x3b, - 0x5e, 0xf8, 0x82, 0x74, 0xcf, 0x50, 0xae, 0xf2, 0xc5, 0xfb, 0x8c, 0x77, - 0x61, 0xa2, 0x21, 0x5e, 0xea, 0x09, 0xcb, 0xb0, 0x27, 0x2c, 0xc3, 0x94, - 0xc3, 0xc2, 0xe8, 0xd8, 0x8b, 0x5f, 0x66, 0xc4, 0xe1, 0xcb, 0xe4, 0xe6, - 0x6e, 0x72, 0xca, 0x62, 0x3a, 0x77, 0x76, 0x6b, 0x2e, 0xdb, 0x23, 0xb6, - 0xd9, 0xcb, 0xe8, 0xec, 0x2c, 0xe5, 0xf3, 0x1d, 0xd8, 0x68, 0x8d, 0x94, - 0xc3, 0xcf, 0xe1, 0x0d, 0x94, 0x0a, 0x21, 0x71, 0x8e, 0xff, 0x29, 0x9c, - 0x63, 0xbb, 0x0d, 0x14, 0xda, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x50, 0x2f, - 0x66, 0xed, 0x9c, 0xb2, 0x98, 0x7a, 0x5d, 0x34, 0xbf, 0xca, 0x67, 0x18, - 0xee, 0xc3, 0x45, 0x4c, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x56, 0x0b, 0xf2, - 0x36, 0x1f, 0xf8, 0x72, 0xed, 0x09, 0xcb, 0x97, 0xa3, 0x97, 0xf2, 0x6d, - 0xbc, 0x26, 0xd9, 0xcb, 0xfc, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x47, 0xeb, - 0xc3, 0x01, 0x39, 0x50, 0x88, 0xc9, 0x18, 0xa2, 0x05, 0xec, 0x89, 0xce, - 0x5f, 0xdb, 0xc9, 0xe4, 0x82, 0x72, 0xf4, 0x0c, 0xc7, 0x2b, 0x0f, 0x25, - 0x52, 0xdb, 0x9f, 0xc7, 0x2e, 0xf7, 0x8e, 0x59, 0x4c, 0x4f, 0xe5, 0x86, - 0x88, 0x54, 0xb1, 0x67, 0x85, 0x18, 0x97, 0x79, 0x97, 0x6c, 0x8b, 0x68, - 0x5a, 0xff, 0xf2, 0x8b, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x13, 0x7a, - 0xff, 0xe5, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0xf9, 0x79, 0x9f, - 0x56, 0x72, 0xfd, 0xdc, 0xf4, 0x04, 0xe5, 0x34, 0x0f, 0x19, 0xc7, 0xee, - 0x16, 0x1c, 0xbe, 0xd4, 0xcb, 0xd1, 0xcb, 0x98, 0xc3, 0x97, 0xf9, 0x9d, - 0x4f, 0x66, 0x2c, 0xe5, 0xdb, 0x18, 0x78, 0xc0, 0x95, 0x08, 0xa9, 0x41, - 0x60, 0x12, 0x68, 0x5f, 0xc6, 0x57, 0xe6, 0xa9, 0xa1, 0xb7, 0x9b, 0x9c, - 0xbf, 0x9a, 0x87, 0x9f, 0xa8, 0xd6, 0x72, 0xfc, 0xd5, 0xaa, 0xae, 0x35, - 0x9c, 0xbf, 0xbc, 0x82, 0xde, 0x09, 0xcb, 0xb6, 0x30, 0xf1, 0x80, 0xad, - 0xd3, 0x94, 0xd4, 0x26, 0x00, 0xd0, 0x35, 0x68, 0xc6, 0xd8, 0x65, 0xe2, - 0xcf, 0xc9, 0xaf, 0x9a, 0xbe, 0x3e, 0x1c, 0xbe, 0x69, 0x4e, 0xbd, 0x1c, - 0xbf, 0xff, 0x9a, 0xb1, 0x7f, 0x40, 0xb1, 0x16, 0x1f, 0xdf, 0x92, 0x39, - 0x7f, 0xcf, 0xd4, 0xd8, 0xa3, 0x6d, 0xb6, 0x52, 0xff, 0x75, 0xfd, 0xe7, - 0x76, 0xce, 0x53, 0x49, 0x1f, 0x2d, 0x4c, 0xa1, 0xa9, 0x2f, 0xb4, 0x63, - 0xfb, 0xff, 0xfc, 0xd5, 0x34, 0x35, 0xc8, 0x4f, 0x77, 0x02, 0x9a, 0xc1, - 0x01, 0xcb, 0xf9, 0xae, 0x38, 0xef, 0x23, 0x97, 0xee, 0xa3, 0x81, 0xa3, - 0x1c, 0xa6, 0xa1, 0x18, 0x8d, 0x13, 0x47, 0x8b, 0xec, 0xe7, 0x2f, 0x87, - 0x10, 0x07, 0x2f, 0x9a, 0x38, 0x15, 0x83, 0x94, 0xd0, 0x3c, 0x96, 0x91, - 0x05, 0xff, 0xa2, 0x22, 0x22, 0x23, 0x7d, 0x1c, 0xbd, 0x34, 0x78, 0xe5, - 0xd1, 0x10, 0x7b, 0x13, 0x1d, 0xde, 0x4d, 0xf0, 0xe5, 0xfb, 0x89, 0x3b, - 0xac, 0xa5, 0xcd, 0xb6, 0x52, 0xb0, 0xf0, 0x5b, 0x28, 0xb7, 0xe5, 0x14, - 0x34, 0x57, 0xbb, 0x8c, 0x39, 0x50, 0x8e, 0xa0, 0x16, 0x69, 0xff, 0xe9, - 0x1d, 0xf9, 0xdc, 0x63, 0x68, 0xe5, 0xff, 0xe4, 0x1c, 0x5c, 0x6b, 0x59, - 0x2d, 0xbc, 0x39, 0x7f, 0xb0, 0x29, 0xb3, 0x40, 0x61, 0xcb, 0xff, 0xff, - 0x66, 0xc4, 0xf4, 0xb0, 0x1a, 0x1c, 0x07, 0x22, 0x77, 0xe3, 0x0e, 0x5d, - 0x12, 0x74, 0x51, 0x68, 0xd6, 0xfe, 0xf6, 0xb3, 0x27, 0x83, 0x95, 0xd3, - 0xda, 0x12, 0xdb, 0xed, 0x07, 0xdf, 0x9c, 0xbf, 0xdc, 0xfc, 0x7f, 0xf7, - 0xfe, 0x39, 0x7b, 0xb0, 0x27, 0x2d, 0x08, 0x7a, 0x5e, 0x37, 0xa8, 0x45, - 0xeb, 0x08, 0x7a, 0xed, 0x78, 0x52, 0x0e, 0x5f, 0xa3, 0xea, 0xfa, 0x87, - 0x2b, 0x87, 0x86, 0x23, 0x57, 0xf7, 0x5e, 0x78, 0x76, 0x1c, 0xbf, 0xa5, - 0xaf, 0x60, 0xaa, 0x72, 0xff, 0xe8, 0x66, 0x73, 0x3a, 0x9c, 0xeb, 0x9c, - 0xbc, 0xdb, 0xb6, 0x72, 0xff, 0xf7, 0xb8, 0xf3, 0x87, 0xb1, 0xaf, 0x7f, - 0xd3, 0x97, 0x62, 0xf8, 0x8a, 0xde, 0xa1, 0x68, 0x7a, 0xfc, 0xec, 0xea, - 0x70, 0xe5, 0xff, 0xff, 0xe1, 0x75, 0x53, 0x91, 0x2f, 0x9d, 0x45, 0x86, - 0x3e, 0x6d, 0xff, 0xd4, 0xe1, 0xcb, 0xe7, 0x92, 0x6e, 0x72, 0xff, 0xdd, - 0x4f, 0x67, 0x39, 0xfc, 0xfb, 0x0e, 0x5f, 0xf2, 0x7b, 0x39, 0xcf, 0xe7, - 0xd8, 0x72, 0xf6, 0xbf, 0x1f, 0x88, 0x80, 0xea, 0x1d, 0x05, 0x3b, 0xae, - 0x1d, 0xf4, 0x9c, 0x5f, 0xf5, 0x0a, 0x2b, 0xe5, 0xa0, 0x60, 0xe5, 0xfc, - 0x9d, 0xe7, 0x12, 0x73, 0x95, 0x07, 0x9f, 0xd2, 0x1b, 0x9b, 0xf1, 0xcb, - 0xff, 0x91, 0x3b, 0x36, 0x7a, 0x3d, 0x01, 0x39, 0x68, 0x39, 0x7f, 0xfd, - 0x1b, 0xc9, 0xc4, 0x1f, 0x00, 0x9c, 0x45, 0x4e, 0x54, 0x22, 0xf6, 0x61, - 0x8d, 0xb4, 0x3d, 0xa1, 0x0b, 0xef, 0x6b, 0xa8, 0x72, 0xfa, 0x75, 0xa4, - 0x8e, 0x5f, 0x40, 0x3e, 0xac, 0xe5, 0xf0, 0xfe, 0xf2, 0x39, 0x4c, 0x3c, - 0x6d, 0x12, 0x5f, 0xee, 0xc2, 0xd4, 0x00, 0x20, 0xe5, 0x42, 0x2f, 0xf1, - 0xa5, 0x08, 0xaf, 0xe9, 0x93, 0xbe, 0xc6, 0x1c, 0xac, 0x4c, 0xf3, 0x90, - 0xe1, 0x72, 0xdb, 0xfe, 0xdc, 0x3f, 0x61, 0xaf, 0xbf, 0xe8, 0xe5, 0xcf, - 0xd3, 0x97, 0x95, 0x8f, 0x1c, 0xbf, 0xff, 0x07, 0xb1, 0xc4, 0x04, 0x7d, - 0x89, 0x86, 0x16, 0x72, 0xff, 0x2b, 0x03, 0xed, 0x3f, 0x4e, 0x52, 0x22, - 0x25, 0xd5, 0xaf, 0xc3, 0x8e, 0x33, 0x9c, 0xa8, 0x4d, 0x11, 0x10, 0x5c, - 0x58, 0x61, 0x4d, 0xa2, 0x1b, 0xfd, 0xd8, 0x9f, 0x91, 0x81, 0x39, 0x7f, - 0xfc, 0x39, 0xb1, 0x8f, 0xc9, 0xdf, 0xcf, 0xb8, 0x0e, 0x54, 0x22, 0x15, - 0xcc, 0xef, 0xf0, 0xbc, 0xfb, 0xca, 0x36, 0x8e, 0x5f, 0xed, 0x75, 0xfe, - 0xf6, 0x24, 0x72, 0xa7, 0x3e, 0xcd, 0xcd, 0xef, 0x66, 0x4c, 0x72, 0xff, - 0xfd, 0x37, 0x61, 0x69, 0xc4, 0xda, 0x8f, 0xb3, 0xe3, 0x67, 0x2f, 0xfc, - 0x9c, 0x8d, 0x7d, 0x11, 0x8e, 0x1c, 0xbf, 0xe8, 0x90, 0xbf, 0xa4, 0x9b, - 0x0e, 0x5e, 0xfb, 0x00, 0x39, 0x5d, 0x3d, 0x7d, 0x1c, 0xd9, 0xac, 0xe5, - 0xef, 0x4b, 0x0e, 0x5d, 0xac, 0x39, 0x7f, 0xf6, 0xa3, 0x8c, 0xf0, 0xe4, - 0xee, 0x27, 0x2a, 0x13, 0x9c, 0x9d, 0x73, 0x21, 0x2a, 0x84, 0x4e, 0x28, - 0x01, 0xcf, 0x0b, 0x5f, 0xdf, 0xcd, 0xff, 0xa3, 0xa7, 0x2f, 0xfe, 0x0c, - 0x79, 0xf5, 0x9d, 0xea, 0x2c, 0xe5, 0xfe, 0x9c, 0x30, 0xfc, 0x07, 0xe7, - 0x2f, 0x79, 0x26, 0x39, 0x50, 0x89, 0x5c, 0x43, 0xd1, 0xad, 0xff, 0x71, - 0x35, 0xd7, 0x5c, 0x35, 0x9c, 0xbf, 0x43, 0x5a, 0x36, 0xc3, 0x95, 0x0c, - 0xf2, 0xc9, 0xcf, 0xa4, 0x50, 0x19, 0x40, 0x78, 0xe4, 0xc2, 0x1d, 0xcb, - 0x52, 0x54, 0xab, 0x5c, 0x27, 0xa6, 0x86, 0xf7, 0x23, 0x7f, 0x5c, 0x6f, - 0x1d, 0x86, 0x8b, 0xc2, 0x34, 0x04, 0x83, 0x1d, 0xc6, 0x99, 0xfd, 0x0c, - 0x6d, 0x85, 0xdf, 0x4e, 0xef, 0xff, 0xf9, 0xa9, 0xb4, 0xa3, 0x1a, 0x97, - 0x1a, 0x4d, 0x16, 0xc6, 0xb6, 0x8d, 0xff, 0xcf, 0x9d, 0xdb, 0x39, 0x7a, - 0x6f, 0xab, 0x39, 0x7f, 0xd9, 0xed, 0x67, 0xbb, 0x80, 0x39, 0x4e, 0x7b, - 0x02, 0x41, 0x73, 0x89, 0xca, 0xe1, 0xb5, 0x59, 0x05, 0xf4, 0x7b, 0x16, - 0x72, 0xfd, 0xe8, 0x14, 0x01, 0xcb, 0xfb, 0x1b, 0x70, 0x2f, 0x0e, 0x57, - 0xc3, 0xf4, 0xc2, 0x11, 0x26, 0xbf, 0x90, 0x7d, 0xdc, 0x91, 0xcb, 0xfc, - 0x30, 0xde, 0xde, 0x72, 0x0e, 0x59, 0xb9, 0x1f, 0x08, 0x4b, 0x2f, 0xdc, - 0x9e, 0x3d, 0xa3, 0x97, 0xcf, 0xc7, 0x91, 0xcb, 0x73, 0x0f, 0x28, 0x4a, - 0x6f, 0x36, 0xdb, 0x67, 0x2f, 0xa7, 0x14, 0x82, 0x8a, 0x1a, 0x0b, 0xfe, - 0x6b, 0xeb, 0x8c, 0x83, 0x13, 0x9c, 0xbb, 0x79, 0x1c, 0xbf, 0xca, 0xc7, - 0xb5, 0xd7, 0xfc, 0xe5, 0xf9, 0x27, 0xcd, 0xfc, 0x72, 0xe4, 0x61, 0xca, - 0x84, 0x46, 0x2a, 0x30, 0xb3, 0x5f, 0x14, 0xdf, 0x95, 0x7d, 0x6c, 0x91, - 0xca, 0xdc, 0xfa, 0x3c, 0x7b, 0x4d, 0x12, 0xe4, 0x2c, 0x46, 0x44, 0x18, - 0x4a, 0xe4, 0x24, 0x11, 0xcf, 0xa8, 0xce, 0x65, 0xfc, 0x66, 0x17, 0xff, - 0x6c, 0x6f, 0x34, 0x29, 0x1c, 0xc9, 0xce, 0x5f, 0xff, 0xff, 0xf9, 0xaf, - 0xe7, 0x73, 0x79, 0x75, 0x7f, 0x19, 0xdf, 0xfd, 0xec, 0x1e, 0xe7, 0xa0, - 0x3f, 0x3e, 0x77, 0x6c, 0xe5, 0xff, 0x07, 0x3f, 0x69, 0xa7, 0x5d, 0x67, - 0x2f, 0xd0, 0xb1, 0xc9, 0x8e, 0x61, 0xbd, 0xbd, 0xb3, 0x02, 0x72, 0xfe, - 0xea, 0x40, 0xff, 0x07, 0x2f, 0xf4, 0x35, 0xab, 0x9a, 0x76, 0xb3, 0x94, - 0xa9, 0xf2, 0xf4, 0xb2, 0xba, 0x8a, 0x67, 0x84, 0x1d, 0x05, 0x30, 0x3d, - 0x43, 0x72, 0xfe, 0x89, 0x76, 0x36, 0x21, 0xcb, 0xf2, 0xff, 0x18, 0x59, - 0xcb, 0xee, 0x7e, 0xfa, 0x39, 0x50, 0x79, 0x6e, 0x51, 0x74, 0xbc, 0x72, - 0xfa, 0x68, 0xf3, 0x9c, 0xbe, 0xfc, 0x18, 0x2c, 0x37, 0x3f, 0x8b, 0xda, - 0x47, 0x2a, 0x73, 0xca, 0xe9, 0xcd, 0xff, 0xd1, 0xdf, 0xa1, 0xf2, 0x64, - 0xd0, 0xb3, 0x97, 0xe7, 0x96, 0x93, 0x61, 0xcb, 0xfe, 0xce, 0x67, 0xcc, - 0xe4, 0x04, 0xe5, 0xfd, 0x92, 0xde, 0x59, 0xe3, 0x96, 0xf4, 0x8f, 0x9f, - 0xa7, 0x37, 0xd1, 0xef, 0xd6, 0x72, 0x8d, 0x10, 0x72, 0xfe, 0x79, 0xc0, - 0xe2, 0x12, 0x56, 0x0d, 0x5b, 0x4c, 0x3d, 0x3d, 0xb1, 0x8a, 0x5a, 0x28, - 0x7c, 0xed, 0x7f, 0xfe, 0x5e, 0x9e, 0x5d, 0x4c, 0xf6, 0xb9, 0x81, 0xc3, - 0x97, 0xfd, 0x1e, 0x1c, 0xd8, 0x39, 0xa3, 0x95, 0x08, 0xaf, 0xc2, 0x3d, - 0x2a, 0x5f, 0xcf, 0xd8, 0x6b, 0xfe, 0x47, 0x2a, 0x4a, 0xfb, 0x18, 0xf3, - 0xc8, 0x51, 0xac, 0x8c, 0x08, 0xc3, 0x09, 0x0f, 0x46, 0xf1, 0xb0, 0xba, - 0xfe, 0x90, 0xe6, 0xfe, 0xc3, 0x97, 0xff, 0xef, 0xa0, 0x04, 0x6f, 0x93, - 0x85, 0xdd, 0x8e, 0x13, 0x95, 0x08, 0x85, 0xe1, 0x6d, 0xfe, 0x71, 0xf4, - 0xb3, 0x98, 0x72, 0xff, 0x77, 0x18, 0xfd, 0x8e, 0x9c, 0xbf, 0xf9, 0xd3, - 0xd0, 0x2c, 0xcf, 0x75, 0x0e, 0x5f, 0xc2, 0x80, 0xd7, 0x50, 0xe5, 0xdc, - 0x09, 0xcb, 0x9b, 0x6c, 0xe5, 0x48, 0xd8, 0x36, 0x2f, 0x7a, 0x13, 0x61, - 0x45, 0x0d, 0x15, 0xff, 0x20, 0xa0, 0x35, 0x9d, 0x73, 0x95, 0x89, 0xaa, - 0xf4, 0xc9, 0xd0, 0x74, 0xfd, 0xe2, 0xeb, 0x81, 0xa3, 0x97, 0xf2, 0x75, - 0x15, 0x56, 0x0e, 0x5d, 0xaf, 0xa1, 0x3c, 0x5f, 0x0b, 0xd2, 0x22, 0xfb, - 0xec, 0x23, 0xaf, 0x36, 0xdb, 0x65, 0x28, 0xa2, 0x86, 0x82, 0xf9, 0x1b, - 0x49, 0x8a, 0x53, 0x0d, 0xfa, 0x0e, 0x5f, 0xb3, 0x91, 0xb3, 0x0e, 0x54, - 0x32, 0xa1, 0xa7, 0x46, 0xc8, 0xfb, 0x12, 0x70, 0x57, 0x91, 0x84, 0xac, - 0x8b, 0xb2, 0x91, 0x06, 0x11, 0x1a, 0x20, 0xbe, 0xe4, 0xbf, 0xc3, 0x97, - 0xf8, 0x77, 0xf7, 0xde, 0xb8, 0x0e, 0x5e, 0x14, 0xd1, 0xcb, 0xe0, 0xb8, - 0x80, 0xe5, 0xff, 0xd0, 0x20, 0x18, 0xde, 0x68, 0x10, 0x1c, 0xac, 0x45, - 0xaa, 0x1b, 0x00, 0x6f, 0x44, 0x37, 0xe9, 0xb6, 0xc1, 0xb7, 0x87, 0x2c, - 0x87, 0x2f, 0xf9, 0xd5, 0x67, 0x50, 0x2f, 0x23, 0x97, 0xd3, 0xce, 0xfb, - 0x9c, 0xb8, 0x1a, 0x43, 0xee, 0x11, 0x0f, 0xa7, 0x37, 0xe8, 0xce, 0x75, - 0x0e, 0x5f, 0xfe, 0x6c, 0x1d, 0xcc, 0x9d, 0x33, 0x64, 0x6e, 0x72, 0xff, - 0xf0, 0x21, 0x7c, 0xe4, 0x4f, 0xe7, 0x75, 0x4e, 0x5f, 0xe9, 0x67, 0x71, - 0x70, 0xc3, 0x97, 0xb1, 0x6d, 0x67, 0x2f, 0xfc, 0xfb, 0x33, 0xe8, 0xc7, - 0x52, 0x73, 0x97, 0xfb, 0x34, 0x39, 0xee, 0xa1, 0xca, 0x0a, 0x24, 0x78, - 0x3e, 0x28, 0x35, 0x89, 0xf5, 0xcc, 0x77, 0xd2, 0x60, 0x26, 0xf9, 0x2f, - 0x64, 0x30, 0xef, 0xef, 0x64, 0xc3, 0x0b, 0x3c, 0x40, 0x4b, 0xf3, 0x88, - 0x7b, 0x06, 0x88, 0x08, 0xa1, 0xba, 0xbf, 0xf9, 0x37, 0xd0, 0x70, 0x60, - 0x7f, 0x83, 0x97, 0xff, 0x7e, 0xc5, 0x79, 0x9b, 0xe8, 0x0f, 0xe3, 0x97, - 0xe8, 0x93, 0xee, 0xd9, 0xcb, 0xff, 0x33, 0xe7, 0x39, 0x9d, 0xde, 0x5a, - 0x39, 0x58, 0x8f, 0x74, 0x43, 0xe2, 0x43, 0x94, 0xda, 0x73, 0x97, 0xef, - 0x99, 0x32, 0x2c, 0xe5, 0xff, 0xef, 0xe3, 0xe6, 0xd7, 0x93, 0x5d, 0xdd, - 0xdb, 0x39, 0x53, 0x9f, 0xe6, 0x8a, 0xaf, 0xfd, 0x81, 0xeb, 0xa9, 0x1d, - 0x8d, 0xce, 0x53, 0x41, 0x1e, 0x1c, 0x84, 0x72, 0xc8, 0xef, 0xf8, 0x55, - 0xe0, 0xa3, 0x3f, 0x13, 0x97, 0xef, 0x46, 0x0c, 0x1c, 0xa4, 0x3d, 0xe1, - 0x39, 0xbe, 0x9f, 0xe8, 0xf8, 0xe5, 0xff, 0xf9, 0xf7, 0xdf, 0x50, 0x3e, - 0xfb, 0x37, 0x53, 0xda, 0x39, 0x50, 0x99, 0xb6, 0x42, 0x5d, 0x08, 0x3f, - 0x25, 0xbe, 0x5c, 0x62, 0xce, 0x5f, 0xfb, 0x17, 0x0c, 0x4f, 0x73, 0xf5, - 0x9c, 0xbc, 0x9b, 0xe8, 0xe5, 0x48, 0xf7, 0x00, 0x7f, 0x7f, 0x37, 0xad, - 0x40, 0x1a, 0x83, 0x95, 0x07, 0xac, 0xe4, 0x57, 0xfb, 0x93, 0x69, 0x07, - 0xc8, 0x72, 0xff, 0x75, 0x37, 0x07, 0x1c, 0x27, 0x2f, 0xb7, 0x07, 0x20, - 0xa5, 0xcd, 0xb6, 0x52, 0xa0, 0xde, 0x36, 0x47, 0x70, 0xa1, 0x45, 0x0d, - 0x0d, 0xff, 0xff, 0xc2, 0xa6, 0x66, 0xd4, 0x4c, 0x8b, 0x89, 0xbe, 0x0e, - 0xf2, 0xef, 0xe0, 0x39, 0x47, 0x2f, 0x3f, 0x25, 0xf1, 0x33, 0xc9, 0x42, - 0x47, 0x72, 0x60, 0x3d, 0x53, 0x56, 0xca, 0xc9, 0x88, 0x6c, 0x48, 0xef, - 0x25, 0x44, 0x24, 0x26, 0x79, 0x19, 0xdf, 0x65, 0x30, 0x3a, 0x08, 0xc3, - 0x4f, 0xc4, 0x1f, 0xc6, 0xdf, 0x7b, 0xc8, 0xd9, 0xcb, 0xd3, 0xba, 0xce, - 0x5e, 0xf2, 0x36, 0x78, 0xc2, 0x17, 0xde, 0xfd, 0xfe, 0x9a, 0x20, 0x76, - 0xe6, 0xaa, 0x9d, 0x11, 0x5f, 0xa3, 0xde, 0x1e, 0x34, 0xce, 0x5f, 0xec, - 0x64, 0x4e, 0x30, 0xc3, 0x96, 0x01, 0xcb, 0x35, 0xfc, 0x3c, 0x34, 0x32, - 0xba, 0x3f, 0x39, 0x7e, 0xfc, 0x41, 0xf6, 0x47, 0x2f, 0xff, 0x87, 0x35, - 0xf3, 0xef, 0x60, 0x0b, 0x79, 0x7c, 0xc3, 0xc2, 0xd0, 0xbd, 0x7e, 0x8d, - 0x9d, 0x8d, 0xd7, 0xfe, 0xef, 0xf3, 0xc7, 0xc8, 0xf4, 0x04, 0xe5, 0xe7, - 0xe4, 0xe7, 0x2e, 0x6d, 0xb3, 0x97, 0xfb, 0x89, 0x9b, 0x3e, 0xc9, 0x46, - 0x1b, 0x66, 0xc7, 0x6f, 0xfc, 0x8a, 0xfc, 0xd7, 0xe0, 0x5c, 0x48, 0xe5, - 0xfe, 0xd6, 0x79, 0xd7, 0x82, 0x72, 0x82, 0x99, 0xdf, 0x1e, 0x3a, 0x9f, - 0xe4, 0x3b, 0xff, 0x6b, 0x07, 0x3b, 0x8c, 0xc1, 0x39, 0x7f, 0xec, 0x57, - 0xaf, 0x2f, 0xaf, 0xbc, 0x1c, 0xa9, 0x1f, 0xe0, 0x9d, 0xd4, 0x23, 0x6f, - 0x21, 0x75, 0x7f, 0xf2, 0xd6, 0xf2, 0xce, 0x31, 0xdd, 0x86, 0x88, 0x61, - 0x7f, 0xff, 0xf9, 0xf5, 0x83, 0x8c, 0xec, 0x6f, 0x2d, 0xbc, 0xeb, 0x13, - 0x05, 0xd5, 0x39, 0x58, 0x8c, 0x8f, 0xd4, 0x2a, 0x17, 0x22, 0x52, 0x33, - 0xce, 0xca, 0x3c, 0x18, 0x77, 0x5f, 0xdd, 0x79, 0xc6, 0x24, 0x52, 0xff, - 0xde, 0xeb, 0xa7, 0xa3, 0x90, 0x03, 0x97, 0xee, 0xb8, 0xfd, 0x9c, 0xe5, - 0x2d, 0x12, 0x82, 0x5a, 0xd9, 0xed, 0xff, 0x91, 0x91, 0xa7, 0xe7, 0x11, - 0xb3, 0x97, 0x6b, 0xf3, 0x97, 0xf4, 0xba, 0xee, 0x30, 0x72, 0xd0, 0xc3, - 0xc3, 0xdc, 0x62, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x05, 0x2f, 0x76, 0x16, - 0x72, 0xff, 0xd1, 0x3b, 0xfb, 0x99, 0x2d, 0xbc, 0x39, 0x58, 0x89, 0x14, - 0x34, 0x11, 0xcb, 0xf7, 0x61, 0x7f, 0xee, 0x72, 0xfb, 0xda, 0x80, 0x14, - 0xbc, 0xfc, 0x9c, 0xa5, 0xf7, 0xe2, 0xea, 0x94, 0xbf, 0xc9, 0x3e, 0x7b, - 0x50, 0x02, 0x94, 0x52, 0xfe, 0xc6, 0x47, 0x61, 0x65, 0x2e, 0x6d, 0xb2, - 0x97, 0xf0, 0xc0, 0xce, 0x9c, 0x29, 0x58, 0x98, 0x8b, 0x08, 0x96, 0x3b, - 0xd2, 0x30, 0x19, 0x88, 0x5b, 0x65, 0x9f, 0x46, 0x6e, 0x4e, 0x14, 0x50, - 0xfc, 0xea, 0x4a, 0x80, 0xe6, 0x2d, 0xec, 0x75, 0xd5, 0x0a, 0xe9, 0xb0, - 0xc3, 0xb0, 0x81, 0x79, 0x57, 0x97, 0xf6, 0x0e, 0x90, 0x70, 0xe5, 0xee, - 0xfe, 0xb3, 0x95, 0xd3, 0xc8, 0xda, 0x2a, 0xbf, 0xce, 0x39, 0xae, 0x46, - 0x8e, 0x5f, 0xc1, 0xc1, 0x7f, 0x68, 0xe5, 0xa2, 0x47, 0xbb, 0xa3, 0x1b, - 0xf7, 0x37, 0x96, 0x78, 0xe5, 0xff, 0xf3, 0xa0, 0x35, 0x8a, 0xba, 0xf9, - 0x18, 0x27, 0x2f, 0xde, 0x4c, 0xdf, 0xc7, 0x2f, 0xff, 0xfb, 0xa9, 0xcc, - 0x0b, 0xaf, 0x07, 0xc3, 0x0d, 0xe7, 0xb4, 0x72, 0xd0, 0x72, 0xfa, 0x36, - 0x06, 0x18, 0x7e, 0x80, 0x64, 0xbf, 0xf3, 0xcb, 0xaf, 0xed, 0x60, 0xc8, - 0xe5, 0x74, 0xfd, 0xfc, 0x75, 0x5c, 0x4e, 0xaf, 0xa5, 0x3a, 0x4d, 0xf4, - 0x62, 0x77, 0xfb, 0x79, 0x6d, 0xc3, 0x31, 0x67, 0x2f, 0xff, 0xfd, 0xce, - 0x46, 0xf2, 0xdf, 0x49, 0xc6, 0x77, 0x3e, 0xf1, 0x20, 0x27, 0x2f, 0xf9, - 0xf9, 0x9b, 0xca, 0x01, 0x07, 0x2a, 0x11, 0xbf, 0x86, 0xff, 0xb8, 0x5f, - 0xff, 0x98, 0xab, 0xeb, 0x39, 0x24, 0xeb, 0x8e, 0xf2, 0x39, 0x7f, 0xe6, - 0x47, 0xb5, 0x9e, 0x4d, 0xdb, 0x39, 0x67, 0xc4, 0x4b, 0x2a, 0xad, 0x50, - 0xa8, 0x43, 0xb1, 0x91, 0x8c, 0x31, 0x6f, 0x9e, 0x7f, 0xac, 0x39, 0x73, - 0x80, 0xe5, 0x48, 0xdd, 0xf8, 0x96, 0xff, 0xfc, 0xef, 0x27, 0xef, 0xcc, - 0x9f, 0xff, 0x7e, 0xff, 0x4d, 0x17, 0xda, 0xf0, 0x20, 0x27, 0x2f, 0xe7, - 0x64, 0x0c, 0x00, 0xe5, 0xff, 0xb4, 0x83, 0xbc, 0xb9, 0xfc, 0x68, 0xe5, - 0x4c, 0x8e, 0xfe, 0x34, 0x74, 0x73, 0xc5, 0x77, 0xee, 0xe4, 0xd0, 0xd6, - 0x72, 0xfc, 0x1e, 0x73, 0x1b, 0x39, 0x68, 0x9c, 0xf5, 0x04, 0xae, 0xcc, - 0x39, 0x7f, 0xff, 0x80, 0x9c, 0x57, 0xb0, 0xb9, 0xa4, 0x83, 0xd8, 0xe4, - 0x1c, 0xb7, 0xb0, 0xfc, 0xb4, 0x23, 0x7d, 0xe1, 0xc9, 0x1c, 0xa8, 0x3c, - 0x84, 0x27, 0xbf, 0xf0, 0xa4, 0xbd, 0xdc, 0xe2, 0x68, 0xe5, 0xfd, 0x12, - 0x1c, 0xc9, 0xce, 0x5f, 0xe7, 0x0c, 0x02, 0x1b, 0xd1, 0xca, 0xe9, 0xef, - 0xb9, 0x65, 0xfd, 0xb6, 0xd4, 0xbe, 0x7c, 0xee, 0xd9, 0xe2, 0x01, 0x5f, - 0xef, 0x03, 0xe8, 0xcb, 0xb8, 0x78, 0x80, 0x57, 0x9f, 0x92, 0x3c, 0x40, - 0x2a, 0xc3, 0xeb, 0xfd, 0x0a, 0xe7, 0x91, 0xe2, 0x01, 0x5f, 0x38, 0xef, - 0x23, 0xc4, 0x02, 0xbf, 0xc8, 0xce, 0xe0, 0x01, 0x07, 0x88, 0x05, 0x79, - 0x04, 0x27, 0x88, 0x05, 0x41, 0x45, 0xca, 0xc8, 0xfa, 0x5f, 0xb0, 0xfe, - 0xca, 0x9e, 0x20, 0x15, 0xee, 0x47, 0x8f, 0x10, 0x0a, 0x8f, 0x10, 0x0a, - 0xf6, 0xda, 0x00, 0xf1, 0x00, 0xae, 0x85, 0x9e, 0x20, 0x15, 0x04, 0xf9, - 0xf0, 0x61, 0x0b, 0x2f, 0x91, 0x61, 0x83, 0xc4, 0x02, 0xbd, 0xe7, 0x61, - 0xe2, 0x01, 0x5f, 0xf8, 0x5e, 0x4a, 0x75, 0x18, 0xfc, 0x3c, 0x40, 0x2b, - 0xff, 0x9f, 0xdf, 0xce, 0x83, 0xee, 0xbc, 0x8f, 0x10, 0x0a, 0xe7, 0x09, - 0xe2, 0x01, 0x5f, 0xe1, 0x76, 0xf5, 0xa8, 0x01, 0xe2, 0x01, 0x5f, 0x91, - 0x57, 0x10, 0x1e, 0x20, 0x15, 0xc9, 0xa3, 0xc4, 0x02, 0xae, 0x1e, 0xbf, - 0x8d, 0x2f, 0xff, 0x75, 0x3d, 0xec, 0xd7, 0xce, 0x24, 0x2c, 0xf1, 0x00, - 0xaf, 0xde, 0x18, 0xde, 0x46, 0x88, 0x05, 0x70, 0x20, 0xf1, 0x00, 0x94, - 0x36, 0xb7, 0xe4, 0x85, 0xb8, 0x4f, 0x10, 0x0a, 0xfb, 0xf7, 0x16, 0x1e, - 0x20, 0x15, 0xe8, 0xe3, 0x0f, 0x10, 0x0a, 0xff, 0xd9, 0xbe, 0x83, 0x18, - 0x20, 0xd1, 0xe2, 0x01, 0x5f, 0xbf, 0x79, 0x4a, 0x0f, 0x10, 0x0a, 0xfc, - 0xec, 0xec, 0x6e, 0x78, 0x80, 0x55, 0x88, 0xb5, 0xea, 0x5f, 0xe6, 0xb7, - 0x70, 0x07, 0x88, 0x05, 0x52, 0x56, 0x62, 0x12, 0x3c, 0x84, 0xbb, 0x08, - 0x92, 0x11, 0xbd, 0x34, 0x01, 0x9e, 0x8b, 0xfd, 0x0d, 0xef, 0xcc, 0x2f, - 0xd9, 0xed, 0x3e, 0xe7, 0x88, 0x05, 0x7f, 0x83, 0x0c, 0x9b, 0x91, 0xe3, - 0xc4, 0x02, 0x09, 0xb5, 0xbd, 0xc8, 0x6c, 0xf1, 0x00, 0xa9, 0x87, 0xf7, - 0xc5, 0x1b, 0xfd, 0xfb, 0xca, 0x51, 0xf5, 0x67, 0x88, 0x05, 0x7c, 0x83, - 0x2d, 0x1e, 0x20, 0x15, 0xfc, 0xf3, 0x4b, 0x37, 0x91, 0xe2, 0x01, 0x56, - 0x23, 0x3f, 0xa4, 0x40, 0x43, 0xfc, 0xba, 0xff, 0xbb, 0x1a, 0x53, 0x5f, - 0xf0, 0x07, 0x88, 0x05, 0x64, 0x3c, 0x40, 0x2b, 0x9e, 0x70, 0x9f, 0x37, - 0x52, 0x6e, 0xe0, 0x0f, 0x10, 0x0a, 0xfc, 0xfe, 0xd2, 0x6e, 0x78, 0x80, - 0x57, 0xf2, 0x0f, 0xf2, 0xcd, 0x1e, 0x20, 0x15, 0x42, 0x24, 0xc4, 0x93, - 0xc6, 0xb5, 0x0c, 0xa7, 0xe0, 0xc2, 0xdf, 0x21, 0xb6, 0x87, 0xf3, 0x0f, - 0xf2, 0x12, 0x1d, 0x2d, 0x72, 0xe0, 0x14, 0x8a, 0x5e, 0xa5, 0xc1, 0xfa, - 0x50, 0xd6, 0xdc, 0x28, 0xfe, 0xc3, 0x06, 0xf7, 0x91, 0xb3, 0xc6, 0x12, - 0xbc, 0xee, 0xc3, 0x44, 0x02, 0x51, 0x31, 0x5d, 0xe1, 0xd7, 0x7c, 0xab, - 0x47, 0x0a, 0xce, 0x5d, 0xb2, 0x73, 0x97, 0xed, 0x83, 0x01, 0xe9, 0xca, - 0x83, 0xc3, 0x41, 0xab, 0xff, 0xa4, 0x38, 0xce, 0xa0, 0x01, 0xfc, 0xc7, - 0x2f, 0xde, 0xc0, 0xbf, 0x4e, 0x5c, 0x08, 0x29, 0x65, 0x4a, 0x5e, 0xec, - 0x4e, 0x72, 0xe6, 0xdb, 0x29, 0x48, 0x7b, 0xcd, 0x62, 0xd3, 0x09, 0x36, - 0x3b, 0x6d, 0x14, 0x50, 0xf0, 0x2c, 0xbc, 0x47, 0x42, 0x43, 0x16, 0xf2, - 0x7f, 0xe3, 0x97, 0xff, 0xbd, 0xac, 0x55, 0x39, 0xf4, 0x00, 0x8d, 0xce, - 0x54, 0xec, 0xf1, 0x19, 0x10, 0x06, 0x13, 0x8c, 0xa5, 0xda, 0x22, 0x7f, - 0x1b, 0x5c, 0x80, 0x11, 0x97, 0x78, 0xb3, 0xe8, 0xed, 0xff, 0x64, 0x90, - 0x2e, 0xcd, 0x48, 0xe5, 0xff, 0x2d, 0x05, 0x89, 0xc4, 0x01, 0xca, 0x61, - 0xf7, 0xf4, 0xe2, 0xf3, 0x3a, 0x27, 0x2f, 0xfe, 0xf6, 0xde, 0x4d, 0x27, - 0xe4, 0xe1, 0x83, 0x94, 0xb3, 0xe5, 0x11, 0xcb, 0xfb, 0xdf, 0x76, 0x6c, - 0x8d, 0x1c, 0xbf, 0xd9, 0xbf, 0xbc, 0xf2, 0xd1, 0xcb, 0xd2, 0x69, 0xc8, - 0xe5, 0xdb, 0xc8, 0xf1, 0x80, 0x2b, 0x73, 0xc6, 0x12, 0x1a, 0x84, 0xde, - 0x32, 0x10, 0xe8, 0x43, 0xc3, 0x47, 0x7a, 0xbf, 0xff, 0x90, 0x47, 0xfd, - 0xf3, 0x7f, 0x07, 0x8f, 0xbe, 0x4e, 0x72, 0xfd, 0x34, 0xa3, 0x93, 0x9c, - 0xbe, 0x85, 0x61, 0x67, 0x2a, 0x48, 0xaa, 0xe2, 0xf2, 0xca, 0xaf, 0xfd, - 0x2d, 0x7c, 0x1c, 0x5c, 0x71, 0x53, 0x97, 0xf4, 0xa3, 0x80, 0xfa, 0xb3, - 0x97, 0xff, 0x6c, 0x1c, 0xd7, 0xb0, 0x65, 0x9a, 0x39, 0x7c, 0xb8, 0xff, - 0xc7, 0x2b, 0x0f, 0x9d, 0xd1, 0x2e, 0xeb, 0xe2, 0x2d, 0xc6, 0x12, 0xf7, - 0xfd, 0x0d, 0x61, 0xec, 0x4e, 0xe2, 0x72, 0xff, 0xa1, 0x90, 0xb4, 0x58, - 0x10, 0xe5, 0x71, 0x14, 0x7d, 0x31, 0xda, 0x3b, 0xbf, 0xbe, 0xb7, 0xc4, - 0xce, 0x94, 0xbf, 0x6b, 0xb1, 0x93, 0x9c, 0xbf, 0xf8, 0x02, 0x99, 0xbf, - 0xa6, 0x93, 0xf0, 0xe5, 0xf4, 0xdd, 0x79, 0x8e, 0x5f, 0x31, 0xf9, 0x39, - 0xcb, 0xf6, 0x4d, 0x28, 0xdc, 0xe5, 0xee, 0xa4, 0xc7, 0x2f, 0x0c, 0x48, - 0xa5, 0xff, 0x84, 0x09, 0xb5, 0xb5, 0xfc, 0xa1, 0xac, 0xe5, 0x61, 0xf1, - 0xb8, 0xdd, 0x7c, 0x4d, 0xf7, 0x72, 0x8e, 0x22, 0xf4, 0x90, 0x48, 0xfc, - 0x53, 0xb5, 0x08, 0x0a, 0x85, 0xc1, 0xac, 0x30, 0x48, 0xe6, 0xfa, 0x66, - 0xf1, 0xd6, 0xdf, 0xdb, 0xeb, 0x9c, 0x8f, 0x1c, 0xbf, 0xa5, 0xa5, 0x78, - 0xec, 0x39, 0x78, 0x7d, 0xa3, 0x97, 0x85, 0x24, 0x72, 0xfd, 0xaf, 0xc7, - 0xf6, 0x1c, 0xbf, 0xbd, 0x34, 0xb3, 0x79, 0x1c, 0xa8, 0x46, 0x02, 0x17, - 0xb8, 0xe7, 0xe3, 0x7f, 0x4a, 0xaf, 0xfe, 0xeb, 0x71, 0xcd, 0x63, 0x6f, - 0xc5, 0x4e, 0x5f, 0x04, 0x38, 0xb3, 0x97, 0x02, 0x0a, 0x5c, 0xdb, 0x65, - 0x29, 0x0d, 0x7b, 0x62, 0xd7, 0xe0, 0xfe, 0xfc, 0x91, 0x45, 0x0d, 0x0d, - 0x62, 0x2b, 0x15, 0x72, 0xbf, 0xfd, 0xed, 0xd8, 0x9d, 0xdb, 0x8f, 0x77, - 0xee, 0x8e, 0x5f, 0xe8, 0x92, 0x7a, 0x51, 0xe3, 0x97, 0x34, 0xf4, 0x73, - 0x86, 0xca, 0xff, 0xba, 0xfe, 0xd3, 0x07, 0x27, 0x39, 0x73, 0x10, 0xe5, - 0xf0, 0xa6, 0xf2, 0x39, 0x7f, 0xc9, 0xbf, 0x70, 0x3c, 0x76, 0x1c, 0xa8, - 0x3d, 0xbe, 0x11, 0x5f, 0xf7, 0x63, 0x90, 0xc4, 0x16, 0x1c, 0xbc, 0xab, - 0xe9, 0x88, 0xc9, 0xe3, 0x8e, 0xd1, 0x0d, 0x62, 0x68, 0xfe, 0x8c, 0x0a, - 0xa4, 0xac, 0xd3, 0x90, 0xf3, 0x59, 0x1f, 0xf0, 0x83, 0x6e, 0x37, 0x2b, - 0xf9, 0xb5, 0x5f, 0xc3, 0x07, 0x2f, 0xbf, 0x5e, 0x04, 0xe5, 0x6e, 0x7a, - 0x3b, 0x45, 0xd7, 0xfe, 0xee, 0x6d, 0x38, 0xab, 0x9b, 0xf8, 0xe5, 0xff, - 0x63, 0x3a, 0x81, 0xef, 0xea, 0x9c, 0xbd, 0xec, 0x61, 0xca, 0x59, 0xeb, - 0xe8, 0xee, 0xf4, 0x96, 0x03, 0x94, 0xaa, 0x36, 0x01, 0x09, 0x9f, 0x11, - 0x5f, 0xf2, 0xaf, 0xf2, 0x16, 0x28, 0xa9, 0xcb, 0xff, 0x3e, 0x97, 0x09, - 0xce, 0x23, 0x67, 0x2d, 0xa5, 0x4f, 0xe7, 0xa7, 0x77, 0xcf, 0x27, 0xe1, - 0xcb, 0xfe, 0xcf, 0x79, 0x15, 0xf6, 0x30, 0xe5, 0xfd, 0x1b, 0xeb, 0x37, - 0xf1, 0xcb, 0xb9, 0x07, 0x28, 0x27, 0x8b, 0xe2, 0xfb, 0xfd, 0xe4, 0x62, - 0x06, 0x3c, 0x72, 0xfd, 0xa8, 0x66, 0x2c, 0xe5, 0x41, 0xec, 0xe8, 0xca, - 0xda, 0x0a, 0x63, 0x58, 0xfd, 0xc7, 0xba, 0xdd, 0x39, 0xa5, 0x94, 0xfa, - 0x33, 0xbb, 0xfe, 0xf2, 0x4f, 0x1b, 0x83, 0x90, 0x72, 0xf6, 0xbd, 0x87, - 0x2e, 0xcd, 0x7c, 0x3d, 0x6f, 0xa7, 0x57, 0xff, 0x67, 0x93, 0x79, 0x0c, - 0x34, 0x9a, 0x9e, 0xd9, 0xcb, 0xff, 0xdf, 0xcb, 0xae, 0x9e, 0x41, 0xf7, - 0xfd, 0x39, 0x7e, 0xcf, 0x01, 0xfc, 0x72, 0xa4, 0x8c, 0x3e, 0x28, 0xed, - 0xa5, 0xdf, 0xff, 0xa3, 0xaf, 0x83, 0x1c, 0x54, 0x3f, 0xbf, 0x24, 0x72, - 0xa4, 0x9b, 0xe7, 0xa1, 0xe9, 0xb4, 0x67, 0x50, 0xbc, 0x73, 0x90, 0xaf, - 0x48, 0x7f, 0x3c, 0xa4, 0x9f, 0xe5, 0x05, 0x5f, 0x75, 0x1e, 0x47, 0x2f, - 0xf6, 0x0c, 0xb3, 0x5f, 0x56, 0x72, 0xfc, 0xbd, 0x01, 0xdc, 0xe5, 0x78, - 0xf6, 0xfe, 0x9a, 0x5f, 0xf7, 0x30, 0x7e, 0x77, 0x37, 0x6c, 0xe5, 0xff, - 0x48, 0x7f, 0x07, 0xc6, 0x2c, 0x07, 0x2a, 0x74, 0xc6, 0x64, 0xf9, 0x84, - 0x9b, 0x9e, 0x5f, 0xfc, 0xfd, 0xd2, 0x49, 0x3d, 0x1e, 0xd1, 0xcb, 0xfe, - 0x18, 0xcd, 0xfd, 0x9c, 0x83, 0x97, 0xfe, 0x8e, 0xfd, 0xd0, 0xe7, 0xbb, - 0x87, 0x2a, 0x11, 0xf0, 0x87, 0xee, 0x86, 0x03, 0x7b, 0xf3, 0xec, 0x08, - 0x60, 0xe5, 0xda, 0xd1, 0xcb, 0xcd, 0xb6, 0xd9, 0xcb, 0x80, 0xe5, 0x14, - 0x34, 0x15, 0xc3, 0xde, 0xd1, 0xbd, 0xff, 0xb3, 0x42, 0xea, 0xcc, 0x29, - 0x31, 0xcb, 0xf8, 0x11, 0x2e, 0xfd, 0xd1, 0xcb, 0xf9, 0x04, 0x0c, 0x62, - 0x1c, 0xbc, 0xe0, 0xc2, 0x95, 0x24, 0xd7, 0xd7, 0x08, 0x7e, 0x91, 0x00, - 0xff, 0x61, 0x86, 0xd9, 0x65, 0xf4, 0x05, 0x02, 0x72, 0xfc, 0x1e, 0x27, - 0xf3, 0x9c, 0xbf, 0xcd, 0xe0, 0xe6, 0xc4, 0xe1, 0xcb, 0xf8, 0x73, 0x70, - 0x7d, 0x91, 0xca, 0x99, 0x11, 0xc2, 0x55, 0xe3, 0x4b, 0xf6, 0x67, 0xbb, - 0x87, 0x2e, 0x75, 0x9c, 0xbf, 0xd9, 0xb3, 0x14, 0x6d, 0xb6, 0xca, 0x5f, - 0xa6, 0x8c, 0xee, 0x8e, 0x50, 0x9f, 0x0f, 0xd3, 0x9b, 0xfc, 0xd3, 0x8f, - 0xd9, 0xd4, 0xe1, 0xcb, 0xcb, 0x7f, 0x1c, 0xa9, 0x91, 0xdd, 0xd7, 0x7f, - 0xc8, 0xf6, 0x1c, 0x5f, 0xc3, 0xb1, 0xd6, 0x8b, 0x39, 0x7e, 0xc9, 0xa5, - 0x12, 0x39, 0x7f, 0x4e, 0x18, 0xc1, 0x09, 0xca, 0x85, 0x63, 0x32, 0x62, - 0x48, 0x57, 0xf4, 0xc1, 0xe3, 0x14, 0xd2, 0x0f, 0x8b, 0xbe, 0x94, 0x5e, - 0x70, 0x21, 0xcb, 0xfe, 0x08, 0xff, 0xac, 0x9f, 0x27, 0x39, 0x7a, 0x38, - 0x27, 0x2f, 0xf6, 0x04, 0x5f, 0x48, 0x13, 0x96, 0xe9, 0xcb, 0xdf, 0xbc, - 0xe2, 0x78, 0x5a, 0x31, 0xb2, 0x71, 0x12, 0x3e, 0x5d, 0xa5, 0xa6, 0x1e, - 0xe3, 0x6d, 0x38, 0x66, 0x5f, 0x86, 0x27, 0x89, 0x1c, 0xbf, 0xfd, 0x81, - 0x75, 0xe6, 0xf2, 0xc0, 0x60, 0x4e, 0x5d, 0xd7, 0x39, 0x74, 0xda, 0x39, - 0x7e, 0xcd, 0x88, 0x21, 0xc3, 0x5d, 0xf4, 0x5a, 0xfe, 0xf9, 0xec, 0xd6, - 0xa0, 0xe5, 0xfb, 0xb9, 0xbf, 0xa0, 0xe5, 0xfb, 0x69, 0xe7, 0xfb, 0x23, - 0x95, 0xf1, 0x33, 0xb5, 0x1d, 0xe0, 0xff, 0x0b, 0xff, 0x28, 0xbe, 0x0e, - 0x75, 0xce, 0x5f, 0xfb, 0x06, 0x5d, 0xc1, 0x18, 0x6c, 0xe5, 0xff, 0xb3, - 0x9c, 0x79, 0x7c, 0xd9, 0x0d, 0x67, 0x2a, 0x11, 0x03, 0x23, 0xca, 0xe2, - 0x62, 0x22, 0x9b, 0xe8, 0x51, 0x5f, 0xee, 0x6b, 0xb8, 0x29, 0xa3, 0x95, - 0x0a, 0xb6, 0x92, 0x53, 0x9b, 0x9a, 0xdf, 0xf6, 0x07, 0x06, 0x07, 0xf8, - 0x39, 0x74, 0x36, 0x72, 0xa1, 0xdf, 0xdb, 0xcf, 0x0a, 0x79, 0x4e, 0x56, - 0x06, 0x72, 0x27, 0x21, 0x20, 0xac, 0x20, 0x99, 0x2f, 0x8b, 0x77, 0x64, - 0x8c, 0x42, 0x68, 0x49, 0x72, 0x9f, 0xe4, 0xb9, 0x51, 0x7d, 0x9d, 0x10, - 0x75, 0x50, 0x43, 0xbc, 0x69, 0x36, 0xfa, 0x94, 0xe7, 0xe9, 0xcb, 0x2f, - 0xe3, 0x8c, 0xd9, 0x2c, 0x4f, 0xe9, 0xb6, 0xd1, 0xb5, 0xff, 0x67, 0x06, - 0x3d, 0x2c, 0xe9, 0xcb, 0xf8, 0x41, 0x81, 0x79, 0x1c, 0xbf, 0xef, 0x6b, - 0xa9, 0x0b, 0x70, 0x9c, 0xbf, 0xf7, 0x50, 0x63, 0x7d, 0x22, 0xe0, 0xe5, - 0xed, 0x47, 0x0e, 0x5d, 0xed, 0x30, 0xf6, 0x77, 0x3d, 0xa8, 0x46, 0x07, - 0xf0, 0x91, 0xbf, 0xcc, 0x1c, 0x94, 0x9f, 0x47, 0x2f, 0xe7, 0x6f, 0x01, - 0xf7, 0xc7, 0x2f, 0xcf, 0x2f, 0x81, 0x43, 0x97, 0xf6, 0xb0, 0x29, 0xa9, - 0xce, 0x5e, 0x94, 0x00, 0xe5, 0xfb, 0xec, 0xd2, 0x86, 0xb2, 0x95, 0x0a, - 0x93, 0xb0, 0xdd, 0x58, 0x76, 0x21, 0x47, 0x0c, 0xba, 0x61, 0xa2, 0x9f, - 0x17, 0x7d, 0x1c, 0xb3, 0x0e, 0x5f, 0xfc, 0xa8, 0xfe, 0xff, 0x73, 0x49, - 0x02, 0x72, 0xf6, 0xda, 0x04, 0xe5, 0x70, 0xf9, 0x16, 0x8b, 0x7f, 0xf6, - 0xfe, 0xfd, 0x7d, 0x84, 0x17, 0x09, 0xcb, 0xe5, 0x78, 0xed, 0x9c, 0xb7, - 0xd3, 0x44, 0x0a, 0xb7, 0x8d, 0x40, 0xa2, 0xbc, 0x6f, 0x9b, 0x20, 0xac, - 0x44, 0x22, 0x31, 0x5f, 0xc8, 0xd3, 0x67, 0x61, 0xb3, 0x97, 0xfb, 0xa9, - 0xf5, 0x40, 0x02, 0x0a, 0x57, 0x0f, 0xa3, 0x6c, 0xca, 0xf8, 0x76, 0x9a, - 0x7a, 0x39, 0x48, 0x79, 0xdf, 0x49, 0x6f, 0xee, 0xe7, 0xed, 0x3c, 0xd1, - 0xcb, 0xfe, 0x1f, 0x6b, 0xfd, 0xfc, 0x8d, 0x9c, 0xbf, 0xdf, 0xbe, 0xb3, - 0x05, 0x53, 0x95, 0x07, 0xdf, 0xd3, 0xcb, 0xfe, 0x8f, 0x6b, 0xe6, 0x2d, - 0x02, 0x72, 0xff, 0xdf, 0x05, 0xd5, 0xf9, 0xa0, 0x02, 0x0e, 0x5f, 0xfe, - 0x9f, 0xf0, 0x6a, 0x49, 0xad, 0x47, 0x24, 0x72, 0xc8, 0xaa, 0x24, 0x38, - 0x87, 0x7f, 0x9f, 0xbb, 0xea, 0x07, 0xc7, 0x2b, 0x47, 0xb9, 0xe2, 0x9b, - 0xfd, 0xd4, 0x9a, 0x50, 0x32, 0x39, 0x7f, 0xe8, 0x6f, 0x4d, 0x07, 0x66, - 0x6f, 0xe3, 0x94, 0xc3, 0xf7, 0xf1, 0x9d, 0xf4, 0xbb, 0x93, 0x9c, 0xbf, - 0xe8, 0xdd, 0x6f, 0xec, 0xdf, 0xc7, 0x2b, 0x73, 0xdd, 0x12, 0x3b, 0xfe, - 0x86, 0x7b, 0xfe, 0xf2, 0x1b, 0x39, 0x77, 0x1c, 0xe5, 0xff, 0xdb, 0x13, - 0x5a, 0xc1, 0x63, 0x88, 0x0e, 0x5f, 0xee, 0xa0, 0x43, 0x8d, 0xcc, 0x72, - 0xf4, 0x70, 0x18, 0x7f, 0x2c, 0x44, 0xae, 0x23, 0x07, 0xb0, 0x8f, 0xbf, - 0xf3, 0xef, 0xac, 0xf2, 0x2d, 0xe4, 0x72, 0xde, 0x39, 0x40, 0x3c, 0xff, - 0xa7, 0xd7, 0xff, 0xfa, 0x61, 0x85, 0xf2, 0x19, 0x9c, 0xce, 0xa7, 0x3a, - 0xe7, 0x2f, 0xff, 0xfe, 0xff, 0x5d, 0x79, 0x6a, 0x49, 0xef, 0xbc, 0x8e, - 0xc7, 0xb4, 0xfb, 0x9c, 0xbf, 0x46, 0x0f, 0xb6, 0xce, 0x5f, 0xc9, 0xb8, - 0x38, 0xe1, 0x39, 0x65, 0x9c, 0xa5, 0x9f, 0x47, 0x4a, 0x44, 0xba, 0xee, - 0x35, 0x9c, 0xbd, 0x2f, 0xc2, 0x72, 0xe7, 0xdf, 0xe1, 0xf3, 0x4c, 0x5c, - 0xe3, 0x55, 0x89, 0xf0, 0x71, 0x7f, 0x51, 0xa2, 0x5f, 0xff, 0xd8, 0x33, - 0xeb, 0x50, 0x0c, 0xea, 0x71, 0xdb, 0xf1, 0xcb, 0xf8, 0x38, 0x2a, 0xf2, - 0x0e, 0x54, 0x97, 0xd5, 0xc3, 0x0a, 0x16, 0x10, 0xef, 0x19, 0x34, 0xd0, - 0x99, 0xe3, 0xfa, 0xc8, 0xbb, 0x0f, 0xc0, 0x3b, 0xfa, 0x50, 0x23, 0x66, - 0xdb, 0x6b, 0x77, 0xff, 0xf8, 0x70, 0x3d, 0x86, 0xc7, 0x12, 0x7d, 0xbf, - 0xfa, 0x9c, 0x39, 0x50, 0xc8, 0xa8, 0x49, 0xf7, 0xaf, 0xe1, 0x95, 0x7f, - 0xfe, 0x49, 0x9d, 0xe5, 0xa8, 0x58, 0x7b, 0x02, 0xc3, 0x97, 0xfd, 0x93, - 0x4a, 0x37, 0xcd, 0xfc, 0x72, 0xee, 0x4f, 0x88, 0x8f, 0x15, 0x4b, 0xe0, - 0xf7, 0xf9, 0xce, 0x5f, 0xe0, 0xbc, 0xb2, 0x7f, 0xc4, 0xe5, 0xff, 0xb9, - 0x8d, 0x73, 0x75, 0xd6, 0x9a, 0x39, 0x69, 0xe1, 0x13, 0x78, 0x4b, 0xc3, - 0x4b, 0x9a, 0x78, 0x72, 0xb0, 0xf3, 0xdc, 0xd6, 0xfe, 0xf6, 0xdf, 0xfd, - 0xc6, 0x1c, 0xbf, 0xdc, 0x8f, 0x20, 0x22, 0x47, 0x2f, 0xed, 0xe7, 0x79, - 0x43, 0x59, 0xcb, 0x86, 0x47, 0x2a, 0x0f, 0x22, 0x73, 0x2a, 0x68, 0x33, - 0x6d, 0x21, 0xd5, 0x08, 0x97, 0x0c, 0x9e, 0xd2, 0x5f, 0xde, 0x19, 0xe3, - 0x18, 0xc6, 0x88, 0x3c, 0x65, 0xfb, 0xd5, 0xff, 0x9a, 0x1f, 0x61, 0x6c, - 0xeb, 0xee, 0x03, 0x97, 0xfa, 0x53, 0x60, 0xbf, 0x70, 0xe5, 0xf6, 0xf2, - 0x85, 0x9c, 0xbf, 0x9e, 0x60, 0xc0, 0xce, 0x72, 0xa7, 0x3d, 0x1d, 0x84, - 0x77, 0xe7, 0x89, 0x93, 0xa7, 0x2f, 0xa3, 0xf6, 0x9a, 0x1c, 0xbf, 0xc9, - 0xc8, 0x9d, 0xf8, 0xc3, 0x96, 0xf7, 0xc4, 0x40, 0x70, 0x9f, 0xc4, 0xd7, - 0xff, 0xb8, 0xc1, 0xcd, 0x83, 0x91, 0xc8, 0xd1, 0xcb, 0xfc, 0xf3, 0x77, - 0x17, 0x9a, 0x39, 0x58, 0x7f, 0x9b, 0x12, 0x6f, 0xf0, 0xab, 0xf2, 0x36, - 0x26, 0xc3, 0x97, 0xe5, 0x7d, 0x98, 0xb3, 0x95, 0x87, 0xc2, 0x87, 0x37, - 0xff, 0xa6, 0x1c, 0x55, 0x57, 0xf6, 0x90, 0x66, 0x39, 0x7e, 0xc0, 0xa7, - 0x34, 0x72, 0xf7, 0xbd, 0xb9, 0xcb, 0xff, 0xb7, 0x62, 0x77, 0xe6, 0xd6, - 0x75, 0x16, 0x72, 0x80, 0x7d, 0x1e, 0x1e, 0xbb, 0xfe, 0x1c, 0xad, 0x1b, - 0xad, 0xb2, 0x2b, 0x44, 0xe8, 0xed, 0x6e, 0x19, 0x35, 0x0a, 0xd9, 0x72, - 0x14, 0xa9, 0x0b, 0x4e, 0xc2, 0x11, 0xc8, 0x3d, 0x19, 0xcd, 0xff, 0x85, - 0x3e, 0xef, 0x9b, 0x37, 0x8f, 0xa7, 0x2f, 0xff, 0x26, 0x70, 0x30, 0xde, - 0x76, 0x37, 0xd1, 0xcb, 0xef, 0xb1, 0xc0, 0x1c, 0xbf, 0xf4, 0x6f, 0xde, - 0xc4, 0xf1, 0xfa, 0xce, 0x5c, 0xfc, 0x39, 0x7f, 0x79, 0x27, 0x5c, 0x30, - 0xe5, 0x04, 0xf1, 0x3a, 0x2d, 0x7f, 0xf8, 0x13, 0x49, 0x39, 0x29, 0xa4, - 0x9c, 0x91, 0xcb, 0xde, 0x49, 0xce, 0x56, 0xe7, 0xd5, 0xc4, 0xdb, 0xb3, - 0x68, 0xe5, 0xf0, 0x3e, 0x8c, 0x8e, 0x59, 0xc4, 0xde, 0xf8, 0x66, 0xfd, - 0xad, 0x60, 0x80, 0xe5, 0x00, 0xf3, 0x04, 0x96, 0xa1, 0x35, 0x94, 0x84, - 0x67, 0xf0, 0xac, 0xbb, 0x79, 0x8e, 0x5f, 0xbe, 0xf8, 0x0b, 0xc3, 0x94, - 0xb3, 0xc3, 0x00, 0xcd, 0xe6, 0x46, 0x8e, 0x5f, 0xf4, 0x9f, 0x9e, 0x18, - 0x5e, 0x8e, 0x5f, 0xe8, 0x0c, 0x73, 0xf8, 0x01, 0xcb, 0x97, 0xa9, 0x8f, - 0xad, 0x67, 0x17, 0xff, 0xf3, 0xb6, 0x17, 0x7e, 0x4f, 0xd7, 0xf7, 0x53, - 0x92, 0x39, 0x7f, 0xe8, 0x71, 0xcf, 0x79, 0x1b, 0xf1, 0xca, 0x84, 0xdc, - 0x70, 0x89, 0x21, 0x0e, 0x25, 0xff, 0xae, 0x53, 0x49, 0x92, 0xc9, 0x08, - 0xd2, 0x97, 0xd1, 0x8d, 0x4c, 0x45, 0x99, 0x2b, 0xa4, 0x9a, 0x8f, 0x7b, - 0xd1, 0xf7, 0x5f, 0xd1, 0xfe, 0xe9, 0xbe, 0xd1, 0xcb, 0xf6, 0x37, 0x9b, - 0xf8, 0xe5, 0x7c, 0x3d, 0xc4, 0x33, 0xbf, 0xdb, 0xcb, 0x03, 0xdc, 0x9c, - 0xe5, 0x70, 0xf6, 0x04, 0x8e, 0xf9, 0x5e, 0x66, 0x8e, 0x5f, 0xfd, 0x83, - 0xfb, 0x3b, 0x8b, 0x99, 0xd8, 0x72, 0x90, 0xfa, 0x34, 0x47, 0x7f, 0x85, - 0x5e, 0xc2, 0xd6, 0x27, 0x2f, 0xe6, 0xb4, 0x8d, 0xaf, 0xfc, 0x72, 0xfd, - 0x13, 0x66, 0x30, 0xe5, 0x62, 0x23, 0x90, 0xcf, 0xa6, 0x97, 0xfe, 0xee, - 0x4c, 0x93, 0x7f, 0xb5, 0xfe, 0x8e, 0x5e, 0x4e, 0x2a, 0x72, 0x90, 0xf8, - 0xc5, 0x1a, 0xfd, 0x1b, 0x5d, 0x89, 0x8e, 0x54, 0x8f, 0x2f, 0x44, 0x17, - 0xff, 0x7f, 0x32, 0x76, 0x37, 0x94, 0x4d, 0x07, 0x2f, 0xc1, 0x71, 0x8e, - 0x9c, 0xbf, 0xa5, 0x1b, 0xfb, 0x3a, 0x72, 0xff, 0xf7, 0xb4, 0x80, 0x89, - 0x6b, 0x33, 0x7f, 0x1c, 0xa9, 0x8f, 0xe3, 0x45, 0xd5, 0xd4, 0x60, 0xb7, - 0x09, 0xeb, 0xfd, 0xd7, 0x9b, 0x13, 0x68, 0x27, 0x29, 0x0f, 0x7f, 0x45, - 0x37, 0xff, 0xee, 0x7f, 0xce, 0x40, 0xe2, 0xa9, 0xde, 0xe7, 0xd3, 0x97, - 0xe7, 0x40, 0xc0, 0x9c, 0xba, 0x3f, 0x39, 0x42, 0x6f, 0x34, 0x4b, 0x7d, - 0x3c, 0x6d, 0x41, 0xcb, 0xee, 0x81, 0xfc, 0x72, 0xdd, 0x39, 0x6d, 0x8e, - 0x6c, 0xff, 0x22, 0xbf, 0xf9, 0x16, 0x9a, 0xec, 0x27, 0x3f, 0x6b, 0x39, - 0x50, 0x8c, 0x84, 0x58, 0x72, 0x9b, 0xf8, 0x74, 0x9b, 0x20, 0x27, 0x2f, - 0x0a, 0x2a, 0x72, 0xfe, 0xf2, 0x71, 0x3d, 0xf9, 0xcb, 0x42, 0xcf, 0x2b, - 0xe8, 0xe5, 0xfd, 0xff, 0xde, 0xe6, 0xfa, 0x39, 0x7f, 0xff, 0xfe, 0xe4, - 0x78, 0x5d, 0x89, 0xa9, 0x93, 0x8c, 0x8d, 0x7a, 0x37, 0x8f, 0xb9, 0xa3, - 0x97, 0xfb, 0xb9, 0xbc, 0x71, 0x16, 0x72, 0xff, 0xff, 0xff, 0xda, 0xd6, - 0x7b, 0xae, 0xbd, 0x73, 0x89, 0xbf, 0x9d, 0xd5, 0xcc, 0x9b, 0xff, 0x43, - 0x7b, 0xc1, 0xcb, 0xdd, 0xce, 0x1c, 0xbf, 0xbc, 0x2e, 0x0c, 0x13, 0x97, - 0xe1, 0x70, 0x60, 0x9c, 0xaf, 0x87, 0xa1, 0xe2, 0xba, 0x84, 0xf9, 0x43, - 0x08, 0x47, 0x33, 0xf4, 0x27, 0xbf, 0x6c, 0xbe, 0x03, 0xef, 0xa3, 0x97, - 0x36, 0xd9, 0xca, 0xd1, 0xbc, 0x6c, 0x8e, 0xfc, 0x9d, 0x7c, 0xe9, 0x45, - 0x0d, 0x15, 0xff, 0x7f, 0xe8, 0x16, 0x35, 0x60, 0x59, 0xcb, 0xdd, 0x80, - 0x1c, 0xbf, 0xf7, 0xe1, 0xea, 0x71, 0x37, 0x9a, 0x0e, 0x52, 0x22, 0x71, - 0xcf, 0xc4, 0x72, 0xf7, 0x7e, 0x35, 0x9c, 0xbf, 0x76, 0x07, 0x27, 0x39, - 0x50, 0x79, 0x2e, 0x45, 0x7f, 0xbb, 0x1e, 0xfd, 0x7f, 0xf8, 0xe5, 0x43, - 0x29, 0xc2, 0x50, 0x89, 0x0c, 0x2b, 0xf7, 0x86, 0xe3, 0x59, 0x14, 0xd1, - 0xb3, 0xf0, 0x85, 0x70, 0x94, 0xec, 0x3a, 0x1c, 0xb4, 0x0f, 0x0d, 0x32, - 0x91, 0x94, 0x2f, 0xa8, 0x59, 0x7a, 0x1a, 0x7b, 0x1d, 0xb6, 0x88, 0x2f, - 0x93, 0x9f, 0x66, 0x39, 0x76, 0x61, 0xcb, 0xe6, 0x75, 0x3e, 0x9c, 0xae, - 0x9e, 0xf3, 0x4c, 0x97, 0xe8, 0xad, 0xfa, 0x68, 0x9b, 0xb0, 0x72, 0xef, - 0xb0, 0x72, 0xf3, 0x6d, 0xb6, 0x52, 0xfa, 0x5e, 0xc6, 0x14, 0x50, 0xd0, - 0x5f, 0xb0, 0x28, 0x0d, 0x1e, 0xef, 0xe5, 0x70, 0xf9, 0xc4, 0xce, 0xa1, - 0x1d, 0x3c, 0x29, 0x78, 0x4f, 0xdd, 0xed, 0x1c, 0xbf, 0xef, 0x9e, 0xec, - 0x7b, 0x5d, 0x43, 0x96, 0xd1, 0xcb, 0xfd, 0xed, 0xe5, 0xd8, 0x19, 0xca, - 0x5f, 0xfb, 0x37, 0x92, 0x60, 0x8e, 0x04, 0xe5, 0xfa, 0x75, 0xff, 0xbf, - 0x8e, 0x54, 0x26, 0x01, 0xb8, 0xbf, 0x0e, 0xc4, 0x47, 0x46, 0xbe, 0x3c, - 0xbf, 0xdb, 0xcb, 0xf7, 0xfa, 0xe1, 0x39, 0x7f, 0xc3, 0x0d, 0xe9, 0x07, - 0x79, 0x1c, 0xba, 0x18, 0x72, 0x84, 0xf3, 0xf6, 0x1c, 0xdf, 0x4f, 0xf6, - 0x1a, 0xce, 0x5f, 0x86, 0x1b, 0xc1, 0x39, 0x7f, 0xdd, 0xde, 0x15, 0x9a, - 0x50, 0xd6, 0x72, 0xda, 0x09, 0xf2, 0xe1, 0x35, 0x71, 0x16, 0x9e, 0x84, - 0x6d, 0x42, 0x7b, 0x98, 0xae, 0x90, 0x86, 0x78, 0x6b, 0xdf, 0xc3, 0xbe, - 0xa6, 0xcf, 0x1c, 0xbf, 0x93, 0xc2, 0xe0, 0xd1, 0xcb, 0xff, 0xde, 0x9b, - 0x39, 0x8e, 0xb8, 0xea, 0x04, 0xe5, 0xfd, 0xfa, 0xf3, 0xbb, 0xb9, 0xca, - 0x55, 0x14, 0x82, 0x59, 0xa4, 0x9b, 0xff, 0xc8, 0x11, 0x7d, 0xc7, 0x3d, - 0x88, 0x03, 0x97, 0xf4, 0x7b, 0xb2, 0xd7, 0xe7, 0x2f, 0xdd, 0x7e, 0x67, - 0x0e, 0x5d, 0xfb, 0x9c, 0xa6, 0x1b, 0xe1, 0x27, 0xbf, 0xb9, 0x09, 0x27, - 0xd1, 0xcb, 0xff, 0x6f, 0xa4, 0x57, 0x3c, 0x9c, 0xc3, 0x96, 0x89, 0xd1, - 0x16, 0x24, 0x1e, 0x2c, 0xbf, 0x4e, 0xd6, 0x99, 0xb9, 0xcb, 0xf2, 0x6a, - 0x27, 0x59, 0xec, 0xfd, 0x5f, 0xa1, 0xf8, 0x0f, 0xcf, 0x67, 0xea, 0xe7, - 0x91, 0xec, 0xfd, 0x5f, 0x7f, 0x2c, 0xd1, 0xec, 0xfd, 0x50, 0x4f, 0x4c, - 0x48, 0xef, 0xd1, 0x9a, 0xc1, 0x3d, 0x9f, 0xaa, 0x3d, 0x9f, 0xab, 0x9f, - 0xc7, 0xb3, 0xf4, 0xb2, 0xe2, 0xd2, 0x13, 0xfc, 0xfd, 0x2a, 0xfb, 0x36, - 0xd0, 0x07, 0xb3, 0xf5, 0x47, 0xb3, 0xf5, 0x70, 0x20, 0xf6, 0x7e, 0xaf, - 0xfb, 0x00, 0xfc, 0xcd, 0x98, 0x13, 0xd9, 0xfa, 0xbf, 0xb3, 0xa9, 0xaf, - 0xe7, 0x3d, 0x9f, 0xaa, 0x02, 0x29, 0x44, 0x8f, 0x48, 0xd7, 0xdc, 0x9e, - 0x3c, 0x7b, 0x3f, 0x54, 0x7b, 0x3f, 0x58, 0x6c, 0x2e, 0x6d, 0xb3, 0xd9, - 0xfa, 0xa9, 0x2b, 0x1c, 0x09, 0xae, 0x42, 0x23, 0x78, 0x4e, 0xf0, 0xa1, - 0x66, 0x3a, 0x85, 0xef, 0x97, 0xdb, 0x27, 0xbd, 0x28, 0x54, 0xb6, 0x7e, - 0x8a, 0x22, 0x42, 0xff, 0x6b, 0x25, 0x28, 0xf6, 0xe7, 0x2b, 0x0f, 0xcb, - 0x47, 0xd7, 0xfe, 0xc6, 0x07, 0x38, 0xdb, 0xf6, 0x63, 0x97, 0xff, 0x68, - 0x72, 0x68, 0x9c, 0x0f, 0xbe, 0x8e, 0x5d, 0x29, 0xca, 0x5f, 0x4c, 0xef, - 0xc3, 0x95, 0x3a, 0x38, 0x77, 0x21, 0xea, 0x00, 0xa3, 0x6d, 0x0c, 0x57, - 0x17, 0x5e, 0x5e, 0x74, 0xae, 0xff, 0x2f, 0x43, 0x9e, 0xc0, 0x1c, 0xbf, - 0xe6, 0x40, 0x03, 0xfb, 0xf2, 0x47, 0x2f, 0xfc, 0xef, 0x3e, 0x2d, 0xc7, - 0x79, 0x1c, 0xbf, 0x36, 0x2e, 0xae, 0xb0, 0xfe, 0x26, 0x3a, 0xa8, 0x47, - 0x53, 0xc2, 0xaa, 0xfc, 0x3e, 0xee, 0x4e, 0x72, 0xe0, 0xb6, 0x72, 0xa0, - 0xf0, 0x30, 0xa2, 0xff, 0xfd, 0x2e, 0x46, 0xc7, 0x9a, 0x03, 0xd8, 0x5b, - 0xcc, 0x72, 0xff, 0x6d, 0x3e, 0x93, 0x53, 0x61, 0xca, 0xdd, 0x11, 0xdc, - 0x58, 0xa8, 0x66, 0xc9, 0x4a, 0x58, 0x7e, 0x22, 0x24, 0x34, 0xda, 0xcc, - 0x38, 0x8f, 0xd8, 0x7c, 0x3c, 0xed, 0x70, 0xc6, 0x2f, 0xa6, 0x6f, 0xe1, - 0x5d, 0x7f, 0xff, 0xc9, 0xd7, 0xec, 0x49, 0x4c, 0x04, 0x4b, 0x41, 0xec, - 0x70, 0xe5, 0xff, 0x95, 0x8d, 0xc6, 0x3b, 0xdf, 0xd8, 0x72, 0xff, 0xee, - 0x46, 0x0e, 0x49, 0x3b, 0x9b, 0x0e, 0x5f, 0xff, 0x0b, 0xab, 0xac, 0xd9, - 0x1b, 0xfb, 0x5f, 0xac, 0xe5, 0x05, 0x12, 0xe2, 0x87, 0x7f, 0x0b, 0xab, - 0xd7, 0x91, 0xcb, 0xf3, 0x31, 0x71, 0xa3, 0x97, 0x9b, 0x6d, 0xb2, 0x97, - 0xbe, 0xc0, 0x0a, 0x28, 0x68, 0x2f, 0xf9, 0xe5, 0xf7, 0x99, 0xb1, 0xf8, - 0x72, 0xff, 0xfd, 0xdc, 0x97, 0xd1, 0x1c, 0x9e, 0x69, 0x47, 0x27, 0x39, - 0x42, 0x89, 0x5f, 0x1e, 0x5f, 0xf7, 0x9c, 0x73, 0x5c, 0x8d, 0x1c, 0xbe, - 0x94, 0x03, 0x73, 0x97, 0xf0, 0x20, 0x73, 0x7f, 0x1c, 0xb9, 0xc1, 0xf0, - 0xf4, 0x3e, 0x91, 0xd3, 0xa2, 0xe0, 0x61, 0x0f, 0x7b, 0x64, 0x70, 0xe5, - 0x49, 0x5d, 0xb0, 0x59, 0xb2, 0x1b, 0x0b, 0x22, 0x72, 0xd0, 0x23, 0x8c, - 0x31, 0x3d, 0x0d, 0xad, 0x84, 0xd7, 0x24, 0xe7, 0x2f, 0xf0, 0xb0, 0x29, - 0xb2, 0x02, 0x72, 0x82, 0x79, 0x7f, 0x8b, 0xd8, 0x07, 0x2f, 0xfb, 0x21, - 0xaf, 0xe7, 0x5f, 0x38, 0x72, 0xf2, 0xd2, 0x63, 0x97, 0xf8, 0x1b, 0x68, - 0xb0, 0x87, 0x0e, 0x5f, 0xf7, 0xbb, 0x9a, 0xf9, 0xe4, 0x9c, 0xe5, 0x41, - 0xf9, 0x21, 0xb5, 0xff, 0x0a, 0x7e, 0xd3, 0xd6, 0xdc, 0x78, 0xe5, 0x49, - 0x33, 0xc9, 0x84, 0x56, 0x79, 0xd8, 0x47, 0x89, 0x05, 0xf6, 0x7b, 0xec, - 0xe7, 0x2f, 0x36, 0xdb, 0x65, 0x88, 0x40, 0xbe, 0x63, 0xbb, 0x0b, 0x10, - 0x80, 0xa1, 0xae, 0xbe, 0x7e, 0x63, 0x67, 0x2b, 0x87, 0xc5, 0xb1, 0x02, - 0xf3, 0x6d, 0xb6, 0x58, 0x83, 0xca, 0x2c, 0x41, 0xe2, 0x86, 0xba, 0xfe, - 0xcf, 0x77, 0xf7, 0x91, 0xcb, 0xcd, 0xb6, 0xd9, 0xcb, 0xda, 0x85, 0x4a, - 0x28, 0x68, 0x2b, 0x11, 0xf0, 0xc5, 0x21, 0x2a, 0xf2, 0x75, 0x35, 0xa7, - 0xd0, 0xb8, 0xeb, 0x6f, 0xfe, 0xec, 0x49, 0x3d, 0x9d, 0x64, 0x2c, 0xe5, - 0x41, 0xf8, 0x6c, 0x2d, 0xbf, 0xfd, 0x9d, 0x4e, 0x75, 0xf3, 0x48, 0xf3, - 0x9c, 0xbe, 0x8f, 0x42, 0xce, 0x52, 0xcf, 0xa7, 0xc9, 0x17, 0xf3, 0x6e, - 0x1f, 0xdf, 0xe9, 0xcb, 0xe1, 0x48, 0x54, 0xe5, 0xef, 0xb0, 0x03, 0x95, - 0x39, 0xbf, 0x59, 0x0d, 0xf9, 0x91, 0xd8, 0x59, 0x4b, 0xf0, 0xb8, 0x8e, - 0x14, 0xbb, 0x18, 0x52, 0xe6, 0xdb, 0x29, 0x58, 0x7f, 0x5a, 0x27, 0xf1, - 0x23, 0x62, 0xd7, 0xf8, 0x7e, 0xc0, 0x3b, 0x9b, 0x45, 0x14, 0x37, 0x97, - 0xff, 0xa7, 0x0f, 0x1d, 0x83, 0x9b, 0x38, 0x9a, 0x39, 0x50, 0x9f, 0xf6, - 0x11, 0x23, 0x83, 0xc3, 0x63, 0xf4, 0x8b, 0xff, 0xa0, 0x1a, 0xcc, 0x0b, - 0x8b, 0xaa, 0x72, 0xff, 0xfd, 0xd4, 0xd8, 0x82, 0x1d, 0x47, 0x13, 0x37, - 0xd1, 0xcb, 0xf8, 0x63, 0x38, 0xe0, 0x39, 0x7f, 0xe8, 0xe7, 0x61, 0x3b, - 0x02, 0x87, 0x2e, 0x96, 0x98, 0x8b, 0xcf, 0x2b, 0x36, 0x57, 0x7f, 0xa0, - 0x71, 0x69, 0xbc, 0x8e, 0x5f, 0xff, 0x68, 0x73, 0x70, 0x3e, 0x9f, 0x89, - 0xb8, 0x0e, 0x56, 0xe8, 0xbf, 0xf1, 0xeb, 0x66, 0x55, 0xd4, 0xfb, 0xde, - 0x3b, 0xdb, 0xfb, 0x5f, 0x43, 0xf8, 0xc8, 0xe5, 0xfc, 0x8c, 0x0e, 0x38, - 0x0e, 0x5f, 0xff, 0xbd, 0xad, 0xfe, 0x07, 0x03, 0x0f, 0xcc, 0x10, 0x1c, - 0xbf, 0xba, 0x9d, 0xea, 0x00, 0xd0, 0x85, 0xaf, 0xfa, 0x5f, 0x3d, 0x2c, - 0x06, 0xde, 0x11, 0x0b, 0xed, 0x67, 0xbe, 0x30, 0xff, 0x3c, 0x75, 0x7a, - 0x27, 0x53, 0x49, 0x87, 0x7a, 0x1a, 0x77, 0xe5, 0xe9, 0xb7, 0xdc, 0xe5, - 0xb4, 0x13, 0xe6, 0xfa, 0x79, 0x7f, 0x64, 0xd2, 0x4e, 0x68, 0xe5, 0xfd, - 0x1b, 0xfd, 0xd4, 0x61, 0xca, 0x86, 0x61, 0x38, 0x61, 0xb3, 0x91, 0xaf, - 0xa4, 0xaa, 0x8e, 0x4a, 0x8a, 0x79, 0x47, 0x8d, 0x32, 0x91, 0x31, 0xd4, - 0x74, 0x1e, 0x2a, 0xfc, 0xba, 0xf3, 0x6d, 0xb6, 0x52, 0xf3, 0x88, 0x4a, - 0x28, 0x68, 0x2f, 0xb3, 0x99, 0xe3, 0x94, 0x03, 0xcd, 0xd1, 0x65, 0xf7, - 0x51, 0xe4, 0x72, 0xff, 0x7b, 0x49, 0xce, 0x22, 0xce, 0x5e, 0x5c, 0xe1, - 0x39, 0x42, 0x7a, 0x3e, 0x33, 0xbd, 0xf1, 0x5d, 0xb3, 0x97, 0xbc, 0xe1, - 0x39, 0x5c, 0x37, 0xfa, 0x23, 0xbf, 0x99, 0x00, 0x4e, 0x2a, 0x52, 0xfe, - 0xfb, 0x9c, 0xcc, 0x98, 0xe5, 0xf9, 0xfb, 0xf0, 0x30, 0x72, 0xa4, 0x9c, - 0xd8, 0x48, 0xb1, 0xc9, 0x18, 0x04, 0x87, 0x45, 0xde, 0x2f, 0xbf, 0x3f, - 0x39, 0x9b, 0x9c, 0xbf, 0xfd, 0xee, 0xa3, 0x83, 0x38, 0x18, 0x19, 0x1c, - 0xbf, 0xfd, 0xbf, 0xcd, 0xc1, 0x02, 0xc7, 0x9c, 0x5c, 0xe5, 0x42, 0x2f, - 0x70, 0xa0, 0x52, 0x2f, 0xd1, 0xaf, 0xa3, 0x23, 0x97, 0xdf, 0x18, 0x92, - 0x39, 0x7f, 0xff, 0xf3, 0xa7, 0x93, 0xac, 0x4f, 0x92, 0x4e, 0xb8, 0xfa, - 0x59, 0xcc, 0x39, 0x7b, 0xb9, 0xb4, 0x72, 0xba, 0x88, 0xf7, 0x70, 0xbf, - 0xe1, 0x8d, 0xf5, 0x1e, 0x80, 0x9c, 0xbd, 0xaf, 0xba, 0xf8, 0x7b, 0x58, - 0x45, 0x41, 0x4d, 0x13, 0xd1, 0x86, 0xdf, 0xff, 0xff, 0xf4, 0x6a, 0x3d, - 0x3e, 0x37, 0xcc, 0xeb, 0xfd, 0xd6, 0x2a, 0xe2, 0x08, 0x18, 0x9b, 0xb0, - 0x72, 0xfd, 0xae, 0xbb, 0x20, 0xe5, 0x0a, 0x2f, 0x1b, 0x84, 0xad, 0xff, - 0xff, 0xc8, 0xae, 0xf2, 0xf6, 0x0f, 0xb5, 0xf3, 0x5a, 0xce, 0x60, 0xbc, - 0x8e, 0x5f, 0xfc, 0xa0, 0x46, 0x3f, 0x66, 0x2a, 0x9c, 0x39, 0x76, 0x36, - 0x72, 0xd9, 0x07, 0xbb, 0xa4, 0x6b, 0xfc, 0x1e, 0xc4, 0xce, 0xfb, 0x9c, - 0xbd, 0xd0, 0x6c, 0x39, 0x5c, 0x3d, 0x3d, 0xa3, 0x4a, 0x92, 0x27, 0x9d, - 0xe6, 0xff, 0xec, 0xe0, 0x16, 0x9a, 0xfb, 0xa8, 0xc3, 0x97, 0xe0, 0xf2, - 0x37, 0x6b, 0x39, 0x7f, 0xff, 0xef, 0x47, 0x00, 0xce, 0xa4, 0x93, 0x8e, - 0x0f, 0x0c, 0x2f, 0x47, 0x2e, 0x6b, 0xd1, 0xca, 0x55, 0x10, 0xae, 0xd7, - 0x52, 0x4c, 0x67, 0x11, 0x5e, 0x16, 0x37, 0x9a, 0x81, 0x01, 0xcb, 0xc1, - 0xc5, 0x9c, 0xbe, 0x07, 0xb0, 0x07, 0x2f, 0xd1, 0xad, 0x26, 0xc3, 0x94, - 0x87, 0xcf, 0xc1, 0xce, 0x91, 0x5f, 0xf3, 0x3a, 0x31, 0xba, 0x47, 0x4e, - 0x54, 0x2f, 0xc9, 0xca, 0x31, 0xf0, 0x96, 0xe4, 0x6d, 0xa9, 0x0e, 0x6e, - 0x14, 0x3c, 0x6d, 0xe3, 0x19, 0xde, 0x8d, 0x3f, 0x84, 0x47, 0xd2, 0xeb, - 0xff, 0x3a, 0x07, 0xff, 0x6a, 0x7c, 0x6c, 0xe5, 0xfb, 0x58, 0xac, 0x68, - 0xe5, 0xfc, 0xd7, 0xa4, 0x1d, 0xe4, 0x72, 0xff, 0xcf, 0xcd, 0xb4, 0xee, - 0x3e, 0xe0, 0x39, 0x7f, 0xfe, 0x4f, 0x42, 0xf3, 0x7f, 0x42, 0xfe, 0xf1, - 0xc0, 0x72, 0xf9, 0x05, 0xc2, 0x72, 0xff, 0xb5, 0x1c, 0xf4, 0x28, 0x14, - 0x39, 0x52, 0x45, 0x80, 0x55, 0xf4, 0x41, 0x7f, 0xfb, 0x49, 0xc8, 0x97, - 0x62, 0x61, 0xfd, 0x53, 0x97, 0x33, 0x6c, 0xe5, 0xfc, 0xaf, 0xa3, 0xb1, - 0xa3, 0x97, 0xf7, 0x53, 0x7d, 0x3e, 0xe7, 0x2a, 0x47, 0xee, 0x83, 0x40, - 0x2e, 0xbf, 0xe7, 0x9b, 0xaf, 0xce, 0x20, 0x4e, 0x5f, 0x27, 0x5d, 0x67, - 0x28, 0x4f, 0x6b, 0xc7, 0x37, 0xa1, 0xa9, 0xb9, 0xcb, 0xfb, 0xec, 0x7e, - 0xcf, 0xd6, 0x72, 0xe4, 0x13, 0x97, 0xd2, 0x81, 0x61, 0xca, 0x09, 0xb6, - 0xc1, 0x5b, 0xfa, 0x3c, 0xd0, 0x78, 0xdc, 0xe5, 0x7c, 0x3d, 0x14, 0x20, - 0xbe, 0x80, 0x60, 0x9c, 0xa9, 0x2e, 0x01, 0xe1, 0x43, 0x0c, 0x52, 0x1e, - 0x33, 0x18, 0x72, 0x18, 0x6b, 0x84, 0x46, 0x88, 0x7f, 0x21, 0x6e, 0x17, - 0x3b, 0x64, 0x77, 0xe4, 0x5b, 0x44, 0xd4, 0xda, 0xb3, 0x97, 0xdf, 0x61, - 0xbd, 0x1c, 0xb8, 0x1e, 0x39, 0x70, 0x3a, 0x72, 0xfb, 0x9c, 0xcd, 0x1c, - 0xbb, 0x26, 0x39, 0x69, 0x7c, 0x44, 0x64, 0xe4, 0xab, 0x17, 0x71, 0x7f, - 0xa4, 0x57, 0xe4, 0xf3, 0x8e, 0x1c, 0xbf, 0x70, 0x39, 0x82, 0x72, 0xff, - 0xe6, 0xb4, 0xce, 0xc6, 0xcd, 0x76, 0x37, 0x39, 0x7f, 0x6f, 0xcf, 0xf7, - 0xf4, 0x8e, 0x53, 0xa2, 0x87, 0x44, 0xdf, 0xa4, 0xdf, 0xf6, 0x0f, 0x33, - 0x58, 0x9d, 0x39, 0x7f, 0xfd, 0x2f, 0x0e, 0x3f, 0x87, 0x3d, 0xec, 0x6c, - 0xe5, 0xd9, 0xb0, 0xe5, 0xff, 0x33, 0xb8, 0x15, 0xa7, 0x30, 0xe5, 0x4e, - 0x7a, 0x18, 0x31, 0x7f, 0x44, 0x73, 0xb1, 0xb0, 0xe5, 0xff, 0xef, 0x6b, - 0x26, 0xec, 0x6c, 0xce, 0xf6, 0x0e, 0x5f, 0xdd, 0x0a, 0x6c, 0x80, 0x9c, - 0xac, 0x3f, 0xb7, 0x4c, 0xbe, 0xd2, 0x60, 0x0e, 0x5f, 0x67, 0x93, 0x47, - 0x2f, 0xe6, 0xa2, 0x61, 0x6a, 0xe7, 0xfc, 0xe5, 0x68, 0xf7, 0x3c, 0x43, - 0x52, 0x56, 0xa8, 0x18, 0x63, 0x30, 0xc3, 0x73, 0x6e, 0x42, 0x7b, 0xa4, - 0x43, 0x0a, 0x9d, 0x10, 0x79, 0xf6, 0xff, 0xfd, 0xe4, 0xd4, 0xf8, 0xde, - 0x92, 0x71, 0x7d, 0xfc, 0x72, 0xf3, 0x79, 0xd3, 0x97, 0xfb, 0x48, 0xaf, - 0x5c, 0x50, 0xe5, 0xfa, 0x70, 0x8b, 0xaa, 0x72, 0xf9, 0x35, 0x81, 0xc4, - 0x68, 0x3a, 0xc7, 0x87, 0x7e, 0x99, 0x5f, 0xf9, 0xda, 0xc1, 0xfe, 0x90, - 0x77, 0x91, 0xcb, 0xfc, 0x1c, 0x14, 0x6f, 0xbf, 0x9c, 0xbf, 0xfe, 0xea, - 0x47, 0x90, 0x11, 0x25, 0x1b, 0x6d, 0xb2, 0x97, 0xff, 0x24, 0x78, 0x11, - 0x25, 0x1b, 0x6d, 0xb2, 0x95, 0x88, 0x9b, 0xea, 0x9d, 0x4e, 0x8f, 0x1f, - 0x43, 0x3e, 0xff, 0x77, 0xf7, 0x58, 0x5d, 0x67, 0x28, 0x4f, 0x77, 0xc5, - 0x37, 0xc1, 0xcc, 0x54, 0xa5, 0xf3, 0x81, 0xfc, 0x72, 0xff, 0xb8, 0xec, - 0xf9, 0xd8, 0xfa, 0x27, 0x2f, 0x7f, 0x1c, 0x39, 0x77, 0xb4, 0x13, 0xd9, - 0x98, 0xf2, 0xf4, 0x87, 0xf3, 0x44, 0x32, 0xbd, 0xd8, 0x9c, 0xe5, 0xfb, - 0xd1, 0x25, 0x56, 0x72, 0xf3, 0x6d, 0xb6, 0x52, 0xf6, 0x0b, 0x0a, 0x28, - 0x68, 0x2f, 0xfd, 0x93, 0xe0, 0x5e, 0x43, 0x13, 0x9c, 0xa8, 0x45, 0x98, - 0x12, 0x44, 0xb2, 0xf9, 0xc5, 0xa9, 0x34, 0x8e, 0x5c, 0xd4, 0x9a, 0x91, - 0xcb, 0xf6, 0x7b, 0xdf, 0xce, 0x72, 0xd2, 0x6a, 0x47, 0x9a, 0x24, 0x77, - 0x9d, 0xae, 0x0e, 0x5f, 0xb0, 0x3d, 0x76, 0xb3, 0x97, 0xe1, 0xc0, 0xc2, - 0xce, 0x54, 0x2b, 0x27, 0x9c, 0x84, 0x24, 0x58, 0xf5, 0xb9, 0x7c, 0xc5, - 0x5c, 0x86, 0x87, 0x4b, 0x9d, 0xe3, 0xf2, 0xdd, 0x83, 0xcd, 0x95, 0x5f, - 0xe8, 0x5e, 0x27, 0x26, 0x91, 0xcb, 0xde, 0x48, 0x39, 0x76, 0x09, 0xca, - 0x43, 0x61, 0xf8, 0xdd, 0xf8, 0x63, 0x78, 0xd1, 0xcb, 0xff, 0x62, 0x0b, - 0xfb, 0x4d, 0xc0, 0x9c, 0xbd, 0xd7, 0xe4, 0x1f, 0x1e, 0x89, 0xef, 0x93, - 0x91, 0xe3, 0x97, 0xda, 0xc8, 0x91, 0xca, 0x09, 0xe1, 0x09, 0x0d, 0xfa, - 0x25, 0xdc, 0xdc, 0xe5, 0xdb, 0x80, 0xe5, 0xfc, 0xb8, 0xd0, 0x11, 0x87, - 0x2f, 0x6a, 0x15, 0x01, 0xe2, 0xe8, 0x62, 0xff, 0x7f, 0x9c, 0x00, 0x10, - 0x4e, 0x5f, 0xfb, 0x16, 0x81, 0xe6, 0x05, 0xd6, 0x72, 0xfb, 0x17, 0xf4, - 0x27, 0x2b, 0xa7, 0xc2, 0x27, 0xb7, 0xff, 0x90, 0x3d, 0xfb, 0xac, 0xe3, - 0x1d, 0xd8, 0x68, 0x83, 0x17, 0xfe, 0xd0, 0x1f, 0x7d, 0x7d, 0xe7, 0x5c, - 0xe5, 0xf7, 0xfd, 0xc6, 0x1c, 0xa9, 0x22, 0xf7, 0xcb, 0x1b, 0x68, 0x57, - 0xfd, 0xad, 0x47, 0x24, 0xc4, 0x9c, 0xe5, 0xfd, 0xfa, 0xa3, 0x93, 0xfe, - 0x72, 0xa0, 0xfa, 0xfa, 0x75, 0x7b, 0xbf, 0xb5, 0x9c, 0xbf, 0xfd, 0xc7, - 0xd9, 0x82, 0xce, 0xa0, 0x3e, 0xf8, 0xe5, 0x42, 0x65, 0xb2, 0x84, 0xf3, - 0x4c, 0x87, 0xf2, 0x1a, 0xdd, 0x58, 0xd7, 0x4d, 0x35, 0x09, 0x4f, 0x4a, - 0x0b, 0xbc, 0xfb, 0x30, 0xe5, 0xff, 0x80, 0xce, 0xa7, 0x05, 0x3d, 0xa3, - 0x97, 0xf8, 0x09, 0xde, 0xe0, 0x1c, 0xe5, 0xff, 0xff, 0x2f, 0x3d, 0xe7, - 0xe0, 0xc6, 0xf2, 0xfb, 0xc0, 0x2d, 0x34, 0x72, 0xff, 0x96, 0x8d, 0xe0, - 0x87, 0xb0, 0x72, 0xee, 0xfe, 0x72, 0xff, 0xfd, 0x24, 0x10, 0xf7, 0x37, - 0xfa, 0xe3, 0xe1, 0x09, 0xcb, 0xc8, 0xdb, 0x59, 0xcb, 0xfd, 0x9b, 0x35, - 0xef, 0x42, 0xce, 0x57, 0x0f, 0x57, 0xa4, 0x15, 0x09, 0xc3, 0x63, 0x4a, - 0x1c, 0x4c, 0x31, 0xa8, 0x55, 0xdf, 0xc8, 0xb6, 0x60, 0xb0, 0xe5, 0xfd, - 0x9a, 0xdb, 0xce, 0x41, 0xca, 0xe1, 0xed, 0xed, 0x96, 0x54, 0x97, 0xf3, - 0x43, 0x08, 0x4c, 0x74, 0x61, 0x0a, 0x4b, 0x87, 0x5a, 0x63, 0x8e, 0x80, - 0xfb, 0x51, 0xdc, 0x7a, 0x15, 0x37, 0xfb, 0x5a, 0xc1, 0x06, 0xde, 0x1c, - 0xbe, 0x14, 0xda, 0x83, 0x96, 0x98, 0xe5, 0xfd, 0xac, 0x10, 0x6d, 0xe1, - 0xcb, 0x6c, 0xf8, 0x89, 0x9c, 0x35, 0x01, 0x1e, 0x84, 0xaf, 0xfb, 0xff, - 0x03, 0xf5, 0xc6, 0x78, 0xe5, 0xff, 0xe1, 0x9f, 0xe4, 0xc8, 0x38, 0x1c, - 0x15, 0x4e, 0x5f, 0xc9, 0xbe, 0xd7, 0x63, 0xc7, 0x2f, 0x7d, 0xc8, 0x39, - 0x50, 0x89, 0xa6, 0xb4, 0xc7, 0x31, 0xbf, 0xff, 0xd8, 0x2f, 0xed, 0x67, - 0x00, 0x08, 0xcd, 0xfd, 0xa4, 0x39, 0x76, 0x6d, 0x9c, 0xb3, 0x84, 0xfe, - 0x3c, 0xbf, 0x7a, 0x39, 0x31, 0xca, 0xf8, 0xdd, 0xf8, 0x44, 0xe2, 0x24, - 0xf0, 0xb3, 0x0c, 0x31, 0x32, 0x5d, 0x43, 0x23, 0x5f, 0xdd, 0x4d, 0x27, - 0x2e, 0x3b, 0x0b, 0x07, 0xa4, 0x18, 0x02, 0x33, 0xb1, 0x46, 0xfe, 0x1a, - 0xad, 0xc2, 0xa7, 0x6c, 0x9e, 0xf6, 0xf3, 0xec, 0x39, 0x7f, 0x7c, 0x67, - 0x63, 0x7d, 0xa3, 0x97, 0xbe, 0x01, 0xb3, 0x95, 0xb9, 0xea, 0x78, 0xd2, - 0xfe, 0xc6, 0xf3, 0x05, 0x53, 0x97, 0xcb, 0x7c, 0xd1, 0xca, 0x43, 0xce, - 0x72, 0xdb, 0xff, 0xe6, 0x46, 0xb5, 0x0b, 0xcf, 0x26, 0xba, 0xe7, 0x2f, - 0xf0, 0x8c, 0x49, 0x70, 0x87, 0x2f, 0xf7, 0x93, 0x62, 0x7a, 0x50, 0x52, - 0xcb, 0x39, 0x7f, 0x60, 0xab, 0xc8, 0x51, 0x0f, 0x17, 0xe9, 0xa5, 0x62, - 0x61, 0x28, 0x9d, 0xa7, 0x5b, 0xee, 0x7f, 0xbc, 0x8e, 0x5f, 0xe1, 0x90, - 0xe2, 0xe1, 0x87, 0x2f, 0x2c, 0x38, 0x72, 0xa0, 0xfc, 0xb0, 0x95, 0xcc, - 0x6f, 0x6d, 0xff, 0xe3, 0x97, 0xcf, 0xc7, 0xfa, 0x72, 0xff, 0xf7, 0xa1, - 0x68, 0x1c, 0x15, 0x7b, 0x0b, 0x39, 0x4c, 0x44, 0x6e, 0x88, 0x7c, 0x47, - 0x7f, 0xfc, 0x9e, 0xec, 0x6a, 0x3b, 0x09, 0x3c, 0x2a, 0x72, 0xff, 0x76, - 0x26, 0x92, 0x72, 0x47, 0x2f, 0xf7, 0x91, 0xb9, 0x85, 0xdb, 0x39, 0x7e, - 0xf7, 0xb4, 0xe0, 0x39, 0x7e, 0x85, 0xfb, 0x18, 0x72, 0xe4, 0x9c, 0xe5, - 0x42, 0x63, 0xc1, 0x4f, 0xdc, 0xd1, 0x0d, 0x7a, 0x51, 0xe2, 0x7b, 0xf3, - 0x68, 0x1d, 0xa4, 0x39, 0x7f, 0xdd, 0x89, 0x20, 0xe2, 0xe0, 0xe5, 0xff, - 0x67, 0xbb, 0x8b, 0x17, 0xf1, 0xcb, 0xfb, 0x62, 0x73, 0x78, 0x6b, 0x39, - 0x61, 0x09, 0xf5, 0x61, 0xbd, 0xf9, 0x70, 0xc9, 0xc2, 0x72, 0xfa, 0x50, - 0xb7, 0x39, 0x7e, 0xe0, 0x16, 0x9a, 0x39, 0x77, 0xb5, 0x87, 0xe4, 0xe5, - 0x3f, 0x48, 0x6a, 0x11, 0xa7, 0xfc, 0x26, 0x2d, 0xa3, 0x97, 0xf4, 0x4f, - 0x82, 0x8a, 0x9c, 0xae, 0x1b, 0xed, 0x08, 0xdf, 0xfd, 0x02, 0xfd, 0x80, - 0x29, 0xcd, 0x68, 0xa5, 0x4e, 0xa8, 0xf8, 0x31, 0xb9, 0xe3, 0x32, 0xc8, - 0x6f, 0xf3, 0x87, 0x5a, 0x8e, 0x48, 0xe5, 0xdf, 0xce, 0x72, 0xff, 0x6f, - 0x2d, 0xf4, 0x9e, 0x83, 0x97, 0x93, 0x7d, 0x1c, 0xac, 0x3d, 0x24, 0x35, - 0xa4, 0x44, 0x5f, 0x5a, 0xee, 0xc6, 0x1c, 0xbd, 0xcc, 0xd1, 0xcf, 0x16, - 0xd7, 0xff, 0xc1, 0xf8, 0xe9, 0x9a, 0x89, 0xf0, 0x51, 0x53, 0x97, 0xfb, - 0x8b, 0x8d, 0xfc, 0xec, 0x39, 0x7f, 0xff, 0x0e, 0x7b, 0xb9, 0x2c, 0x64, - 0x33, 0xc2, 0xeb, 0x39, 0x58, 0x8d, 0xc4, 0x50, 0xd1, 0xa5, 0xf2, 0x2e, - 0x26, 0x39, 0x7f, 0xf6, 0x93, 0x71, 0xc9, 0xb9, 0x1e, 0xd1, 0xcb, 0xec, - 0x9f, 0xf9, 0x1c, 0xa9, 0x91, 0x16, 0x02, 0x26, 0xd1, 0x6f, 0xbf, 0x08, - 0x60, 0xe5, 0x41, 0xea, 0xb9, 0x95, 0xd8, 0xd9, 0xca, 0x2e, 0x21, 0x85, - 0xfd, 0xaf, 0xb1, 0xc8, 0x59, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x14, 0x5c, - 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc2, 0xa4, 0x8b, 0xa4, 0x19, - 0x01, 0xef, 0xe3, 0x3b, 0x63, 0x3b, 0x43, 0x37, 0x77, 0x0b, 0x88, 0x61, - 0x7f, 0x3b, 0xfa, 0x68, 0x59, 0x71, 0x0c, 0x3e, 0x1a, 0x4b, 0x34, 0xcb, - 0x88, 0x61, 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x54, 0x8d, 0x92, 0x0c, - 0xd1, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, - 0x85, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x53, 0xa2, 0x58, 0x23, 0x28, - 0x32, 0x01, 0x9d, 0x0c, 0xec, 0x19, 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, - 0x2a, 0x46, 0xcb, 0x43, 0x34, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x17, - 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x52, 0x3e, 0x40, 0x0c, 0xf8, 0x67, 0x68, - 0x66, 0x8b, 0x88, 0x61, 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x51, 0x71, - 0x0c, 0x2a, 0x73, 0xe4, 0x54, 0x67, 0x83, 0x3d, 0x19, 0xb2, 0xa5, 0xc4, - 0x30, 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x14, 0x5c, - 0x43, 0x0a, 0x09, 0xf2, 0x6e, 0x32, 0x01, 0x9f, 0xc6, 0x68, 0xb8, 0x86, - 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0xfb, 0xb0, 0x0d, 0x61, 0x71, - 0x0c, 0x28, 0xb8, 0x86, 0x15, 0x24, 0x4c, 0xb0, 0x67, 0xa3, 0x2e, 0x32, - 0x03, 0x5b, 0x30, 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, - 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x52, 0x3e, 0x4d, 0xc6, 0x50, 0x67, - 0x60, 0xcd, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x45, 0xc4, 0x30, 0xa2, - 0xe2, 0x18, 0x54, 0x8f, 0x90, 0x23, 0x3d, 0x19, 0x11, 0x9b, 0x74, 0xb8, - 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0xa4, 0x5c, 0x43, 0x0a, - 0x2e, 0x21, 0x86, 0xe5, 0xfd, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x45, - 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x54, 0xe8, 0xde, 0x90, 0xca, 0xa7, 0x0c, - 0x29, 0x98, 0x64, 0x03, 0x3e, 0x19, 0xb6, 0x17, 0x10, 0xc2, 0x8b, 0x88, - 0x61, 0x45, 0xc4, 0x30, 0xb4, 0x8b, 0x88, 0x61, 0x45, 0xc4, 0x30, 0xdc, - 0xbf, 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x2a, 0x11, 0x59, 0x21, 0x94, - 0x38, 0xe1, 0x4a, 0xc6, 0x68, 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, - 0x21, 0x85, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x50, 0x7f, 0xbb, 0x8c, - 0xf0, 0x65, 0x63, 0x22, 0x33, 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x51, - 0x71, 0x0c, 0x2b, 0x87, 0x97, 0xa1, 0x9f, 0x0c, 0xd1, 0x71, 0x0c, 0x28, - 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x59, 0xe5, 0x88, 0xcf, 0x86, 0x6c, - 0xb2, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x14, 0x03, 0x65, - 0xf8, 0xcd, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x45, 0xc4, 0x30, 0xa2, - 0xe2, 0x18, 0x54, 0x1f, 0x24, 0xc3, 0x3d, 0x19, 0xfc, 0x66, 0xa1, 0x98, - 0x21, 0x3c, 0x20, 0x64, 0x9a, 0x15, 0x5c, 0x85, 0xb3, 0x21, 0x17, 0xbc, - 0x21, 0x52, 0x14, 0x6d, 0x67, 0xd3, 0x42, 0x13, 0x90, 0xd7, 0x5a, 0x4f, - 0x61, 0x06, 0xf0, 0xa2, 0x01, 0xd8, 0xc3, 0xf7, 0x4c, 0xfe, 0x86, 0x57, - 0xf0, 0xc5, 0xd9, 0x09, 0x36, 0xde, 0xb6, 0xcb, 0xbe, 0xa8, 0xed, 0x42, - 0x1a, 0xfd, 0x21, 0x8c, 0xd1, 0x71, 0x0c, 0x14, 0x4e, 0x62, 0xf2, 0x42, - 0xcb, 0x88, 0x61, 0x7c, 0x8c, 0x7e, 0x1f, 0x10, 0xc5, 0xe4, 0x0e, 0x1f, - 0x10, 0xc5, 0x94, 0xdd, 0x18, 0xfc, 0x48, 0xe9, 0x4f, 0x8b, 0xad, 0x1b, - 0x19, 0xf0, 0xbf, 0x69, 0xe8, 0x17, 0xfb, 0xa8, 0xd8, 0x79, 0x13, 0x9c, - 0xbc, 0x9b, 0x1a, 0x67, 0x2b, 0x74, 0x48, 0x4c, 0x73, 0xe3, 0x5b, 0xf6, - 0x64, 0xcf, 0xf4, 0xe5, 0xc0, 0x83, 0x97, 0xf7, 0x1c, 0x7e, 0xc0, 0x0e, - 0x5c, 0xfc, 0x39, 0x64, 0x38, 0xc2, 0xda, 0xcc, 0x39, 0x65, 0x9c, 0xbb, - 0x6d, 0x44, 0x44, 0xdf, 0x05, 0xba, 0x88, 0xe3, 0xff, 0x44, 0x6f, 0xfb, - 0xb0, 0xbc, 0x9a, 0x06, 0x73, 0x97, 0xff, 0x7c, 0x76, 0x07, 0xb0, 0x0c, - 0x10, 0x1c, 0xb8, 0x10, 0x72, 0xb0, 0xf6, 0xc0, 0x8b, 0x58, 0x98, 0x78, - 0x16, 0xbf, 0x84, 0xa5, 0xff, 0xc2, 0x31, 0x38, 0xe2, 0x6c, 0x8d, 0xb3, - 0x97, 0xa3, 0x7d, 0x1c, 0xa7, 0x3e, 0x3d, 0x23, 0x5e, 0x7e, 0x41, 0xcb, - 0xf2, 0x6d, 0xb8, 0x80, 0xe5, 0x48, 0xf1, 0x16, 0x37, 0x7f, 0xdf, 0x5c, - 0x3a, 0xc5, 0xc3, 0x59, 0xcb, 0xd9, 0xbb, 0x67, 0x2f, 0x6e, 0x0c, 0xe1, - 0xed, 0x89, 0xed, 0xf6, 0xcc, 0xe4, 0x8e, 0x5e, 0x0b, 0x89, 0xca, 0x43, - 0x7e, 0xe4, 0x97, 0xff, 0xd1, 0xf1, 0xf9, 0xc7, 0x04, 0x28, 0xdb, 0x6d, - 0x9c, 0xa8, 0x4d, 0x8d, 0xdf, 0x74, 0xe5, 0xf8, 0xfd, 0xff, 0xdf, 0xfd, - 0x9b, 0xe4, 0x7d, 0x76, 0x47, 0x4e, 0x53, 0x41, 0xbf, 0xeb, 0x87, 0x59, - 0xdc, 0x65, 0x19, 0x48, 0x61, 0x43, 0x90, 0xb9, 0x64, 0x69, 0xdb, 0xab, - 0xa4, 0xa6, 0x96, 0xb4, 0x59, 0xa1, 0x7d, 0xc3, 0x85, 0xc6, 0x0f, 0xd8, - 0xc3, 0x9e, 0xb0, 0x35, 0x01, 0x90, 0xc7, 0xa7, 0xa8, 0x4c, 0xfa, 0x3c, - 0x8f, 0xa7, 0xb7, 0x97, 0xa6, 0x1c, 0xbc, 0x2c, 0x83, 0x95, 0xf0, 0xdc, - 0x20, 0xed, 0xfc, 0xdb, 0xf3, 0x8f, 0xb9, 0xcb, 0xff, 0xf6, 0xb9, 0xc4, - 0x9b, 0x5c, 0x8f, 0x23, 0x10, 0x27, 0x29, 0x68, 0xa7, 0x12, 0x26, 0xcb, - 0xef, 0x97, 0xe8, 0xd1, 0xcb, 0xee, 0x20, 0xaa, 0x72, 0xff, 0x7a, 0x3f, - 0x67, 0x53, 0x87, 0x2f, 0xec, 0x67, 0x63, 0x79, 0x1c, 0xbf, 0x97, 0xa4, - 0x57, 0xcd, 0x9c, 0xbf, 0x46, 0xfd, 0x89, 0x1c, 0xae, 0x23, 0x70, 0x48, - 0xbc, 0x69, 0xf4, 0xbb, 0x68, 0xc2, 0xff, 0xb3, 0x71, 0xcf, 0x7b, 0x27, - 0x39, 0x76, 0xfe, 0x39, 0x7e, 0xc1, 0x9d, 0x38, 0x72, 0xfd, 0xe7, 0x1f, - 0xf0, 0xe5, 0xfe, 0xd6, 0x2d, 0x3d, 0xd7, 0x39, 0x68, 0xc4, 0x4c, 0x70, - 0x60, 0x49, 0xfc, 0x4f, 0x7b, 0xe2, 0xd0, 0xe5, 0xc2, 0xb3, 0x95, 0x23, - 0x69, 0xa1, 0xeb, 0xdb, 0x5c, 0x83, 0x97, 0xfb, 0x89, 0x30, 0xe6, 0xc7, - 0x39, 0x76, 0xfa, 0xf8, 0x7e, 0x90, 0x43, 0xc1, 0xfb, 0xfe, 0x18, 0x79, - 0xfb, 0x1c, 0x01, 0xcb, 0xfc, 0x9c, 0x1f, 0x7b, 0x27, 0x39, 0x73, 0xec, - 0x39, 0x7f, 0x48, 0x52, 0x5d, 0xc3, 0x97, 0xe9, 0xd3, 0x91, 0x23, 0x94, - 0xaa, 0x27, 0xe6, 0x33, 0xe0, 0xc0, 0x96, 0x5f, 0xbf, 0xf6, 0xde, 0x78, - 0xe5, 0xe0, 0xa2, 0xa7, 0x2a, 0x0f, 0x27, 0x0b, 0x2f, 0x70, 0x1f, 0x4e, - 0x5f, 0xfc, 0x9e, 0x8f, 0x6b, 0xae, 0x9d, 0xfc, 0xe5, 0x41, 0xf1, 0xb8, - 0xfd, 0xf0, 0x8f, 0xf2, 0x39, 0x7f, 0xee, 0xc7, 0x00, 0x38, 0xdb, 0x80, - 0xe5, 0xec, 0xc9, 0x8e, 0x5b, 0x3a, 0x7b, 0x40, 0x3e, 0xbd, 0x1b, 0xb6, - 0x72, 0xfd, 0xcf, 0xd6, 0xe2, 0x72, 0xbc, 0x78, 0xdf, 0x8f, 0x5f, 0x2e, - 0x32, 0x73, 0x97, 0xec, 0xd8, 0x31, 0xb9, 0xca, 0x43, 0xcb, 0xd1, 0x15, - 0xf4, 0x0f, 0x98, 0x72, 0x82, 0xae, 0x6b, 0x21, 0xaf, 0xc8, 0x43, 0xf6, - 0x10, 0x6e, 0x40, 0x2f, 0x9a, 0x6d, 0xf3, 0x76, 0xd9, 0x0d, 0xfe, 0x07, - 0xdc, 0x10, 0xf6, 0x0e, 0x54, 0x23, 0x0d, 0xe1, 0x1f, 0x7f, 0x6b, 0x16, - 0x9d, 0x83, 0x97, 0xb7, 0x96, 0x8e, 0x56, 0xe7, 0x95, 0xc2, 0xcb, 0xda, - 0x03, 0x67, 0x2a, 0x0f, 0x07, 0x08, 0xef, 0xbf, 0x7e, 0x48, 0xe5, 0xf4, - 0x7e, 0xd3, 0xd1, 0x4b, 0xf4, 0x94, 0x6d, 0xb6, 0xce, 0x50, 0x9e, 0xa7, - 0xe4, 0xf7, 0xcf, 0xe5, 0xf8, 0xe5, 0x05, 0x17, 0x78, 0xee, 0x02, 0x2b, - 0xfd, 0xf4, 0x45, 0xdb, 0x7e, 0x9c, 0xa8, 0x64, 0xdf, 0x61, 0x82, 0x43, - 0xfb, 0x89, 0xcb, 0x86, 0x8b, 0xc3, 0xa0, 0x13, 0x93, 0x43, 0x0b, 0x1f, - 0xe1, 0xb6, 0xd9, 0x7d, 0xe6, 0xa9, 0xa9, 0xb4, 0x0e, 0x5e, 0x90, 0xb9, - 0xcb, 0x6e, 0xd5, 0x1e, 0x3c, 0x16, 0x5f, 0xb6, 0xa2, 0x5c, 0x83, 0x97, - 0xbc, 0xe0, 0x39, 0x7f, 0x47, 0x27, 0x8e, 0x4e, 0x72, 0xff, 0xd0, 0x3e, - 0xef, 0xef, 0x29, 0x41, 0xcb, 0xf7, 0xe0, 0xc1, 0x61, 0xcb, 0xdc, 0x89, - 0x8e, 0x5f, 0x20, 0xbc, 0xc7, 0x2f, 0xfc, 0x30, 0xaf, 0x5f, 0xdf, 0x70, - 0x07, 0x2f, 0x93, 0x5c, 0xc3, 0x96, 0x6b, 0x39, 0x7f, 0x67, 0xd8, 0x99, - 0x34, 0x72, 0x84, 0xf0, 0xfc, 0x29, 0x50, 0x9e, 0xf4, 0xe5, 0x52, 0x1c, - 0x09, 0x7f, 0x0f, 0x96, 0x51, 0xd1, 0xd1, 0x21, 0xf2, 0x06, 0xc6, 0x4b, - 0xfe, 0x84, 0xec, 0x2e, 0x7c, 0x6c, 0xe5, 0xfb, 0xa9, 0x3b, 0x89, 0xcb, - 0xf7, 0xea, 0xb8, 0x80, 0xe5, 0x41, 0xe8, 0x74, 0x9e, 0xff, 0xa7, 0x1c, - 0x97, 0x70, 0x1a, 0x39, 0x7f, 0xec, 0x1d, 0xe5, 0xae, 0x7f, 0x00, 0x39, - 0x7e, 0xcf, 0x6b, 0x15, 0x39, 0x48, 0x7d, 0x0b, 0x40, 0xbf, 0x87, 0xdf, - 0x3b, 0x9b, 0x47, 0x2f, 0x06, 0x36, 0x1c, 0xbf, 0xfc, 0x23, 0x0d, 0x84, - 0x63, 0x79, 0x20, 0x9c, 0xbf, 0x2f, 0x3a, 0xfb, 0x47, 0x2b, 0x0f, 0xc9, - 0x12, 0x2f, 0xff, 0x3f, 0xc9, 0xa5, 0x1c, 0x9f, 0xe3, 0x79, 0xd3, 0x95, - 0x09, 0x99, 0x84, 0xcb, 0xb0, 0x90, 0x12, 0x0b, 0xfe, 0x5f, 0x73, 0xd9, - 0xff, 0x27, 0x39, 0x7f, 0xfc, 0xab, 0xfb, 0x48, 0x33, 0x43, 0x39, 0x9b, - 0x9c, 0xbf, 0xe8, 0xf6, 0x71, 0x8e, 0xec, 0x34, 0x5f, 0x0b, 0xf6, 0x72, - 0x37, 0x91, 0xcb, 0xdd, 0x85, 0xb0, 0xfb, 0x3c, 0x89, 0x7f, 0xfe, 0x16, - 0x7c, 0xec, 0x27, 0x11, 0x69, 0xb7, 0x0b, 0x39, 0x79, 0xf9, 0x39, 0xa2, - 0xff, 0x54, 0x22, 0xd7, 0x0c, 0xd8, 0xb1, 0x7f, 0xe0, 0x3f, 0xb4, 0x83, - 0xbc, 0x96, 0x72, 0xff, 0xff, 0x75, 0xf4, 0x91, 0xaf, 0x9e, 0xee, 0x2f, - 0x18, 0xfc, 0x39, 0x74, 0x6d, 0x1c, 0xbe, 0xd6, 0x9d, 0x67, 0x2b, 0xa8, - 0x9c, 0x03, 0x0f, 0x86, 0x6f, 0xb7, 0x97, 0x9c, 0xe5, 0xff, 0xf0, 0x59, - 0xd4, 0x1c, 0xd8, 0xf2, 0xd2, 0x04, 0xe5, 0xa5, 0x87, 0xe6, 0xe4, 0x77, - 0xfd, 0x0b, 0xf8, 0x1c, 0xc0, 0x68, 0xe5, 0xff, 0x26, 0x08, 0x55, 0x4c, - 0xe1, 0xca, 0x43, 0xf1, 0xda, 0x3a, 0xbd, 0xec, 0xdc, 0xe5, 0xfc, 0xfc, - 0xde, 0x59, 0xe3, 0x97, 0xfe, 0xf6, 0x93, 0x9e, 0x1f, 0xde, 0x47, 0x2f, - 0xff, 0x2e, 0x36, 0xf3, 0xf1, 0xcc, 0xd9, 0x1b, 0x9c, 0xbf, 0xf4, 0x67, - 0x33, 0x80, 0x5a, 0x68, 0xe5, 0xe7, 0xdf, 0x68, 0xe5, 0xfc, 0xfe, 0xd4, - 0x64, 0xe7, 0x2a, 0x13, 0x45, 0xc2, 0xe4, 0x3f, 0x14, 0xed, 0x87, 0xad, - 0x90, 0x5f, 0xf7, 0xf0, 0xbd, 0x62, 0xe1, 0xac, 0xe5, 0xff, 0xb9, 0x3e, - 0x07, 0x3b, 0xdc, 0x6b, 0x39, 0x7f, 0xec, 0x1f, 0x6b, 0xee, 0xc8, 0xcd, - 0xce, 0x56, 0x22, 0x13, 0x48, 0x57, 0xff, 0xd2, 0x8e, 0x4f, 0xe4, 0x57, - 0x5a, 0x71, 0x91, 0xcb, 0xfa, 0x7d, 0x62, 0xe1, 0xac, 0xe5, 0x9b, 0x99, - 0x10, 0x5f, 0x54, 0x6f, 0x27, 0x50, 0xe5, 0xf4, 0xb8, 0x19, 0x1c, 0xbe, - 0x5f, 0x92, 0x73, 0x95, 0x87, 0x8c, 0x84, 0x77, 0xff, 0x6c, 0xf2, 0xb0, - 0x32, 0xce, 0xa2, 0xce, 0x5d, 0x3f, 0x8e, 0x5f, 0xed, 0x9d, 0x79, 0x46, - 0x09, 0xca, 0x83, 0xcb, 0xc1, 0x8b, 0xff, 0xf4, 0xbb, 0x1c, 0x7f, 0x7f, - 0xe4, 0xf6, 0xba, 0x87, 0x2f, 0xec, 0x6f, 0xef, 0x5f, 0xc7, 0x2f, 0xe9, - 0x2f, 0xc3, 0xfc, 0xc7, 0x2f, 0xff, 0xbe, 0xca, 0x36, 0x20, 0x83, 0x89, - 0x0b, 0xc2, 0x95, 0xc4, 0x40, 0xf8, 0xc2, 0xfb, 0xbf, 0x77, 0xf1, 0xcb, - 0xf6, 0x2f, 0x13, 0x61, 0xcb, 0xd3, 0xcc, 0xd6, 0x72, 0xa1, 0x39, 0xa9, - 0xd5, 0xb2, 0x16, 0x2c, 0x23, 0x42, 0x6f, 0xca, 0x2e, 0xf6, 0x1c, 0xbf, - 0x71, 0x27, 0x75, 0x9a, 0x61, 0x35, 0xf7, 0xbf, 0x87, 0x34, 0xc2, 0x6b, - 0x81, 0x06, 0xa0, 0x4d, 0x7f, 0x85, 0xd5, 0xf4, 0x70, 0x06, 0xa0, 0x4d, - 0x7f, 0xb5, 0x9d, 0x4d, 0x7f, 0x39, 0xa6, 0x13, 0x5d, 0x81, 0x34, 0xc2, - 0x6b, 0x9b, 0x6c, 0xf3, 0x09, 0xab, 0x13, 0x52, 0xdc, 0xd5, 0x0b, 0xd6, - 0x47, 0xa4, 0x0d, 0x88, 0x4d, 0x91, 0xdb, 0xc5, 0x98, 0x4c, 0x50, 0xf9, - 0xec, 0x9b, 0xaa, 0x00, 0x6e, 0x3c, 0xfa, 0x85, 0xd8, 0x74, 0x2d, 0xeb, - 0x0b, 0x90, 0x0c, 0x24, 0x75, 0x1d, 0xd7, 0xa5, 0x2e, 0x5f, 0xff, 0xba, - 0xf2, 0xec, 0x42, 0x7b, 0x48, 0x3b, 0xc8, 0xe5, 0xe1, 0x02, 0xce, 0x5f, - 0xf4, 0x7f, 0xe1, 0x4d, 0x9f, 0x56, 0x72, 0xec, 0xd6, 0x1e, 0xcf, 0x07, - 0x29, 0xd1, 0xb2, 0x30, 0xad, 0xbe, 0xc4, 0xe2, 0xa7, 0x2f, 0x04, 0x13, - 0x1c, 0xa8, 0x6c, 0x28, 0xa7, 0x85, 0x08, 0x63, 0x54, 0xc4, 0x15, 0x4e, - 0xd9, 0x1b, 0x96, 0xe5, 0xc9, 0x0d, 0xb9, 0xa1, 0x47, 0xc8, 0x4b, 0xac, - 0x93, 0xb1, 0xb1, 0x0a, 0xbe, 0xa1, 0x81, 0xe9, 0xe2, 0xbd, 0x91, 0xa7, - 0x6d, 0x93, 0x7d, 0x22, 0xbf, 0x07, 0x38, 0x8a, 0x9c, 0xbf, 0xbb, 0x1f, - 0x47, 0x70, 0x1c, 0xbc, 0xd5, 0xe6, 0xd1, 0xcb, 0xd9, 0x8d, 0x9c, 0xb9, - 0x15, 0x39, 0x53, 0x9b, 0x34, 0x1c, 0xbf, 0x7b, 0x26, 0x45, 0x9c, 0xbf, - 0x46, 0xe0, 0x04, 0x1c, 0xa8, 0x3d, 0x01, 0x28, 0xbf, 0x46, 0xc8, 0x1f, - 0x1c, 0xbf, 0x26, 0xcf, 0x24, 0xe7, 0x2f, 0xcf, 0x2f, 0x63, 0x0e, 0x5f, - 0x87, 0x3e, 0xe4, 0xc7, 0x2f, 0xff, 0x85, 0x88, 0xb0, 0xfe, 0xfc, 0x96, - 0x6f, 0xe3, 0x97, 0xfe, 0x71, 0x06, 0xfe, 0xe4, 0x63, 0x67, 0x2f, 0xfd, - 0xae, 0xa7, 0xcd, 0xe5, 0x19, 0x39, 0xcb, 0x63, 0x5a, 0x20, 0x40, 0x7f, - 0x7f, 0xdd, 0x75, 0xf5, 0x23, 0x79, 0x1c, 0xbf, 0xbe, 0x8c, 0xb6, 0xde, - 0x73, 0x95, 0x09, 0xb4, 0xca, 0x1a, 0x48, 0x56, 0x03, 0x9a, 0x9d, 0x53, - 0x60, 0x48, 0x18, 0x51, 0xc2, 0xa1, 0x27, 0xf4, 0x72, 0x57, 0xfe, 0xc7, - 0xec, 0xc8, 0x3d, 0xcd, 0xce, 0x5f, 0xc0, 0x9a, 0x51, 0xed, 0x1c, 0xbf, - 0xff, 0xff, 0x67, 0x70, 0x41, 0x83, 0xee, 0xe7, 0x63, 0x26, 0x4e, 0x4d, - 0xd4, 0xdf, 0xc7, 0x2f, 0x86, 0x31, 0xb3, 0x97, 0xd1, 0xbe, 0x9c, 0xe5, - 0x43, 0x70, 0x5d, 0x3c, 0x23, 0x43, 0x08, 0x9c, 0xac, 0x30, 0xd2, 0x33, - 0x86, 0xb2, 0x89, 0x8c, 0x38, 0xae, 0xf2, 0xb7, 0x45, 0x7f, 0xc7, 0xdf, - 0x97, 0xec, 0x84, 0x17, 0xd2, 0x1b, 0xff, 0xe4, 0x1c, 0x5c, 0x7d, 0x1f, - 0xe4, 0x38, 0xb3, 0x97, 0xfc, 0x14, 0xc1, 0xfe, 0x59, 0xa3, 0x96, 0xfc, - 0xe5, 0xfc, 0xcf, 0xdc, 0x2b, 0x83, 0x97, 0xfd, 0xd4, 0x97, 0x5e, 0x48, - 0xb3, 0x97, 0xfe, 0xd2, 0x0e, 0xf2, 0xf2, 0x69, 0x0e, 0x56, 0x1f, 0xb7, - 0x8e, 0x2f, 0xda, 0x5c, 0x06, 0x0e, 0x54, 0x93, 0x85, 0xc4, 0xf9, 0x8e, - 0x38, 0x24, 0xb8, 0x52, 0x78, 0x86, 0xf8, 0x63, 0x92, 0x39, 0x7f, 0xdd, - 0x89, 0x20, 0x8f, 0xfb, 0x9c, 0xbf, 0xe8, 0x92, 0x7a, 0x50, 0x20, 0x39, - 0x7f, 0xd1, 0x9e, 0xfa, 0x00, 0x46, 0xe7, 0x2d, 0xc8, 0x46, 0x66, 0x10, - 0xf0, 0xe5, 0x66, 0xf7, 0xf0, 0xc3, 0x39, 0x12, 0x39, 0x7f, 0xfd, 0xd7, - 0x4f, 0x4b, 0xf1, 0xf6, 0xba, 0xf2, 0x39, 0xf4, 0xd6, 0x5f, 0xfb, 0x5f, - 0x7c, 0x83, 0xfc, 0xb3, 0x47, 0x2e, 0x0e, 0x8e, 0x53, 0x5a, 0x2e, 0xba, - 0xc4, 0x28, 0x37, 0xff, 0xf6, 0x6f, 0x9a, 0x71, 0xea, 0x47, 0xbb, 0xfb, - 0xac, 0xe5, 0x42, 0x76, 0x6f, 0x19, 0x38, 0x99, 0x5f, 0xbf, 0x5a, 0x76, - 0x0e, 0x5f, 0xb3, 0x8c, 0x8c, 0x39, 0x42, 0x79, 0xdf, 0x4a, 0x2f, 0xff, - 0xce, 0x3e, 0x77, 0xe8, 0xc7, 0xb4, 0xde, 0x74, 0xe5, 0xff, 0x47, 0xbb, - 0x8b, 0xce, 0x61, 0xcb, 0xf7, 0xba, 0x91, 0xa3, 0x97, 0xa7, 0x71, 0xe1, - 0xef, 0x68, 0xde, 0xff, 0xa0, 0x1a, 0x0f, 0xef, 0xc9, 0x1c, 0xbd, 0xcd, - 0x68, 0xf1, 0x01, 0xaf, 0x98, 0xee, 0xc3, 0x44, 0x06, 0x50, 0xd5, 0x5f, - 0xdc, 0x8e, 0xc7, 0xcc, 0x92, 0x28, 0xf8, 0xc9, 0x4e, 0x98, 0xe7, 0xd8, - 0x6b, 0x50, 0x13, 0xf7, 0xf4, 0x79, 0xb7, 0xb6, 0x47, 0x4e, 0x56, 0x2a, - 0x62, 0x49, 0x43, 0x5f, 0x4a, 0xaf, 0x75, 0xda, 0xce, 0x5f, 0x40, 0x36, - 0xf0, 0xe5, 0x00, 0xf0, 0xfc, 0x3f, 0x7c, 0x3e, 0x07, 0xe7, 0x2f, 0xcb, - 0x6a, 0x9a, 0xa6, 0xa9, 0xa8, 0x39, 0x7f, 0xff, 0x4b, 0x34, 0x9c, 0xe2, - 0x2f, 0xef, 0xbb, 0x8d, 0xf8, 0xe5, 0x62, 0x2f, 0x90, 0x8d, 0xcf, 0x6f, - 0xff, 0x37, 0x83, 0xec, 0x19, 0x66, 0xbe, 0xac, 0xe5, 0xff, 0xe9, 0x66, - 0xf2, 0xfb, 0x00, 0x51, 0xb6, 0xdb, 0x29, 0x7e, 0x5b, 0x78, 0x9b, 0x0e, - 0x5e, 0x96, 0x0c, 0xc7, 0xf9, 0xf5, 0x4a, 0xa1, 0x1f, 0x8f, 0x0c, 0x7a, - 0x85, 0x45, 0xfd, 0x87, 0x00, 0xc6, 0x53, 0x7f, 0xc8, 0x32, 0xd3, 0x52, - 0x6a, 0x1a, 0xa6, 0xa0, 0xe5, 0xf4, 0xda, 0xc9, 0x8e, 0x5f, 0x81, 0x1e, - 0xc6, 0xb3, 0x97, 0xfa, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x09, 0x5f, 0xf4, - 0x7b, 0x38, 0xc7, 0x76, 0x1a, 0x2f, 0x95, 0xf9, 0xc3, 0xd8, 0x54, 0xe5, - 0xe1, 0xcd, 0x05, 0x15, 0x4c, 0x3e, 0x5a, 0x25, 0x0a, 0x62, 0x9b, 0x21, - 0xa9, 0x7f, 0xf4, 0x75, 0x15, 0xce, 0x4e, 0xbf, 0xf7, 0x39, 0x7f, 0xc1, - 0xe6, 0x2f, 0x24, 0xe1, 0x39, 0x58, 0x9f, 0x12, 0x46, 0x71, 0xd2, 0xa7, - 0x48, 0xbf, 0xdf, 0xf7, 0x6f, 0xa8, 0xce, 0x9c, 0xbf, 0xf4, 0xef, 0xbe, - 0xde, 0x78, 0x5f, 0x61, 0xcb, 0xff, 0xec, 0xf4, 0x0f, 0xb5, 0x98, 0xaa, - 0xaf, 0x23, 0x97, 0xfe, 0xc0, 0xc4, 0xa3, 0xb8, 0x07, 0x39, 0x7f, 0x3c, - 0xbf, 0x93, 0x84, 0xe5, 0xfd, 0xd4, 0x9f, 0x5a, 0x73, 0x97, 0x9b, 0x6d, - 0xb2, 0x97, 0xee, 0xe3, 0x1f, 0x85, 0x14, 0x34, 0x17, 0xff, 0xfa, 0x6e, - 0x46, 0xcf, 0x8a, 0xbf, 0xcf, 0xb3, 0x6b, 0xe6, 0x6f, 0xe3, 0x95, 0x08, - 0xf6, 0xf2, 0x77, 0xd3, 0x8b, 0xff, 0xc9, 0xc4, 0xf7, 0xf9, 0xe7, 0x5e, - 0x09, 0xca, 0x9d, 0x53, 0x63, 0x11, 0x16, 0x9e, 0x03, 0xc1, 0x8c, 0x93, - 0xc6, 0x37, 0xfe, 0x5c, 0x6f, 0xa1, 0xc9, 0xfe, 0xc8, 0xe5, 0xff, 0xfe, - 0x4e, 0xb8, 0xef, 0x2f, 0xb2, 0x81, 0x93, 0xaf, 0x02, 0x72, 0xff, 0xf6, - 0x67, 0x43, 0xd8, 0xd6, 0x75, 0x00, 0x72, 0xff, 0x2b, 0xf2, 0x69, 0x47, - 0x34, 0x72, 0xa7, 0x4c, 0x8e, 0x48, 0x41, 0x61, 0x44, 0x8b, 0xef, 0x89, - 0xdf, 0xce, 0x5f, 0xb2, 0x5d, 0x8e, 0x1c, 0xa6, 0x1e, 0x63, 0x59, 0x2d, - 0xfe, 0xf4, 0x27, 0x55, 0x8d, 0xce, 0x5f, 0xfd, 0xed, 0x3c, 0xb5, 0x8c, - 0x85, 0xa1, 0xcb, 0xff, 0xdb, 0x8f, 0xc6, 0x75, 0x00, 0x08, 0xe4, 0x8e, - 0x54, 0x23, 0xa5, 0x09, 0x7f, 0x34, 0xfa, 0x87, 0x7f, 0x26, 0xb0, 0x3f, - 0x70, 0xe5, 0xfb, 0x69, 0x07, 0x36, 0x1c, 0xbf, 0xdc, 0xc0, 0xa7, 0xec, - 0xeb, 0x0f, 0x65, 0xcb, 0xaf, 0xf6, 0x87, 0x36, 0x75, 0xe4, 0x72, 0xf6, - 0xa5, 0xb0, 0xe5, 0x21, 0xe9, 0xb5, 0x9a, 0x5f, 0xfe, 0x89, 0xfe, 0xf6, - 0x37, 0xf6, 0x4e, 0x21, 0x39, 0x48, 0x98, 0x7b, 0xc2, 0x74, 0x49, 0x2f, - 0xf4, 0x60, 0xf9, 0xa0, 0xdb, 0x0e, 0x5f, 0xee, 0xe6, 0xcf, 0x9a, 0x93, - 0x0e, 0x5b, 0xfd, 0x1f, 0x7f, 0x8d, 0xef, 0xe1, 0xf9, 0xf7, 0x9d, 0x73, - 0x97, 0xfe, 0xfd, 0xe5, 0xf2, 0x10, 0x38, 0xb3, 0x94, 0xe7, 0xe2, 0x26, - 0x37, 0xec, 0xe3, 0xee, 0xd9, 0xcb, 0xff, 0xfd, 0x3e, 0x36, 0x38, 0x1e, - 0x27, 0xf3, 0x87, 0xb0, 0x33, 0x9c, 0xa9, 0xd1, 0x1b, 0xa2, 0x9b, 0xcd, - 0xb6, 0xd9, 0x4b, 0xfd, 0xf4, 0x10, 0x39, 0xbf, 0x8a, 0x28, 0x68, 0x2f, - 0xff, 0xe6, 0x9f, 0xc6, 0x75, 0x02, 0x1c, 0x6f, 0xe7, 0xb5, 0x93, 0x9c, - 0xae, 0xa2, 0xb3, 0xf4, 0x6a, 0x44, 0xc5, 0x1e, 0x1e, 0x15, 0x3b, 0x33, - 0x52, 0x52, 0x8c, 0x02, 0x82, 0x92, 0xa9, 0x39, 0x1c, 0x12, 0xe3, 0x73, - 0xec, 0x74, 0xc3, 0x0a, 0x2d, 0x42, 0x6b, 0xd1, 0xe0, 0xdf, 0xfb, 0x10, - 0x67, 0x71, 0xf6, 0x2c, 0xe5, 0xff, 0xee, 0x2b, 0xf7, 0xc9, 0xa1, 0xcd, - 0x88, 0x13, 0x97, 0xfc, 0x8d, 0x87, 0xb9, 0xed, 0xbc, 0x39, 0x50, 0x88, - 0xae, 0xa7, 0x5f, 0x0b, 0xef, 0xe3, 0x97, 0xb0, 0x40, 0x72, 0xfb, 0x3d, - 0x34, 0x8e, 0x5f, 0xfd, 0xb4, 0x31, 0xb5, 0xa7, 0x1f, 0xa0, 0xd1, 0xca, - 0xe9, 0xf7, 0x39, 0x1d, 0xff, 0xb3, 0xd1, 0xcd, 0x76, 0x07, 0xc7, 0x88, - 0x21, 0x7f, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x10, 0x50, 0xf2, 0xaf, 0x40, - 0x50, 0xe5, 0x41, 0xf3, 0x69, 0x2e, 0xf6, 0xc8, 0x59, 0xcb, 0xf9, 0xfb, - 0xce, 0x23, 0x67, 0x2f, 0xe6, 0xb0, 0xb6, 0xe3, 0x23, 0x95, 0x87, 0xfa, - 0x23, 0xdf, 0x97, 0x5f, 0xff, 0xa0, 0x33, 0x49, 0x07, 0xd0, 0x09, 0x85, - 0x26, 0x39, 0x53, 0xaa, 0x9e, 0x54, 0x8b, 0xb0, 0x89, 0x04, 0x34, 0x46, - 0x13, 0xdb, 0x0b, 0xaf, 0xee, 0xe7, 0xbc, 0x8b, 0x39, 0x7f, 0x7b, 0xee, - 0x75, 0xf7, 0x39, 0x5b, 0x9e, 0xe8, 0x96, 0xdf, 0xd9, 0xbf, 0xb9, 0xc8, - 0x39, 0x7f, 0xf6, 0x85, 0xfc, 0xeb, 0xfb, 0x13, 0xe1, 0xca, 0x09, 0xf9, - 0xe8, 0xba, 0xa1, 0x16, 0xff, 0xc2, 0x56, 0xfe, 0xc6, 0x7d, 0xd9, 0xdc, - 0x39, 0x74, 0x2a, 0x72, 0xe4, 0x13, 0x96, 0x6c, 0xe5, 0x04, 0xd3, 0xfd, - 0x15, 0xbc, 0x3f, 0xce, 0x72, 0xfd, 0xd7, 0x96, 0x09, 0xcb, 0xf9, 0x3c, - 0x39, 0xd4, 0x39, 0x76, 0x77, 0xe1, 0xe8, 0xc1, 0x35, 0xce, 0xdf, 0xc4, - 0x7f, 0x61, 0xf7, 0x48, 0xfc, 0xdf, 0x52, 0x4e, 0x87, 0x0a, 0x06, 0x32, - 0xfb, 0xfb, 0x48, 0x10, 0xe0, 0x9c, 0xbf, 0xff, 0xbd, 0xdc, 0xd6, 0xb3, - 0x3f, 0xe4, 0xf9, 0xf8, 0xf8, 0xe5, 0xff, 0x76, 0x39, 0xe1, 0x8c, 0xdc, - 0xe5, 0xff, 0xff, 0x24, 0xf1, 0x2d, 0x73, 0x89, 0xbc, 0xd2, 0x7e, 0x2f, - 0x37, 0x39, 0x7f, 0xa1, 0xe7, 0x7e, 0x3f, 0xd3, 0x97, 0xbb, 0x82, 0x14, - 0x6b, 0x74, 0xe3, 0xcd, 0x55, 0x89, 0xcf, 0xa1, 0x67, 0xa3, 0x33, 0xbf, - 0xf3, 0x3b, 0x19, 0xc9, 0x6b, 0xf5, 0x9c, 0xb9, 0x34, 0x72, 0xff, 0xb2, - 0x77, 0xf0, 0x3e, 0x8c, 0x8e, 0x5f, 0xcf, 0xef, 0x91, 0x25, 0x4e, 0x5f, - 0xdf, 0x57, 0xa6, 0xdf, 0x73, 0x95, 0x09, 0x94, 0x61, 0xaa, 0xa8, 0x1c, - 0x16, 0x73, 0xbf, 0x18, 0x5e, 0xe6, 0x74, 0xe5, 0xed, 0x22, 0xce, 0x5a, - 0x38, 0x6e, 0x3c, 0x39, 0x7f, 0xf7, 0x52, 0x07, 0xe3, 0x8c, 0x91, 0x67, - 0x2f, 0x92, 0x64, 0x6c, 0xe5, 0xff, 0xcb, 0x7d, 0xfe, 0xf9, 0x39, 0x1f, - 0xb4, 0xce, 0x5f, 0xff, 0xbf, 0x9c, 0x63, 0x3a, 0xa4, 0x7b, 0x3b, 0xff, - 0x0e, 0x5f, 0x7b, 0x5f, 0x75, 0xf1, 0x30, 0xa0, 0xa1, 0xe1, 0x1f, 0xd4, - 0xcb, 0xf6, 0x97, 0x9e, 0xd1, 0xcb, 0xff, 0x91, 0x5c, 0xf2, 0x77, 0x3d, - 0x1c, 0x39, 0x7e, 0x79, 0x0a, 0x41, 0xcb, 0xfa, 0x1c, 0x7d, 0x82, 0x72, - 0xa4, 0xa9, 0x17, 0x23, 0x30, 0x45, 0xbe, 0x14, 0x2d, 0x0c, 0x49, 0x6f, - 0xe6, 0x75, 0x36, 0xd1, 0x53, 0x97, 0xff, 0x90, 0x11, 0xa5, 0xc2, 0x73, - 0x88, 0xd9, 0xcb, 0xe6, 0xbe, 0xe4, 0xe7, 0x2f, 0xf4, 0x07, 0x3c, 0x9d, - 0xfc, 0xe5, 0x97, 0x07, 0xb2, 0x12, 0x6b, 0xff, 0x7b, 0xe8, 0x23, 0xec, - 0x02, 0x00, 0x72, 0xff, 0xff, 0xcb, 0x71, 0x04, 0x93, 0x5f, 0xaf, 0xa9, - 0x1e, 0xef, 0xee, 0xb3, 0x97, 0xff, 0xc3, 0xff, 0xa4, 0x80, 0xeb, 0xa7, - 0x9d, 0x67, 0x2e, 0xf8, 0xd6, 0x72, 0xff, 0xfc, 0xe9, 0xe4, 0x0e, 0x07, - 0x3c, 0x8b, 0x4e, 0x1c, 0xbf, 0xfd, 0x0c, 0x0e, 0x7d, 0xf2, 0x72, 0x3f, - 0x69, 0x9c, 0xbd, 0xc7, 0xd6, 0x26, 0x1b, 0xc4, 0xfe, 0x8e, 0x0a, 0x95, - 0xbc, 0xe9, 0xe3, 0xff, 0x1b, 0xd5, 0x6e, 0xa8, 0xe5, 0x25, 0x04, 0xdd, - 0x28, 0x39, 0x7f, 0xfa, 0x70, 0xf6, 0x3b, 0x9b, 0x83, 0x3d, 0xa3, 0x94, - 0xe7, 0xc5, 0xf8, 0xb5, 0x05, 0x5f, 0x1e, 0x18, 0xa4, 0x28, 0x9e, 0x53, - 0x00, 0xc2, 0x3a, 0xfe, 0xe4, 0x4e, 0x83, 0xe3, 0x97, 0x83, 0xf5, 0x67, - 0x2f, 0xc3, 0x01, 0xc9, 0x8e, 0x5f, 0x6b, 0xfe, 0x2a, 0x72, 0xfd, 0x1d, - 0xf4, 0x48, 0xe5, 0xf0, 0x7f, 0xf6, 0xa0, 0xfc, 0xf7, 0x27, 0x01, 0x2d, - 0xf8, 0x18, 0xb8, 0xe9, 0xcb, 0xff, 0xff, 0xd9, 0x3e, 0xa1, 0x57, 0xd7, - 0xa5, 0x8a, 0xab, 0x9b, 0xfb, 0x91, 0x9b, 0x9c, 0xbf, 0x47, 0xce, 0x0c, - 0x8e, 0x56, 0x91, 0x4b, 0xfb, 0xe5, 0xe6, 0x9f, 0x70, 0xe5, 0x05, 0x50, - 0xbe, 0x16, 0xa4, 0x24, 0x85, 0x23, 0xd0, 0xcc, 0xfc, 0x92, 0xf7, 0x3e, - 0xe8, 0xe5, 0x9a, 0x39, 0xcb, 0xf7, 0xbd, 0xec, 0x6c, 0xe5, 0x41, 0xe0, - 0x20, 0xbd, 0xff, 0x9c, 0x59, 0x9c, 0x63, 0xbb, 0x0d, 0x10, 0x8a, 0xe9, - 0x4e, 0x72, 0xa1, 0x1c, 0x00, 0x5f, 0xfc, 0x83, 0x62, 0x4d, 0xfb, 0x27, - 0xd0, 0x1c, 0xe5, 0xff, 0xff, 0xee, 0xe7, 0xfc, 0x57, 0xa9, 0xbc, 0x7b, - 0xfe, 0x8e, 0x6f, 0xef, 0xdf, 0x47, 0x2f, 0xfe, 0xcd, 0xfe, 0xf9, 0x07, - 0xf9, 0x66, 0x8e, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x67, 0x17, - 0x0c, 0x0c, 0xf1, 0xc0, 0xe0, 0xe7, 0xb4, 0x8c, 0xc1, 0xfb, 0x3e, 0x72, - 0x34, 0x2e, 0xae, 0xb1, 0x00, 0x0f, 0xc0, 0x2e, 0x18, 0x19, 0xe3, 0x87, - 0x2a, 0x13, 0x50, 0xc4, 0x7b, 0xff, 0xbc, 0xe3, 0x3e, 0xf2, 0x18, 0xcd, - 0x1c, 0xbf, 0xff, 0x40, 0x26, 0x94, 0x4e, 0x2e, 0xae, 0x86, 0x24, 0x72, - 0xff, 0xdf, 0x73, 0xae, 0xb5, 0x1b, 0x6d, 0xb3, 0x97, 0xff, 0xec, 0x67, - 0x60, 0x42, 0x29, 0x3e, 0x0a, 0x2a, 0x72, 0xcf, 0x3a, 0x26, 0x24, 0x8b, - 0x52, 0x4c, 0x5d, 0xe1, 0xdd, 0x7f, 0xff, 0x4c, 0x30, 0x0d, 0x33, 0xa9, - 0xc9, 0x86, 0x01, 0xa3, 0x97, 0xff, 0x7b, 0xa9, 0xb3, 0xaf, 0x2e, 0x42, - 0xa7, 0x2f, 0xef, 0xfc, 0x9f, 0x8a, 0xa7, 0x2f, 0xec, 0x6f, 0x07, 0xf0, - 0x1c, 0xbf, 0x4b, 0x3d, 0x00, 0x39, 0x74, 0x2e, 0x73, 0xd5, 0xdc, 0xba, - 0xff, 0xff, 0xe0, 0x2d, 0xe5, 0xd7, 0x4f, 0x20, 0x70, 0x39, 0xe4, 0x5a, - 0x70, 0xe5, 0x69, 0x13, 0xdf, 0x97, 0xdf, 0xff, 0x87, 0x35, 0x9d, 0x7d, - 0xa6, 0x75, 0x17, 0x0c, 0x39, 0x7e, 0x9d, 0x70, 0x18, 0x39, 0x52, 0x5d, - 0xda, 0x0c, 0x79, 0xbb, 0x91, 0x4d, 0x1a, 0xdf, 0x0a, 0x3a, 0xb9, 0xa4, - 0x7f, 0x46, 0x47, 0xb0, 0x93, 0xea, 0xb5, 0xfe, 0x8d, 0x6a, 0x27, 0xc6, - 0xce, 0x5f, 0xee, 0xe2, 0xf3, 0xbf, 0x89, 0xca, 0x09, 0xf3, 0xf8, 0xd2, - 0xfb, 0x38, 0xaa, 0x1c, 0xa8, 0x5f, 0x53, 0xc9, 0xe0, 0x27, 0x8c, 0x37, - 0xf2, 0x2b, 0xcd, 0xb6, 0xd9, 0x4b, 0xfe, 0xc0, 0x3f, 0x33, 0x66, 0x04, - 0xa2, 0x86, 0x82, 0xe6, 0xdb, 0x29, 0x79, 0xb6, 0xdb, 0x29, 0x7f, 0x3c, - 0xe1, 0xec, 0x68, 0xa2, 0x86, 0x82, 0x85, 0x18, 0x4d, 0xa5, 0x6d, 0x9c, - 0xdf, 0x98, 0x81, 0xfa, 0xb2, 0x8a, 0x1b, 0x3b, 0xcd, 0xb6, 0xd9, 0x4b, - 0xda, 0x8e, 0x14, 0x50, 0xd0, 0x5f, 0x38, 0xef, 0xe3, 0x96, 0x02, 0x22, - 0xab, 0xcb, 0x6d, 0x96, 0xdf, 0xc1, 0x18, 0x93, 0xb0, 0xe5, 0xfb, 0x5f, - 0xcf, 0xb6, 0x27, 0x2f, 0xc1, 0x4d, 0x90, 0x13, 0x97, 0xd8, 0x38, 0xd6, - 0x72, 0xb8, 0x79, 0x8b, 0x29, 0xa4, 0x44, 0xdf, 0xd7, 0x9b, 0xff, 0xba, - 0xf2, 0x17, 0x56, 0x61, 0x49, 0x8e, 0x5f, 0xfd, 0x9c, 0x9e, 0x37, 0xd2, - 0x0e, 0x00, 0xe5, 0xfd, 0xdc, 0xd9, 0x9e, 0xd1, 0xca, 0x62, 0x2e, 0x00, - 0x8b, 0xe4, 0x4a, 0xe2, 0x7a, 0x7d, 0x86, 0x38, 0xc3, 0x72, 0xe9, 0xfc, - 0x72, 0xa1, 0x52, 0xde, 0x4a, 0x09, 0x13, 0xab, 0xdb, 0xb5, 0x26, 0xa0, - 0xe5, 0xf9, 0x91, 0xd8, 0x59, 0xcb, 0x9f, 0xc7, 0x2f, 0xd8, 0xd6, 0xe2, - 0x0c, 0x37, 0xa2, 0x4f, 0x7f, 0x07, 0x39, 0xb6, 0xb0, 0x9c, 0xbd, 0xd4, - 0x98, 0xa5, 0x70, 0xf3, 0xb4, 0x63, 0x7f, 0xcf, 0xbf, 0xb2, 0x6f, 0xf8, - 0xa9, 0xcb, 0x31, 0x0f, 0x7f, 0xf2, 0x2b, 0xfc, 0x39, 0xbc, 0xb4, 0x8a, - 0x9c, 0xbe, 0x77, 0xe2, 0xa7, 0x2b, 0xe1, 0xeb, 0x4e, 0x69, 0x7f, 0xd9, - 0x8c, 0x04, 0x66, 0xf2, 0x39, 0x7d, 0x0e, 0xbd, 0x85, 0x2f, 0xfe, 0xea, - 0x38, 0x01, 0x00, 0x8e, 0xe8, 0xe5, 0xfd, 0xdc, 0x5a, 0xde, 0x47, 0x2f, - 0x36, 0xdb, 0x65, 0x2f, 0xf0, 0xfb, 0xa9, 0x03, 0x39, 0x45, 0x0d, 0x05, - 0xe8, 0x06, 0x49, 0x12, 0x18, 0x9b, 0x5e, 0x4c, 0x17, 0xec, 0x34, 0xed, - 0x8c, 0x4d, 0x4d, 0x71, 0x94, 0x5f, 0xc0, 0x80, 0x47, 0x74, 0x72, 0xff, - 0x47, 0xde, 0x71, 0x3d, 0xa3, 0x95, 0x0b, 0x81, 0xf2, 0x66, 0xde, 0x1d, - 0x48, 0xfd, 0x31, 0x2f, 0x63, 0x8b, 0x01, 0x78, 0x96, 0xdf, 0x81, 0x89, - 0xd5, 0x4e, 0x5f, 0xff, 0x63, 0x20, 0x5f, 0xda, 0x0f, 0xef, 0xc9, 0x1c, - 0xad, 0xcf, 0xdd, 0x65, 0x17, 0xf4, 0x0b, 0x1a, 0xa6, 0xa6, 0xd5, 0x9c, - 0xbf, 0xff, 0xf8, 0x5d, 0x71, 0xc6, 0x07, 0xb1, 0xaf, 0xdd, 0x25, 0xae, - 0xbc, 0x8e, 0x5e, 0xff, 0xda, 0x39, 0x79, 0x91, 0xa3, 0x97, 0xff, 0x7d, - 0x96, 0x75, 0xfa, 0x9c, 0xe4, 0x1c, 0xac, 0x3e, 0x10, 0x0e, 0x5f, 0xa3, - 0xda, 0xd9, 0x87, 0x2f, 0xdf, 0xf1, 0x5e, 0xa1, 0xca, 0x84, 0xf1, 0x02, - 0x46, 0xe7, 0xa0, 0x71, 0x17, 0xff, 0x10, 0xed, 0x94, 0xdf, 0xe1, 0x76, - 0xf0, 0x5d, 0x53, 0x97, 0xff, 0x67, 0xb5, 0xf7, 0x4b, 0x18, 0xe4, 0x1c, - 0xbd, 0xb3, 0x04, 0x27, 0xee, 0xb3, 0x2b, 0xff, 0x9b, 0x8e, 0x0b, 0xcf, - 0x1c, 0x89, 0x1c, 0xa4, 0x3f, 0x8e, 0x9a, 0x5f, 0xff, 0xf0, 0x7a, 0x8d, - 0xe6, 0xd2, 0x2d, 0xfd, 0xaf, 0xe5, 0x9b, 0xf8, 0xe5, 0x62, 0x23, 0x5c, - 0x86, 0xff, 0xa6, 0x67, 0x51, 0x71, 0xc5, 0x4e, 0x5f, 0xa7, 0xf9, 0xfc, - 0x4c, 0x72, 0xd2, 0x39, 0x7b, 0xe8, 0xcc, 0x72, 0xa4, 0x6c, 0x00, 0x23, - 0x58, 0x8b, 0x97, 0x3b, 0xd2, 0xed, 0x43, 0xe0, 0x3e, 0x4f, 0x2b, 0x72, - 0x52, 0xb9, 0x03, 0x2a, 0xaf, 0x29, 0xa1, 0xea, 0xc2, 0xf9, 0x90, 0xc6, - 0x49, 0x58, 0x13, 0x4b, 0x20, 0xe4, 0xaf, 0xc5, 0xca, 0xd3, 0xec, 0xe1, - 0xfb, 0xca, 0x70, 0x04, 0x68, 0x23, 0x3f, 0x25, 0xa9, 0xc6, 0x6f, 0x4e, - 0x22, 0xff, 0x2a, 0xe5, 0xb8, 0xf8, 0x7e, 0xc3, 0x6a, 0xf6, 0xc8, 0x13, - 0x97, 0xff, 0xd8, 0x2a, 0x79, 0x54, 0xdf, 0x5d, 0xc0, 0x39, 0xca, 0x91, - 0xf7, 0x04, 0x76, 0xe0, 0x41, 0xcb, 0xf3, 0x33, 0xdd, 0x43, 0x96, 0x74, - 0x37, 0xa2, 0x2d, 0x7f, 0xff, 0xd9, 0xd7, 0xfb, 0xac, 0x55, 0xc4, 0x10, - 0x31, 0x37, 0x60, 0xe5, 0xa0, 0xe5, 0xff, 0xfa, 0x39, 0xd8, 0x5e, 0xd7, - 0xf0, 0x31, 0x37, 0x60, 0xe5, 0xf9, 0x39, 0x34, 0x77, 0x88, 0xce, 0x03, - 0x30, 0x88, 0x56, 0xe9, 0xce, 0xad, 0x7f, 0xec, 0x3c, 0xac, 0xd1, 0xce, - 0x5f, 0xf9, 0xc4, 0x1f, 0x03, 0xfb, 0xf2, 0x47, 0x2f, 0x90, 0x67, 0x83, - 0x97, 0xbd, 0xc8, 0x39, 0x7f, 0xc3, 0x0b, 0x41, 0xc5, 0xc1, 0xcb, 0x90, - 0x38, 0x7a, 0x33, 0x0e, 0x53, 0x5a, 0x38, 0x38, 0x82, 0x2e, 0x54, 0xd4, - 0xd3, 0x29, 0xc8, 0x7b, 0xde, 0x81, 0x9c, 0xe5, 0xf2, 0x75, 0x16, 0x72, - 0xdd, 0x43, 0x7b, 0x30, 0xe5, 0xfd, 0x0c, 0x8d, 0x79, 0x0e, 0x5f, 0xf4, - 0x7b, 0xae, 0x07, 0xdf, 0x47, 0x28, 0x27, 0xca, 0x25, 0x97, 0xff, 0xf8, - 0x7f, 0x76, 0x6b, 0xf7, 0x49, 0x40, 0xb3, 0x37, 0xf1, 0xcb, 0xff, 0x70, - 0x1f, 0x3a, 0x8c, 0xff, 0x80, 0x39, 0x7a, 0x6f, 0xf8, 0x72, 0xff, 0xce, - 0x9c, 0xcd, 0xd4, 0x6d, 0xb6, 0xce, 0x54, 0x22, 0x95, 0xd0, 0xf4, 0x3f, - 0x7f, 0xfc, 0x31, 0x2f, 0x9f, 0x7c, 0x83, 0xfc, 0xb3, 0x47, 0x2b, 0x15, - 0x1a, 0x32, 0x11, 0x8b, 0x21, 0xec, 0x60, 0xc0, 0x2e, 0xbc, 0x07, 0x59, - 0xcb, 0xb0, 0x07, 0x2a, 0x0d, 0x96, 0x0e, 0x5e, 0x7c, 0x59, 0xcb, 0x86, - 0x42, 0x6e, 0xb6, 0x87, 0xef, 0xf3, 0x7a, 0x1c, 0x08, 0xb9, 0xcb, 0xed, - 0x31, 0x88, 0x72, 0xa1, 0x10, 0x48, 0x5c, 0xe6, 0x57, 0xee, 0x68, 0x62, - 0x73, 0x97, 0xff, 0xcd, 0xe3, 0x35, 0x9e, 0x9b, 0x15, 0x1c, 0x01, 0xca, - 0xc3, 0xf9, 0x42, 0x8b, 0xf9, 0xfd, 0xd7, 0x10, 0x1c, 0xbf, 0xf3, 0xfb, - 0x26, 0x78, 0x18, 0x98, 0xe5, 0xff, 0xba, 0x99, 0xf7, 0x26, 0x6e, 0x37, - 0x39, 0x64, 0xe2, 0x2a, 0xfa, 0x59, 0xa3, 0xdb, 0x98, 0xc3, 0x46, 0x08, - 0xa9, 0x26, 0x48, 0xc8, 0x65, 0x80, 0xd6, 0xec, 0x13, 0x97, 0xff, 0xbd, - 0x02, 0xcc, 0xf7, 0x53, 0x80, 0x61, 0xcb, 0xf0, 0x53, 0x5d, 0x43, 0x97, - 0xf2, 0x0e, 0x7b, 0xa8, 0x72, 0xd1, 0x87, 0xa5, 0xa2, 0x7a, 0x0a, 0x35, - 0xb0, 0x57, 0xf8, 0x4d, 0xdf, 0xe8, 0x5e, 0xb4, 0xe3, 0x39, 0xcb, 0xfe, - 0x06, 0xa4, 0x9d, 0x74, 0x9c, 0xe5, 0xf6, 0xb0, 0x7c, 0x72, 0xf6, 0xd4, - 0x70, 0xe5, 0x21, 0xfc, 0xb9, 0xcf, 0xe4, 0x37, 0xbc, 0xed, 0x67, 0x2f, - 0xf7, 0xba, 0x8a, 0x01, 0xd0, 0xe5, 0xdf, 0x89, 0xcb, 0xbe, 0xe1, 0xca, - 0x0a, 0x72, 0x1d, 0x35, 0x18, 0x56, 0x78, 0xbb, 0xf1, 0xfd, 0xb3, 0x3f, - 0xa2, 0xf7, 0xe5, 0x40, 0x93, 0x68, 0xe5, 0xf7, 0x51, 0xe4, 0x72, 0xf0, - 0x5e, 0x47, 0x2a, 0x0d, 0xee, 0x10, 0xdb, 0xf8, 0x44, 0x30, 0x19, 0xef, - 0x3f, 0xb4, 0x72, 0xff, 0xe4, 0x60, 0xe2, 0xe2, 0x60, 0xc4, 0xe7, 0x2f, - 0xf9, 0x99, 0xe8, 0xd8, 0x82, 0x03, 0x97, 0xff, 0xf7, 0xf1, 0xed, 0x60, - 0xfc, 0xe4, 0x20, 0x45, 0xe4, 0x72, 0xfc, 0xce, 0xee, 0xed, 0x67, 0x2f, - 0xfe, 0x40, 0x8f, 0xfe, 0xd4, 0x0c, 0x68, 0xe5, 0x31, 0x34, 0x74, 0x44, - 0x13, 0x9f, 0xd6, 0xf6, 0x16, 0x5f, 0xf9, 0xf9, 0x9b, 0x30, 0x3c, 0x16, - 0xce, 0x5f, 0xff, 0xc9, 0xf8, 0xcb, 0x07, 0xc9, 0xb7, 0x9e, 0x17, 0x91, - 0xca, 0x02, 0x26, 0xfc, 0x81, 0x7f, 0xff, 0x0e, 0x6b, 0xff, 0x99, 0xd7, - 0x1c, 0x9a, 0x51, 0xb9, 0xcb, 0xf7, 0x18, 0xee, 0xc3, 0x44, 0x0c, 0xbf, - 0x9e, 0x70, 0x38, 0x84, 0x95, 0x83, 0xd7, 0xb3, 0x5f, 0xe1, 0xf7, 0xed, - 0x9a, 0x5e, 0xeb, 0xcb, 0xe2, 0x60, 0x43, 0x0c, 0xcb, 0xfe, 0xea, 0x60, - 0xe3, 0x03, 0x87, 0x29, 0x69, 0xcb, 0x7a, 0x32, 0x5d, 0x87, 0x77, 0xbd, - 0xfc, 0x1c, 0xbe, 0x07, 0x35, 0xa3, 0x97, 0xf8, 0x1e, 0x49, 0xd7, 0x0c, - 0x39, 0x5b, 0x9f, 0xa3, 0x8e, 0x89, 0x1d, 0xf8, 0x2d, 0x5b, 0x85, 0xab, - 0x39, 0x50, 0xae, 0x2b, 0x25, 0x3e, 0xa4, 0x2b, 0x5c, 0xba, 0xe4, 0x91, - 0xcb, 0xfb, 0x7f, 0x07, 0x31, 0x53, 0x94, 0x13, 0xc5, 0xc1, 0x6b, 0xfb, - 0x3d, 0x02, 0x80, 0x39, 0x7f, 0xc1, 0xe0, 0xbb, 0x7f, 0x77, 0x6c, 0xe5, - 0xe7, 0xe4, 0xe6, 0x8c, 0x15, 0x7f, 0xe7, 0xe6, 0x08, 0x35, 0xed, 0x6e, - 0x72, 0xff, 0xff, 0xfe, 0xcf, 0x75, 0xc5, 0x5f, 0x9a, 0xe3, 0xbf, 0xb6, - 0x60, 0x7e, 0x62, 0xdc, 0x77, 0x91, 0xe2, 0x0b, 0x5f, 0xf9, 0xdd, 0x56, - 0x38, 0x7e, 0x2a, 0xd9, 0xe2, 0x0b, 0x5f, 0xfd, 0xd4, 0xea, 0x40, 0xfb, - 0xe2, 0xad, 0x9e, 0x20, 0xb5, 0xfe, 0x84, 0x1f, 0x7c, 0x55, 0xb3, 0xc4, - 0x16, 0xbf, 0x97, 0x81, 0xf8, 0xab, 0x67, 0x88, 0x2d, 0x7f, 0xff, 0xce, - 0x22, 0x8b, 0xf9, 0xa6, 0x75, 0x38, 0x8a, 0xcf, 0x8d, 0x9e, 0x20, 0xb5, - 0xdb, 0xfc, 0x0a, 0x73, 0x8c, 0x50, 0xe2, 0xa3, 0xa1, 0x89, 0xfd, 0x42, - 0xac, 0xee, 0x9f, 0x8c, 0xa3, 0x7b, 0xfc, 0x90, 0xae, 0xbd, 0xad, 0xce, - 0x5f, 0x3f, 0x00, 0xe7, 0x2f, 0xfe, 0xea, 0x75, 0x20, 0x7d, 0xf1, 0x56, - 0xcf, 0x10, 0x5a, 0xff, 0xa6, 0xd3, 0x12, 0x7f, 0x8a, 0xb6, 0x78, 0x82, - 0xd7, 0xef, 0x6a, 0x17, 0xf1, 0x88, 0xa1, 0xfa, 0xa9, 0x7f, 0xfb, 0xe3, - 0x3a, 0x8c, 0x8f, 0x6b, 0xe2, 0xad, 0x9e, 0x20, 0xb5, 0xff, 0xff, 0xc2, - 0x28, 0xbf, 0x9f, 0xe7, 0xcd, 0x33, 0xa9, 0xc4, 0x56, 0x7c, 0x6c, 0xf1, - 0x05, 0xab, 0x13, 0x27, 0xdd, 0x11, 0xd7, 0xaf, 0xfb, 0xa9, 0xc4, 0x56, - 0x7c, 0x6c, 0xf1, 0x05, 0xaf, 0xff, 0x9d, 0xf7, 0x96, 0xba, 0x81, 0x0c, - 0x72, 0x0a, 0x5f, 0xfb, 0x25, 0x2f, 0xf5, 0xc1, 0x9f, 0x6c, 0xf1, 0x05, - 0xa9, 0x88, 0xe8, 0xe2, 0x46, 0x93, 0xef, 0xfc, 0xc4, 0xe7, 0x9c, 0x1a, - 0xf8, 0xd9, 0xe2, 0x0b, 0x5f, 0xdd, 0x4e, 0xf5, 0x00, 0x68, 0x02, 0xd7, - 0xec, 0x07, 0xc5, 0x5b, 0x3c, 0x41, 0x6b, 0xb3, 0xcc, 0x3f, 0x3e, 0x9d, - 0x56, 0xe8, 0xef, 0xd4, 0x30, 0xaf, 0xe5, 0xe0, 0x7e, 0x2a, 0xd9, 0xe2, - 0x0b, 0x5f, 0xf9, 0x9d, 0x4e, 0x22, 0xb3, 0xe3, 0x67, 0x88, 0x2d, 0x76, - 0x7c, 0x74, 0x46, 0xe8, 0xfe, 0xff, 0x7e, 0x8b, 0x71, 0xde, 0x47, 0x88, - 0x2d, 0x7f, 0xec, 0x4d, 0x98, 0x38, 0x17, 0x91, 0xe2, 0x0b, 0x2c, 0xf0, - 0x68, 0x2b, 0xc1, 0xbc, 0x37, 0x01, 0xa8, 0xc7, 0xd3, 0xa8, 0xc6, 0x3d, - 0x18, 0xff, 0xf0, 0xb6, 0x6d, 0xc2, 0xe0, 0x41, 0xa2, 0x0b, 0x28, 0x88, - 0xcb, 0x9d, 0x87, 0x2d, 0xa6, 0x32, 0x77, 0x41, 0x49, 0x91, 0xf1, 0xb5, - 0xd2, 0xda, 0x39, 0x7a, 0x25, 0xb4, 0x72, 0xa0, 0xdc, 0x88, 0xd5, 0x4e, - 0xcb, 0x02, 0x09, 0x0e, 0xe5, 0x60, 0xa5, 0x0d, 0x8b, 0xe5, 0xff, 0xd9, - 0x21, 0xcf, 0x75, 0x33, 0x7f, 0x1c, 0xbf, 0xd1, 0xd4, 0x6f, 0x79, 0x68, - 0xe5, 0xfa, 0x3d, 0xae, 0xa1, 0xcb, 0xfe, 0xdc, 0x71, 0x17, 0x82, 0x03, - 0x97, 0xfe, 0xd4, 0xd2, 0xfc, 0x33, 0x4b, 0xf0, 0x9c, 0xa9, 0xd1, 0xb1, - 0x23, 0x5c, 0x27, 0xf1, 0xbd, 0xff, 0xd1, 0xbc, 0xbe, 0xaf, 0x5e, 0x8d, - 0xdb, 0x39, 0x7e, 0x96, 0xd6, 0xd7, 0xf3, 0x9c, 0xb7, 0x50, 0xfe, 0xdd, - 0x2a, 0xfd, 0xc8, 0xde, 0x5a, 0x39, 0x52, 0x3c, 0xfe, 0x13, 0x5f, 0xfb, - 0xfd, 0x6d, 0xe7, 0x00, 0xb4, 0xd1, 0xcb, 0xff, 0xb6, 0x6c, 0x8d, 0x3f, - 0x77, 0x96, 0x78, 0xe5, 0x01, 0x11, 0x9f, 0x50, 0xef, 0xf0, 0x3f, 0xf0, - 0xc7, 0xb4, 0x72, 0x80, 0x7b, 0x3a, 0x25, 0xa8, 0x54, 0x61, 0x91, 0x83, - 0xbc, 0x60, 0xf7, 0xf3, 0xca, 0x36, 0x3f, 0x4e, 0x5f, 0xfd, 0x9b, 0xfb, - 0x48, 0x30, 0x07, 0x59, 0xcb, 0xff, 0x34, 0xf0, 0x47, 0x3e, 0xc0, 0x80, - 0xe5, 0x4e, 0x88, 0x4f, 0xd0, 0xef, 0xb7, 0xd4, 0x6e, 0x72, 0xff, 0xd2, - 0xcd, 0xe5, 0xc8, 0xf3, 0xf8, 0xe5, 0xe5, 0xc4, 0x8e, 0x5f, 0xb0, 0x3d, - 0xfd, 0xb3, 0x95, 0xf1, 0x15, 0x33, 0x12, 0x39, 0xf8, 0x8e, 0x5e, 0x0b, - 0xf8, 0xe5, 0x70, 0xf6, 0x9c, 0xfa, 0xf2, 0x6d, 0xe1, 0xcb, 0xcf, 0xc0, - 0x1c, 0xb6, 0xf0, 0x6e, 0xbc, 0x3d, 0x7c, 0xde, 0x75, 0xce, 0x5f, 0x2b, - 0xc4, 0x6c, 0xe5, 0xfa, 0x77, 0xec, 0x35, 0x9c, 0xa6, 0xa0, 0xf3, 0xf0, - 0x92, 0xa1, 0x57, 0x9e, 0x42, 0xc9, 0x23, 0x28, 0x75, 0xb0, 0x13, 0x8b, - 0x8d, 0xff, 0xe1, 0x18, 0x9d, 0x7d, 0x4e, 0x71, 0xe4, 0x72, 0xff, 0x4f, - 0x3c, 0x0e, 0xf9, 0xe3, 0x95, 0x87, 0xfc, 0x89, 0x37, 0xff, 0x70, 0x7f, - 0xdf, 0xc3, 0x93, 0xb8, 0x9c, 0xbc, 0xfc, 0x9c, 0xe5, 0xc0, 0x83, 0x97, - 0xc9, 0x0b, 0xc3, 0x94, 0x72, 0xfe, 0x75, 0x7d, 0x1c, 0x01, 0xca, 0x09, - 0xb9, 0x10, 0xbb, 0xff, 0xfd, 0x08, 0x11, 0x8f, 0xd9, 0xec, 0x60, 0x61, - 0x9f, 0x56, 0x72, 0xe0, 0x41, 0xcb, 0xa1, 0x53, 0x97, 0xfd, 0x9e, 0xd4, - 0x2f, 0xee, 0x4c, 0x72, 0xff, 0x6b, 0x3a, 0x9a, 0xfe, 0x73, 0x97, 0x36, - 0xd9, 0x4b, 0xfe, 0x1c, 0xd8, 0xf2, 0xd2, 0x04, 0xe5, 0x31, 0x3f, 0xd4, - 0x1d, 0xe0, 0xb2, 0xd6, 0x7a, 0x40, 0x06, 0x26, 0x98, 0xb0, 0x8b, 0xe8, - 0xed, 0xb3, 0x5f, 0xa3, 0x37, 0x9b, 0x6d, 0xb2, 0x96, 0x59, 0x45, 0x0d, - 0x05, 0xf4, 0xce, 0xfc, 0x28, 0xa2, 0x38, 0x3e, 0xc2, 0xfa, 0xa7, 0x56, - 0xd6, 0xf2, 0xc8, 0xaf, 0xef, 0x46, 0x77, 0x27, 0x39, 0x76, 0x2c, 0xe5, - 0x6e, 0x78, 0x7a, 0x2d, 0xa8, 0x74, 0xe1, 0xf2, 0x8d, 0x8b, 0x25, 0x4f, - 0xab, 0x1a, 0x26, 0xf1, 0xe5, 0x24, 0xa9, 0xce, 0x43, 0xd5, 0x65, 0x3d, - 0x9c, 0xed, 0x7a, 0x5c, 0x70, 0x16, 0x06, 0x5a, 0x5e, 0xa5, 0x97, 0x7a, - 0x1b, 0xbf, 0xcb, 0x8b, 0xd8, 0xdf, 0x7f, 0x60, 0x00, 0x9c, 0x91, 0xcb, - 0x99, 0x87, 0x28, 0x27, 0x86, 0xe5, 0xb7, 0x63, 0x67, 0x2e, 0x8f, 0x1c, - 0xa9, 0xcd, 0x6b, 0x05, 0xec, 0xb3, 0x95, 0x86, 0xcf, 0xc4, 0x57, 0xfa, - 0x48, 0x38, 0xbf, 0xfa, 0x72, 0xff, 0xd9, 0xed, 0x75, 0x16, 0xf9, 0xc3, - 0x95, 0x07, 0xe0, 0x26, 0x77, 0xec, 0xf9, 0x80, 0xf1, 0xcb, 0xef, 0x9e, - 0x8d, 0x87, 0x2f, 0xb1, 0x79, 0xe3, 0x97, 0xbc, 0xea, 0x9c, 0xbf, 0xff, - 0xf3, 0xcd, 0xfc, 0xbf, 0x67, 0xce, 0xa7, 0xbd, 0x1b, 0xc4, 0xf1, 0xa3, - 0x97, 0xe1, 0x76, 0xb9, 0xe6, 0x39, 0x7d, 0x36, 0xa3, 0xc7, 0x29, 0x88, - 0xc2, 0x99, 0xcf, 0xf2, 0xcb, 0xff, 0xfe, 0x6b, 0x17, 0x7d, 0x91, 0x2e, - 0xc7, 0x27, 0x8f, 0x69, 0xe4, 0x72, 0xf2, 0x6f, 0x31, 0xcb, 0xf6, 0x64, - 0xff, 0xe8, 0xe5, 0xf7, 0x05, 0x00, 0x72, 0xf9, 0x18, 0xfc, 0x39, 0x74, - 0x00, 0xe5, 0xf7, 0xf3, 0xfe, 0xa7, 0x4d, 0xbf, 0xd2, 0x1a, 0x44, 0x4b, - 0xf5, 0x62, 0xe6, 0xb0, 0x1c, 0xbf, 0x3c, 0x6f, 0x8c, 0x39, 0x7f, 0xdd, - 0x7d, 0x75, 0x27, 0x71, 0x39, 0x7c, 0xf3, 0xfd, 0x91, 0xca, 0x69, 0x2e, - 0x5d, 0x44, 0x20, 0x65, 0x09, 0x00, 0x90, 0x61, 0x4e, 0xe4, 0xc8, 0x43, - 0xc8, 0x6f, 0xb9, 0x90, 0x1a, 0xb4, 0x3d, 0xe8, 0x60, 0x7e, 0x44, 0xd8, - 0xd7, 0xd2, 0x7d, 0xa3, 0x8b, 0xf8, 0x7f, 0x0a, 0xde, 0x47, 0x2f, 0x24, - 0xff, 0x9c, 0xbf, 0x40, 0x13, 0x7c, 0x39, 0x72, 0xf6, 0x1c, 0xb0, 0x60, - 0xf0, 0x04, 0x9e, 0xff, 0xf4, 0x86, 0x3e, 0x2c, 0x61, 0x5f, 0x24, 0xe7, - 0x2f, 0xce, 0xbc, 0xea, 0xce, 0x56, 0xe7, 0xe7, 0xe4, 0xcb, 0xde, 0xe4, - 0x1c, 0xbf, 0xda, 0xf6, 0xcc, 0x1c, 0x09, 0xcb, 0xfb, 0x35, 0x92, 0x4e, - 0x1c, 0xbd, 0xd8, 0xd8, 0x72, 0xf6, 0xa5, 0x39, 0xca, 0xc3, 0x79, 0xf4, - 0x7a, 0xa1, 0x51, 0x14, 0x8b, 0xb1, 0x79, 0x21, 0x32, 0xb2, 0x37, 0x1c, - 0x13, 0x4f, 0x34, 0x5e, 0x7f, 0x9f, 0x4e, 0x5e, 0x99, 0x3a, 0x72, 0xfe, - 0x8e, 0x3c, 0xc9, 0xd3, 0x97, 0xed, 0x06, 0x06, 0x77, 0x3c, 0xad, 0x0e, - 0xde, 0x5c, 0x2c, 0xe5, 0x6e, 0x7b, 0x4b, 0x3e, 0xbf, 0xfe, 0x19, 0x7c, - 0xc0, 0xa6, 0xb7, 0xf7, 0xef, 0xa3, 0x97, 0xee, 0xfe, 0x31, 0xb0, 0xe5, - 0xfc, 0x2f, 0xe9, 0x42, 0xa7, 0x2a, 0x0f, 0x5f, 0xe9, 0x55, 0xf6, 0x66, - 0xf2, 0x39, 0x7b, 0x49, 0x31, 0xcb, 0x2a, 0x26, 0xff, 0x44, 0x57, 0xff, - 0x3c, 0xe3, 0x1b, 0xa0, 0x46, 0x27, 0x39, 0x5c, 0x3e, 0xb1, 0x27, 0xbf, - 0x7c, 0xec, 0x72, 0x47, 0x2b, 0xe2, 0xaa, 0x98, 0x86, 0x26, 0x11, 0xb2, - 0x15, 0x4f, 0x0c, 0xd6, 0xc8, 0x6f, 0x2f, 0x50, 0x72, 0xfe, 0x9e, 0x69, - 0x34, 0xb9, 0x39, 0xcb, 0xe5, 0xe3, 0xf4, 0xe5, 0xa7, 0x39, 0x7e, 0xf7, - 0x51, 0x7c, 0x39, 0x52, 0x37, 0x5c, 0x12, 0xbd, 0xd0, 0xa1, 0xcb, 0xf7, - 0x71, 0x25, 0xa3, 0x97, 0xff, 0xdd, 0x8f, 0xaa, 0x78, 0x5c, 0x1a, 0xd4, - 0x00, 0xa5, 0xfb, 0x3c, 0xff, 0xb4, 0xce, 0x5f, 0xb8, 0xc7, 0x76, 0x1e, - 0x20, 0x45, 0xed, 0x46, 0xe7, 0x2c, 0x0c, 0x3d, 0x1d, 0xcd, 0x2f, 0x79, - 0x27, 0x39, 0x7a, 0x77, 0x13, 0x95, 0x24, 0xd5, 0xc2, 0x4f, 0xba, 0x97, - 0x1f, 0x56, 0x51, 0xe1, 0xdb, 0xf8, 0x58, 0xea, 0xf5, 0x0e, 0x5d, 0xb5, - 0x23, 0x97, 0xde, 0x9d, 0xc4, 0xe5, 0xe1, 0x75, 0x4e, 0x5f, 0xe5, 0x72, - 0x7f, 0xfd, 0xb3, 0xc7, 0x2f, 0xf9, 0xe5, 0xc8, 0x9d, 0xf8, 0xc3, 0x97, - 0x95, 0x4f, 0x1c, 0xbd, 0xa7, 0xf1, 0xca, 0x54, 0xdc, 0xee, 0x3b, 0x77, - 0xce, 0x9c, 0xbf, 0x97, 0xe4, 0x0f, 0xf0, 0x72, 0xf2, 0xfc, 0xc3, 0x96, - 0xf4, 0x1e, 0x5e, 0x17, 0x5f, 0xd0, 0xbc, 0x56, 0x34, 0x72, 0xa7, 0x4f, - 0x77, 0x06, 0x98, 0x45, 0xc1, 0xc5, 0x9c, 0xf5, 0xc8, 0x04, 0x62, 0xc9, - 0xe2, 0x6b, 0xb9, 0xf9, 0xcb, 0xfc, 0x2e, 0xde, 0xb5, 0x00, 0x39, 0x7b, - 0x6d, 0xd5, 0x39, 0x7f, 0xd0, 0xb9, 0x64, 0xf9, 0xfb, 0x4c, 0xe5, 0xf3, - 0xf9, 0xa7, 0x39, 0xca, 0xc4, 0x42, 0xa1, 0x03, 0x9f, 0x5e, 0x6e, 0x3e, - 0x9c, 0xbc, 0xdb, 0x6d, 0x9e, 0xaf, 0xa5, 0xe7, 0x10, 0x96, 0xaf, 0xa9, - 0x43, 0x5b, 0x7d, 0x2f, 0xe1, 0x53, 0x96, 0x01, 0xca, 0xc3, 0x6a, 0xe4, - 0x95, 0x09, 0xeb, 0x84, 0x63, 0x90, 0xb8, 0xe9, 0x68, 0x13, 0x3c, 0xdf, - 0x7f, 0xbd, 0xdc, 0x97, 0x53, 0x61, 0xcb, 0xe5, 0xf3, 0xf9, 0xce, 0x5f, - 0xff, 0x0a, 0x2a, 0xa6, 0xbd, 0xdf, 0xde, 0x52, 0x83, 0x95, 0x07, 0xef, - 0x84, 0xb5, 0x3a, 0x65, 0x12, 0x5c, 0x56, 0x15, 0x97, 0xd8, 0x17, 0x91, - 0xcb, 0xf3, 0x88, 0xa2, 0xce, 0x5c, 0x9d, 0x39, 0x78, 0x2f, 0x23, 0x97, - 0xf9, 0x39, 0x88, 0xb8, 0x6b, 0x39, 0x41, 0x3e, 0x6c, 0x16, 0xe8, 0xe5, - 0xf9, 0x16, 0xe3, 0x87, 0x2b, 0xe3, 0x25, 0x61, 0xaa, 0x1c, 0x83, 0x69, - 0x2d, 0x84, 0x87, 0x23, 0x73, 0x55, 0x65, 0x25, 0x05, 0x3c, 0xb7, 0xd0, - 0x1c, 0x09, 0x0f, 0xf0, 0x8b, 0xdb, 0x2e, 0xbf, 0xb3, 0xb8, 0xcf, 0xf0, - 0xe5, 0xf9, 0x3d, 0x1e, 0xd1, 0x4b, 0xe6, 0x47, 0xb4, 0x52, 0xe6, 0xdb, - 0x29, 0x52, 0x3e, 0x2c, 0x27, 0x6c, 0x8a, 0xec, 0x6c, 0xa2, 0x86, 0xbe, - 0xfa, 0x61, 0x76, 0xce, 0x5f, 0xff, 0x7a, 0x19, 0x98, 0x3e, 0xea, 0x40, - 0xce, 0x72, 0x8e, 0x56, 0x1e, 0xc6, 0x93, 0x6a, 0x64, 0xe0, 0x81, 0x0b, - 0xe1, 0x28, 0x6d, 0xee, 0xff, 0xf0, 0xc6, 0xe0, 0xc1, 0x89, 0x73, 0x90, - 0x72, 0xff, 0xde, 0xd6, 0x33, 0xae, 0x3e, 0xd1, 0xcb, 0xc8, 0x20, 0x39, - 0xf0, 0xdf, 0x5a, 0x16, 0x8b, 0x3d, 0x90, 0x86, 0xbf, 0x4b, 0xbf, 0xc7, - 0x0e, 0x5f, 0xfc, 0xeb, 0xe4, 0x6c, 0x4d, 0x83, 0xfe, 0x8e, 0x56, 0xe7, - 0xe3, 0xd2, 0x9b, 0xf6, 0x7e, 0xb8, 0xd1, 0xca, 0x39, 0x76, 0x4d, 0xc3, - 0x67, 0xa2, 0x8b, 0xfe, 0x4f, 0xda, 0x7d, 0x8f, 0xa3, 0x39, 0xcb, 0xfe, - 0x89, 0xe3, 0x7f, 0x0e, 0x4e, 0x72, 0xb1, 0x14, 0xec, 0x2d, 0x44, 0x0b, - 0xf3, 0xac, 0x63, 0x73, 0x95, 0x32, 0x6a, 0x5c, 0x87, 0xef, 0x4b, 0xaf, - 0xb3, 0xb9, 0x39, 0xcb, 0xd2, 0x7e, 0x1c, 0xbf, 0x4b, 0x3d, 0x81, 0x29, - 0x7d, 0x02, 0x30, 0x72, 0xa6, 0x3e, 0x2f, 0x0e, 0x7d, 0x27, 0xbe, 0x06, - 0x97, 0xc3, 0x94, 0xaa, 0x36, 0x52, 0x10, 0x9e, 0x32, 0xbf, 0xe1, 0xce, - 0xe7, 0xce, 0xe4, 0xe7, 0x2f, 0xff, 0xfe, 0x04, 0x0b, 0x1f, 0xcf, 0xb8, - 0x37, 0xf2, 0x2f, 0x5d, 0x8f, 0xa2, 0x72, 0xfe, 0xfd, 0xa6, 0x9c, 0xe6, - 0x1c, 0xbe, 0xf2, 0xb9, 0xd3, 0x97, 0xfe, 0x1c, 0xf7, 0xbf, 0x9f, 0xd8, - 0xc3, 0x97, 0xe0, 0xfe, 0xfc, 0x91, 0xcb, 0x68, 0xe5, 0xc8, 0x03, 0x97, - 0x75, 0x0e, 0x5d, 0xfe, 0xbe, 0x1a, 0xc9, 0x85, 0xa9, 0xcf, 0xb8, 0x07, - 0xb7, 0x02, 0x0e, 0x5c, 0x08, 0x39, 0x7e, 0xfe, 0x58, 0x2a, 0x21, 0xac, - 0x00, 0xb5, 0x42, 0x70, 0xaa, 0x91, 0xa2, 0x00, 0x21, 0x2e, 0x29, 0xb7, - 0xff, 0xd8, 0x2f, 0xbe, 0x95, 0x55, 0xfe, 0x31, 0x60, 0x39, 0x7f, 0xf7, - 0xbb, 0x8b, 0xfb, 0x00, 0xcd, 0xfc, 0x72, 0xff, 0x6e, 0xc4, 0xe7, 0xd8, - 0x09, 0xcb, 0xe0, 0x2d, 0xe5, 0xf1, 0x1a, 0x3a, 0x54, 0xf2, 0x3d, 0xdf, - 0xf8, 0xe5, 0xfc, 0x05, 0xfd, 0xd7, 0xd9, 0xce, 0x5f, 0xda, 0x41, 0x18, - 0xdc, 0xe5, 0xd9, 0xb9, 0xca, 0xdc, 0xfd, 0xfc, 0x69, 0xb6, 0x59, 0x7c, - 0x0e, 0x27, 0x0e, 0x54, 0x26, 0x5b, 0x24, 0x97, 0x84, 0x7b, 0x66, 0x77, - 0xbf, 0xdf, 0xc7, 0x2c, 0xe7, 0x2b, 0x46, 0xbf, 0xc3, 0xf7, 0x63, 0x67, - 0x2f, 0xfa, 0x37, 0xc0, 0x46, 0xcc, 0x9c, 0xe5, 0xfc, 0x39, 0xed, 0x38, - 0x0e, 0x57, 0x0f, 0xf8, 0x02, 0xfa, 0x3b, 0xbf, 0xe8, 0x9f, 0x5c, 0xc6, - 0x44, 0xe7, 0x2f, 0xf6, 0x0c, 0xf8, 0x17, 0xe9, 0xca, 0x98, 0xfb, 0x1b, - 0x3a, 0xbf, 0xb1, 0x78, 0x14, 0x6c, 0xe5, 0xcb, 0x83, 0x94, 0xb3, 0xc3, - 0x72, 0xdb, 0xf8, 0x72, 0x6e, 0xa7, 0x8e, 0x5f, 0x66, 0x77, 0x47, 0x2b, - 0x11, 0xac, 0xec, 0xfe, 0x21, 0xda, 0x2d, 0xbc, 0xdb, 0x6d, 0x94, 0xbf, - 0x62, 0xa3, 0xfe, 0x8a, 0x28, 0x68, 0x2f, 0x94, 0x6d, 0xb6, 0xce, 0x5d, - 0x80, 0x39, 0x58, 0x6f, 0x7c, 0x4f, 0x50, 0x89, 0x7f, 0x3b, 0xdf, 0xff, - 0x24, 0x9f, 0x4b, 0x5b, 0xc9, 0xd5, 0xea, 0x1c, 0xbe, 0x4e, 0x03, 0x47, - 0x2f, 0xfb, 0x5c, 0x8f, 0xfc, 0x29, 0xb0, 0xe5, 0xff, 0x87, 0x34, 0xce, - 0xa3, 0x20, 0x4e, 0x5f, 0xff, 0xe5, 0x5b, 0x7e, 0x2a, 0xa6, 0xb2, 0x43, - 0xfb, 0xeb, 0x04, 0xe5, 0x42, 0x36, 0xf0, 0xed, 0x0f, 0x2f, 0x9b, 0x71, - 0x91, 0xcb, 0xfe, 0xf4, 0x6e, 0x07, 0xef, 0x50, 0xe5, 0xba, 0x72, 0xb0, - 0xf2, 0x98, 0x73, 0x7e, 0x1c, 0xf4, 0x70, 0xe5, 0xe6, 0xdb, 0x6c, 0xa5, - 0xf9, 0xd5, 0xea, 0x78, 0xa2, 0x86, 0x82, 0xa0, 0xff, 0xd1, 0x1a, 0xf6, - 0xc8, 0x59, 0xcb, 0xde, 0x46, 0xce, 0x5e, 0xd3, 0xf0, 0xe5, 0x6e, 0x6e, - 0x7c, 0x3b, 0x7b, 0xb0, 0x13, 0x95, 0x88, 0x95, 0x45, 0x77, 0x22, 0xbf, - 0x60, 0x33, 0x26, 0x39, 0x6d, 0x7c, 0x4e, 0xa7, 0x90, 0xa0, 0xec, 0x2d, - 0x44, 0xb6, 0xef, 0xe4, 0x15, 0x4c, 0x99, 0x28, 0x56, 0xfc, 0xd3, 0xec, - 0x4f, 0xf9, 0xcb, 0xff, 0x93, 0xd1, 0xcc, 0x1f, 0x3b, 0x89, 0xca, 0x99, - 0x70, 0xd3, 0xb0, 0xfd, 0x19, 0x52, 0x3f, 0x9c, 0x6c, 0x2e, 0xbd, 0x1b, - 0x20, 0xe5, 0x62, 0xe7, 0xe2, 0x4e, 0x41, 0x8a, 0xe5, 0xe1, 0x8d, 0x87, - 0x2f, 0xfe, 0xe4, 0x33, 0xa2, 0xfe, 0x18, 0x6c, 0xe5, 0xcd, 0x34, 0x39, - 0x72, 0x74, 0xe5, 0x4e, 0x6c, 0x38, 0x35, 0x50, 0x89, 0x57, 0x73, 0xbe, - 0xf6, 0xbf, 0x6b, 0x39, 0x7f, 0xa0, 0x64, 0x29, 0x1b, 0x9c, 0xa8, 0x6c, - 0xb5, 0xa5, 0x0f, 0x7c, 0x8f, 0xc9, 0x58, 0xc4, 0x18, 0x6b, 0xb9, 0xd2, - 0x3a, 0x72, 0x3b, 0x7e, 0xca, 0x4c, 0x77, 0x10, 0x42, 0x7c, 0x63, 0x71, - 0xd4, 0x3d, 0x7d, 0x3a, 0x3d, 0xb0, 0xe3, 0x6e, 0x16, 0x5f, 0x48, 0x76, - 0x89, 0xef, 0xc9, 0x34, 0x90, 0x4e, 0x5c, 0xd4, 0x21, 0xcb, 0xfe, 0x9b, - 0xdb, 0x5a, 0x89, 0xbf, 0xe1, 0xcb, 0xfc, 0x18, 0x15, 0xc0, 0x60, 0xe5, - 0x41, 0xf8, 0xba, 0x05, 0xff, 0xd8, 0x9d, 0x80, 0xf7, 0xf8, 0xdf, 0x47, - 0x2f, 0x05, 0x50, 0x1c, 0xbf, 0x2f, 0x9c, 0x7f, 0x1c, 0xaf, 0x87, 0x8d, - 0x03, 0xd7, 0xff, 0x4c, 0xec, 0xec, 0x4b, 0xc3, 0x8b, 0x39, 0x7f, 0x73, - 0x04, 0x5e, 0x73, 0x94, 0xc3, 0xf0, 0x44, 0x4b, 0xff, 0xe4, 0x5e, 0xf2, - 0xd7, 0xcc, 0x11, 0xc4, 0x01, 0xcb, 0xc9, 0xdf, 0xce, 0x57, 0xc5, 0x4f, - 0xed, 0x51, 0x3c, 0xa1, 0x19, 0xc2, 0x0e, 0xc2, 0x2d, 0xe1, 0x27, 0xe2, - 0x1d, 0x8a, 0x16, 0x51, 0xa8, 0x8f, 0x1f, 0x79, 0xa1, 0x0c, 0xe6, 0xae, - 0x34, 0x86, 0x93, 0x3b, 0x47, 0x8c, 0x7d, 0xa9, 0xc6, 0x2e, 0xd4, 0x8e, - 0x9a, 0x25, 0x98, 0xac, 0x26, 0x27, 0x9d, 0xd4, 0x95, 0x2c, 0x48, 0x34, - 0xb6, 0x8c, 0xbc, 0x07, 0xd5, 0x65, 0xfa, 0xb2, 0x9c, 0x73, 0xbd, 0x28, - 0x35, 0x29, 0x77, 0x8d, 0x71, 0xc1, 0xcd, 0x4e, 0xb0, 0xe5, 0x61, 0x38, - 0xba, 0x52, 0xef, 0x6b, 0xca, 0xb7, 0xb4, 0x20, 0xa0, 0xa5, 0xff, 0xb4, - 0xe1, 0xe8, 0x35, 0xd1, 0xce, 0xaf, 0x0b, 0xc3, 0xd6, 0xaa, 0xcf, 0xf9, - 0xe2, 0xcd, 0x92, 0xc6, 0x9b, 0x96, 0x39, 0xb7, 0x49, 0xc0, 0xfb, 0x5a, - 0x97, 0x6d, 0x4b, 0xb9, 0xa5, 0x23, 0xcb, 0x82, 0x96, 0x79, 0x0e, 0xb7, - 0xe5, 0x00, 0xbc, 0xf1, 0xcb, 0xfc, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x5c, - 0x6b, 0xfc, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x5d, 0x6b, 0xff, 0x94, 0x79, - 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0x8a, 0xa2, 0x3d, 0x18, 0x89, 0x43, - 0x3c, 0x25, 0x2a, 0xc2, 0x49, 0x85, 0x09, 0x28, 0xe5, 0xae, 0x11, 0xaf, - 0x9e, 0x5e, 0xd0, 0x0e, 0xf4, 0x53, 0xe4, 0x0d, 0xa4, 0x0b, 0xff, 0xca, - 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4b, 0x4b, 0xfe, 0x68, 0xdd, - 0x46, 0xb7, 0x8d, 0xf6, 0x8e, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x23, 0x75, - 0xff, 0xdd, 0x84, 0xe2, 0x34, 0xd9, 0xd8, 0x6c, 0xe5, 0xff, 0x9e, 0x4a, - 0x67, 0x18, 0xee, 0xc3, 0x44, 0xbe, 0xbf, 0xa3, 0xdf, 0x7a, 0xfe, 0x39, - 0x7f, 0xb3, 0xef, 0x15, 0xef, 0xfa, 0x39, 0x7d, 0xff, 0x53, 0x87, 0x2f, - 0x4d, 0xae, 0x1c, 0xb2, 0x8d, 0x49, 0x3b, 0x4c, 0x45, 0x61, 0xa2, 0xd2, - 0x3a, 0x96, 0x25, 0xfb, 0x67, 0x1f, 0x48, 0xef, 0xff, 0x6f, 0x2f, 0x24, - 0xca, 0x05, 0x36, 0x40, 0x4e, 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, - 0xab, 0x5c, 0x9b, 0x47, 0x2f, 0x91, 0x6f, 0xb0, 0xe5, 0x2a, 0x6f, 0x3c, - 0x33, 0x78, 0x76, 0x9b, 0x39, 0x7f, 0x76, 0x36, 0x7e, 0x1c, 0x39, 0x7f, - 0x3f, 0x66, 0x18, 0x09, 0xcb, 0xff, 0xbd, 0xd8, 0xd0, 0xbf, 0xed, 0x34, - 0xe1, 0xcb, 0xd1, 0x2c, 0x39, 0x52, 0x46, 0x00, 0x4c, 0x37, 0x2d, 0x99, - 0x22, 0xff, 0x95, 0xc1, 0xcd, 0xfc, 0xeb, 0x39, 0x7b, 0x6a, 0x3c, 0x72, - 0xff, 0x72, 0x17, 0xf6, 0x05, 0x87, 0x2f, 0x9f, 0xcf, 0xb9, 0xcb, 0x82, - 0x87, 0x2f, 0xec, 0xe3, 0x1d, 0xd8, 0x68, 0x90, 0x15, 0xf0, 0xf3, 0xd4, - 0x16, 0xbf, 0x69, 0xc5, 0xf7, 0x39, 0x77, 0xf0, 0x72, 0xa4, 0x7c, 0x7b, - 0x92, 0xf0, 0x9e, 0xff, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0x97, 0xfb, 0x93, - 0xae, 0x06, 0x5a, 0x39, 0x50, 0x7d, 0x38, 0x6b, 0x7d, 0x93, 0xb8, 0x4e, - 0x5c, 0xd0, 0xe9, 0xcb, 0xff, 0xd9, 0x37, 0x5d, 0x7e, 0xec, 0x7b, 0xf5, - 0x9c, 0xa9, 0xd5, 0xf1, 0x84, 0x8b, 0x21, 0xc0, 0xa9, 0xfb, 0x59, 0xcc, - 0xc3, 0xfd, 0x34, 0x78, 0x6a, 0x0c, 0x26, 0x7c, 0x41, 0xb6, 0x45, 0xf4, - 0x6e, 0xfd, 0x02, 0x39, 0xe3, 0x97, 0xdc, 0xe2, 0x30, 0xe5, 0xf0, 0xe4, - 0xea, 0x6d, 0x9e, 0x3f, 0xd2, 0x5b, 0xfc, 0xa7, 0x5d, 0x79, 0x01, 0x39, - 0x4a, 0x26, 0xef, 0xc8, 0xc1, 0x76, 0xcf, 0xef, 0xf2, 0x99, 0xc6, 0x3b, - 0xb0, 0xd1, 0x64, 0x2f, 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x6b, 0xaf, - 0xff, 0x67, 0xd8, 0x9d, 0x4c, 0x9b, 0xc1, 0x81, 0x39, 0x7f, 0x94, 0xce, - 0x31, 0xdd, 0x86, 0x8b, 0x91, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xbb, 0x17, - 0xfe, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x14, 0x72, 0xca, 0x61, 0xff, - 0xac, 0xd2, 0xf8, 0x62, 0x4b, 0x39, 0x7f, 0xe6, 0x93, 0x41, 0x71, 0xc9, - 0x62, 0x6c, 0x39, 0x69, 0x1c, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x52, 0xab, - 0xfe, 0x67, 0x52, 0x6e, 0xc4, 0xf8, 0x72, 0xff, 0xf7, 0x62, 0x78, 0xea, - 0x6c, 0x70, 0xf5, 0x0e, 0x28, 0x6e, 0xae, 0x92, 0x98, 0x8c, 0xa9, 0x9b, - 0xab, 0x74, 0xc2, 0xde, 0x1b, 0x77, 0xfe, 0x74, 0xf4, 0xbf, 0x0b, 0x88, - 0x0e, 0x59, 0x40, 0xa7, 0xb7, 0xb9, 0x0a, 0xe3, 0x53, 0xe9, 0x4d, 0x4e, - 0xcc, 0xc9, 0x94, 0xa0, 0xcc, 0x84, 0x16, 0xe9, 0xe9, 0x3b, 0xac, 0xb3, - 0xb0, 0x20, 0x0a, 0x06, 0x93, 0x7d, 0x0b, 0xfd, 0x92, 0x80, 0xef, 0xfa, - 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x70, 0xbf, 0xe4, 0x53, 0x38, 0xc7, - 0x76, 0x1a, 0x2b, 0x55, 0x94, 0x74, 0x45, 0xf9, 0x1a, 0xff, 0xf2, 0x8b, - 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0xda, 0xf7, 0xfc, 0x01, 0xcb, - 0xb3, 0x73, 0x97, 0xf8, 0x38, 0xb5, 0xc2, 0x68, 0xe5, 0xed, 0x9f, 0xc8, - 0xe5, 0x31, 0x10, 0xfb, 0x8f, 0x20, 0xbe, 0xc3, 0x2b, 0xdd, 0x0c, 0x8e, - 0x5f, 0xf6, 0x6e, 0x38, 0x00, 0x3c, 0x8e, 0x5c, 0xb6, 0x1c, 0xbf, 0xd8, - 0x9b, 0xe8, 0x38, 0x27, 0x2a, 0x11, 0x03, 0x23, 0x8e, 0x0b, 0xdf, 0x0c, - 0x6f, 0x23, 0x97, 0xff, 0xe7, 0xdc, 0x01, 0xeb, 0xcb, 0x34, 0x3f, 0xbf, - 0xd3, 0x97, 0xc0, 0xce, 0x4c, 0x72, 0x98, 0x89, 0xde, 0x91, 0x01, 0x62, - 0xca, 0x9c, 0xbf, 0x93, 0x82, 0x9e, 0xd1, 0xcb, 0xf7, 0x1c, 0x72, 0x0e, - 0x51, 0xa2, 0x1b, 0x21, 0xf1, 0xf4, 0x49, 0xcb, 0x2e, 0x81, 0x39, 0x7f, - 0x20, 0x87, 0x10, 0x27, 0x2a, 0x0f, 0x02, 0x42, 0xb7, 0xd9, 0x34, 0xb0, - 0xe5, 0xff, 0x9e, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, 0xc0, 0xbc, 0xda, - 0x00, 0xe5, 0xf6, 0x9c, 0x40, 0x72, 0xa6, 0x37, 0xc0, 0x1d, 0xbf, 0xdf, - 0xef, 0xc4, 0x85, 0xe1, 0xcb, 0xf7, 0x52, 0x06, 0x73, 0x97, 0xfd, 0x13, - 0xf8, 0x63, 0xff, 0x68, 0xe5, 0xbd, 0xd4, 0x4a, 0xe8, 0xd3, 0x6c, 0x9e, - 0xfb, 0x76, 0x22, 0xa7, 0x2b, 0x0f, 0x77, 0xc7, 0x37, 0xfb, 0x89, 0xec, - 0x5c, 0x74, 0xe5, 0xfe, 0xd2, 0x75, 0x17, 0x8a, 0x9c, 0xbf, 0xfc, 0xf3, - 0xf5, 0x20, 0x72, 0x64, 0xe2, 0x1c, 0xac, 0x45, 0x6f, 0x8c, 0x9b, 0x33, - 0xb9, 0x98, 0x72, 0xef, 0xc0, 0x52, 0x90, 0xd7, 0x70, 0x5a, 0xff, 0x60, - 0x47, 0x3d, 0xdc, 0x39, 0x73, 0x49, 0x87, 0x8c, 0x29, 0x7f, 0x4f, 0xf7, - 0x6d, 0xc4, 0x07, 0x2f, 0xec, 0xf7, 0xa3, 0x9a, 0x39, 0x7f, 0x38, 0x82, - 0x70, 0x78, 0xe5, 0x42, 0x23, 0x84, 0xcf, 0x6c, 0xb6, 0xca, 0x42, 0xf8, - 0x0c, 0xe7, 0xe1, 0x84, 0xf6, 0x43, 0x31, 0x90, 0x93, 0xde, 0x10, 0x3c, - 0x21, 0x59, 0x13, 0xc2, 0x24, 0x63, 0x14, 0xd4, 0x33, 0xbc, 0xbd, 0xb0, - 0x81, 0xb3, 0x1f, 0xb0, 0xb6, 0xbc, 0xbf, 0xf8, 0x52, 0xff, 0xcf, 0x25, - 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x63, 0x5f, 0x47, 0x23, 0x68, 0xe5, 0x94, - 0x44, 0x46, 0xac, 0x7b, 0xa9, 0x77, 0xd1, 0x3c, 0x70, 0xe5, 0xfb, 0x22, - 0x64, 0x59, 0xca, 0x43, 0xc9, 0xe1, 0x15, 0xfc, 0x15, 0xc6, 0x7b, 0x47, - 0x2f, 0xf7, 0x63, 0x93, 0xfd, 0xfc, 0x07, 0x2e, 0x7d, 0x1c, 0xbe, 0xf9, - 0xec, 0xe9, 0xcb, 0x47, 0x4d, 0xd6, 0x85, 0xaf, 0x40, 0xce, 0x72, 0xff, - 0xff, 0xfa, 0x5a, 0xee, 0x7e, 0xde, 0xbb, 0x8c, 0xcd, 0x7c, 0xcd, 0xe5, - 0xa4, 0x14, 0x39, 0x79, 0xdd, 0x86, 0x8a, 0xc5, 0x7c, 0xff, 0x61, 0x53, - 0x94, 0xc3, 0xcc, 0xe1, 0x45, 0xff, 0xb6, 0xf3, 0xc3, 0x9f, 0xc0, 0xf8, - 0xe5, 0x2a, 0x9b, 0x8b, 0x09, 0xb7, 0x1c, 0xe4, 0x33, 0x7c, 0x45, 0x7f, - 0xf0, 0xf9, 0x5f, 0xe0, 0x71, 0x91, 0xc3, 0x97, 0xfb, 0x93, 0xfb, 0x4f, - 0xbb, 0x0e, 0x54, 0x1f, 0xd3, 0xa2, 0x5f, 0xb6, 0xbd, 0x9b, 0xcc, 0x72, - 0xff, 0xff, 0xff, 0x3f, 0xbd, 0x9d, 0xd3, 0xc9, 0x07, 0xd2, 0xce, 0x66, - 0xb3, 0xaf, 0x38, 0xc4, 0x8e, 0x54, 0x22, 0xe3, 0x45, 0xb7, 0xf7, 0xfb, - 0x6c, 0xea, 0x34, 0xce, 0x5f, 0xd9, 0xad, 0xe5, 0x1d, 0x39, 0x74, 0x6c, - 0x39, 0x5d, 0x3c, 0x61, 0x2e, 0xbf, 0xd3, 0x3e, 0x24, 0xbe, 0xac, 0xe5, - 0x04, 0xf5, 0x90, 0x86, 0xff, 0xa3, 0x79, 0x4d, 0x27, 0xe4, 0xe7, 0x2a, - 0x13, 0x2f, 0xc8, 0x69, 0x21, 0x0d, 0xe8, 0x97, 0x8e, 0x5f, 0xfb, 0x03, - 0xc4, 0xfe, 0x70, 0x6a, 0x47, 0x2f, 0x96, 0xfb, 0xf8, 0xe5, 0xff, 0xd3, - 0xc7, 0xbe, 0x7d, 0x67, 0xdd, 0xaf, 0xba, 0x39, 0x7f, 0xdc, 0x8d, 0x3f, - 0x06, 0x24, 0x72, 0xb8, 0x88, 0x9d, 0x8a, 0x57, 0xa4, 0xf3, 0x9c, 0xbd, - 0xf2, 0x75, 0x9c, 0xb8, 0x3e, 0x39, 0x4d, 0x24, 0xc9, 0x72, 0x15, 0x9b, - 0x92, 0xa0, 0xe8, 0x90, 0x5f, 0xf8, 0x5c, 0x3d, 0x8d, 0x9d, 0x71, 0x39, - 0x7f, 0xff, 0xef, 0xe7, 0xc6, 0x7c, 0x1f, 0xf6, 0xbe, 0x66, 0xf2, 0xcf, - 0xc4, 0x1a, 0x39, 0x7f, 0xfa, 0x7c, 0xdf, 0xda, 0x41, 0x80, 0x3a, 0xce, - 0x5f, 0xed, 0xc7, 0x03, 0xd7, 0x6c, 0xe5, 0x61, 0xff, 0x3a, 0x55, 0x05, - 0x35, 0x41, 0x3e, 0xd4, 0x3d, 0xaf, 0xe9, 0xe6, 0x93, 0x4b, 0x93, 0x9c, - 0xbe, 0x11, 0xcf, 0x1c, 0xbf, 0x23, 0x5f, 0x38, 0x87, 0x29, 0xaa, 0x44, - 0x04, 0x1b, 0x74, 0x82, 0xfe, 0x9f, 0xee, 0xdb, 0x88, 0x0e, 0x5f, 0x35, - 0xc6, 0x84, 0xe5, 0xff, 0xba, 0xeb, 0xf7, 0x63, 0xdf, 0xac, 0xe5, 0x61, - 0xf2, 0x4c, 0x49, 0x7f, 0xf6, 0x62, 0xab, 0x84, 0xe7, 0x11, 0xb3, 0x97, - 0xfc, 0x92, 0x4e, 0xfe, 0xb5, 0xa1, 0xca, 0x84, 0xcd, 0xb2, 0x12, 0xfc, - 0x22, 0xf2, 0x25, 0xee, 0xa2, 0x90, 0xca, 0xe1, 0x9c, 0x86, 0x45, 0xb9, - 0x1f, 0x1b, 0x21, 0x99, 0xc8, 0x6c, 0x76, 0x35, 0x17, 0x33, 0x11, 0xcd, - 0x46, 0xcd, 0xe8, 0xe9, 0xb6, 0xe1, 0x6b, 0xf6, 0x36, 0xab, 0xcd, 0x1b, - 0x6d, 0xaa, 0x39, 0x74, 0x84, 0xe5, 0xfd, 0xce, 0x40, 0x71, 0x67, 0x2f, - 0xa7, 0xe4, 0x4e, 0x72, 0xef, 0xa0, 0x39, 0x7b, 0xa8, 0xb3, 0x96, 0x98, - 0xe5, 0x39, 0xae, 0xfc, 0x72, 0xfc, 0xe3, 0x3f, 0xfa, 0x39, 0x7f, 0xd0, - 0x1e, 0xe0, 0x78, 0xec, 0x39, 0x48, 0x98, 0xd3, 0x96, 0x80, 0x90, 0x51, - 0xf4, 0x43, 0xe2, 0x9b, 0x74, 0xe5, 0xed, 0x7d, 0xd1, 0xcb, 0xed, 0xe7, - 0x85, 0x4e, 0x54, 0xe7, 0xaa, 0x11, 0x1f, 0xc7, 0xee, 0xf4, 0x1c, 0xbf, - 0xdb, 0xf2, 0x12, 0x4f, 0xa3, 0x97, 0xd8, 0x31, 0x23, 0x95, 0x87, 0xa6, - 0xb3, 0x3b, 0xfd, 0x80, 0xd6, 0x79, 0x38, 0x72, 0xfb, 0xff, 0x66, 0x8e, - 0x5f, 0x47, 0x1c, 0x4e, 0x5f, 0xe7, 0xe4, 0x80, 0x9b, 0xe8, 0xe5, 0xf6, - 0xb5, 0x00, 0x39, 0x50, 0x8e, 0xcc, 0x21, 0x43, 0x2e, 0x91, 0xfe, 0x40, - 0xd9, 0xa5, 0xfc, 0x82, 0x39, 0xb1, 0xce, 0x5e, 0x97, 0xdf, 0x1c, 0xbe, - 0x90, 0x3f, 0x91, 0xcb, 0xee, 0x7d, 0x80, 0x1c, 0xa8, 0x3c, 0x84, 0x24, - 0xbf, 0xc9, 0x3b, 0xac, 0x00, 0x83, 0x97, 0x20, 0x4e, 0x5f, 0xf2, 0x33, - 0xb9, 0x30, 0xc0, 0x4e, 0x5f, 0x4b, 0xd9, 0xf4, 0xe5, 0xe6, 0x40, 0x0e, - 0x5e, 0xe4, 0x2c, 0xe5, 0x39, 0xee, 0x7e, 0x48, 0xd8, 0xe5, 0xf4, 0xff, - 0x72, 0x63, 0x97, 0xa3, 0x93, 0x9c, 0xa8, 0x3c, 0x34, 0x26, 0xbd, 0x03, - 0x23, 0x97, 0xde, 0x14, 0xda, 0x39, 0x41, 0x54, 0xc5, 0xb9, 0x64, 0xcc, - 0xfc, 0x20, 0x59, 0x9f, 0x45, 0x86, 0x12, 0x9a, 0x73, 0xf1, 0x07, 0xe3, - 0x77, 0xfb, 0xaf, 0x2d, 0xad, 0xaf, 0xe7, 0x39, 0x77, 0x76, 0xce, 0x5f, - 0xfa, 0x33, 0x5f, 0x21, 0x03, 0xf6, 0x47, 0x2f, 0xe4, 0x6f, 0x53, 0xe3, - 0x67, 0x28, 0x4f, 0xc7, 0xc8, 0x37, 0xe8, 0x0f, 0xb1, 0x87, 0x2f, 0xbb, - 0x02, 0xc3, 0x95, 0x23, 0xe9, 0xd1, 0x0f, 0x89, 0xef, 0x9c, 0x5e, 0x63, - 0x97, 0xe4, 0xf0, 0xe4, 0x8e, 0x5f, 0x43, 0x71, 0x31, 0xcb, 0xbe, 0xac, - 0xe5, 0xfd, 0xe1, 0x70, 0x60, 0x9c, 0xbf, 0x0b, 0x83, 0x04, 0xe5, 0xbf, - 0xf8, 0x7a, 0x1e, 0x2b, 0xa9, 0xd1, 0xfc, 0xa9, 0x0a, 0x13, 0x74, 0x8c, - 0x5a, 0x6f, 0xf4, 0x36, 0x1f, 0xdf, 0x92, 0x39, 0x7f, 0x27, 0x37, 0xd4, - 0x48, 0xe5, 0xb6, 0x1c, 0xae, 0x1f, 0xb7, 0x4d, 0x76, 0x8b, 0xaf, 0x0a, - 0x2a, 0x72, 0xfb, 0x02, 0x9b, 0x0e, 0x5d, 0x0b, 0xc3, 0x7e, 0xe3, 0x97, - 0xfd, 0x8d, 0xbe, 0xfd, 0x8f, 0xa2, 0x72, 0xda, 0x39, 0x48, 0x7e, 0xdc, - 0x2a, 0x73, 0xbb, 0x81, 0x05, 0x2e, 0x6d, 0xb2, 0x94, 0x86, 0xbd, 0xb1, - 0x6b, 0xfc, 0xf2, 0x1c, 0xf7, 0x50, 0xa2, 0x86, 0x86, 0xf3, 0xef, 0xa3, - 0x96, 0xd1, 0xcb, 0xef, 0xbd, 0x7f, 0x1c, 0xa0, 0x9e, 0x96, 0xe3, 0xbe, - 0x11, 0xbd, 0x03, 0x31, 0xcb, 0x86, 0x0e, 0x5a, 0x63, 0x95, 0x31, 0xe1, - 0xf0, 0x71, 0xc5, 0x6f, 0xfe, 0x55, 0x05, 0x9a, 0x85, 0xbe, 0xfe, 0x39, - 0x78, 0x19, 0xb4, 0x72, 0x95, 0x3e, 0x4e, 0x22, 0xdf, 0x2f, 0x5f, 0xac, - 0xe5, 0x95, 0x39, 0x6d, 0xb3, 0x97, 0x71, 0x53, 0x95, 0x07, 0xc4, 0x84, - 0x9f, 0x89, 0x7d, 0x14, 0xbf, 0xfe, 0xee, 0x4b, 0x51, 0xe9, 0x63, 0x5b, - 0x88, 0x0e, 0x5f, 0xfa, 0x49, 0xee, 0xe6, 0xfe, 0xfe, 0x0e, 0x5d, 0x9a, - 0x39, 0x50, 0x7a, 0xd2, 0x40, 0xad, 0x23, 0x23, 0xd0, 0xa7, 0xb0, 0x0e, - 0x5f, 0x92, 0x17, 0x0b, 0x39, 0x6c, 0x39, 0x48, 0x7d, 0xee, 0x51, 0xa1, - 0x1d, 0xb2, 0x6a, 0x85, 0x67, 0x98, 0xe6, 0x90, 0x93, 0xec, 0x21, 0x5e, - 0x37, 0x4b, 0xda, 0x89, 0x8e, 0x5f, 0xd8, 0x1c, 0xd8, 0x9c, 0x39, 0x47, - 0x2c, 0xb3, 0x95, 0xe2, 0xf3, 0x60, 0x5d, 0xf8, 0x09, 0xc4, 0x54, 0xe5, - 0xce, 0xa9, 0xca, 0x99, 0x19, 0x0b, 0x1d, 0xea, 0x50, 0x08, 0x84, 0xa2, - 0xec, 0xe1, 0xcb, 0xbd, 0x07, 0x2f, 0xd1, 0xdc, 0xd8, 0xe7, 0x29, 0x67, - 0xa8, 0xe2, 0xc0, 0x16, 0xbf, 0x93, 0xd9, 0xd7, 0x54, 0xe5, 0xfd, 0xdf, - 0xde, 0x7e, 0xa1, 0xcb, 0xcd, 0xb6, 0xd9, 0x4b, 0xfe, 0x0c, 0x4f, 0xf7, - 0x3a, 0xfb, 0x94, 0x50, 0xd0, 0x5d, 0x93, 0x9c, 0xbd, 0x28, 0x59, 0xca, - 0x0a, 0x33, 0xd8, 0x9e, 0x89, 0xb3, 0x0b, 0xde, 0x85, 0xa1, 0xca, 0xc3, - 0xd8, 0x61, 0xed, 0xf2, 0x73, 0x68, 0x27, 0x2f, 0xdd, 0x8d, 0xdd, 0xac, - 0xe5, 0xff, 0xf4, 0x7b, 0x41, 0xcf, 0x27, 0x7f, 0xcd, 0xfc, 0x72, 0xba, - 0x7f, 0x9e, 0x2b, 0xb7, 0x0e, 0x5f, 0xec, 0xc6, 0x7d, 0xd9, 0xdc, 0x39, - 0x7f, 0xe4, 0x81, 0xf0, 0xe7, 0xa1, 0xb3, 0x97, 0xbd, 0xcf, 0xce, 0x5b, - 0x47, 0x28, 0x4d, 0x7f, 0xe3, 0xd7, 0xff, 0xec, 0x0c, 0x66, 0xff, 0x7c, - 0x83, 0xfc, 0xb3, 0x47, 0x2e, 0x58, 0x0e, 0x5c, 0xe2, 0x72, 0xba, 0x6b, - 0x1c, 0x5e, 0xfc, 0xb4, 0xf0, 0x1c, 0xe5, 0x4e, 0xa9, 0x83, 0x21, 0x42, - 0xd6, 0x45, 0x30, 0x8f, 0x0d, 0x9d, 0xac, 0x48, 0x7d, 0x08, 0x3f, 0xc8, - 0x2f, 0xbb, 0xe4, 0x9c, 0xe5, 0xfe, 0x62, 0x68, 0x73, 0x63, 0x9c, 0xbe, - 0x89, 0xde, 0x47, 0x2f, 0xbd, 0xae, 0xa1, 0xcb, 0xf8, 0x5f, 0xd3, 0xe3, - 0x67, 0x28, 0xe5, 0x09, 0xb9, 0xf1, 0x75, 0x41, 0xfd, 0xe2, 0xdd, 0xfb, - 0x27, 0x1c, 0xdc, 0xe5, 0x62, 0x67, 0x7b, 0x91, 0xf0, 0xcf, 0xb0, 0x9d, - 0x12, 0x0b, 0xc2, 0x8d, 0x67, 0x2f, 0x83, 0xb6, 0xea, 0x9c, 0xa8, 0x3c, - 0x4c, 0x1e, 0xbd, 0xd8, 0x09, 0xcb, 0xb9, 0xa3, 0x94, 0x71, 0x0b, 0x7b, - 0xfd, 0x03, 0x27, 0x5e, 0x04, 0xe5, 0xf7, 0x96, 0xbe, 0x1c, 0xbf, 0xf8, - 0x10, 0x2c, 0x7f, 0x03, 0xe8, 0xc8, 0xe5, 0xe9, 0x27, 0x4e, 0x5f, 0x78, - 0x72, 0x47, 0x2f, 0xd9, 0xfb, 0x4f, 0x4e, 0x72, 0xff, 0xf2, 0x6b, 0xb8, - 0x11, 0xcd, 0x83, 0x9a, 0x39, 0x52, 0x4d, 0x2d, 0x53, 0x1d, 0xc8, 0xe6, - 0x45, 0xe0, 0xe0, 0x90, 0xf8, 0xb2, 0x9a, 0xa6, 0xe5, 0x89, 0xa4, 0x57, - 0x11, 0x98, 0x4f, 0x0a, 0xa9, 0x18, 0x86, 0x35, 0x5c, 0x95, 0x70, 0xac, - 0x25, 0x18, 0x79, 0xbc, 0x3d, 0x12, 0x32, 0xd9, 0xa1, 0x81, 0xc8, 0x73, - 0xad, 0xf7, 0xb2, 0xf4, 0x1e, 0x32, 0x00, 0x42, 0x79, 0xa6, 0x5c, 0x31, - 0xaa, 0x6a, 0x54, 0x0f, 0xa3, 0xc8, 0xd9, 0x09, 0x36, 0xc8, 0x36, 0xcc, - 0xfe, 0xc6, 0xc9, 0x7f, 0xca, 0x79, 0x33, 0x6b, 0x5f, 0xc1, 0xcb, 0xff, - 0xfe, 0xfe, 0x14, 0xf6, 0x93, 0xae, 0x9e, 0xce, 0x01, 0x6f, 0x23, 0x94, - 0xa2, 0xa6, 0xd9, 0xe3, 0xc9, 0x09, 0xed, 0xfb, 0x8c, 0x77, 0x61, 0xa2, - 0xb7, 0x5f, 0xf9, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4e, 0x0b, 0x29, - 0x87, 0xfe, 0xb3, 0x4b, 0x9a, 0x41, 0x39, 0x6e, 0x9c, 0xb6, 0x8e, 0x57, - 0xe6, 0x8b, 0x6c, 0x46, 0xf9, 0x8e, 0xec, 0x34, 0x5a, 0x2b, 0xff, 0xd8, - 0x1e, 0xba, 0xb3, 0x4c, 0x9a, 0xfd, 0x67, 0x2b, 0x87, 0xf9, 0xd2, 0xeb, - 0xe6, 0x38, 0x80, 0xe5, 0xff, 0x4d, 0x8d, 0x7a, 0xe7, 0x1f, 0xc7, 0x2f, - 0xe8, 0x71, 0xfc, 0x38, 0x72, 0xff, 0xe1, 0xcd, 0x9a, 0xce, 0xe0, 0xfd, - 0x09, 0xcb, 0xfd, 0x9c, 0x06, 0x4d, 0xf7, 0x47, 0x2c, 0xa9, 0xcb, 0xfe, - 0xc8, 0x9f, 0x26, 0xe2, 0x68, 0xe5, 0x21, 0xe5, 0xcc, 0x25, 0x7f, 0xfe, - 0x9e, 0x3d, 0x01, 0xe4, 0x75, 0xf4, 0x38, 0x03, 0x97, 0xfe, 0x8d, 0xdd, - 0xaf, 0xa2, 0xed, 0x73, 0x9c, 0xbf, 0xf4, 0x70, 0x18, 0x99, 0xcf, 0x7e, - 0x72, 0xa1, 0x1a, 0xfd, 0x54, 0xd2, 0x2d, 0xb0, 0x29, 0xf7, 0xa2, 0x34, - 0xd0, 0x81, 0xd4, 0x3e, 0x6f, 0xf7, 0x7b, 0xfa, 0xab, 0x8d, 0x1c, 0xbf, - 0xff, 0x26, 0x87, 0x36, 0x3f, 0x87, 0x35, 0xd7, 0x98, 0xe5, 0xfa, 0x3d, - 0xaf, 0xbd, 0x39, 0x58, 0x8b, 0x59, 0x8d, 0x85, 0x56, 0xfb, 0x00, 0xfd, - 0x39, 0x77, 0x74, 0x72, 0xca, 0x34, 0x17, 0x38, 0x9a, 0xb3, 0xdc, 0x85, - 0x0b, 0x08, 0xa6, 0x21, 0x59, 0xef, 0x65, 0x0d, 0xfa, 0x30, 0x2d, 0xb2, - 0xff, 0xa4, 0x37, 0xff, 0xfe, 0xec, 0x01, 0x6f, 0x2f, 0x9e, 0xee, 0x2f, - 0x19, 0x1d, 0x85, 0x9c, 0xbf, 0x92, 0x7f, 0x8e, 0x20, 0x39, 0x7c, 0xc7, - 0x76, 0x1a, 0x2d, 0xa5, 0xff, 0xfd, 0x0f, 0xe8, 0xec, 0x69, 0x12, 0x49, - 0xcc, 0x09, 0xcb, 0xfb, 0xb0, 0xb8, 0x40, 0x9c, 0xa4, 0x4d, 0x36, 0x66, - 0xde, 0x17, 0xe8, 0xbb, 0xca, 0xf7, 0xfe, 0xea, 0x05, 0xe4, 0x1e, 0xa2, - 0xce, 0x5f, 0xf6, 0x63, 0x36, 0xff, 0xea, 0x70, 0xe5, 0xf4, 0x6c, 0xc4, - 0x39, 0x77, 0x80, 0x72, 0xff, 0xa2, 0x51, 0xc9, 0xe3, 0x93, 0x9c, 0xbf, - 0xff, 0x7e, 0x29, 0xb1, 0x3d, 0xd8, 0xf6, 0xa3, 0x64, 0x1c, 0xb9, 0xc2, - 0x72, 0xff, 0xa3, 0x9f, 0x35, 0x1d, 0x74, 0x39, 0x7f, 0xba, 0x8f, 0x2f, - 0x24, 0xe7, 0x2f, 0xc1, 0x8c, 0x14, 0x39, 0x58, 0xa8, 0xdd, 0x89, 0x73, - 0x1f, 0x70, 0xf1, 0x64, 0x42, 0x2f, 0xa3, 0xaf, 0x2c, 0x36, 0x2d, 0xb6, - 0x73, 0xf4, 0xce, 0xfe, 0x55, 0xf8, 0x1f, 0xc4, 0xe5, 0xfc, 0x3b, 0x69, - 0xcc, 0x54, 0xe5, 0xf9, 0x27, 0x5c, 0x30, 0xe5, 0xf9, 0xf7, 0x97, 0xdd, - 0x1c, 0xbf, 0xf2, 0x4d, 0xad, 0x8e, 0x33, 0xfe, 0x13, 0x96, 0x51, 0x54, - 0x7a, 0x89, 0x7f, 0x8c, 0x36, 0x14, 0x7d, 0x2b, 0xa5, 0x13, 0xe9, 0x04, - 0x72, 0x97, 0x2f, 0xa7, 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x17, 0x2a, 0xfe, - 0x70, 0xf6, 0x06, 0x73, 0x96, 0x50, 0x27, 0xf1, 0x82, 0xfd, 0x34, 0xbf, - 0x71, 0x8e, 0xec, 0x34, 0x5d, 0xab, 0xfe, 0x49, 0x49, 0x04, 0x11, 0x23, - 0x97, 0xc9, 0xc7, 0x01, 0xcb, 0x29, 0x88, 0x8c, 0x73, 0x4d, 0x1b, 0xd4, - 0x3b, 0xf3, 0xc9, 0xca, 0x65, 0x3f, 0xc0, 0x18, 0xe3, 0xd5, 0xa5, 0xb0, - 0x25, 0x79, 0x8c, 0xd7, 0x0b, 0x9e, 0xce, 0x85, 0x0c, 0xf1, 0x16, 0xa1, - 0x47, 0xe8, 0x60, 0xdf, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0xa7, 0x5f, - 0x85, 0x4e, 0x6b, 0x47, 0x2e, 0x9d, 0x67, 0x2f, 0xdb, 0xad, 0xdc, 0x4e, - 0x50, 0x4d, 0xff, 0xe3, 0x16, 0xf1, 0xcb, 0xfe, 0x87, 0x9f, 0xe6, 0xfa, - 0x80, 0x9c, 0xa4, 0x3c, 0xd1, 0x11, 0xbe, 0x63, 0xbb, 0x0d, 0x15, 0xca, - 0xff, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x16, 0x72, 0xf3, 0xbc, 0x8e, 0x5f, - 0xc9, 0xac, 0x17, 0x6c, 0xe5, 0x71, 0x16, 0xbd, 0x2e, 0x14, 0x0f, 0x0d, - 0xdf, 0xfe, 0xf4, 0x6b, 0xe7, 0xfa, 0xf4, 0x4d, 0x32, 0x1c, 0xbf, 0x91, - 0x73, 0xff, 0xc9, 0x1c, 0xbf, 0x9d, 0x79, 0x33, 0x80, 0xe5, 0xfe, 0x8e, - 0xfc, 0x5b, 0x56, 0xd0, 0xf1, 0xca, 0xc4, 0x75, 0xf5, 0x3c, 0x4c, 0x36, - 0x16, 0xdf, 0xb9, 0x9e, 0x45, 0x9c, 0xbe, 0x71, 0x80, 0x9c, 0xbf, 0x4d, - 0x0b, 0x8f, 0xa7, 0x2e, 0x92, 0xce, 0x56, 0x1e, 0x08, 0x95, 0x5f, 0xfe, - 0xea, 0x7c, 0xeb, 0xa7, 0xa3, 0x02, 0x87, 0x2f, 0xdc, 0x63, 0xbb, 0x0d, - 0x12, 0x12, 0xff, 0xd8, 0xbc, 0x7e, 0x4f, 0xf3, 0x75, 0x9c, 0xbf, 0xe4, - 0xdf, 0x5e, 0x18, 0x5e, 0x8e, 0x59, 0x49, 0x23, 0xe3, 0x12, 0x7a, 0x68, - 0x04, 0x2b, 0x93, 0xa7, 0x2f, 0xfc, 0xff, 0x66, 0x14, 0xf0, 0xc0, 0x0e, - 0x54, 0x91, 0x31, 0xba, 0x1f, 0x85, 0xaf, 0xfe, 0xea, 0x2f, 0x35, 0xf3, - 0x79, 0x67, 0x8e, 0x5f, 0x4b, 0xbf, 0x74, 0x72, 0xa0, 0xfb, 0x31, 0x1e, - 0xf9, 0xab, 0xec, 0x2c, 0xe5, 0xfd, 0xdd, 0x6b, 0x39, 0x39, 0xcb, 0xa1, - 0xb3, 0x95, 0x87, 0x8c, 0x85, 0xf7, 0x97, 0xb2, 0x47, 0x2f, 0xff, 0x76, - 0x00, 0xb7, 0x96, 0xbd, 0x98, 0xb3, 0x96, 0x52, 0x75, 0xe9, 0x20, 0xb7, - 0xe4, 0x35, 0x52, 0x32, 0x7e, 0x1e, 0xac, 0x9f, 0xac, 0x2f, 0x1d, 0x80, - 0xc2, 0x77, 0x44, 0x1e, 0x6d, 0xfc, 0x83, 0xe8, 0xfd, 0xff, 0xec, 0xdd, - 0x40, 0xfe, 0xfc, 0x97, 0x5b, 0x73, 0x97, 0xff, 0x29, 0xd7, 0xd0, 0xe7, - 0xbd, 0x00, 0x39, 0x7f, 0xf9, 0x45, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, - 0x89, 0xf1, 0x4c, 0x64, 0x7b, 0x22, 0x03, 0x5c, 0xf7, 0xd7, 0x21, 0xa4, - 0xb4, 0xee, 0xa2, 0x5c, 0x9b, 0x9c, 0xbf, 0xfe, 0x94, 0xed, 0x14, 0x35, - 0x73, 0xb3, 0x9f, 0x3e, 0x77, 0x6c, 0xe5, 0x48, 0xff, 0x00, 0x2f, 0x7f, - 0xf8, 0x67, 0xec, 0x27, 0xb4, 0x83, 0xbc, 0x8e, 0x5f, 0xdf, 0xf0, 0x09, - 0xd8, 0x39, 0x7e, 0xce, 0x66, 0x4c, 0x72, 0xca, 0x75, 0x18, 0x2e, 0x45, - 0xa4, 0xaf, 0xa5, 0xd7, 0xee, 0x31, 0xdd, 0x86, 0x8a, 0xc9, 0x7f, 0xe7, - 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x37, 0x2c, 0xa6, 0x1f, 0xfa, 0xcd, - 0x29, 0x88, 0xec, 0x48, 0x62, 0x5f, 0x31, 0xdd, 0x86, 0x89, 0x59, 0x7f, - 0xfd, 0xc9, 0xc6, 0x38, 0xe1, 0x17, 0xe4, 0x6c, 0x39, 0x5c, 0x3f, 0xef, - 0xcb, 0xaf, 0xc3, 0x01, 0x7e, 0x9c, 0xbf, 0xd0, 0x83, 0x12, 0x8d, 0xa3, - 0x97, 0xe5, 0x16, 0xf2, 0x53, 0x0f, 0xf1, 0x08, 0xf4, 0x4d, 0x7f, 0xef, - 0x62, 0x99, 0xc4, 0x9d, 0xd6, 0x72, 0xff, 0xf3, 0x50, 0xd5, 0x34, 0x35, - 0x8f, 0x24, 0xce, 0x61, 0xcb, 0xff, 0x26, 0xbf, 0x58, 0xa6, 0xcf, 0xdc, - 0xe5, 0xfd, 0x02, 0xec, 0x76, 0xb3, 0x95, 0x23, 0xef, 0x5a, 0x0d, 0xc1, - 0xe1, 0xcb, 0xf7, 0x18, 0xee, 0xc3, 0x44, 0xb8, 0xbf, 0xe4, 0x79, 0x78, - 0x61, 0x7a, 0x39, 0x7e, 0x96, 0xda, 0x75, 0xce, 0x5e, 0x8d, 0xb8, 0x39, - 0x79, 0x06, 0x0e, 0x54, 0x8f, 0x88, 0x25, 0x5b, 0x07, 0xaf, 0xff, 0xcf, - 0xe4, 0xfe, 0x42, 0x92, 0x8f, 0x0f, 0xf2, 0x39, 0x7f, 0x4b, 0xb8, 0x38, - 0xc3, 0x97, 0xa5, 0xdf, 0x1c, 0xbb, 0xb0, 0x87, 0x93, 0xd2, 0xcb, 0xff, - 0x85, 0x01, 0xae, 0x42, 0x49, 0xf4, 0x72, 0xb0, 0xfb, 0x90, 0xb2, 0xfe, - 0xe2, 0x2c, 0x5e, 0x47, 0x2f, 0x3c, 0x94, 0x6a, 0x6a, 0xd5, 0x22, 0x18, - 0xb2, 0x22, 0xc1, 0x7e, 0x9a, 0x3c, 0x26, 0x74, 0x63, 0xe8, 0xc3, 0x3f, - 0x20, 0xbf, 0xf7, 0xeb, 0x53, 0x50, 0x3e, 0xce, 0x1c, 0xbf, 0xe0, 0xe2, - 0x91, 0xc4, 0xef, 0xe7, 0x2c, 0xa2, 0x2e, 0x59, 0xae, 0x5c, 0x9e, 0xa1, - 0x4d, 0xfa, 0x05, 0xff, 0xca, 0x3c, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x88, - 0xed, 0x7f, 0xde, 0xee, 0x49, 0x47, 0x1d, 0x1c, 0xbf, 0x9a, 0x43, 0x0c, - 0xc1, 0x39, 0x77, 0xfd, 0x39, 0x7f, 0x34, 0x07, 0x3a, 0xfe, 0x39, 0x7f, - 0xff, 0x7a, 0x48, 0x1e, 0xa6, 0xcf, 0x98, 0x1e, 0x27, 0xec, 0x39, 0x7f, - 0xb1, 0xbd, 0x40, 0xfb, 0x47, 0x2f, 0xe0, 0x0e, 0x6f, 0xec, 0x39, 0x7e, - 0x75, 0x7b, 0x80, 0x39, 0x7f, 0x08, 0x1f, 0x8f, 0xf4, 0xe5, 0x42, 0x20, - 0xf8, 0x5a, 0xe5, 0x17, 0xfe, 0x4e, 0x7c, 0xd0, 0xe2, 0xe1, 0x87, 0x2f, - 0xfd, 0x03, 0xff, 0x91, 0xf6, 0x3c, 0x8e, 0x5f, 0xf8, 0x7f, 0x97, 0xcc, - 0x41, 0x85, 0x9c, 0xbe, 0x63, 0xbb, 0x0d, 0x15, 0x0a, 0xff, 0xb3, 0xb8, - 0x2f, 0xce, 0x21, 0xca, 0x55, 0x32, 0x16, 0x1f, 0xa1, 0xff, 0x0f, 0xf4, - 0x5d, 0x79, 0xad, 0xe0, 0xe5, 0xd2, 0xc3, 0x97, 0xfd, 0x2f, 0x27, 0x1d, - 0x88, 0x27, 0x2f, 0xa4, 0x0d, 0x61, 0xcb, 0xff, 0xce, 0xbc, 0xe0, 0xe2, - 0x6c, 0x4e, 0x39, 0xcb, 0xff, 0xba, 0x39, 0x37, 0xbb, 0x9c, 0x4d, 0x1c, - 0xbf, 0x6e, 0x28, 0xb4, 0x39, 0x7e, 0x86, 0x94, 0xf8, 0xd9, 0xca, 0x84, - 0x70, 0x62, 0x42, 0x22, 0x70, 0x9e, 0xff, 0x47, 0x9f, 0xbf, 0x03, 0x07, - 0x2f, 0xfd, 0x9e, 0xd7, 0x32, 0x6e, 0xa2, 0xa7, 0x2f, 0xfc, 0x38, 0xae, - 0x2d, 0x36, 0xe1, 0x67, 0x2f, 0xfb, 0xe3, 0x8e, 0x6d, 0x7c, 0xef, 0xe7, - 0x29, 0x11, 0x80, 0xe8, 0x1f, 0xa0, 0x5f, 0xe9, 0x47, 0x27, 0x8e, 0x4e, - 0x72, 0xff, 0xda, 0xc1, 0xf6, 0xb2, 0x49, 0xd3, 0x97, 0xf6, 0xb3, 0x60, - 0xc6, 0xe7, 0x2b, 0x47, 0xd9, 0xe3, 0xdb, 0xff, 0xe8, 0x06, 0x0f, 0xc7, - 0xf7, 0xce, 0xe0, 0x1c, 0xe5, 0xc3, 0x39, 0xca, 0x84, 0xca, 0xf2, 0x14, - 0x28, 0x44, 0x2a, 0x37, 0xf6, 0xc7, 0x5f, 0x5b, 0x73, 0x97, 0xff, 0xf9, - 0x23, 0xcf, 0xd5, 0x35, 0xdc, 0x1f, 0x7c, 0x04, 0xb4, 0x72, 0x91, 0x12, - 0x62, 0x61, 0x7b, 0x5f, 0xf0, 0xe5, 0x61, 0xbf, 0x42, 0x1b, 0xee, 0xfb, - 0x27, 0x39, 0x7e, 0xc9, 0xdc, 0x76, 0x1c, 0xbf, 0xff, 0xff, 0xd1, 0x2f, - 0x9e, 0xea, 0x46, 0xbe, 0x67, 0xec, 0x8d, 0x9f, 0x33, 0x9c, 0xcd, 0x9f, - 0xbf, 0x4e, 0x5f, 0x74, 0x5f, 0x68, 0xe5, 0x62, 0x61, 0x22, 0x47, 0xa2, - 0x9f, 0x42, 0x66, 0xff, 0xff, 0xbf, 0x76, 0xb4, 0x9f, 0xae, 0x9e, 0x8e, - 0xa7, 0xb5, 0x81, 0x39, 0x65, 0x1a, 0x0c, 0x9f, 0xf6, 0xac, 0xbd, 0xa4, - 0x31, 0x06, 0x13, 0xb0, 0x06, 0x16, 0xd9, 0x1a, 0x7a, 0xa9, 0x6c, 0x1e, - 0xdc, 0x59, 0x0d, 0xf9, 0x18, 0x12, 0xce, 0xbb, 0x0f, 0x41, 0x8d, 0x6b, - 0x51, 0x88, 0xfa, 0x32, 0x8d, 0xb4, 0x1b, 0xe6, 0x3b, 0xb0, 0xd1, 0x54, - 0x2f, 0xf7, 0x23, 0x66, 0xf2, 0xcf, 0x1c, 0xae, 0x1f, 0x27, 0xe5, 0xd7, - 0xfe, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x13, 0x5a, 0xfa, 0x39, 0x1e, - 0x39, 0x73, 0xf8, 0xe5, 0x04, 0xdb, 0xac, 0x86, 0xca, 0x62, 0x31, 0x96, - 0x46, 0xf0, 0x82, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x55, 0x8b, 0xfe, 0x89, - 0x47, 0x27, 0x8e, 0x4e, 0x72, 0xca, 0x61, 0xf7, 0x09, 0xa5, 0xff, 0x76, - 0x37, 0xf4, 0x75, 0xda, 0xce, 0x5f, 0xfc, 0x0c, 0x15, 0x24, 0x0d, 0x4e, - 0xe2, 0x72, 0x94, 0x44, 0x0c, 0x1e, 0x5f, 0xfc, 0xa3, 0xc9, 0x4c, 0xe3, - 0x1d, 0xd8, 0x68, 0x91, 0x17, 0xee, 0x31, 0xdd, 0x86, 0x8b, 0x49, 0x7f, - 0xe7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x3e, 0xac, 0xa6, 0x1f, 0xfa, - 0xcd, 0x2f, 0xff, 0x28, 0xb7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x42, - 0x2f, 0xfe, 0xc6, 0xd4, 0xf2, 0xaf, 0xa4, 0xf4, 0x1c, 0xbf, 0x7b, 0xf6, - 0x3e, 0x8e, 0x5f, 0x24, 0xf1, 0xc3, 0x94, 0xb3, 0xcb, 0xe9, 0x4d, 0xfb, - 0x8c, 0x77, 0x61, 0xa2, 0x8f, 0x5f, 0xf4, 0x4a, 0x39, 0x3c, 0x72, 0x73, - 0x97, 0xff, 0xff, 0xfb, 0xea, 0x72, 0x68, 0xef, 0x33, 0xaf, 0xf7, 0x58, - 0xab, 0x88, 0x20, 0x62, 0x6e, 0xc1, 0xcb, 0xf3, 0xe9, 0x3d, 0x07, 0x2f, - 0xfa, 0x26, 0x81, 0x89, 0xbb, 0x07, 0x2a, 0x11, 0xde, 0xac, 0x24, 0x44, - 0x9a, 0xff, 0xfe, 0xc0, 0xf6, 0x3e, 0xa9, 0xe1, 0x70, 0x6b, 0x50, 0x02, - 0x97, 0x9e, 0x4a, 0x42, 0xa1, 0x0c, 0x22, 0x13, 0x4f, 0x46, 0x53, 0xb6, - 0x69, 0x7f, 0xf6, 0x75, 0x4f, 0x2a, 0xfa, 0x4f, 0x41, 0xcb, 0x29, 0x3a, - 0xb4, 0xa5, 0xca, 0xa1, 0xf3, 0x25, 0x43, 0x71, 0x15, 0x3c, 0xe7, 0xfc, - 0x94, 0xf1, 0x49, 0x5a, 0x51, 0xc3, 0x25, 0x2f, 0xef, 0x0a, 0x84, 0x85, - 0x44, 0xc4, 0x7d, 0x86, 0x88, 0x0a, 0x3d, 0x2e, 0x8a, 0xff, 0x29, 0x9c, - 0x63, 0xbb, 0x0d, 0x11, 0x12, 0xfe, 0xce, 0x31, 0xdd, 0x86, 0x88, 0xad, - 0x7f, 0xcd, 0x6a, 0x67, 0x18, 0xee, 0xc3, 0x45, 0x70, 0xa5, 0x11, 0x04, - 0xe7, 0x37, 0xff, 0x81, 0x02, 0xc5, 0x1f, 0xc0, 0xfa, 0x32, 0x39, 0x7c, - 0xa4, 0xf3, 0x35, 0x9c, 0xb2, 0x6e, 0x7e, 0xa0, 0x4c, 0xbe, 0xce, 0xbf, - 0x8e, 0x5f, 0xec, 0x4e, 0x00, 0x1f, 0xe8, 0xe5, 0x9a, 0x02, 0x7a, 0xba, - 0x21, 0xbf, 0xff, 0xbd, 0xa4, 0xeb, 0xa4, 0x90, 0x7d, 0xff, 0x79, 0x87, - 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x14, 0xf2, 0xff, 0x2d, 0x03, 0xfb, 0xf2, - 0x47, 0x2e, 0x5a, 0x1c, 0xa8, 0x3c, 0xa6, 0x1a, 0x5f, 0xff, 0xe9, 0x47, - 0xb5, 0xfa, 0xd8, 0x80, 0x8c, 0xea, 0x7e, 0xc3, 0x97, 0xff, 0xf7, 0x39, - 0xff, 0x39, 0x03, 0x8a, 0xa7, 0x7b, 0x9f, 0x4e, 0x5f, 0xfc, 0x92, 0xc1, - 0x04, 0x2d, 0x39, 0x23, 0x97, 0xfa, 0x51, 0xc9, 0xe3, 0x93, 0x9c, 0xbe, - 0xf8, 0x2f, 0x23, 0x97, 0xe7, 0xce, 0xa2, 0xce, 0x56, 0x8f, 0x27, 0x61, - 0x1d, 0x42, 0x28, 0xb1, 0xfa, 0xff, 0xc8, 0x30, 0xb8, 0x90, 0xe2, 0xce, - 0x5f, 0xf4, 0x0b, 0x33, 0x66, 0x7b, 0x47, 0x2f, 0xcf, 0x3c, 0x73, 0xf3, - 0x94, 0xd2, 0x57, 0x0d, 0x05, 0x78, 0xb4, 0xc7, 0xed, 0xc8, 0x51, 0x89, - 0xd7, 0x86, 0x1c, 0x9a, 0x21, 0xd8, 0x77, 0xb6, 0x73, 0x7f, 0xf9, 0xe4, - 0xa0, 0x45, 0xdb, 0xd6, 0xa0, 0x07, 0x2f, 0xff, 0x00, 0x1f, 0xe9, 0x4f, - 0xa2, 0xeb, 0x18, 0x39, 0x7f, 0xf0, 0xe0, 0x1c, 0x40, 0xa2, 0xd1, 0x67, - 0x2b, 0x88, 0x90, 0xf2, 0x6d, 0xff, 0xfe, 0x41, 0x00, 0xe7, 0xbb, 0x8a, - 0x75, 0xfb, 0xd4, 0x98, 0xe5, 0x28, 0xa8, 0x08, 0x30, 0xa4, 0x48, 0x6d, - 0xe8, 0x8e, 0xd8, 0x72, 0xfc, 0x31, 0xfb, 0x4f, 0x47, 0x2f, 0xe5, 0x78, - 0xe1, 0x71, 0x39, 0x41, 0x3e, 0x9c, 0x10, 0x72, 0xcb, 0xff, 0x90, 0x3c, - 0x7d, 0xd4, 0xe7, 0x22, 0x73, 0x94, 0xa1, 0xfa, 0x74, 0xb6, 0xe0, 0xc1, - 0xcb, 0xff, 0xf7, 0x63, 0x99, 0x24, 0x7f, 0x60, 0x53, 0xf6, 0x14, 0xbf, - 0x44, 0x81, 0xfc, 0x8e, 0x5f, 0x31, 0xdd, 0x86, 0x8a, 0xcd, 0x53, 0x1e, - 0xbf, 0x0a, 0x6f, 0xbc, 0x8b, 0xd1, 0xcb, 0xca, 0xe9, 0x53, 0x97, 0xf4, - 0xeb, 0x81, 0x96, 0x8e, 0x5f, 0x7b, 0x5f, 0x74, 0x72, 0xce, 0x72, 0xb0, - 0xda, 0xe8, 0x96, 0xf4, 0x4e, 0x87, 0x2f, 0xde, 0x07, 0xd1, 0x91, 0xcb, - 0xff, 0xe8, 0x5f, 0xb3, 0x07, 0xda, 0xee, 0x01, 0xce, 0x5e, 0xfd, 0xf4, - 0x72, 0xff, 0xb2, 0x49, 0xfb, 0x5b, 0x56, 0x05, 0x9c, 0xb2, 0x1c, 0xbf, - 0xbb, 0x82, 0x2f, 0xe3, 0x9a, 0x2c, 0x2f, 0xd9, 0x34, 0xff, 0x80, 0xe5, - 0xfd, 0xe8, 0xe0, 0x22, 0x63, 0x96, 0x52, 0x15, 0x9e, 0x84, 0x5b, 0x21, - 0x57, 0xb9, 0x1a, 0x11, 0x70, 0x7d, 0x6c, 0x7d, 0x20, 0x71, 0xc0, 0x15, - 0x0a, 0x6e, 0x87, 0x7c, 0xa5, 0xf4, 0xeb, 0x68, 0xae, 0xff, 0xdd, 0x4f, - 0x3f, 0x27, 0x84, 0x09, 0xcb, 0xff, 0x7b, 0xf5, 0xe3, 0x39, 0xbb, 0xb6, - 0x72, 0xff, 0x72, 0x15, 0xc1, 0x45, 0x4e, 0x5f, 0xfe, 0x86, 0xfe, 0xac, - 0x73, 0x7f, 0x46, 0x36, 0x72, 0xfd, 0xe4, 0x1c, 0x59, 0xcb, 0xe9, 0x38, - 0xa9, 0x89, 0x93, 0x6e, 0x7d, 0xc4, 0x2f, 0xa6, 0x7b, 0x49, 0xb7, 0xfe, - 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0x2a, 0xff, 0xfd, 0xee, 0xe0, - 0xa9, 0xe7, 0x7d, 0xf4, 0xaa, 0xae, 0x72, 0xff, 0xcf, 0xe5, 0x21, 0x38, - 0x9e, 0xfc, 0xe5, 0x28, 0x8e, 0x28, 0x4b, 0x75, 0x8b, 0xfb, 0x38, 0xc7, - 0x76, 0x1a, 0x2c, 0x95, 0xff, 0xef, 0x6b, 0xee, 0x94, 0xc9, 0xd0, 0x65, - 0xa3, 0x94, 0xa2, 0x21, 0xf0, 0xe6, 0xfe, 0xea, 0x72, 0x25, 0xa3, 0x97, - 0xf2, 0xfc, 0x9d, 0x75, 0x9c, 0xbf, 0xfc, 0x9e, 0xee, 0x7b, 0x06, 0x3d, - 0x01, 0x39, 0x50, 0x7e, 0x8e, 0x5b, 0x7f, 0xce, 0x9e, 0xff, 0x8f, 0xa5, - 0x18, 0x8c, 0x1e, 0xc2, 0x86, 0xfe, 0xce, 0x31, 0xdd, 0x86, 0x8b, 0x61, - 0x7f, 0xff, 0x34, 0x3b, 0xf0, 0x73, 0x9e, 0xd7, 0x66, 0xf9, 0xf3, 0xbb, - 0x67, 0x2f, 0x73, 0xfe, 0x9c, 0xbb, 0xca, 0x42, 0x22, 0x78, 0xd7, 0x4a, - 0x23, 0xc5, 0x21, 0x85, 0x7b, 0x35, 0x87, 0x2f, 0x98, 0xee, 0xc3, 0x45, - 0xb6, 0xbe, 0xd4, 0xef, 0xc3, 0x95, 0xc3, 0xd1, 0xf1, 0x75, 0xfc, 0x9d, - 0xf2, 0x03, 0xf3, 0x97, 0xfd, 0x12, 0x8e, 0x4f, 0x1c, 0x9c, 0xe5, 0x94, - 0x92, 0x3d, 0xb1, 0xb2, 0x62, 0x21, 0x2e, 0xbf, 0xfd, 0x82, 0x05, 0x16, - 0xe1, 0xcc, 0x15, 0x4e, 0x5e, 0x69, 0x74, 0x27, 0x2f, 0x4f, 0xd4, 0x39, - 0x7f, 0xe6, 0x93, 0x49, 0xa3, 0xfb, 0xb8, 0x30, 0x03, 0x97, 0xf4, 0x0c, - 0x83, 0xfa, 0xce, 0x5f, 0xf6, 0x73, 0x91, 0x27, 0xdd, 0xb3, 0x97, 0xcc, - 0x77, 0x61, 0xa2, 0xf0, 0x5f, 0xf9, 0xfd, 0x1b, 0x39, 0xcc, 0xdf, 0x47, - 0x2b, 0x87, 0xde, 0x25, 0xd7, 0xde, 0xdb, 0xce, 0x9c, 0xbf, 0x2e, 0x06, - 0x4e, 0x72, 0xfe, 0x81, 0xf6, 0xc7, 0x61, 0xcb, 0xfa, 0x51, 0xb2, 0x39, - 0xb9, 0xca, 0x91, 0xef, 0x61, 0x75, 0xfe, 0x8f, 0x3f, 0x7e, 0x06, 0x0e, - 0x5f, 0xfb, 0xea, 0xf7, 0x97, 0xb0, 0x7d, 0xa3, 0x97, 0x62, 0xa7, 0x2a, - 0x0f, 0x67, 0x10, 0xaf, 0x92, 0x7c, 0x59, 0xcb, 0xf6, 0x08, 0x36, 0xa0, - 0xe5, 0xfa, 0x3e, 0xfe, 0xfa, 0x39, 0x7f, 0xf2, 0xe1, 0x9f, 0x30, 0x7f, - 0x96, 0x68, 0xe5, 0xff, 0xff, 0x9d, 0x3c, 0xeb, 0x71, 0x03, 0x3a, 0x9c, - 0x97, 0xd9, 0x60, 0x9c, 0xbf, 0xa3, 0x7d, 0xe4, 0xfb, 0x9c, 0xac, 0x47, - 0x0f, 0x51, 0xbf, 0x6b, 0xbf, 0xfb, 0x3b, 0xd7, 0x92, 0xd2, 0x39, 0x23, - 0x97, 0x40, 0x0e, 0x54, 0x8f, 0x67, 0xc8, 0x74, 0xd0, 0x5c, 0xfa, 0x69, - 0x10, 0xb5, 0x31, 0xd9, 0xd3, 0x02, 0x5d, 0x90, 0xa9, 0xdc, 0x85, 0x09, - 0x66, 0x84, 0x22, 0xc8, 0x7b, 0x08, 0xd7, 0x20, 0x01, 0x10, 0x94, 0xea, - 0x30, 0xbf, 0x42, 0x26, 0xff, 0x6e, 0xa6, 0x01, 0xf9, 0xa3, 0x97, 0xf8, - 0x0a, 0x4d, 0x28, 0x1f, 0x1c, 0xa5, 0x13, 0x6d, 0x88, 0xc0, 0xf8, 0x6b, - 0x79, 0x33, 0x73, 0x97, 0xcc, 0x77, 0x61, 0xa2, 0xf4, 0x5f, 0xf9, 0x3d, - 0xd1, 0x79, 0x01, 0xc0, 0x72, 0xb8, 0x7d, 0x6b, 0x2e, 0xbc, 0xb4, 0xf1, - 0xcb, 0xfe, 0x7f, 0x4a, 0x15, 0xf2, 0x4e, 0x72, 0x96, 0x7a, 0xc2, 0x39, - 0x7e, 0xc5, 0xf5, 0xc2, 0x72, 0x82, 0x9a, 0x3e, 0x42, 0x1f, 0xeb, 0xc6, - 0xd1, 0x0d, 0xff, 0xfe, 0xd9, 0x82, 0xa0, 0x70, 0x3d, 0xc5, 0xad, 0xe5, - 0x82, 0x72, 0xff, 0x29, 0xec, 0x9a, 0x4e, 0x13, 0x94, 0x88, 0x96, 0xeb, - 0x0d, 0x28, 0x8f, 0xfc, 0x86, 0xed, 0x43, 0x79, 0x8f, 0x3c, 0x30, 0xa5, - 0x09, 0x8c, 0x9e, 0x05, 0x64, 0x64, 0xc9, 0x2d, 0x82, 0x69, 0x40, 0x3c, - 0x8d, 0x25, 0x70, 0xb6, 0xec, 0x39, 0x01, 0x1a, 0x40, 0xc6, 0x3d, 0xa4, - 0x3f, 0xe7, 0xac, 0x1b, 0x94, 0xfb, 0x77, 0xfd, 0x39, 0x7f, 0xf7, 0xf1, - 0x30, 0xe6, 0xc7, 0x5a, 0xd0, 0xe5, 0xf6, 0x75, 0xfc, 0x72, 0xff, 0x62, - 0x70, 0x00, 0xff, 0x47, 0x2c, 0xd0, 0x55, 0x13, 0x62, 0x8d, 0xa2, 0x1b, - 0xef, 0x46, 0xf3, 0x9c, 0xbf, 0xef, 0x6b, 0x37, 0x97, 0x7f, 0x54, 0xe5, - 0x21, 0xf0, 0x89, 0x25, 0xf4, 0x6c, 0x89, 0x1c, 0xbf, 0xdf, 0xbf, 0x24, - 0x3f, 0xb9, 0xcb, 0xce, 0xec, 0x34, 0x44, 0x6b, 0xe5, 0x58, 0xfc, 0x39, - 0x4c, 0x3c, 0xb4, 0x28, 0xbf, 0x34, 0xbd, 0xa7, 0x01, 0xca, 0xe1, 0xe6, - 0xac, 0x86, 0xff, 0xfb, 0xbf, 0xeb, 0x58, 0xb1, 0xcd, 0x9f, 0x21, 0xa8, - 0x39, 0x7f, 0xd1, 0x3f, 0x33, 0xde, 0x4f, 0x1c, 0xbc, 0x31, 0xb9, 0xca, - 0x91, 0xea, 0x84, 0xe6, 0xff, 0xb3, 0x99, 0xac, 0x71, 0x9c, 0xe5, 0xec, - 0x0a, 0xce, 0x5f, 0xff, 0xee, 0xba, 0x7a, 0x3a, 0x39, 0xee, 0xa7, 0x71, - 0x1b, 0x39, 0x7f, 0xff, 0xfb, 0xde, 0x45, 0xf1, 0x33, 0x71, 0xff, 0xd1, - 0xdf, 0x9b, 0x13, 0xd3, 0x41, 0xca, 0x84, 0x6d, 0xe2, 0xf5, 0xfe, 0x75, - 0xe7, 0x25, 0x0b, 0x39, 0x74, 0xeb, 0x29, 0x73, 0x6d, 0x94, 0xbf, 0xf2, - 0x8c, 0xea, 0x4d, 0xd8, 0x9d, 0x40, 0x1b, 0x16, 0xc6, 0x2f, 0xb6, 0x47, - 0xa0, 0xe5, 0x48, 0xff, 0x51, 0x6a, 0xfe, 0xc7, 0x5e, 0x6f, 0xe3, 0x97, - 0xfd, 0xfc, 0x77, 0x26, 0x93, 0xce, 0x72, 0xfe, 0x53, 0x49, 0xc7, 0x01, - 0xca, 0xc3, 0xe9, 0x73, 0xbb, 0x35, 0x9c, 0xbf, 0xe8, 0xcd, 0xe1, 0xe4, - 0xf2, 0x39, 0x4d, 0x51, 0xe5, 0x84, 0x52, 0xfc, 0x39, 0xd7, 0xf1, 0xcb, - 0xdf, 0x34, 0xc3, 0x94, 0xd6, 0x78, 0xbd, 0x26, 0xbf, 0xa1, 0x5c, 0x14, - 0x54, 0xe5, 0xfd, 0x9e, 0xda, 0xf6, 0x74, 0xe5, 0x62, 0x20, 0x84, 0x97, - 0x45, 0xb7, 0xff, 0xf3, 0x14, 0xe3, 0x8a, 0x79, 0x4e, 0x47, 0x85, 0xc0, - 0x72, 0x9a, 0xb6, 0x40, 0xbb, 0x4a, 0x16, 0x71, 0x09, 0xb9, 0x10, 0x04, - 0x8f, 0x21, 0x98, 0xc2, 0x2d, 0xe1, 0x5c, 0x84, 0x53, 0x1b, 0xf2, 0x1e, - 0xfd, 0x21, 0x78, 0x70, 0x00, 0x84, 0x61, 0x2d, 0xa6, 0xbf, 0x43, 0xbb, - 0x61, 0x75, 0xdb, 0x5d, 0x39, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0x8b, 0x97, - 0xef, 0x03, 0xe8, 0xc8, 0xa5, 0xfb, 0x5e, 0xec, 0x00, 0xe5, 0xf9, 0xe7, - 0x8e, 0x7e, 0x72, 0xca, 0x4e, 0x8c, 0x9c, 0x1a, 0x73, 0x4f, 0xca, 0xb6, - 0xca, 0x29, 0x45, 0x48, 0x92, 0x8f, 0xc2, 0xff, 0xe5, 0xbc, 0x94, 0xce, - 0x31, 0xdd, 0x86, 0x89, 0x99, 0x7f, 0x34, 0x4d, 0x1d, 0xa1, 0xa8, 0xf1, - 0xcb, 0xdb, 0xc6, 0x8e, 0x5e, 0x62, 0x2c, 0xe5, 0xf3, 0x4b, 0xce, 0x27, - 0x2e, 0xdb, 0x6a, 0x8e, 0x5d, 0x9f, 0x9c, 0xbf, 0xfd, 0xd8, 0x5b, 0xfb, - 0x37, 0x02, 0xfe, 0xf4, 0xe5, 0xf2, 0x4f, 0xf8, 0x9c, 0xbf, 0x64, 0xf8, - 0x09, 0x8e, 0x57, 0xc3, 0xcc, 0xf1, 0x1d, 0xfe, 0xf9, 0x82, 0xfc, 0x06, - 0xd9, 0xcb, 0xff, 0xf2, 0xdf, 0xb9, 0xb8, 0x3a, 0xdb, 0xf6, 0x6e, 0xfe, - 0x72, 0xfe, 0xcd, 0x47, 0xd1, 0x83, 0x94, 0x14, 0x5f, 0x61, 0xbf, 0x56, - 0xae, 0xd6, 0x1c, 0xbb, 0x6b, 0xc7, 0x2c, 0xd3, 0x39, 0x60, 0x41, 0xaf, - 0xfc, 0x6a, 0xff, 0xff, 0xc8, 0x30, 0xc1, 0x85, 0xfc, 0x8e, 0x71, 0x36, - 0x71, 0xdc, 0x07, 0x29, 0xaa, 0x55, 0x70, 0xc1, 0xf4, 0x17, 0x9a, 0x13, - 0x3d, 0x87, 0x13, 0x97, 0x81, 0x17, 0xc4, 0xf7, 0xf3, 0x70, 0x23, 0x9e, - 0x39, 0x7c, 0xfd, 0x49, 0x8e, 0x5f, 0x76, 0x68, 0x09, 0xca, 0xc3, 0xf1, - 0x61, 0x63, 0x91, 0x5f, 0xe6, 0x26, 0x08, 0x7b, 0x07, 0x28, 0xe5, 0xf3, - 0xfa, 0x40, 0x39, 0x7f, 0xda, 0x46, 0x3e, 0x73, 0x3c, 0x72, 0xff, 0x3f, - 0x12, 0x1a, 0xd1, 0x67, 0x2b, 0xa8, 0x8d, 0xf1, 0x16, 0xc3, 0x7b, 0xff, - 0xdf, 0x3a, 0xe9, 0xe0, 0x7e, 0x22, 0xf2, 0x39, 0x79, 0xa9, 0xb5, 0x4d, - 0x03, 0x95, 0x89, 0xb9, 0x30, 0xc5, 0x21, 0x30, 0xb3, 0x21, 0x4b, 0xbf, - 0xff, 0xff, 0xff, 0xfc, 0xd4, 0xda, 0x18, 0xd4, 0xda, 0x4d, 0x1d, 0xa3, - 0xb1, 0xa7, 0x0d, 0x19, 0xa5, 0xc9, 0xf6, 0xb3, 0xf0, 0xb5, 0x28, 0xdb, - 0xdf, 0xef, 0x5a, 0x51, 0x0d, 0x26, 0xb6, 0x8b, 0xdf, 0x3e, 0x77, 0x6c, - 0xe5, 0xff, 0xf8, 0x1b, 0xcb, 0xbf, 0xc7, 0x14, 0xea, 0x31, 0xf8, 0x72, - 0xff, 0xed, 0xdb, 0x8f, 0x05, 0x1a, 0xf5, 0x0b, 0x39, 0x7c, 0x83, 0xed, - 0x1c, 0xbf, 0xff, 0xe5, 0xa7, 0x3b, 0xfe, 0xa5, 0x1b, 0x39, 0x03, 0xee, - 0xe4, 0x8e, 0x54, 0x91, 0x14, 0x84, 0x37, 0xfe, 0x4f, 0x23, 0x10, 0x3e, - 0xc6, 0x1c, 0xac, 0x4c, 0xcb, 0xd0, 0xd3, 0xda, 0x22, 0xbe, 0xf6, 0xde, - 0x74, 0xe5, 0xff, 0xfe, 0x71, 0x60, 0xe0, 0x7b, 0xff, 0xce, 0xc4, 0xb9, - 0x13, 0x9c, 0xac, 0x44, 0x47, 0xe4, 0xb7, 0xff, 0xf9, 0xd5, 0x1c, 0x07, - 0xfa, 0xf9, 0x24, 0xec, 0x30, 0x5c, 0xe5, 0xf7, 0x93, 0xa8, 0x72, 0xff, - 0x9f, 0x92, 0xf9, 0x8c, 0x0e, 0x1c, 0xa6, 0x92, 0xe2, 0xc4, 0x46, 0x5b, - 0x91, 0xc5, 0xf6, 0x18, 0x0e, 0x46, 0x2c, 0x5f, 0x90, 0xdb, 0x87, 0x2f, - 0xef, 0x62, 0xf7, 0xc5, 0x9c, 0xb7, 0x70, 0xdf, 0xa0, 0x8d, 0xfe, 0xfc, - 0x2f, 0x2d, 0x24, 0x8e, 0x5f, 0x99, 0xf8, 0xfb, 0x47, 0x2f, 0xfc, 0x30, - 0xc5, 0x5f, 0x38, 0x80, 0x39, 0x7f, 0x6b, 0x13, 0x9c, 0x73, 0x95, 0x39, - 0xf4, 0x80, 0xf6, 0xff, 0xf9, 0x06, 0x7c, 0xd2, 0x3f, 0x54, 0x6d, 0xb6, - 0xca, 0x54, 0x1f, 0xb0, 0x48, 0xef, 0xed, 0xf3, 0xbf, 0xee, 0x03, 0x97, - 0xee, 0xc4, 0xfd, 0xfc, 0xe5, 0x61, 0xed, 0xf8, 0xc6, 0xff, 0x87, 0x21, - 0x57, 0xf3, 0xaa, 0x72, 0xfe, 0xde, 0x5a, 0x07, 0xf3, 0x1c, 0xbf, 0xe9, - 0xf0, 0x01, 0xfd, 0xf9, 0x23, 0x97, 0xf3, 0xb8, 0x76, 0x60, 0x4e, 0x5e, - 0x77, 0x61, 0xa2, 0xcf, 0x5f, 0xc0, 0x71, 0x92, 0x2c, 0xe5, 0x4e, 0x8b, - 0xd0, 0x9d, 0xb0, 0xb8, 0x05, 0x17, 0xfb, 0xbe, 0xd3, 0xef, 0xf5, 0x67, - 0x2f, 0xfb, 0xb1, 0x24, 0xf4, 0x7b, 0x47, 0x2a, 0x0f, 0xbd, 0x0d, 0xef, - 0xff, 0x73, 0xaf, 0xf3, 0x36, 0x0e, 0x6b, 0x04, 0xe5, 0xff, 0x42, 0x07, - 0x16, 0xde, 0x74, 0xe5, 0xff, 0xda, 0xf2, 0x4c, 0xdb, 0x86, 0x37, 0xd1, - 0xca, 0x44, 0x65, 0x3a, 0x5f, 0xe7, 0x17, 0x9b, 0x6d, 0xb2, 0x97, 0xfe, - 0x79, 0x68, 0x71, 0x81, 0xce, 0x14, 0x50, 0xd0, 0x5f, 0xb6, 0xbf, 0x5e, - 0x04, 0xe5, 0xfe, 0xf7, 0x73, 0x67, 0xc9, 0x2c, 0xe5, 0x61, 0xf2, 0x7e, - 0x59, 0x7f, 0xed, 0xe4, 0x3f, 0x83, 0xe3, 0x16, 0x03, 0x97, 0x42, 0xa7, - 0x2f, 0xf8, 0x30, 0x30, 0x09, 0x75, 0x0e, 0x54, 0x22, 0x4a, 0x74, 0x44, - 0x17, 0xbf, 0xdd, 0x40, 0x8b, 0xbc, 0xc7, 0x2f, 0xf0, 0x7b, 0xfb, 0x83, - 0x6f, 0x0e, 0x54, 0x1f, 0x4a, 0x19, 0x5f, 0xe8, 0xf9, 0xec, 0xd6, 0xa0, - 0xe5, 0xfc, 0x1f, 0xa1, 0xff, 0xda, 0x39, 0x64, 0xe1, 0xf3, 0x09, 0xa5, - 0xe8, 0x15, 0x4e, 0x54, 0x97, 0xf4, 0x42, 0x4b, 0x86, 0x8c, 0x8c, 0x23, - 0x77, 0xc4, 0x21, 0x98, 0xe3, 0x90, 0xef, 0x5c, 0x2b, 0x7b, 0x0e, 0xa0, - 0x27, 0x8c, 0x2c, 0xb5, 0x0b, 0x4f, 0x42, 0x63, 0x64, 0x21, 0xbe, 0x93, - 0x5c, 0x0d, 0x1c, 0xbf, 0xef, 0xfd, 0xa1, 0xc9, 0xa1, 0x67, 0x2f, 0x80, - 0xed, 0xf8, 0xe5, 0xfe, 0x76, 0xfa, 0x91, 0xc8, 0x39, 0x41, 0x45, 0x32, - 0xa2, 0xe8, 0x75, 0xc2, 0x3b, 0xff, 0x71, 0x35, 0x2f, 0xbd, 0x81, 0x83, - 0x97, 0xdc, 0x48, 0x59, 0xcb, 0xff, 0xf7, 0x95, 0xfe, 0x30, 0x3d, 0xcd, - 0x6f, 0x28, 0xe9, 0xca, 0xe2, 0x2e, 0x16, 0x7e, 0x24, 0x37, 0x3c, 0x8e, - 0x5f, 0xff, 0xff, 0xc2, 0xed, 0xfb, 0x3a, 0x39, 0xef, 0xc0, 0xb7, 0x93, - 0x86, 0x05, 0xf8, 0xf2, 0x39, 0x7f, 0xb3, 0xbd, 0xff, 0xce, 0x27, 0x2f, - 0xf9, 0x99, 0xd6, 0x3f, 0x1e, 0x47, 0x2f, 0x24, 0xda, 0x39, 0x50, 0x7a, - 0xab, 0x38, 0xb2, 0x05, 0x34, 0x59, 0x85, 0xb9, 0x08, 0x65, 0xc2, 0x22, - 0xfe, 0xf8, 0x9d, 0x75, 0xa1, 0xcb, 0xdb, 0x30, 0x27, 0x2d, 0xc9, 0xcf, - 0x32, 0x62, 0xeb, 0xff, 0x63, 0x7b, 0x5c, 0xcd, 0xa1, 0xfd, 0xb3, 0x95, - 0x0a, 0x9f, 0xfb, 0x1b, 0xa3, 0xc2, 0x68, 0x4a, 0xaf, 0xff, 0xff, 0x81, - 0xac, 0xc1, 0x57, 0xef, 0x06, 0x33, 0xaa, 0x68, 0x72, 0x75, 0xe2, 0xce, - 0x5f, 0xbe, 0xc0, 0xfd, 0x59, 0xca, 0xc4, 0x55, 0x79, 0xfe, 0xfd, 0xb1, - 0xfb, 0x1f, 0x4e, 0x5f, 0xff, 0x7f, 0xbc, 0xb4, 0x1e, 0xc7, 0x02, 0xee, - 0xd9, 0xca, 0xc4, 0x50, 0x21, 0x10, 0x95, 0xde, 0xd4, 0x4e, 0x72, 0xff, - 0xa3, 0x19, 0xd4, 0xd8, 0xfc, 0x39, 0x76, 0x74, 0xe5, 0x09, 0xe7, 0xed, - 0x9c, 0xd4, 0x91, 0x7b, 0xa2, 0xdf, 0x36, 0x5e, 0xef, 0xed, 0x9c, 0xbc, - 0x0f, 0xd8, 0x72, 0xf7, 0xb3, 0xe9, 0xcb, 0xfa, 0x37, 0xd7, 0xce, 0x41, - 0xcb, 0xc1, 0xfd, 0x87, 0x2f, 0x82, 0x31, 0x23, 0x94, 0x86, 0xfd, 0xc7, - 0xa8, 0x28, 0xe9, 0xdc, 0x7d, 0x07, 0x96, 0x3d, 0xd6, 0xfb, 0xfc, 0x93, - 0x38, 0xa6, 0xfa, 0x39, 0x76, 0x30, 0xe5, 0xfd, 0xc4, 0xd9, 0x83, 0xa3, - 0x97, 0xf6, 0xfe, 0xce, 0xfe, 0xd6, 0x72, 0xfe, 0xe6, 0x77, 0xbf, 0xf8, - 0xe5, 0xfb, 0xa3, 0x19, 0xc3, 0x17, 0xf6, 0x72, 0x7f, 0xdc, 0x26, 0x88, - 0x34, 0xa1, 0xa6, 0xb7, 0x27, 0x45, 0x14, 0x95, 0x6f, 0x87, 0xb9, 0xb9, - 0xca, 0x84, 0xc8, 0x52, 0x1a, 0xae, 0x55, 0x7e, 0x76, 0x22, 0xe0, 0xe5, - 0xfd, 0x2e, 0x8b, 0xef, 0xe3, 0x94, 0xc3, 0xd4, 0x12, 0x6b, 0xef, 0xa2, - 0xf3, 0x9c, 0xac, 0x3c, 0x5d, 0x10, 0xdf, 0xa3, 0xdf, 0x16, 0xd9, 0xcb, - 0xfd, 0x24, 0x5c, 0x77, 0xe8, 0x4e, 0x5f, 0xfe, 0x8c, 0x1d, 0xfd, 0x9c, - 0x49, 0xdd, 0x67, 0x2f, 0xce, 0xdf, 0xb3, 0xba, 0x3f, 0xef, 0x1a, 0xd7, - 0xc5, 0x6d, 0xad, 0x59, 0x9c, 0x0b, 0x4a, 0x34, 0xfc, 0x86, 0x67, 0x08, - 0x46, 0x15, 0x37, 0xb5, 0x92, 0x39, 0x7e, 0x40, 0x76, 0x02, 0x72, 0xfc, - 0x9b, 0xc9, 0x04, 0xe5, 0xe4, 0xee, 0x1c, 0xba, 0x17, 0x87, 0x84, 0xc2, - 0x7b, 0xf9, 0xbc, 0x5c, 0x71, 0x53, 0x97, 0xc1, 0xd7, 0x60, 0xe5, 0xf8, - 0x78, 0xdb, 0xce, 0x72, 0xa0, 0xfe, 0xb0, 0xbd, 0xc8, 0xae, 0xfc, 0x4e, - 0x54, 0x26, 0xdd, 0x83, 0x88, 0xd3, 0xc8, 0x53, 0x68, 0xb2, 0xf7, 0x70, - 0x4e, 0x5e, 0x7f, 0x41, 0xcb, 0xfd, 0x34, 0x4e, 0xb7, 0x9a, 0x0e, 0x5f, - 0xff, 0x3a, 0xbe, 0x8e, 0x03, 0x91, 0xe1, 0x70, 0x1c, 0xbf, 0x87, 0x01, - 0x83, 0x23, 0x97, 0xff, 0xca, 0xfc, 0xfa, 0x2f, 0xed, 0x26, 0xfd, 0x46, - 0xce, 0x58, 0x71, 0x10, 0x2e, 0x57, 0x58, 0x9b, 0x0f, 0x06, 0xdc, 0x6c, - 0x4d, 0x7f, 0x86, 0x85, 0xda, 0xd8, 0x72, 0xf9, 0x05, 0xc2, 0x72, 0xff, - 0xcb, 0xcf, 0x6b, 0xee, 0x9e, 0x58, 0x72, 0xfd, 0xa8, 0xe7, 0xa0, 0xe2, - 0x87, 0x81, 0x41, 0x44, 0xce, 0x98, 0x2f, 0xdf, 0x66, 0x77, 0xe1, 0xcb, - 0xee, 0xe2, 0x6c, 0x39, 0x7f, 0x69, 0x39, 0x9f, 0xf0, 0xe5, 0xff, 0xfe, - 0x89, 0xbe, 0x23, 0x3f, 0xe6, 0xbf, 0xf8, 0xb4, 0xf7, 0x50, 0xe5, 0x62, - 0x77, 0x09, 0x0b, 0x25, 0x91, 0xf4, 0xab, 0xc4, 0x7b, 0x45, 0xd7, 0x2d, - 0xa0, 0x68, 0xbf, 0x17, 0xda, 0xe6, 0x61, 0xcb, 0xff, 0xa5, 0xef, 0xe5, - 0x25, 0xfb, 0xd0, 0xb3, 0x97, 0xfb, 0xda, 0x89, 0xf3, 0x41, 0x39, 0x77, - 0x70, 0xe5, 0xff, 0xf7, 0x60, 0x38, 0xcf, 0x98, 0x38, 0x1e, 0xc1, 0xcb, - 0xff, 0x93, 0x07, 0x33, 0x5f, 0x25, 0xa5, 0x9c, 0xbf, 0xf3, 0xc6, 0xf2, - 0xf9, 0xad, 0xc3, 0x07, 0x28, 0x29, 0xc3, 0xee, 0x42, 0x88, 0xed, 0x66, - 0x93, 0x0b, 0x69, 0x3f, 0xc8, 0x97, 0x95, 0x8e, 0x1c, 0xbf, 0x83, 0x00, - 0xe6, 0x6e, 0x72, 0x94, 0x3c, 0xb5, 0x8e, 0xdf, 0xe8, 0x5e, 0x27, 0x26, - 0x91, 0xcb, 0x92, 0x63, 0x97, 0xfb, 0x90, 0xa8, 0x46, 0x37, 0x39, 0x7f, - 0xfb, 0xd1, 0xd1, 0x79, 0xe3, 0x9c, 0x79, 0x1c, 0xbd, 0xe4, 0x9c, 0xe5, - 0xf8, 0x0f, 0xbc, 0x4c, 0x72, 0xf0, 0xc3, 0x0e, 0x5f, 0xfc, 0x14, 0x9b, - 0xb1, 0xcd, 0xe5, 0x1c, 0x39, 0x7f, 0xf9, 0x05, 0xf7, 0xd6, 0xb3, 0x81, - 0xee, 0x1c, 0xaf, 0x89, 0xc2, 0x48, 0x5d, 0x0d, 0x16, 0x92, 0xe3, 0xa2, - 0x53, 0xa1, 0xbd, 0xa4, 0x6b, 0x41, 0xcb, 0xdd, 0x4f, 0x1c, 0xb6, 0xcc, - 0x35, 0x9f, 0x44, 0x2a, 0x17, 0x59, 0x42, 0xbd, 0x91, 0xd7, 0xa4, 0x2d, - 0x3a, 0x46, 0xf1, 0xdb, 0x82, 0x14, 0x17, 0x96, 0xff, 0x4e, 0x5f, 0xf6, - 0x0c, 0x87, 0x17, 0x0c, 0x39, 0x7e, 0xea, 0x6c, 0xc0, 0x9c, 0xbf, 0xf0, - 0x60, 0x70, 0x7f, 0x96, 0x68, 0xe5, 0xf9, 0xd6, 0x9b, 0x58, 0x72, 0xf7, - 0xa3, 0x73, 0x95, 0x87, 0x8c, 0xe5, 0x37, 0xa1, 0x26, 0x39, 0x78, 0x5a, - 0xad, 0xa3, 0x97, 0xec, 0x9d, 0x71, 0xa3, 0x97, 0xff, 0xfe, 0x8e, 0xa2, - 0xd4, 0x9a, 0x4f, 0xcf, 0xbd, 0x4d, 0xf4, 0xc4, 0x9c, 0xe5, 0x4e, 0x9f, - 0xd0, 0x47, 0x95, 0x36, 0x42, 0x99, 0xa1, 0x07, 0xd2, 0x01, 0x1c, 0xd1, - 0x26, 0xd1, 0x45, 0xf7, 0xc7, 0x93, 0x50, 0x72, 0xff, 0xec, 0xd9, 0x81, - 0xc1, 0xfe, 0x59, 0xa3, 0x97, 0xee, 0x47, 0x7e, 0x84, 0xe5, 0x70, 0xfb, - 0xdd, 0x16, 0xfa, 0x12, 0x78, 0x39, 0x7c, 0xdb, 0xe6, 0x8e, 0x5f, 0xc1, - 0x80, 0x0e, 0x6e, 0x72, 0xff, 0xa4, 0xb7, 0x97, 0xb5, 0x0a, 0x9c, 0xa8, - 0x44, 0x4e, 0x11, 0x39, 0x6d, 0xed, 0x20, 0x9c, 0xbf, 0x0b, 0x3e, 0x6b, - 0x73, 0x95, 0x87, 0x8c, 0xe3, 0x74, 0xd6, 0x9f, 0xb3, 0xc2, 0x60, 0x04, - 0x23, 0x0a, 0xaf, 0xdc, 0xee, 0x9e, 0x47, 0x2f, 0x27, 0x50, 0xe5, 0x6e, - 0x6c, 0xfc, 0x31, 0x7d, 0xf7, 0xf7, 0xd1, 0xcb, 0xfe, 0x45, 0x60, 0x31, - 0xb3, 0x3a, 0x72, 0xff, 0xba, 0x8d, 0xef, 0x2d, 0x63, 0x0e, 0x5f, 0xdf, - 0xea, 0x26, 0xff, 0x87, 0x2f, 0x7f, 0x9b, 0x9c, 0xae, 0x9e, 0x7f, 0x8c, - 0x6f, 0xf4, 0xbf, 0x19, 0xf4, 0x9b, 0x9c, 0xbe, 0x00, 0x33, 0x73, 0x97, - 0xf6, 0xd7, 0xb1, 0xc5, 0x87, 0x2f, 0xfb, 0xf7, 0x90, 0x73, 0x01, 0xa3, - 0x97, 0xf8, 0x09, 0xbe, 0xf2, 0xcf, 0x1c, 0xae, 0x9f, 0x76, 0x8e, 0x6f, - 0xdb, 0xe9, 0x68, 0xd6, 0x72, 0xff, 0xfd, 0x9a, 0xf9, 0xd7, 0x4f, 0x03, - 0xf1, 0x17, 0x91, 0xca, 0x84, 0x41, 0x09, 0x65, 0xfc, 0xf3, 0x81, 0xc4, - 0x27, 0x2a, 0x75, 0x59, 0xc1, 0x3a, 0x64, 0x22, 0xa6, 0x22, 0xe1, 0xb7, - 0x48, 0xfd, 0x09, 0xdd, 0x90, 0xa4, 0xdb, 0x21, 0xbf, 0xdf, 0x61, 0x9b, - 0x79, 0xc8, 0x39, 0x7f, 0xc1, 0xcf, 0xf9, 0x3b, 0x12, 0x73, 0x97, 0xf4, - 0x75, 0x39, 0x0b, 0x39, 0x5d, 0x44, 0xfb, 0x9b, 0xf8, 0xf2, 0xa1, 0x71, - 0x5f, 0x25, 0x79, 0xbc, 0x66, 0xb7, 0x4d, 0xf9, 0xcb, 0x2c, 0xe5, 0x6e, - 0x6a, 0x9a, 0x63, 0x37, 0xff, 0x47, 0x33, 0x63, 0xc8, 0x19, 0x81, 0x39, - 0x7f, 0x3e, 0xf2, 0x18, 0x09, 0xcb, 0xfe, 0x8d, 0xe4, 0x82, 0xb7, 0xf1, - 0xca, 0x73, 0xe5, 0x12, 0xdb, 0xf3, 0xcb, 0x27, 0x83, 0x97, 0xff, 0x46, - 0xb5, 0x8b, 0xf0, 0xc2, 0xf4, 0x72, 0xff, 0xe4, 0x8d, 0x0b, 0xcb, 0xe6, - 0xb3, 0x87, 0x2f, 0xff, 0xf2, 0x6a, 0x7c, 0x6f, 0x07, 0xfd, 0xa8, 0x53, - 0x05, 0xf8, 0x72, 0xff, 0x6f, 0x2d, 0x4d, 0x28, 0x9c, 0xe5, 0x05, 0x34, - 0x96, 0x13, 0x8a, 0x1f, 0x91, 0x3f, 0x64, 0xbf, 0xff, 0xf7, 0x53, 0x7f, - 0x66, 0xfe, 0xe7, 0x23, 0xc0, 0xfa, 0x32, 0xee, 0x1c, 0xbc, 0x17, 0x13, - 0x97, 0xb9, 0x1b, 0x0e, 0x5d, 0xff, 0x0e, 0x50, 0x4f, 0x47, 0x83, 0x7a, - 0x1e, 0xbf, 0xf4, 0xa0, 0x7d, 0xc4, 0xd9, 0x81, 0x39, 0x7f, 0xe7, 0xf6, - 0xbf, 0x97, 0xd0, 0xa7, 0x8e, 0x5f, 0xf9, 0xfa, 0xc4, 0x7f, 0x9a, 0x7e, - 0x9c, 0xbf, 0xba, 0xe3, 0xbc, 0x90, 0xe5, 0xff, 0xfb, 0x43, 0xf3, 0xae, - 0x9e, 0x07, 0xe2, 0x2f, 0x23, 0x97, 0xfb, 0xa8, 0xae, 0xdf, 0xfc, 0x54, - 0xe5, 0xff, 0x43, 0x6b, 0xec, 0x20, 0xce, 0x72, 0xff, 0xf8, 0x73, 0x58, - 0xb8, 0x66, 0x79, 0x39, 0x87, 0x2d, 0x8c, 0x45, 0xff, 0x8e, 0xb6, 0x1c, - 0xdf, 0xd3, 0xe7, 0x11, 0x90, 0x72, 0xf8, 0x43, 0x0b, 0x39, 0x7f, 0xfd, - 0xf8, 0xfb, 0x5d, 0x49, 0x86, 0x16, 0xf2, 0x39, 0x7d, 0x83, 0xfb, 0x9c, - 0xa5, 0x9f, 0x8e, 0xc5, 0x0b, 0xf9, 0xc1, 0x81, 0x79, 0x1c, 0xa8, 0x47, - 0x16, 0x42, 0x49, 0x09, 0x29, 0x13, 0x41, 0xec, 0x61, 0xf5, 0x0b, 0xe2, - 0xd3, 0x93, 0x06, 0x15, 0x39, 0x1b, 0x4b, 0x12, 0xd2, 0x18, 0x33, 0x17, - 0xac, 0xff, 0xa8, 0x4e, 0x7e, 0x02, 0xd1, 0x8c, 0x57, 0xd1, 0xbc, 0x5f, - 0xfd, 0x82, 0x0c, 0xce, 0x6b, 0xd1, 0x87, 0x2f, 0xfb, 0x7f, 0x67, 0x12, - 0x77, 0x59, 0xcb, 0x60, 0x0f, 0xec, 0x50, 0x6f, 0x34, 0xe4, 0x87, 0x2f, - 0xa0, 0x5e, 0x47, 0x2f, 0xd8, 0xd6, 0xe2, 0x0f, 0x87, 0x81, 0xc2, 0x0b, - 0xfb, 0x67, 0x52, 0x39, 0xa3, 0x97, 0xfe, 0xea, 0x2c, 0x39, 0x34, 0x67, - 0x0e, 0x5e, 0x94, 0x6e, 0x72, 0xfa, 0x00, 0xeb, 0x39, 0x70, 0xcb, 0x0f, - 0xf2, 0x63, 0xe1, 0x1d, 0xbe, 0xd2, 0x7a, 0x0e, 0x54, 0x1e, 0xd3, 0x9c, - 0xdf, 0x33, 0xa9, 0x31, 0xcb, 0xff, 0xf0, 0xe2, 0xaa, 0xa0, 0x7a, 0x93, - 0x75, 0x37, 0xf1, 0xca, 0x83, 0xfb, 0xc2, 0x3b, 0xcc, 0x7e, 0x1c, 0xbf, - 0x69, 0x91, 0xc5, 0x4e, 0x57, 0x4f, 0x14, 0x03, 0x97, 0xf4, 0xb1, 0x03, - 0xd4, 0x39, 0x79, 0xf8, 0xa9, 0xca, 0xc3, 0xc9, 0x72, 0xcb, 0xff, 0xb3, - 0x7f, 0x69, 0x06, 0x00, 0xeb, 0x39, 0x7a, 0x4b, 0xe9, 0xca, 0x9c, 0xf8, - 0x3c, 0x87, 0x7c, 0x8a, 0xa3, 0x67, 0x2b, 0x0f, 0x18, 0x48, 0xee, 0xf9, - 0x87, 0x2f, 0xb4, 0x30, 0xb3, 0x95, 0x06, 0xe7, 0x71, 0x8b, 0xdd, 0x92, - 0xce, 0x5d, 0xd4, 0x39, 0x58, 0x6c, 0xfc, 0x3b, 0x50, 0xb9, 0x57, 0x26, - 0x6c, 0x42, 0x56, 0x30, 0x5e, 0xc2, 0x6d, 0xd9, 0x45, 0xaf, 0x50, 0xc6, - 0xfd, 0x67, 0x6d, 0x52, 0xf0, 0x56, 0xc3, 0x96, 0xe9, 0xcb, 0x00, 0xe5, - 0xda, 0x91, 0xca, 0x01, 0xb9, 0xd0, 0x8f, 0xe2, 0x37, 0xf4, 0xf3, 0x49, - 0xa5, 0xc9, 0xce, 0x5e, 0x7c, 0xe1, 0xcb, 0xc3, 0x9e, 0x39, 0x5d, 0x36, - 0xc2, 0x37, 0x77, 0x84, 0xe5, 0xe8, 0xdf, 0x47, 0x2f, 0x90, 0x65, 0x87, - 0x2f, 0x4e, 0xe2, 0x72, 0x82, 0x7b, 0x2b, 0x1d, 0xf1, 0x05, 0xfb, 0x3d, - 0xd4, 0xf1, 0xcb, 0xf3, 0xef, 0x9b, 0xf8, 0xe5, 0x95, 0xe9, 0xe8, 0x78, - 0x9e, 0xe4, 0xe1, 0xcb, 0xfa, 0x7f, 0x93, 0xbb, 0xf4, 0xe5, 0x35, 0x49, - 0xf5, 0x43, 0x64, 0x88, 0x31, 0xbd, 0x1f, 0xfa, 0x52, 0xe2, 0xd7, 0xfd, - 0x81, 0x0a, 0x6f, 0x9b, 0xf8, 0xe5, 0xf3, 0x06, 0x24, 0x72, 0xba, 0x7b, - 0x6e, 0x75, 0x7f, 0xa3, 0x3d, 0x1d, 0x70, 0x9c, 0xa9, 0xcf, 0x48, 0x24, - 0x37, 0xff, 0x06, 0x03, 0xc8, 0xf2, 0x31, 0x02, 0x72, 0xfa, 0x68, 0xda, - 0x91, 0xcb, 0xfb, 0xcc, 0x08, 0x57, 0xc3, 0x97, 0xfd, 0x36, 0xb6, 0x38, - 0xcf, 0xf8, 0x4e, 0x5f, 0x67, 0xb1, 0x67, 0x2e, 0x15, 0x4e, 0x5b, 0x4e, - 0x6e, 0x3f, 0x21, 0xbf, 0xbb, 0xfc, 0xf3, 0x75, 0x0e, 0x5f, 0x08, 0xe7, - 0x8e, 0x54, 0x27, 0x52, 0x12, 0x3c, 0x43, 0x54, 0x99, 0x0b, 0xe6, 0x76, - 0xe9, 0x3f, 0x8c, 0x6f, 0xef, 0x93, 0x47, 0x87, 0x61, 0xcb, 0xff, 0xc3, - 0x1b, 0x39, 0x1c, 0xc4, 0xec, 0x04, 0xe5, 0xe1, 0x75, 0x9c, 0xa9, 0x22, - 0x5b, 0x0c, 0x91, 0x26, 0xca, 0x35, 0x4f, 0x91, 0x6e, 0xd5, 0x9e, 0xb4, - 0x71, 0xd6, 0xa4, 0x39, 0x12, 0xb7, 0x67, 0x87, 0x94, 0xa3, 0x9f, 0x0c, - 0xe5, 0x2e, 0x52, 0x22, 0x55, 0x8e, 0xb9, 0x92, 0xdd, 0x37, 0x94, 0x9c, - 0x91, 0x8c, 0xcd, 0x2e, 0xdf, 0x91, 0xf4, 0x2e, 0x3a, 0xee, 0xcf, 0xb5, - 0xbc, 0xa7, 0x30, 0x4a, 0x7e, 0x69, 0xc2, 0x28, 0x67, 0x1e, 0x75, 0x3e, - 0xfb, 0xe9, 0xdf, 0x4f, 0xe1, 0x3e, 0xda, 0xb6, 0xdc, 0xa1, 0x9f, 0xb2, - 0xaf, 0x36, 0xa3, 0x07, 0xa5, 0x1f, 0x2d, 0x2b, 0xb7, 0x92, 0x11, 0x7f, - 0xf9, 0x45, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0xb1, 0x7f, 0x94, - 0xce, 0x31, 0xdd, 0x86, 0x8a, 0xb5, 0x7f, 0xa5, 0x2f, 0xfc, 0x31, 0x23, - 0x97, 0xd9, 0xd7, 0xf1, 0xcb, 0x34, 0x30, 0xf5, 0x44, 0xd2, 0xff, 0xb0, - 0x71, 0x71, 0x2f, 0xf8, 0x72, 0xff, 0x73, 0x19, 0x00, 0xfa, 0xb3, 0x97, - 0xfb, 0xb1, 0x3f, 0x23, 0x02, 0x72, 0xff, 0xfd, 0x13, 0xc7, 0x21, 0x71, - 0x1e, 0xea, 0x01, 0x67, 0x2a, 0x11, 0x0f, 0xd3, 0x3a, 0x62, 0x62, 0xdc, - 0x38, 0xec, 0x2f, 0x2f, 0xd1, 0xc5, 0xf4, 0x27, 0x2f, 0x07, 0x04, 0xe5, - 0xe7, 0x76, 0x1a, 0x2b, 0x45, 0xf9, 0x5d, 0xf5, 0xfe, 0xe7, 0x29, 0x87, - 0xaa, 0x85, 0x17, 0xff, 0x93, 0xd2, 0x86, 0x75, 0x3d, 0xa7, 0xdc, 0xe5, - 0x70, 0xfa, 0xf6, 0x10, 0xdf, 0xfe, 0xea, 0x2e, 0x19, 0x8b, 0xc1, 0xf6, - 0xd9, 0xcb, 0xff, 0xe6, 0x47, 0x30, 0x0e, 0xb7, 0x94, 0x23, 0x0e, 0x5f, - 0xff, 0x4b, 0x58, 0x30, 0xb7, 0xcf, 0x7a, 0x16, 0x72, 0xef, 0x7a, 0x11, - 0x34, 0xe9, 0xb7, 0xff, 0xff, 0xa3, 0x62, 0x7b, 0x58, 0xab, 0x3a, 0x9e, - 0xc9, 0x86, 0x17, 0x3e, 0x36, 0x72, 0xff, 0x47, 0x9f, 0xbf, 0x03, 0x07, - 0x2f, 0xa5, 0xe4, 0x9c, 0xe5, 0xfb, 0xef, 0x86, 0x00, 0x72, 0xb7, 0x3c, - 0xcd, 0x84, 0x77, 0xf9, 0xe5, 0xe4, 0x9f, 0xa8, 0x72, 0xa0, 0xf6, 0x10, - 0x96, 0xfd, 0x9d, 0x4c, 0x59, 0xcb, 0xf2, 0x01, 0x69, 0xc3, 0x97, 0xff, - 0x0b, 0xa3, 0x3a, 0xff, 0xcf, 0xc4, 0x39, 0x53, 0xa2, 0x44, 0x24, 0xdd, - 0x27, 0xbf, 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, 0xe5, 0xf4, 0xb9, 0x8b, 0x39, - 0x7b, 0x38, 0x03, 0x97, 0xe9, 0xb0, 0x2b, 0x6b, 0x39, 0x7f, 0x0c, 0x37, - 0xbc, 0xb4, 0x72, 0xb7, 0x44, 0xca, 0x11, 0x4c, 0x39, 0xb4, 0x59, 0x50, - 0x98, 0x7e, 0x43, 0x3a, 0xff, 0xff, 0xfe, 0xc4, 0x66, 0x7a, 0x07, 0xda, - 0xf9, 0x08, 0x1c, 0x5f, 0xce, 0x42, 0x49, 0xf4, 0x72, 0xfe, 0xcf, 0x38, - 0x83, 0xf3, 0x97, 0xf7, 0x7e, 0x24, 0xee, 0x27, 0x2f, 0xf4, 0x2f, 0x41, - 0x17, 0x6c, 0xe5, 0xf3, 0x81, 0xc2, 0x72, 0xa4, 0x8b, 0x0c, 0x2d, 0x12, - 0xfd, 0x19, 0xd9, 0x46, 0x93, 0x22, 0x36, 0x23, 0x40, 0x9c, 0xd8, 0x25, - 0x19, 0x0d, 0xb6, 0x12, 0x24, 0x39, 0x78, 0x5a, 0xb7, 0xbe, 0xc3, 0x61, - 0xe1, 0x62, 0x31, 0xa0, 0x68, 0x9f, 0xd1, 0x9c, 0x5f, 0xb8, 0xc7, 0x76, - 0x1a, 0x2c, 0x05, 0xf9, 0xd9, 0xf7, 0xb3, 0x1c, 0xb2, 0x98, 0x7b, 0xfa, - 0x34, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x4e, 0xab, 0xff, 0xfd, 0xd8, 0x9c, - 0x38, 0xb5, 0x35, 0xac, 0xea, 0x6b, 0xf9, 0xce, 0x5f, 0x94, 0x5b, 0xc9, - 0x4c, 0x44, 0xcc, 0xc6, 0x97, 0x95, 0x85, 0x9c, 0xbe, 0x76, 0x7d, 0x59, - 0xcb, 0xd2, 0xd2, 0x8a, 0x9e, 0x0e, 0xc1, 0xdb, 0xf7, 0x18, 0xee, 0xc3, - 0x45, 0xb2, 0xbf, 0xbc, 0xfd, 0xf8, 0x18, 0x39, 0x7f, 0xff, 0x49, 0x4d, - 0x42, 0x60, 0x53, 0x35, 0x9e, 0x18, 0x39, 0x50, 0x88, 0x77, 0x2f, 0xbf, - 0xf0, 0x23, 0x4a, 0x75, 0x18, 0xfc, 0x39, 0x7f, 0xd1, 0x28, 0xe4, 0xf1, - 0xc9, 0xce, 0x59, 0x4c, 0x4d, 0x55, 0x70, 0xbb, 0x72, 0x11, 0x3f, 0xbf, - 0xf0, 0xa8, 0xbf, 0xd3, 0xc2, 0xfb, 0x47, 0x2f, 0xfe, 0xff, 0x4a, 0x67, - 0x1f, 0x5d, 0x79, 0x1c, 0xb9, 0xc1, 0x88, 0x88, 0x02, 0x15, 0xdb, 0xb0, - 0xe5, 0xf3, 0x1d, 0xd8, 0x68, 0xb9, 0x96, 0x59, 0xca, 0xe1, 0xbf, 0x6c, - 0xba, 0xff, 0x70, 0x73, 0x70, 0x24, 0x8e, 0x5d, 0x32, 0xce, 0x51, 0xcb, - 0x29, 0x08, 0xcf, 0xc5, 0x74, 0x22, 0x6c, 0xcf, 0x6c, 0x62, 0xfd, 0xc6, - 0x3b, 0xb0, 0xd1, 0x77, 0xaf, 0xf4, 0x94, 0xd7, 0x38, 0x8d, 0x9c, 0xb2, - 0x98, 0x7d, 0x4e, 0x69, 0x7c, 0xa2, 0xa1, 0x01, 0xca, 0x87, 0xdc, 0x1a, - 0xcb, 0xcb, 0x76, 0x61, 0xbe, 0xeb, 0x09, 0x49, 0x22, 0xe4, 0x69, 0xeb, - 0x86, 0x0b, 0xc2, 0x0c, 0x11, 0xc6, 0x8c, 0x33, 0xf5, 0x0f, 0xcf, 0x42, - 0xf3, 0xe9, 0x3d, 0xff, 0x9b, 0x71, 0x9f, 0x48, 0x3b, 0xc8, 0xe5, 0xff, - 0xd9, 0x3e, 0x37, 0xdc, 0xd6, 0x20, 0x9c, 0xb9, 0x14, 0xea, 0x20, 0xc5, - 0x02, 0xfd, 0xad, 0x2d, 0xe4, 0x72, 0xff, 0xff, 0xff, 0xdd, 0x4e, 0xa4, - 0x0f, 0x85, 0xd5, 0xcf, 0x7f, 0xe4, 0xf6, 0xba, 0x9c, 0x89, 0xdf, 0x8c, - 0x39, 0x76, 0xa0, 0xe5, 0xff, 0xdb, 0xb3, 0xf7, 0xdf, 0xd9, 0x82, 0xa9, - 0xcb, 0xc2, 0xea, 0x42, 0x63, 0xcc, 0x28, 0xd4, 0x26, 0x7c, 0x2d, 0x7b, - 0xf7, 0x59, 0xcb, 0xf6, 0x6d, 0x7a, 0x15, 0x39, 0x6d, 0xa3, 0x95, 0x39, - 0xbf, 0xc2, 0xba, 0xe1, 0xfe, 0x8a, 0xe5, 0xff, 0xb4, 0xea, 0xf5, 0x20, - 0x7f, 0x83, 0x97, 0xfe, 0xeb, 0xf9, 0xfb, 0xbc, 0xb3, 0xc7, 0x2b, 0x0f, - 0xf5, 0x0f, 0xae, 0x70, 0x1c, 0xbf, 0xff, 0xfc, 0x2e, 0xd8, 0xe7, 0xbd, - 0x93, 0xc0, 0xba, 0xba, 0x5c, 0x60, 0x84, 0xe5, 0xec, 0xfb, 0xa3, 0x95, - 0x88, 0xa9, 0xe0, 0xb6, 0xd3, 0xad, 0xfe, 0xee, 0x05, 0x36, 0x73, 0x0e, - 0x5e, 0x77, 0x61, 0xa2, 0x57, 0x5f, 0xe5, 0x5c, 0x41, 0xec, 0xe9, 0xca, - 0x61, 0xed, 0xa1, 0x45, 0xfe, 0xdc, 0x5d, 0x57, 0xf4, 0x8e, 0x5f, 0xfd, - 0xdc, 0x93, 0x3a, 0x81, 0x81, 0xf1, 0xca, 0x43, 0xf7, 0xf1, 0xa5, 0x49, - 0x34, 0x8e, 0x42, 0x3c, 0x61, 0x31, 0x7f, 0xff, 0xfd, 0xc7, 0x1f, 0xb0, - 0x0c, 0x97, 0x63, 0x60, 0x61, 0x4c, 0x1f, 0xe5, 0x9a, 0x39, 0x74, 0xa7, - 0x39, 0x7f, 0xff, 0x9f, 0x7d, 0x67, 0x3d, 0xe7, 0x9f, 0xea, 0xc3, 0xd4, - 0x54, 0xe5, 0xff, 0x62, 0x6c, 0x18, 0xce, 0x48, 0xe5, 0xff, 0xfb, 0xd2, - 0xc6, 0xb7, 0x10, 0x6f, 0xee, 0x46, 0x36, 0x71, 0xb3, 0x71, 0x7e, 0xdf, - 0xdd, 0x80, 0x1c, 0xa7, 0x44, 0x9f, 0xed, 0x57, 0xff, 0xa6, 0x18, 0xf6, - 0xbd, 0xbb, 0x10, 0x67, 0x39, 0x7f, 0xce, 0xd8, 0x7b, 0x13, 0xe3, 0x67, - 0x29, 0x11, 0x0e, 0x29, 0x97, 0xff, 0xec, 0x40, 0x62, 0xd3, 0xda, 0x85, - 0xbe, 0xfe, 0x39, 0x7f, 0xd0, 0xbf, 0x64, 0xd2, 0x4f, 0x1c, 0xa9, 0x22, - 0x37, 0xca, 0x97, 0xdf, 0xbf, 0x24, 0x72, 0xfe, 0x18, 0x9c, 0x0f, 0xe3, - 0x97, 0xf9, 0xc3, 0xf7, 0x6a, 0x06, 0x47, 0x2d, 0x0c, 0x3e, 0x45, 0x96, - 0xdf, 0xff, 0xe4, 0xf3, 0xad, 0xc4, 0x1d, 0x6d, 0xc6, 0x76, 0x24, 0xe7, - 0x28, 0x29, 0x87, 0xa4, 0x21, 0xdc, 0x9e, 0xff, 0xbf, 0x02, 0xde, 0x5a, - 0xe0, 0x4e, 0x5f, 0xff, 0xec, 0x41, 0xf6, 0x0f, 0xc1, 0x70, 0xc0, 0xcf, - 0x1c, 0x39, 0x6c, 0xf2, 0x26, 0x76, 0x1d, 0xdf, 0xf6, 0xe0, 0xce, 0x66, - 0x7b, 0x47, 0x28, 0x2a, 0xc4, 0x32, 0x15, 0xdd, 0x8c, 0xc8, 0x61, 0x9b, - 0xf4, 0xaa, 0xff, 0xd9, 0xde, 0xbc, 0x81, 0xcc, 0xdc, 0xe5, 0xff, 0x66, - 0xfa, 0x0c, 0x38, 0xce, 0x72, 0xff, 0x9e, 0x5a, 0xec, 0x73, 0xe8, 0x4e, - 0x54, 0x91, 0x67, 0x87, 0xfe, 0x39, 0xbf, 0xfb, 0xc9, 0xb1, 0x3d, 0x34, - 0xa0, 0x7c, 0x72, 0xff, 0xf3, 0xe4, 0xbb, 0x88, 0x38, 0x0d, 0xbc, 0x39, - 0x79, 0xe4, 0xa4, 0x32, 0x9a, 0xe5, 0x09, 0xe0, 0xc3, 0x27, 0x23, 0x7a, - 0xe1, 0xd2, 0xe1, 0x00, 0x01, 0x81, 0x8c, 0xc7, 0x52, 0xee, 0xbd, 0x18, - 0x7f, 0xd2, 0xfd, 0xa4, 0x6b, 0xff, 0xd9, 0xd5, 0x07, 0x02, 0x83, 0xec, - 0xe9, 0xcb, 0xde, 0x80, 0x94, 0xbf, 0xfd, 0xd7, 0x4f, 0x44, 0x93, 0x93, - 0xfe, 0x02, 0x97, 0xf9, 0xd8, 0xa0, 0x78, 0xd3, 0x52, 0x0f, 0x9f, 0x43, - 0x96, 0x50, 0x2c, 0xe6, 0xb6, 0x46, 0x98, 0xba, 0x59, 0xdf, 0xa1, 0xcb, - 0xb2, 0x15, 0xf7, 0xff, 0x94, 0x5b, 0xc9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, - 0x98, 0x57, 0xff, 0xf6, 0x6c, 0x70, 0xf6, 0x14, 0xf7, 0x70, 0x3f, 0xfb, - 0x47, 0x2f, 0xff, 0x71, 0xc0, 0xa2, 0xbe, 0x93, 0x71, 0xa9, 0x1c, 0xbb, - 0x14, 0x14, 0x56, 0xfd, 0x5f, 0xb9, 0x7b, 0x0e, 0x5f, 0xfc, 0xd0, 0xcd, - 0xe5, 0xfb, 0xf8, 0x62, 0x47, 0x2f, 0xcd, 0x5b, 0x56, 0xd4, 0x6d, 0xb5, - 0x47, 0x2f, 0xd8, 0xbf, 0x9b, 0xb5, 0x9c, 0xbf, 0xa1, 0x78, 0x08, 0xd8, - 0x72, 0x82, 0x7b, 0x9d, 0x2e, 0xbf, 0xdc, 0xc6, 0x40, 0x3e, 0xac, 0xe5, - 0xfb, 0xb0, 0x14, 0x54, 0xe5, 0x21, 0xff, 0xf0, 0x8b, 0x68, 0xd6, 0xff, - 0x43, 0xcf, 0xe5, 0x5f, 0x87, 0x2f, 0xcf, 0xc9, 0x3a, 0xce, 0x50, 0x9e, - 0xdf, 0xe6, 0x97, 0xfb, 0x51, 0x82, 0x1e, 0xc1, 0xcb, 0xfa, 0x30, 0x43, - 0xd8, 0x39, 0x7b, 0xfe, 0x4d, 0xf0, 0xf7, 0x34, 0x63, 0x7f, 0xfb, 0x89, - 0xfe, 0x2b, 0x9e, 0xfe, 0x37, 0x09, 0xcb, 0xff, 0xf2, 0x73, 0xaf, 0xf0, - 0x39, 0x2e, 0xc6, 0xc0, 0xc1, 0xcb, 0xfe, 0x6f, 0xef, 0x61, 0x9d, 0x49, - 0x8e, 0x5f, 0x7e, 0xbc, 0x09, 0xcb, 0x66, 0xe7, 0xc1, 0xb4, 0x7b, 0x7f, - 0x47, 0x22, 0x5a, 0xc3, 0x94, 0xc4, 0xe5, 0x38, 0x71, 0xd4, 0xd1, 0x85, - 0xc7, 0x8a, 0xef, 0xff, 0x43, 0x35, 0xff, 0x93, 0xa8, 0xaf, 0x50, 0xe5, - 0xfc, 0xb8, 0xc1, 0xf6, 0xd9, 0xcb, 0x68, 0xe5, 0xfa, 0x30, 0x7d, 0xb6, - 0x72, 0xf6, 0x9f, 0x7f, 0x87, 0xd3, 0x31, 0x7a, 0xc4, 0x6e, 0xea, 0x2d, - 0x1f, 0x1e, 0x85, 0xa5, 0xfd, 0xe8, 0x5e, 0xc0, 0x48, 0xe5, 0xde, 0x43, - 0x95, 0x23, 0xc6, 0x54, 0xc2, 0xff, 0xff, 0x37, 0xb5, 0xec, 0xef, 0xc1, - 0xc9, 0xd3, 0x07, 0x79, 0x68, 0xe5, 0xf9, 0xbf, 0x67, 0x58, 0x72, 0xc3, - 0x88, 0x90, 0x76, 0x7b, 0xff, 0xde, 0x17, 0x07, 0x71, 0x03, 0xff, 0xb4, - 0x72, 0xff, 0xa2, 0x7f, 0xb2, 0xef, 0xef, 0x39, 0xca, 0x84, 0x44, 0x71, - 0x2a, 0xff, 0xec, 0xde, 0x5f, 0x3a, 0xec, 0x81, 0x09, 0xcb, 0xe4, 0x8d, - 0xf4, 0x72, 0xfd, 0xf7, 0xc3, 0x00, 0x39, 0x5e, 0x3c, 0xbd, 0x84, 0x57, - 0xde, 0xf6, 0x36, 0x72, 0xff, 0xf4, 0x78, 0x11, 0x2c, 0xdf, 0xd3, 0xfe, - 0xd9, 0xcb, 0xda, 0x70, 0x1c, 0xa8, 0x45, 0x8e, 0x12, 0x21, 0x1f, 0x93, - 0xaf, 0xff, 0xba, 0x9a, 0x89, 0x7c, 0xce, 0xa7, 0x3a, 0xe7, 0x2f, 0xe7, - 0x07, 0x38, 0x9c, 0x39, 0x7b, 0xdf, 0x30, 0xe5, 0x00, 0xf2, 0xfe, 0x96, - 0xdf, 0x77, 0xfd, 0xfc, 0x72, 0xfe, 0xd2, 0x2a, 0xb7, 0xf1, 0xcb, 0xff, - 0xff, 0x73, 0x36, 0x40, 0xfb, 0xe7, 0xd1, 0x8e, 0xba, 0x7a, 0x3d, 0xa3, - 0x97, 0xf0, 0xe6, 0xbe, 0x31, 0xa4, 0x72, 0xb7, 0x46, 0x87, 0x0b, 0xb6, - 0x37, 0xdf, 0x7c, 0xd9, 0xb5, 0x39, 0xca, 0x0a, 0x6a, 0x79, 0x0f, 0x55, - 0x4c, 0xec, 0xd6, 0x72, 0xfc, 0xbe, 0x60, 0x7c, 0x72, 0xef, 0x61, 0xcb, - 0xff, 0xcd, 0x31, 0x85, 0xba, 0x75, 0xfd, 0xd8, 0x39, 0x50, 0x7c, 0x3f, - 0x8b, 0x5f, 0xee, 0xa4, 0xce, 0xcd, 0x48, 0xe5, 0xfc, 0x3e, 0x75, 0xa7, - 0x8e, 0x5f, 0xf9, 0x3d, 0xff, 0x1f, 0x5f, 0x17, 0xe3, 0x95, 0x07, 0xdc, - 0xe5, 0x97, 0xfd, 0x89, 0x8b, 0x1c, 0x9d, 0xce, 0x5f, 0xa3, 0xda, 0x07, - 0xe7, 0x29, 0xaa, 0x4f, 0x82, 0x05, 0x32, 0x11, 0x2c, 0x22, 0xec, 0x28, - 0x84, 0x83, 0xc6, 0xd7, 0xff, 0xee, 0x8e, 0x7b, 0xa9, 0x9b, 0xfb, 0x36, - 0x46, 0x8e, 0x5f, 0xfc, 0xe3, 0xd8, 0x40, 0xa6, 0xb2, 0x47, 0x2f, 0x40, - 0x3e, 0x9c, 0xbf, 0xb3, 0x67, 0x50, 0x13, 0x1c, 0xac, 0x47, 0x2b, 0xab, - 0x0a, 0x0e, 0x87, 0xaf, 0x7d, 0x0e, 0x1c, 0xbc, 0xd3, 0xd3, 0x48, 0xe5, - 0x39, 0xe1, 0xe8, 0x7a, 0xfb, 0xe2, 0xfe, 0x30, 0xe5, 0xec, 0x60, 0x4e, - 0x5f, 0xce, 0xdc, 0x7b, 0x27, 0x39, 0x58, 0x79, 0x42, 0x39, 0x7e, 0xdd, - 0xb9, 0xb5, 0x07, 0x2c, 0xa3, 0x54, 0xcf, 0xb2, 0x69, 0x0c, 0xb5, 0x24, - 0x98, 0x8c, 0x6c, 0x30, 0x8c, 0xc9, 0x42, 0x4c, 0x8d, 0x1f, 0x77, 0x99, - 0xa1, 0x67, 0xc8, 0x57, 0x2c, 0x8b, 0xb1, 0xa1, 0x39, 0xd0, 0x21, 0x36, - 0x31, 0xbb, 0xea, 0x50, 0xb7, 0xa3, 0x56, 0xfd, 0xf5, 0xb2, 0x1d, 0xb7, - 0x1f, 0xa4, 0x17, 0xff, 0xdc, 0x4d, 0xe5, 0xa4, 0xf7, 0x63, 0x9e, 0x83, - 0x97, 0xee, 0x31, 0xdd, 0x86, 0x8a, 0xb9, 0x7b, 0x90, 0xb3, 0x97, 0xfa, - 0x39, 0xe8, 0x18, 0x01, 0xcb, 0xfe, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, - 0x1e, 0x2f, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, 0xcb, 0xff, 0x47, 0x93, - 0xf6, 0x9e, 0x4a, 0x79, 0x8e, 0x5f, 0xf6, 0xec, 0x4d, 0x75, 0x3c, 0x87, - 0x2c, 0xa0, 0x53, 0xcf, 0xc5, 0x0e, 0x1a, 0x74, 0x71, 0xcc, 0x45, 0x1b, - 0x47, 0x5e, 0x45, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x58, 0x2b, 0xca, 0xc4, - 0xe7, 0x2f, 0xff, 0xe1, 0xfd, 0xe7, 0x5e, 0x6d, 0xff, 0xcc, 0xe4, 0xbe, - 0xc8, 0xe5, 0xfb, 0x07, 0x3d, 0xa3, 0x97, 0xfb, 0x8e, 0xbf, 0xbc, 0x7d, - 0xce, 0x59, 0x4c, 0x4c, 0x45, 0x53, 0x46, 0x0f, 0x3b, 0x1f, 0xd2, 0x6b, - 0xfc, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x59, 0x4b, 0xf7, 0x18, 0xee, 0xc3, - 0x45, 0xa6, 0xbf, 0xe7, 0x0f, 0x5e, 0x6e, 0xa2, 0xce, 0x59, 0x4c, 0x3e, - 0xd5, 0x9a, 0x5f, 0x9a, 0x3b, 0x53, 0x6a, 0x9a, 0xa6, 0xac, 0xe5, 0xff, - 0x34, 0xba, 0x8d, 0x85, 0xdd, 0x87, 0x2f, 0xcd, 0x1d, 0xa1, 0xac, 0x83, - 0x97, 0xfb, 0xea, 0xf3, 0xda, 0x4d, 0x1c, 0xb2, 0x1c, 0xa6, 0x91, 0xe2, - 0xed, 0x9a, 0xdf, 0xff, 0xc9, 0xd7, 0x1f, 0x4b, 0x39, 0x90, 0x23, 0x9e, - 0x39, 0x7e, 0xd8, 0xe1, 0xc5, 0x9c, 0xbe, 0x5c, 0x6f, 0xa3, 0x97, 0xff, - 0x26, 0x38, 0x22, 0x5c, 0x8c, 0x13, 0x97, 0xc9, 0xb3, 0xbb, 0x0e, 0x54, - 0x93, 0x08, 0xc5, 0x69, 0x8a, 0x44, 0x8f, 0x48, 0x17, 0xf9, 0x7f, 0x56, - 0x05, 0xa0, 0x0e, 0x5f, 0xbe, 0x73, 0x9f, 0xf4, 0xe5, 0xf9, 0x15, 0x81, - 0x61, 0xca, 0xd1, 0xe9, 0xf8, 0xb2, 0xa1, 0x15, 0x79, 0x08, 0x9b, 0xff, - 0xe1, 0x67, 0x53, 0xa9, 0xc8, 0x99, 0xbc, 0xe9, 0xcb, 0xff, 0x2d, 0x6f, - 0x2d, 0xbf, 0xfa, 0x9c, 0x39, 0x7e, 0x7d, 0x7a, 0x02, 0x72, 0xa0, 0xfa, - 0xbf, 0x43, 0xbf, 0xcf, 0xc9, 0x3f, 0x9d, 0x87, 0x2a, 0x13, 0x0e, 0xec, - 0x2e, 0xbf, 0x22, 0xbe, 0x8f, 0xb1, 0xd3, 0x97, 0xcc, 0x77, 0x61, 0xa2, - 0xdc, 0x5f, 0x4d, 0x01, 0xc3, 0x97, 0xfe, 0xce, 0x60, 0xfc, 0xee, 0x6e, - 0xd9, 0xcb, 0xf0, 0x81, 0xf7, 0xd1, 0xca, 0x83, 0xe9, 0x74, 0x1a, 0xdd, - 0x1f, 0x9c, 0x23, 0x72, 0xed, 0x42, 0x2e, 0xff, 0x38, 0x82, 0x61, 0x85, - 0x9c, 0xbc, 0xb1, 0x43, 0x96, 0x13, 0x97, 0xfd, 0xdf, 0xdf, 0x59, 0x82, - 0xa9, 0xcb, 0xf6, 0x9f, 0x77, 0x09, 0xcb, 0x20, 0x4f, 0x87, 0xc7, 0x35, - 0x08, 0xb3, 0xc1, 0xbe, 0xb8, 0xdf, 0xf4, 0x38, 0xf7, 0x30, 0x58, 0x72, - 0xff, 0x7b, 0xc9, 0x3a, 0xe0, 0x4e, 0x54, 0x8f, 0xa3, 0x0d, 0x6f, 0xfa, - 0x07, 0xf5, 0xc6, 0xbc, 0x87, 0x2f, 0x46, 0x70, 0xe5, 0xfe, 0xec, 0x49, - 0x36, 0xf1, 0x67, 0x28, 0x27, 0xa1, 0xa1, 0xbb, 0xf7, 0xcd, 0xf4, 0x8a, - 0x9c, 0xb3, 0xce, 0x79, 0xdb, 0x91, 0x5f, 0xfd, 0x2c, 0xea, 0x70, 0x3d, - 0x81, 0x61, 0xcb, 0xfd, 0xbc, 0xa0, 0x7d, 0x80, 0x39, 0x7d, 0xa0, 0x27, - 0x8e, 0x53, 0xa3, 0x07, 0x45, 0x3f, 0xa1, 0xfd, 0x33, 0xbf, 0x3f, 0x3d, - 0x9d, 0x39, 0x7f, 0xe4, 0x04, 0x48, 0x3d, 0x81, 0x61, 0xca, 0x91, 0xf2, - 0x78, 0x9e, 0xfe, 0xf4, 0xb3, 0x99, 0xa3, 0x94, 0x72, 0xf7, 0xef, 0xe3, - 0x97, 0x7f, 0x07, 0x2a, 0x46, 0xd3, 0xc3, 0xb4, 0x72, 0xfb, 0x76, 0x27, - 0x0e, 0x5e, 0x85, 0xa9, 0x88, 0x8e, 0xdc, 0xfd, 0x64, 0x3e, 0x0b, 0xa8, - 0x4c, 0xb3, 0x08, 0x92, 0x17, 0x77, 0x87, 0xdb, 0x67, 0x2f, 0x7c, 0x6a, - 0xda, 0xb3, 0x97, 0xfd, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x87, 0x52, - 0x22, 0x3a, 0x61, 0xf7, 0x29, 0xbf, 0x02, 0x19, 0x8b, 0x39, 0x7d, 0x13, - 0x60, 0x4e, 0x57, 0x0f, 0x27, 0x44, 0xf7, 0xfd, 0x90, 0x1e, 0xc6, 0xd4, - 0x4c, 0x72, 0xff, 0x01, 0x3b, 0xdc, 0x03, 0x9c, 0xa5, 0x9f, 0x68, 0x0e, - 0xea, 0x11, 0x62, 0xf0, 0x8f, 0xbf, 0xf3, 0x86, 0x03, 0xd4, 0x14, 0x59, - 0xcb, 0xff, 0x6c, 0x7e, 0x69, 0xfb, 0xa8, 0x9c, 0xe5, 0xfe, 0xd7, 0xec, - 0xcf, 0x0c, 0x1c, 0xa5, 0xa2, 0xc3, 0xa7, 0x9e, 0x41, 0xbf, 0xfb, 0xf9, - 0x75, 0xf9, 0xbf, 0xa1, 0x27, 0x39, 0x7f, 0xa5, 0x1c, 0x9e, 0x39, 0x39, - 0xcb, 0xf3, 0xeb, 0x66, 0x68, 0xe5, 0x41, 0xef, 0x00, 0xd6, 0xfc, 0x9e, - 0xd3, 0xa1, 0xcb, 0xfe, 0xe0, 0x38, 0xe3, 0xec, 0x01, 0xca, 0x01, 0xef, - 0x7e, 0x4d, 0x7b, 0xef, 0x24, 0x72, 0xfe, 0xfb, 0xef, 0xe3, 0x27, 0x39, - 0x52, 0x3d, 0x09, 0x87, 0xef, 0xfe, 0x60, 0xc7, 0x87, 0x36, 0x67, 0x24, - 0x72, 0xff, 0xbf, 0x15, 0x7e, 0xf7, 0xbf, 0xe8, 0xe5, 0xff, 0x7d, 0x80, - 0x4d, 0x28, 0xe4, 0xe7, 0x2f, 0xe1, 0x7f, 0x7d, 0x86, 0x1c, 0xa5, 0x9f, - 0x58, 0x9e, 0xdf, 0x08, 0x27, 0x01, 0xca, 0xc3, 0xc4, 0x42, 0x1b, 0xfd, - 0xaf, 0x9e, 0xf8, 0x1c, 0x13, 0x96, 0x01, 0xcb, 0x26, 0xe7, 0x91, 0xc3, - 0x7b, 0xf3, 0xef, 0xaf, 0x21, 0xca, 0x85, 0x41, 0xb8, 0x46, 0x88, 0x9d, - 0x87, 0x70, 0xb4, 0x68, 0xa2, 0xfc, 0xff, 0xab, 0x1f, 0x4e, 0x5f, 0x9a, - 0x59, 0xc8, 0xd1, 0xca, 0x98, 0xf5, 0x84, 0xae, 0xff, 0x9f, 0x51, 0x36, - 0xf2, 0xcd, 0x87, 0x2f, 0xff, 0xc1, 0xec, 0x7d, 0x53, 0xc2, 0xe0, 0xd6, - 0xa0, 0x05, 0x2e, 0x0e, 0x1c, 0xbf, 0x4f, 0x13, 0xbe, 0x8e, 0x56, 0x22, - 0x5d, 0x16, 0x1c, 0x5a, 0xe0, 0x7e, 0x72, 0xfe, 0x70, 0x4c, 0x30, 0x13, - 0x97, 0xfc, 0x39, 0x38, 0x7b, 0x83, 0xe3, 0x95, 0x07, 0xfb, 0xd1, 0x81, - 0x2d, 0xa6, 0xa1, 0xb3, 0xd7, 0x6a, 0xd1, 0x1a, 0x99, 0xeb, 0x44, 0xed, - 0x11, 0x98, 0xca, 0x1e, 0xa1, 0x8c, 0xd3, 0x23, 0x32, 0x55, 0x09, 0x90, - 0xe5, 0xde, 0x12, 0xc8, 0x43, 0x34, 0x72, 0xfc, 0x8f, 0x3d, 0x70, 0xc1, - 0xec, 0x65, 0x2f, 0x0d, 0x60, 0x18, 0x0c, 0x29, 0x74, 0xff, 0xe9, 0x50, - 0x1f, 0xc2, 0xc3, 0x61, 0x16, 0xdc, 0x34, 0xfe, 0xc2, 0xaa, 0xff, 0xfc, - 0xc5, 0x01, 0xcc, 0xdd, 0x9d, 0x4f, 0x69, 0xf7, 0x39, 0x4a, 0x2a, 0x1f, - 0xfe, 0x3c, 0x6b, 0xe8, 0xe4, 0x96, 0x72, 0xfb, 0x7d, 0x3b, 0x59, 0xcb, - 0xcf, 0xc5, 0x4e, 0x59, 0x49, 0xcf, 0x95, 0x08, 0x9b, 0x26, 0xbf, 0xca, - 0x67, 0x18, 0xee, 0xc3, 0x45, 0xe6, 0xa8, 0x75, 0xc9, 0xb2, 0x70, 0x0c, - 0x60, 0xb9, 0x4f, 0xe2, 0xde, 0x5a, 0x47, 0x23, 0x87, 0x5a, 0x9f, 0x61, - 0x5a, 0x35, 0xb0, 0xf6, 0xa1, 0x25, 0xb0, 0xde, 0xff, 0x29, 0x9c, 0x63, - 0xbb, 0x0d, 0x14, 0xb2, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x61, 0x2f, 0xff, - 0xd1, 0x82, 0x18, 0xec, 0x6f, 0xec, 0x17, 0x59, 0xcb, 0x68, 0xe5, 0xfd, - 0xff, 0x12, 0x77, 0x59, 0xcb, 0x29, 0x88, 0xc6, 0x59, 0xa6, 0x94, 0xb6, - 0xc4, 0x6f, 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x65, 0xae, 0xe2, 0xa7, - 0x2f, 0x94, 0x55, 0xa2, 0x6a, 0x0e, 0x51, 0x4b, 0xca, 0x7d, 0x59, 0xca, - 0x61, 0xed, 0x68, 0xbf, 0xf0, 0xba, 0x14, 0x51, 0x69, 0xca, 0xe8, 0xe9, - 0xcb, 0x00, 0xe5, 0xca, 0xce, 0x72, 0xdc, 0x91, 0xaa, 0xc1, 0x1a, 0x61, - 0xf3, 0x3a, 0x05, 0xc8, 0x03, 0x97, 0xfc, 0xfb, 0x8e, 0x6f, 0xe8, 0x54, - 0xe5, 0xfe, 0x9f, 0x7d, 0x40, 0x7c, 0x87, 0x2f, 0xd1, 0x9b, 0x23, 0x47, - 0x2d, 0x0e, 0x7b, 0xad, 0x9a, 0xd3, 0xa2, 0xf8, 0x61, 0x2f, 0x7c, 0xf2, - 0x90, 0x4e, 0x5f, 0xcf, 0xc8, 0xf3, 0xf4, 0xe5, 0xe6, 0xdb, 0x6c, 0xa5, - 0xff, 0x44, 0xb7, 0xf7, 0x23, 0x37, 0x28, 0xa1, 0xa0, 0xbf, 0xef, 0xdf, - 0x7c, 0xf2, 0x6e, 0xd9, 0xcb, 0xa3, 0x47, 0x28, 0x29, 0x85, 0xf4, 0x88, - 0x53, 0x34, 0x97, 0xb0, 0xf2, 0xe6, 0x89, 0xa8, 0x39, 0x7f, 0x23, 0xe8, - 0x1a, 0xfc, 0xe5, 0xff, 0xc9, 0x27, 0xd3, 0x8f, 0xec, 0xcd, 0x14, 0xbf, - 0xff, 0xba, 0x9e, 0xee, 0x68, 0x71, 0x7f, 0xeb, 0xaf, 0x23, 0x97, 0xfa, - 0x25, 0xe7, 0xeb, 0x84, 0xe5, 0x42, 0x34, 0x31, 0x0f, 0x8b, 0x76, 0x91, - 0xcb, 0x48, 0xe5, 0xa4, 0x72, 0xa0, 0xd9, 0xaa, 0x22, 0x82, 0x37, 0xf7, - 0xfa, 0xeb, 0xcb, 0x0e, 0x5f, 0xff, 0x69, 0x19, 0x83, 0xc8, 0x1c, 0x0e, - 0x2a, 0x72, 0x96, 0x7f, 0x7e, 0x2e, 0xb6, 0xe7, 0x2c, 0xa9, 0xcb, 0x7e, - 0x72, 0x84, 0xd2, 0x68, 0x4a, 0xb0, 0xfe, 0x34, 0x45, 0xe3, 0x6b, 0xb4, - 0xa9, 0xcb, 0x61, 0xcb, 0xbf, 0x04, 0x1a, 0x80, 0x8c, 0x5c, 0x90, 0x72, - 0xfe, 0x18, 0x58, 0xc6, 0x1c, 0xba, 0x50, 0x72, 0xa7, 0x44, 0x10, 0x4b, - 0x66, 0x15, 0xfc, 0xaa, 0xff, 0xff, 0xfb, 0xb1, 0xed, 0x26, 0xb5, 0x1e, - 0xea, 0x47, 0x00, 0xb7, 0x94, 0xbc, 0xa9, 0xcb, 0x93, 0x73, 0x97, 0x42, - 0xce, 0x5f, 0xff, 0xa0, 0x7f, 0x94, 0xa3, 0xdd, 0xc5, 0xfd, 0x80, 0x1c, - 0xbf, 0xfe, 0x41, 0xfe, 0x59, 0xae, 0x42, 0x49, 0xf4, 0x52, 0xa4, 0x8a, - 0x5f, 0x2b, 0xdc, 0xc5, 0x21, 0x90, 0x4b, 0x3c, 0x22, 0x24, 0x42, 0x18, - 0x6a, 0x64, 0x66, 0x2a, 0xa6, 0x30, 0x87, 0x90, 0xfe, 0x76, 0x11, 0x8c, - 0x83, 0x50, 0xd8, 0xf2, 0x06, 0xc7, 0xed, 0xb1, 0x7f, 0xb0, 0xbb, 0xbf, - 0xfc, 0xa2, 0xde, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x45, 0x18, 0xbf, 0x6c, - 0x8e, 0x40, 0x0e, 0x5f, 0x85, 0xc1, 0x1f, 0x4e, 0x5f, 0xf9, 0x37, 0x96, - 0x87, 0x3d, 0xdf, 0xce, 0x5f, 0xf2, 0x73, 0xb9, 0x83, 0x2d, 0x1c, 0xb6, - 0xf2, 0x3f, 0x76, 0x20, 0x5f, 0xf9, 0xe4, 0xce, 0xa2, 0xe3, 0x8a, 0x9c, - 0xb2, 0x90, 0x99, 0x87, 0x4a, 0x7d, 0x09, 0xf6, 0xca, 0x6a, 0x4c, 0xd2, - 0xce, 0x46, 0x0c, 0xb4, 0x67, 0xa4, 0x83, 0xea, 0x30, 0x7f, 0x47, 0x11, - 0x7f, 0xf2, 0x8f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x39, 0x5f, 0xfe, - 0x51, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x72, 0x5f, 0xe5, 0x33, - 0x8c, 0x77, 0x61, 0xa2, 0xcc, 0x5f, 0xf4, 0xb4, 0xeb, 0x53, 0xbe, 0x01, - 0xcb, 0xfe, 0x68, 0xc1, 0xc5, 0xc6, 0xf0, 0xb3, 0x97, 0xfb, 0x91, 0xee, - 0xbe, 0xf2, 0x39, 0x7f, 0xff, 0xfd, 0x13, 0x76, 0x3d, 0x1f, 0x53, 0x93, - 0x47, 0x73, 0x66, 0x77, 0x03, 0xb3, 0x0e, 0x50, 0x11, 0x6c, 0x26, 0x97, - 0xfd, 0x9a, 0x7f, 0x03, 0xe8, 0xc8, 0xe5, 0xfe, 0xcd, 0x73, 0x99, 0xbe, - 0x8e, 0x5e, 0xe6, 0x2c, 0xe5, 0xf2, 0x0e, 0x68, 0xe5, 0xb3, 0xc6, 0xf3, - 0x68, 0x72, 0xff, 0xc8, 0x31, 0xa8, 0xf4, 0xf8, 0xd9, 0xcb, 0xfb, 0x8c, - 0xeb, 0xa3, 0x4c, 0xe5, 0xf9, 0xc6, 0x36, 0x7e, 0x72, 0xed, 0xd6, 0x72, - 0xca, 0x35, 0x0a, 0xa6, 0xa2, 0x1e, 0xb3, 0x91, 0x48, 0xe8, 0x2e, 0x0b, - 0x29, 0xfc, 0xfb, 0x61, 0x8e, 0xd9, 0x4d, 0xfe, 0x53, 0x38, 0xc7, 0x76, - 0x1a, 0x2d, 0xd5, 0xfc, 0x2e, 0xa7, 0x27, 0xe9, 0xcb, 0xc9, 0xb8, 0x0e, - 0x5f, 0xfd, 0xc7, 0x60, 0x3f, 0xd7, 0xa3, 0x76, 0xce, 0x5c, 0x2a, 0x9c, - 0xbe, 0x63, 0xbb, 0x0d, 0x14, 0x82, 0xb0, 0xf1, 0x78, 0x2f, 0x7f, 0xa5, - 0xe4, 0x6f, 0x40, 0x43, 0x97, 0xfe, 0xce, 0xa6, 0xce, 0xe6, 0x0b, 0x0e, - 0x5e, 0x79, 0x28, 0x14, 0xc8, 0x32, 0x11, 0xbb, 0x90, 0xe8, 0xd2, 0xf3, - 0x8c, 0x8e, 0x59, 0x46, 0x27, 0xb9, 0xc2, 0xf5, 0xc6, 0x7a, 0xda, 0xad, - 0xff, 0xca, 0x3c, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0x49, 0x53, 0xaf, - 0x88, 0x4c, 0xa4, 0xb5, 0x87, 0x40, 0x04, 0xad, 0x51, 0x84, 0xbf, 0xa5, - 0x0e, 0x6d, 0x26, 0x5f, 0xe9, 0x20, 0xfb, 0x10, 0x27, 0x2f, 0x6b, 0xf5, - 0x9c, 0xb2, 0x9b, 0x9e, 0x7a, 0x18, 0xde, 0x17, 0x91, 0xcb, 0xf7, 0x18, - 0xee, 0xc3, 0x44, 0xec, 0xbf, 0xfb, 0x3a, 0x2f, 0x2f, 0xc0, 0xb7, 0x91, - 0xcb, 0xcf, 0x25, 0x30, 0xfe, 0x04, 0xd2, 0xe9, 0xda, 0xce, 0x5f, 0xff, - 0x90, 0x3f, 0xae, 0x36, 0x9c, 0x23, 0x03, 0x8c, 0x39, 0x7f, 0xa5, 0x1c, - 0x9e, 0x39, 0x39, 0xcb, 0xff, 0x74, 0x5e, 0x5f, 0x81, 0x6f, 0x23, 0x95, - 0x07, 0xe9, 0x86, 0xb6, 0x53, 0x13, 0xca, 0x5c, 0x24, 0xfa, 0x64, 0xe3, - 0x63, 0x0c, 0xab, 0xff, 0xe5, 0x3e, 0xed, 0xb8, 0x83, 0x3d, 0x02, 0x80, - 0x39, 0x7f, 0xf3, 0xaf, 0xb8, 0xc7, 0xec, 0x7d, 0x91, 0xcb, 0xc8, 0x17, - 0x39, 0x7f, 0xf0, 0xe7, 0x5e, 0x7c, 0xd0, 0xbe, 0xe7, 0x2e, 0xdb, 0x50, - 0x28, 0xa3, 0xea, 0x2e, 0x86, 0xea, 0x4a, 0xe0, 0x97, 0x1f, 0x9e, 0x96, - 0x76, 0xe1, 0xed, 0x7f, 0xff, 0x05, 0xfc, 0xa6, 0x6a, 0x07, 0x70, 0x6b, - 0x50, 0x03, 0x97, 0xee, 0x31, 0xdd, 0x86, 0x88, 0xb1, 0x7f, 0xe7, 0x92, - 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x2e, 0xaf, 0xff, 0xec, 0x0f, 0x63, 0xea, - 0x9e, 0x17, 0x06, 0xb5, 0x00, 0x29, 0x65, 0x31, 0x1b, 0x8b, 0x34, 0xdb, - 0x4b, 0xbf, 0xf9, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x62, 0x5f, - 0xff, 0x63, 0x21, 0x4e, 0xba, 0x6d, 0xa0, 0x30, 0x27, 0x29, 0x44, 0x51, - 0x75, 0x46, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x54, 0xad, 0x87, 0x2b, 0x0f, - 0x11, 0x53, 0x4b, 0xff, 0x7e, 0xfc, 0x90, 0xe3, 0x6e, 0x03, 0x97, 0xff, - 0x3e, 0xb8, 0x8d, 0xfb, 0xa9, 0xc9, 0x1c, 0xbf, 0xee, 0x3f, 0x77, 0x96, - 0x79, 0x40, 0xa2, 0x13, 0xa7, 0xf4, 0xa2, 0x3e, 0x5e, 0x14, 0xd7, 0xff, - 0x94, 0x5b, 0xc9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x9d, 0x17, 0xf9, 0x1f, - 0x91, 0x27, 0xd8, 0x72, 0xfd, 0x34, 0x4d, 0x1a, 0x39, 0x7f, 0x37, 0x89, - 0xb3, 0x04, 0xe5, 0x21, 0xeb, 0xe8, 0xa6, 0xf2, 0x76, 0x0e, 0x28, 0x68, - 0x6f, 0xfe, 0xff, 0x5e, 0x8d, 0xd4, 0xfe, 0x64, 0x59, 0xca, 0x59, 0xfb, - 0x74, 0xb2, 0xff, 0xcf, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x77, 0x5f, - 0xbd, 0xfb, 0xad, 0x0a, 0x5f, 0xf8, 0x63, 0xd9, 0xac, 0xcd, 0xe4, 0x72, - 0x82, 0x9f, 0x9e, 0x46, 0x42, 0xb2, 0x27, 0x4b, 0xf1, 0x45, 0xff, 0x06, - 0x25, 0x0a, 0x37, 0xa0, 0x1c, 0xbf, 0xa1, 0x40, 0x0e, 0x04, 0xe5, 0x28, - 0x8b, 0x7c, 0x4f, 0x13, 0xbb, 0xff, 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, - 0xec, 0x34, 0x50, 0xab, 0xff, 0xe7, 0xf4, 0xb0, 0x50, 0x2a, 0x6a, 0x78, - 0xe1, 0xcb, 0xff, 0xff, 0xdd, 0xfd, 0x6b, 0x79, 0x28, 0xce, 0xff, 0xe8, - 0x1c, 0x9d, 0x5f, 0xe2, 0x63, 0x97, 0xef, 0xf7, 0xf2, 0x30, 0xe5, 0xfb, - 0x01, 0x8e, 0x27, 0x2f, 0xb4, 0x8d, 0xf8, 0xe5, 0xe8, 0x02, 0x93, 0x9f, - 0x90, 0x95, 0x78, 0x96, 0x91, 0x33, 0x21, 0x87, 0x8d, 0xff, 0xe5, 0x16, - 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x29, 0x25, 0xff, 0xfe, 0xcd, 0x29, - 0xf7, 0x26, 0xeb, 0xaf, 0xdd, 0x8f, 0x7e, 0xb3, 0x95, 0x0c, 0x98, 0xc9, - 0xe3, 0x38, 0x94, 0x36, 0xd9, 0x1b, 0x0f, 0x0a, 0x17, 0x2c, 0x08, 0x05, - 0xe2, 0xb1, 0xe8, 0xe0, 0xbf, 0x27, 0xdb, 0x58, 0xbf, 0xca, 0x67, 0x18, - 0xee, 0xc3, 0x44, 0x48, 0xbf, 0xfc, 0xa2, 0xde, 0x4a, 0x67, 0x18, 0xee, - 0xc3, 0x44, 0xbc, 0xbc, 0xd4, 0x2c, 0x07, 0x2f, 0xb9, 0xff, 0xb4, 0x72, - 0xfd, 0xc0, 0x2d, 0x34, 0x72, 0xf4, 0x0e, 0xe7, 0x2f, 0xde, 0xfa, 0xb1, - 0x83, 0x96, 0x4e, 0x9e, 0x28, 0x8e, 0x5f, 0xfe, 0xee, 0xc8, 0x10, 0x35, - 0xe0, 0x73, 0x9b, 0x9c, 0xba, 0x3c, 0x72, 0xff, 0x9e, 0x7e, 0x46, 0xf2, - 0x45, 0x9c, 0xbf, 0xfd, 0xf8, 0x53, 0x9f, 0x66, 0xda, 0xfd, 0xc6, 0x63, - 0x95, 0x24, 0xc6, 0x10, 0x98, 0x09, 0xe2, 0x2d, 0xa3, 0xab, 0xf8, 0x1d, - 0x8e, 0x22, 0xce, 0x5f, 0xfa, 0x6d, 0x46, 0xc7, 0xec, 0x6f, 0x31, 0xca, - 0x83, 0xf0, 0x72, 0xdb, 0xf6, 0x4f, 0x9a, 0x59, 0xcb, 0xff, 0xa6, 0xf9, - 0xf4, 0x63, 0x63, 0xec, 0x89, 0x8e, 0x51, 0xcb, 0xf4, 0x9f, 0xcf, 0xb0, - 0xe5, 0xf9, 0xf5, 0x1b, 0x30, 0xe5, 0x4c, 0x7a, 0x3b, 0x0a, 0x6a, 0x11, - 0x9d, 0x89, 0xae, 0xb9, 0x77, 0x20, 0xe5, 0x05, 0x5d, 0xda, 0x12, 0x4d, - 0x1c, 0x2f, 0x21, 0x72, 0x24, 0x1b, 0x21, 0xed, 0xb4, 0x5b, 0x76, 0x09, - 0xcb, 0xfb, 0xe6, 0xbb, 0x89, 0xe3, 0x94, 0x13, 0xc4, 0x41, 0x5b, 0x83, - 0xb9, 0xcb, 0xf8, 0x7f, 0xf4, 0xd0, 0xa9, 0xcb, 0xcd, 0x34, 0xe1, 0xcb, - 0x23, 0x9e, 0x87, 0xe6, 0x17, 0xe1, 0xc9, 0xfe, 0xec, 0x39, 0x7d, 0x93, - 0xfd, 0xd8, 0x72, 0xfc, 0x18, 0xdc, 0x2f, 0xf0, 0xf4, 0xc4, 0xb2, 0xff, - 0xf9, 0x39, 0xf3, 0xb0, 0x9e, 0xd7, 0xec, 0xfe, 0x0e, 0x5f, 0x24, 0xe0, - 0x6b, 0x39, 0x7c, 0xc7, 0x76, 0x1a, 0x29, 0x75, 0xf0, 0xfa, 0x38, 0x72, - 0xff, 0xb3, 0x8d, 0x78, 0x1c, 0xe6, 0xe7, 0x29, 0x0f, 0x77, 0x61, 0x0d, - 0x49, 0x36, 0x75, 0x50, 0x26, 0x53, 0xe1, 0x37, 0x61, 0x17, 0x7f, 0x07, - 0x78, 0xe2, 0x6e, 0x72, 0xfb, 0xd3, 0xe3, 0x67, 0x29, 0x0f, 0x4c, 0x4b, - 0xef, 0xfd, 0x03, 0x1d, 0xf9, 0xf8, 0xfe, 0xc3, 0x97, 0xbf, 0x7d, 0x1c, - 0xbe, 0x9b, 0xf7, 0x98, 0xe5, 0xfa, 0x00, 0xfb, 0xe8, 0xe5, 0xe1, 0x40, - 0x1c, 0xbd, 0x9e, 0xd1, 0xca, 0x83, 0x6f, 0xa1, 0xba, 0x0a, 0x60, 0x53, - 0x20, 0xf4, 0x74, 0x04, 0xbe, 0x5f, 0xbf, 0x35, 0xb8, 0x87, 0x68, 0xe5, - 0xd1, 0xb9, 0xcb, 0xfe, 0x06, 0xb9, 0x1b, 0xc9, 0x16, 0x72, 0xf7, 0x9f, - 0x61, 0xcb, 0xf4, 0xff, 0xcd, 0x0d, 0x67, 0x2f, 0xbf, 0x9a, 0x1a, 0xce, - 0x5c, 0xf3, 0xfc, 0x3d, 0x59, 0xcb, 0xaa, 0x11, 0xbc, 0xe7, 0x5f, 0xb9, - 0xdf, 0xf2, 0x6a, 0x64, 0x1f, 0x40, 0x0e, 0x5f, 0xfc, 0x3e, 0xd9, 0x1c, - 0xd3, 0x8c, 0x35, 0x9c, 0xa9, 0x22, 0xb9, 0x65, 0xfa, 0x38, 0xbf, 0xd0, - 0xd7, 0xa8, 0x5b, 0xf8, 0xe5, 0xce, 0x27, 0x2f, 0xfa, 0x01, 0xf3, 0xb0, - 0xb7, 0x13, 0x95, 0xb9, 0xe7, 0x6c, 0x15, 0xa9, 0x22, 0xa3, 0x90, 0x83, - 0xbf, 0xa1, 0xb4, 0xef, 0xed, 0x67, 0x2f, 0xed, 0xe5, 0xa7, 0x1d, 0xce, - 0x54, 0x2b, 0x31, 0x91, 0x6e, 0x47, 0x46, 0x90, 0xd8, 0xe1, 0x47, 0xd3, - 0x2b, 0xdc, 0x85, 0x9c, 0xbf, 0xa0, 0x66, 0xf2, 0x2a, 0x72, 0xff, 0xa5, - 0x9c, 0x9b, 0x06, 0x16, 0x72, 0xfc, 0x08, 0x66, 0x2c, 0xe5, 0xfe, 0xc9, - 0xf5, 0x13, 0x7f, 0xc3, 0x94, 0x88, 0x95, 0xe1, 0xc0, 0x93, 0xdd, 0x2c, - 0x39, 0x7d, 0xc1, 0x85, 0x9c, 0xbd, 0x00, 0xd1, 0xca, 0x84, 0x40, 0x84, - 0xbb, 0x05, 0x9b, 0x21, 0xbe, 0x7e, 0xbc, 0xe7, 0x2f, 0xdd, 0xfd, 0x5c, - 0x13, 0x97, 0xf9, 0xb1, 0x7f, 0x49, 0xc2, 0x72, 0xff, 0xa3, 0xba, 0x7f, - 0x47, 0x36, 0x8e, 0x5f, 0xf9, 0x6e, 0x1f, 0xb3, 0x4a, 0x07, 0x73, 0x94, - 0x13, 0xfd, 0x43, 0xbb, 0xee, 0x03, 0xee, 0xc3, 0x97, 0x91, 0xbf, 0x1c, - 0xae, 0x9e, 0x26, 0x89, 0xea, 0x74, 0xe0, 0x82, 0x45, 0xb9, 0x4f, 0x61, - 0x61, 0xe6, 0x5b, 0xfc, 0x3e, 0xcd, 0x23, 0xf4, 0xe5, 0xff, 0x01, 0x3b, - 0x9c, 0x79, 0xb4, 0x72, 0xff, 0xfd, 0x12, 0x18, 0x9f, 0xec, 0xda, 0xee, - 0x6d, 0x70, 0x07, 0x2f, 0xef, 0x8b, 0xcf, 0x3f, 0x8e, 0x59, 0x87, 0x2e, - 0xdf, 0x58, 0x78, 0x0e, 0x5f, 0x7a, 0x10, 0x27, 0x2a, 0x13, 0x4e, 0xdc, - 0xc5, 0x67, 0x2f, 0x09, 0xcd, 0x16, 0xdf, 0xec, 0x6e, 0x49, 0xaf, 0xd6, - 0x72, 0xed, 0x9a, 0x39, 0x7f, 0x7f, 0xa8, 0x9b, 0xfe, 0x1c, 0xbf, 0x64, - 0xf9, 0xdd, 0x1c, 0xa8, 0x3f, 0x2e, 0x8c, 0x89, 0x8d, 0xec, 0xe6, 0x8e, - 0x53, 0x0f, 0x27, 0x61, 0x6d, 0xff, 0x02, 0x01, 0xf7, 0x64, 0x0e, 0xd1, - 0xca, 0x84, 0xd4, 0xf2, 0x1e, 0x08, 0x49, 0x7f, 0xff, 0xf7, 0x63, 0x9b, - 0xb1, 0x37, 0xf8, 0xab, 0xfc, 0xd7, 0x5d, 0x90, 0x21, 0x39, 0x7c, 0x8a, - 0xed, 0xe1, 0xcb, 0xfb, 0xef, 0xa2, 0x71, 0xdc, 0xe5, 0xe1, 0x45, 0x9c, - 0xae, 0x1f, 0x88, 0x09, 0x7c, 0x63, 0x7f, 0x86, 0x1c, 0x7d, 0x82, 0x72, - 0xff, 0x75, 0xe6, 0x4e, 0x44, 0xe7, 0x2e, 0xc5, 0x9c, 0xa0, 0xa7, 0x23, - 0x90, 0xe9, 0x59, 0x7b, 0x97, 0xec, 0x34, 0xbf, 0x6d, 0x22, 0xe3, 0x47, - 0x2f, 0xcf, 0xb3, 0x39, 0xa3, 0x94, 0x13, 0xd3, 0x59, 0x55, 0xfb, 0xae, - 0x28, 0xb3, 0x97, 0xca, 0xcd, 0xa8, 0x39, 0x7f, 0x03, 0x70, 0x67, 0x30, - 0xe5, 0xfc, 0xe0, 0x5c, 0x67, 0x8e, 0x54, 0x1e, 0xd2, 0x17, 0x5f, 0xe7, - 0x06, 0xa3, 0xb1, 0xa3, 0x97, 0xed, 0xfd, 0xac, 0x9c, 0xe5, 0xd9, 0x39, - 0xca, 0x73, 0xc1, 0x12, 0xaa, 0x84, 0xde, 0x70, 0x89, 0x09, 0xba, 0xfc, - 0x24, 0x1a, 0x73, 0xb8, 0x0c, 0x39, 0x6d, 0x1c, 0xb9, 0x15, 0xd1, 0xa8, - 0xfc, 0x5e, 0xf0, 0x1d, 0x87, 0x2f, 0x9b, 0x9b, 0x50, 0x72, 0xfe, 0xd0, - 0xbc, 0xf1, 0xe3, 0x97, 0xe9, 0xdf, 0x59, 0x23, 0x97, 0xff, 0xc1, 0xcd, - 0x8f, 0xc9, 0xbe, 0xc9, 0xfc, 0xeb, 0x39, 0x50, 0x7f, 0x88, 0x51, 0x7f, - 0x3e, 0xe0, 0x5a, 0x68, 0xe5, 0x42, 0x66, 0xfb, 0x8e, 0x4c, 0x49, 0xc8, - 0x54, 0xf4, 0x82, 0xff, 0x79, 0x1b, 0x79, 0xa1, 0x67, 0x2c, 0xa3, 0x56, - 0xdc, 0xa9, 0x44, 0xbd, 0xd9, 0xe1, 0x7d, 0x22, 0x10, 0xb4, 0x64, 0x7c, - 0x3b, 0xc2, 0x95, 0x23, 0x22, 0x9a, 0x5b, 0xef, 0x18, 0xd6, 0x39, 0xd8, - 0xd1, 0x1e, 0x3b, 0xe0, 0x47, 0x40, 0x31, 0xd1, 0x6a, 0x3c, 0x4f, 0x4a, - 0x1c, 0xdb, 0x7c, 0xfb, 0x1b, 0x2e, 0xd2, 0x8d, 0xfe, 0x53, 0x38, 0xc7, - 0x76, 0x1a, 0x29, 0xc5, 0xfe, 0x5c, 0x2f, 0x36, 0xa3, 0xc7, 0x2f, 0xfc, - 0x9c, 0x7d, 0x77, 0x30, 0x58, 0x72, 0xfc, 0xbe, 0x73, 0x34, 0x72, 0xff, - 0xfd, 0xdf, 0xfd, 0xc8, 0xf6, 0xb1, 0x9a, 0x8e, 0x30, 0xe5, 0xff, 0xfd, - 0xec, 0x98, 0x53, 0x5e, 0x8f, 0xa9, 0xc9, 0xa3, 0xa7, 0x2f, 0xf2, 0x2c, - 0x31, 0xaf, 0xc4, 0xe5, 0xfd, 0x9e, 0xde, 0x50, 0xd9, 0xcb, 0xff, 0x26, - 0xfa, 0x1c, 0x0f, 0x5d, 0xb3, 0x97, 0xff, 0xd9, 0x3e, 0x6f, 0xed, 0x20, - 0xc0, 0x1d, 0x67, 0x29, 0x54, 0x47, 0x68, 0xfe, 0xff, 0xd9, 0xd8, 0xe6, - 0x28, 0xdb, 0x6d, 0x94, 0xb9, 0x1b, 0x39, 0x74, 0xea, 0x42, 0xab, 0xa0, - 0x9a, 0xe1, 0xe3, 0x0a, 0x11, 0x5f, 0xab, 0xa2, 0x67, 0xe8, 0x5e, 0xed, - 0x92, 0x6d, 0x21, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x2b, 0xc5, 0xff, 0xfd, - 0x81, 0xec, 0x7d, 0x53, 0xc2, 0xe0, 0xd6, 0xa0, 0x05, 0x2c, 0xa6, 0x22, - 0x47, 0x6c, 0xd2, 0xff, 0xe5, 0x1e, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, - 0x8e, 0xbc, 0xcc, 0x59, 0xcb, 0xc8, 0x08, 0x39, 0x79, 0x98, 0xb2, 0x8a, - 0x17, 0x77, 0xee, 0x31, 0xdd, 0x86, 0x89, 0x21, 0x7f, 0xff, 0x42, 0x71, - 0x36, 0xa0, 0x67, 0x8f, 0x27, 0x5e, 0x73, 0x97, 0xff, 0x87, 0x01, 0xb7, - 0x9c, 0x89, 0xdf, 0x8c, 0x39, 0x74, 0x94, 0x84, 0xc2, 0x30, 0xb3, 0xa6, - 0x9e, 0x5c, 0xbf, 0x67, 0x54, 0xc5, 0x9c, 0xb2, 0x90, 0x9d, 0x83, 0xc6, - 0x7f, 0xe4, 0x9b, 0xff, 0x94, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, - 0x52, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x78, 0xaf, 0xfa, 0x4a, 0x67, 0x18, - 0xee, 0xc3, 0x44, 0x9a, 0xb2, 0x98, 0x7f, 0x4e, 0x69, 0x7f, 0x46, 0x91, - 0x71, 0x31, 0xcb, 0x74, 0xe5, 0x2c, 0xdf, 0x36, 0x5b, 0x7e, 0x40, 0x6b, - 0x04, 0xe5, 0xff, 0xc9, 0xfb, 0x35, 0xa7, 0xe7, 0xa1, 0x53, 0x97, 0xff, - 0xdf, 0xbe, 0xf9, 0x8a, 0xaa, 0xf2, 0xcd, 0xfc, 0x72, 0xa4, 0x8b, 0xf0, - 0x93, 0x69, 0x1a, 0xff, 0xe7, 0x03, 0x3a, 0x9c, 0x14, 0xf6, 0x8e, 0x5c, - 0x33, 0x9c, 0xa7, 0x3d, 0xaf, 0xa8, 0x77, 0x73, 0xc7, 0x2f, 0x4c, 0x33, - 0x9c, 0xb9, 0xd8, 0x72, 0xfe, 0x60, 0x7f, 0x9f, 0xea, 0xce, 0x54, 0x1e, - 0x4e, 0x0b, 0x58, 0x4e, 0x5d, 0xf7, 0xe9, 0xca, 0x01, 0xab, 0xfa, 0x21, - 0x76, 0xda, 0x90, 0xa9, 0xeb, 0x21, 0xc3, 0xd8, 0x45, 0x39, 0x1e, 0x85, - 0xfc, 0xcf, 0xf5, 0x2e, 0xa1, 0xd3, 0x0f, 0x4e, 0x81, 0x2a, 0xe6, 0xa8, - 0x31, 0xb9, 0xa4, 0xaf, 0xa9, 0xa3, 0x33, 0x59, 0x67, 0x65, 0x01, 0x78, - 0xf3, 0xf8, 0x66, 0x7d, 0x95, 0xbf, 0x51, 0x3a, 0x23, 0xe3, 0x3c, 0xb0, - 0x89, 0x4f, 0x30, 0x06, 0x78, 0xd7, 0x31, 0x5c, 0x62, 0xac, 0xf2, 0xbb, - 0x2f, 0xa3, 0x2f, 0x7a, 0xdb, 0x35, 0x29, 0x77, 0x4d, 0x72, 0x8d, 0xe6, - 0xb7, 0x97, 0x9c, 0xb5, 0xac, 0x2b, 0xcf, 0x4c, 0xb7, 0xb4, 0xd9, 0xf7, - 0xbc, 0x08, 0x40, 0x52, 0x75, 0x9a, 0x72, 0xa4, 0xc6, 0xb9, 0xab, 0xd5, - 0x7b, 0x41, 0xeb, 0xe7, 0x97, 0xfe, 0xdf, 0x16, 0x6c, 0xa6, 0xfd, 0x37, - 0x3f, 0x0b, 0xb7, 0x38, 0xb7, 0xf6, 0x93, 0xb3, 0xb5, 0x69, 0xb6, 0xe8, + 0x26, 0x94, 0x72, 0x72, 0xd3, 0x1c, 0xbf, 0x67, 0x5c, 0x42, 0x72, 0xa7, + 0x37, 0x00, 0x12, 0xba, 0x15, 0x39, 0x7f, 0x38, 0x35, 0xc2, 0xb8, 0x57, + 0x0a, 0x39, 0x7f, 0x24, 0x32, 0x7c, 0x6c, 0xe5, 0xff, 0xf6, 0x7b, 0xb9, + 0x2d, 0xb8, 0xfb, 0xaf, 0x23, 0x97, 0x40, 0x0e, 0x5f, 0xe7, 0xe6, 0x16, + 0x8b, 0xfb, 0xb4, 0x49, 0x09, 0x72, 0x89, 0xd5, 0x89, 0xef, 0x23, 0xcf, + 0x48, 0x84, 0x5f, 0x50, 0xd2, 0xbf, 0x03, 0xb1, 0x2d, 0x1c, 0xbc, 0xdb, + 0xce, 0x72, 0xff, 0xa0, 0x0f, 0xe0, 0x28, 0x32, 0x39, 0x5d, 0x3d, 0x71, + 0x1e, 0xa8, 0x45, 0x07, 0x9f, 0xed, 0xf5, 0xab, 0x5f, 0x84, 0x81, 0x80, + 0xbe, 0x64, 0x69, 0x4b, 0x87, 0xc7, 0x25, 0xbb, 0x84, 0xb8, 0x08, 0x46, + 0x11, 0x1a, 0x21, 0xf4, 0xa1, 0x15, 0x21, 0xdb, 0x7e, 0xda, 0xdd, 0xd6, + 0x68, 0xaa, 0x97, 0xfe, 0x79, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x89, 0xb5, + 0x6f, 0xb8, 0x88, 0x06, 0x1a, 0x5f, 0xef, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, + 0x5f, 0xaf, 0xdb, 0x5b, 0xba, 0xcd, 0x16, 0x32, 0xee, 0x09, 0x1c, 0xb7, + 0xdc, 0x3c, 0xe9, 0x8d, 0x2f, 0xda, 0x5f, 0x61, 0x53, 0x97, 0xf8, 0x7f, + 0x96, 0x69, 0xfc, 0x72, 0xfe, 0x6a, 0x82, 0xd5, 0xb5, 0x62, 0xa9, 0xcb, + 0xfe, 0x1f, 0xe7, 0x9a, 0x51, 0xb9, 0xce, 0x5d, 0xbf, 0x1c, 0xbe, 0x79, + 0x60, 0x4e, 0x5f, 0xde, 0xcd, 0x87, 0x04, 0xe5, 0xb0, 0x27, 0x9b, 0xe2, + 0x1b, 0xca, 0xcb, 0x0e, 0x5b, 0xee, 0x26, 0xac, 0xc3, 0x3e, 0x9f, 0x39, + 0xe8, 0xb2, 0x68, 0x9e, 0xc9, 0xf5, 0x3d, 0xcd, 0xc6, 0xff, 0x7e, 0xda, + 0xdd, 0xd6, 0x68, 0xb5, 0x57, 0xfe, 0x79, 0x7d, 0xcd, 0xad, 0xdd, 0x66, + 0x8a, 0x09, 0x7e, 0x86, 0xda, 0x66, 0xce, 0x5b, 0xee, 0x22, 0xa9, 0x86, + 0x8a, 0x26, 0x5f, 0xf9, 0xdb, 0xf6, 0x77, 0xeb, 0xef, 0xc7, 0x2f, 0xf4, + 0x08, 0x21, 0xad, 0xd8, 0x72, 0xff, 0xf4, 0xd1, 0xc5, 0xf7, 0xad, 0x26, + 0xf1, 0x53, 0x97, 0xfd, 0x09, 0x34, 0x71, 0x7d, 0xe8, 0xe5, 0xdb, 0x83, + 0x95, 0x24, 0x68, 0xa1, 0xa7, 0x53, 0x78, 0x0e, 0xaf, 0x96, 0xee, 0xb3, + 0x45, 0xc4, 0xbf, 0xbf, 0x7e, 0x43, 0x9b, 0x39, 0x5b, 0x3d, 0xdd, 0x17, + 0x5e, 0xdc, 0x30, 0xe5, 0xf3, 0xf0, 0x24, 0xe7, 0x2f, 0xdd, 0xfd, 0x5c, + 0x13, 0x97, 0xe0, 0xe3, 0x5c, 0x74, 0xe5, 0xee, 0x04, 0x59, 0xca, 0x09, + 0xf9, 0x6c, 0xa7, 0x80, 0xaa, 0xff, 0x31, 0xe5, 0xa4, 0x0e, 0x1c, 0xbe, + 0x85, 0x63, 0x47, 0x2f, 0xc3, 0xe1, 0x75, 0x4e, 0x51, 0xcb, 0x6b, 0x0d, + 0x93, 0x42, 0x7b, 0xf9, 0x8f, 0xc6, 0x37, 0xc0, 0x72, 0xff, 0xc8, 0x1c, + 0xe2, 0xcc, 0x97, 0x32, 0x39, 0x50, 0x7e, 0x78, 0x65, 0x7f, 0x66, 0xdf, + 0xdf, 0xc1, 0xcb, 0xff, 0xe7, 0x18, 0x4e, 0x0d, 0x26, 0xb3, 0xb8, 0xd0, + 0xe5, 0x04, 0xff, 0xb8, 0x96, 0xdf, 0xfc, 0x83, 0xfc, 0xb3, 0x5a, 0x40, + 0xe1, 0xca, 0x98, 0xf9, 0xfc, 0x49, 0x6f, 0xb0, 0xaf, 0xb3, 0x21, 0x39, + 0xb2, 0x2e, 0x8e, 0x3c, 0x25, 0xc0, 0x64, 0x26, 0x5a, 0x54, 0xf4, 0x26, + 0xd4, 0x8c, 0x16, 0xfd, 0xc3, 0x70, 0xb8, 0x15, 0x83, 0x97, 0xfe, 0x4e, + 0x78, 0x56, 0xb7, 0xf3, 0xe7, 0x5a, 0x1c, 0xbe, 0xec, 0x79, 0x67, 0x29, + 0xa9, 0x1f, 0x78, 0x53, 0x6f, 0xff, 0x70, 0xa5, 0x5b, 0x6b, 0x9c, 0x3c, + 0x37, 0xcf, 0x9d, 0x68, 0x72, 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x74, 0xaf, + 0xd0, 0x2e, 0x18, 0x39, 0x7a, 0x3d, 0xc0, 0x72, 0xfb, 0x03, 0x81, 0x39, + 0x7f, 0xcf, 0xc6, 0x3d, 0xaf, 0xd7, 0xc3, 0x9c, 0xbe, 0xd4, 0xee, 0xa1, + 0xcb, 0x7d, 0xe1, 0x4a, 0x8b, 0xa2, 0x14, 0x92, 0x28, 0xc6, 0x44, 0x34, + 0xe9, 0x2b, 0x8f, 0x89, 0x0f, 0x90, 0x6f, 0xff, 0xb0, 0x7c, 0x8c, 0xec, + 0x20, 0xbe, 0xd5, 0x39, 0x7f, 0x66, 0x69, 0x7e, 0x83, 0x97, 0xf4, 0xf1, + 0xe7, 0x57, 0xf3, 0x94, 0x72, 0xff, 0xe8, 0xd8, 0x3e, 0x6b, 0xb0, 0xc7, + 0x13, 0x97, 0xfa, 0x36, 0xa7, 0x7b, 0x80, 0x39, 0x52, 0x3f, 0x9e, 0xa2, + 0xdf, 0xd2, 0x79, 0x38, 0xac, 0xe5, 0xff, 0xec, 0xf4, 0x36, 0xa4, 0xfa, + 0xc6, 0x43, 0x59, 0xcb, 0x7d, 0x6a, 0x93, 0x21, 0xc8, 0x42, 0x4c, 0x44, + 0x25, 0x95, 0xb4, 0xe8, 0x19, 0x1a, 0x8d, 0xf6, 0x36, 0xd5, 0x30, 0xe5, + 0xfc, 0x31, 0xcb, 0x1f, 0xc7, 0x2f, 0xff, 0x36, 0xe1, 0xec, 0x73, 0xe8, + 0xeb, 0xb5, 0x9c, 0xb2, 0x6c, 0xfe, 0xfa, 0x5b, 0x7f, 0xff, 0xdf, 0xee, + 0x5a, 0xeb, 0xa6, 0xf7, 0xbf, 0xf9, 0x4d, 0xbe, 0x8e, 0x5f, 0xf8, 0x5d, + 0xbf, 0x67, 0x5e, 0x67, 0x39, 0x7f, 0xff, 0x74, 0x7f, 0x76, 0xbc, 0x97, + 0x71, 0x5c, 0x0c, 0xdf, 0x9c, 0xb9, 0x78, 0x72, 0xa0, 0xfd, 0xd5, 0x61, + 0xbf, 0xcf, 0xed, 0x47, 0x54, 0x98, 0xe5, 0xe9, 0x43, 0x0e, 0x5e, 0x57, + 0x52, 0x39, 0x7f, 0xe9, 0x66, 0xf6, 0xf2, 0x9f, 0x1b, 0x39, 0x7f, 0xf6, + 0x06, 0x25, 0x1b, 0x85, 0x1c, 0x4e, 0x5f, 0xfb, 0x8e, 0x49, 0x81, 0x4e, + 0x30, 0x13, 0x94, 0xc4, 0x42, 0x3a, 0x15, 0xcf, 0xf6, 0x75, 0x52, 0xd3, + 0x35, 0x6e, 0x16, 0xbd, 0x22, 0x73, 0x5d, 0x0e, 0x78, 0x79, 0x48, 0x62, + 0x57, 0x55, 0xa4, 0x8c, 0xab, 0xdb, 0xfd, 0x2c, 0xf7, 0x61, 0x41, 0x39, + 0x7f, 0xef, 0x22, 0xd0, 0x2e, 0x2a, 0xc1, 0xcb, 0xfe, 0x8e, 0x7a, 0xfa, + 0xf4, 0x36, 0x72, 0xa0, 0xfd, 0xf6, 0x7b, 0x77, 0xfd, 0x39, 0x7e, 0x1c, + 0xeb, 0xf8, 0xe5, 0xfd, 0x27, 0xce, 0x30, 0x13, 0x95, 0xc2, 0x1e, 0xa3, + 0x53, 0x26, 0xbe, 0x4f, 0xe5, 0x07, 0x2f, 0xcf, 0x34, 0x93, 0xc7, 0x2f, + 0xfd, 0x01, 0xdc, 0x49, 0x39, 0xf6, 0x1c, 0xa9, 0x22, 0x20, 0x04, 0x5e, + 0x28, 0xbf, 0xf4, 0x6f, 0x5d, 0x45, 0xaf, 0xf9, 0xce, 0x5f, 0xff, 0xf4, + 0x07, 0xb9, 0xcf, 0x85, 0xfa, 0x07, 0xd6, 0x9f, 0x6b, 0x39, 0x7f, 0xb3, + 0x31, 0x55, 0x5e, 0x47, 0x29, 0x54, 0x4c, 0xf9, 0x9a, 0xfd, 0x9a, 0x5f, + 0xa0, 0xe5, 0xff, 0xe4, 0x6f, 0x4b, 0xea, 0x73, 0xed, 0xee, 0x0e, 0x5f, + 0xff, 0xf3, 0xb6, 0xa6, 0x6c, 0x5f, 0x99, 0x2e, 0x3d, 0xac, 0xe7, 0xc7, + 0x2b, 0x11, 0xb9, 0xb2, 0x77, 0x4c, 0xbf, 0x71, 0x4d, 0xe0, 0x4e, 0x5f, + 0xff, 0x6b, 0xa9, 0xaf, 0x77, 0x02, 0x9a, 0xc1, 0x39, 0x7b, 0xb0, 0x38, + 0x7e, 0xff, 0x94, 0xdf, 0xe8, 0x66, 0x23, 0x21, 0xac, 0xe5, 0xfe, 0x93, + 0x34, 0x83, 0xcc, 0x8e, 0x52, 0xcf, 0xa2, 0x63, 0x4b, 0xff, 0xd9, 0xbd, + 0xbc, 0xb4, 0x38, 0xc5, 0x39, 0x39, 0x79, 0xdd, 0x66, 0x89, 0x31, 0x7b, + 0x81, 0x34, 0x72, 0x96, 0x78, 0xfc, 0x05, 0x17, 0xe5, 0xf0, 0xae, 0x19, + 0xaa, 0xe1, 0x0e, 0x5f, 0xfe, 0xe6, 0x5a, 0xce, 0x2e, 0xcc, 0x56, 0x34, + 0x72, 0xff, 0x67, 0x3e, 0xf3, 0xcb, 0x47, 0x2a, 0x11, 0x7f, 0x87, 0xdb, + 0x4d, 0xbf, 0xc2, 0xfe, 0xd2, 0xff, 0x13, 0x97, 0xff, 0xc0, 0x40, 0x37, + 0x89, 0xc4, 0x73, 0xdd, 0x43, 0x97, 0xf9, 0xf9, 0xd3, 0xbc, 0xb4, 0x72, + 0xdb, 0xc4, 0x41, 0xf5, 0x42, 0xb1, 0x1b, 0xc9, 0x0b, 0x6b, 0xff, 0xfd, + 0xfb, 0xf3, 0x83, 0x0d, 0xa9, 0xe1, 0x80, 0x67, 0x3e, 0x39, 0x52, 0x57, + 0x91, 0x90, 0x9a, 0x59, 0x1e, 0xe1, 0x24, 0xc8, 0x72, 0x76, 0x30, 0xcd, + 0x13, 0x5f, 0xc1, 0x07, 0x09, 0xa0, 0x34, 0x39, 0x7b, 0x48, 0x13, 0x97, + 0xf0, 0xc7, 0x2c, 0x7f, 0x1c, 0xbf, 0xe8, 0x5f, 0xbf, 0xee, 0xe1, 0xb3, + 0x97, 0xf9, 0x69, 0xbd, 0x4d, 0x0e, 0x72, 0xff, 0xef, 0xf5, 0xd7, 0x97, + 0x5e, 0x50, 0x27, 0x2b, 0x93, 0xf7, 0xd9, 0x9d, 0xdd, 0x49, 0x93, 0x1e, + 0xd8, 0xe3, 0x0b, 0x7d, 0x0b, 0x2b, 0xef, 0x23, 0x1c, 0xe5, 0x95, 0x39, + 0x7f, 0x77, 0x51, 0xe8, 0x09, 0xca, 0xc3, 0x7e, 0x82, 0x55, 0x87, 0xff, + 0xe6, 0x0b, 0xfe, 0x8e, 0xf9, 0x27, 0x64, 0x2c, 0xe5, 0xff, 0xf9, 0xd7, + 0xb8, 0xe8, 0xe7, 0xb3, 0xeb, 0x6d, 0xb6, 0x52, 0xa4, 0x8b, 0x3d, 0x10, + 0xf8, 0xe6, 0xfe, 0x5a, 0xff, 0x58, 0xc1, 0xcb, 0xff, 0xd9, 0xcc, 0x86, + 0x25, 0xb8, 0xf3, 0xf8, 0xe5, 0xff, 0x9f, 0xd1, 0xbd, 0x76, 0x07, 0xc7, + 0x2f, 0xd9, 0x24, 0x7e, 0x27, 0x28, 0x4f, 0x97, 0x47, 0xb5, 0x24, 0x67, + 0xff, 0x0a, 0xeb, 0xcc, 0x7e, 0x9c, 0xbf, 0xfc, 0x31, 0x2d, 0xef, 0xfe, + 0x53, 0x6f, 0xa3, 0x97, 0xff, 0xda, 0xc5, 0x47, 0x3d, 0xac, 0x90, 0xbb, + 0x67, 0x2c, 0x9d, 0x44, 0xd7, 0x92, 0xe9, 0x11, 0xbd, 0xc6, 0x16, 0xd7, + 0xdc, 0x11, 0xdd, 0x1c, 0xbf, 0xec, 0x9f, 0xc3, 0x1f, 0xfb, 0x47, 0x2a, + 0x11, 0x11, 0x85, 0x3b, 0x25, 0xbc, 0x00, 0x41, 0xcb, 0xf0, 0xff, 0x3f, + 0x2d, 0x67, 0x2b, 0x47, 0x95, 0xe1, 0xcb, 0xff, 0xd1, 0x38, 0xe6, 0x4f, + 0xe5, 0x60, 0x64, 0x72, 0xff, 0xce, 0x33, 0xf5, 0xd8, 0x9a, 0x43, 0x94, + 0xe8, 0xa9, 0x12, 0x26, 0xd2, 0xaf, 0x36, 0xdb, 0x65, 0x2f, 0xa7, 0x62, + 0x68, 0xa7, 0xd3, 0x41, 0x74, 0x04, 0xe5, 0xb6, 0xe7, 0x96, 0x26, 0xb7, + 0xe8, 0xc1, 0x76, 0x1c, 0xbf, 0xf3, 0xcb, 0xa9, 0xc8, 0x36, 0xe1, 0x39, + 0x7f, 0xff, 0xe7, 0x15, 0xef, 0x38, 0xc0, 0xf9, 0x91, 0x82, 0x1c, 0xe7, + 0xc7, 0x28, 0x08, 0xcf, 0x12, 0x5f, 0xcf, 0xef, 0xf4, 0xa3, 0x73, 0xc6, + 0xe7, 0x39, 0x7f, 0x6b, 0x49, 0x82, 0x03, 0x97, 0xb7, 0x8d, 0x67, 0x2f, + 0xfd, 0x0d, 0xa9, 0x3e, 0xb1, 0x90, 0xd6, 0x72, 0xb6, 0x88, 0xf6, 0x16, + 0x78, 0x7e, 0xa1, 0x1e, 0x99, 0x0c, 0x4b, 0xff, 0xe4, 0x98, 0x63, 0xda, + 0xf7, 0x2b, 0x41, 0x9c, 0xe5, 0xff, 0xff, 0xe4, 0x10, 0x28, 0x39, 0xbd, + 0xe3, 0x78, 0xd7, 0x83, 0x00, 0x63, 0xc8, 0xe5, 0xff, 0xfd, 0xed, 0x7e, + 0x1e, 0xa6, 0x4c, 0xe8, 0xd6, 0x9c, 0xc8, 0xe5, 0xff, 0xfc, 0x38, 0x07, + 0x10, 0x6f, 0x78, 0xde, 0x01, 0xf9, 0x39, 0x42, 0x8b, 0xaf, 0x30, 0x5f, + 0x93, 0xd3, 0xe3, 0x67, 0x2f, 0xfa, 0x17, 0xd1, 0xff, 0xd1, 0xa3, 0x97, + 0xff, 0x27, 0x04, 0x2e, 0x19, 0x81, 0x76, 0x1c, 0xbf, 0xff, 0x7b, 0xb9, + 0x2f, 0x8b, 0xea, 0x7b, 0x95, 0xa6, 0xce, 0x54, 0x95, 0x2a, 0x24, 0x66, + 0x5b, 0x22, 0x61, 0x4f, 0x4e, 0x45, 0x16, 0xff, 0xff, 0xe7, 0x4f, 0x7f, + 0xb7, 0xd2, 0xfa, 0x93, 0x0b, 0xb7, 0xec, 0xeb, 0x0e, 0x5f, 0xf3, 0x23, + 0x7c, 0x73, 0x71, 0x31, 0xcb, 0xff, 0x6d, 0x6c, 0x8e, 0x75, 0x9c, 0x70, + 0xe5, 0xfe, 0x10, 0x34, 0xc0, 0xe3, 0x0e, 0x5f, 0xc3, 0xf1, 0xa6, 0x6e, + 0x0e, 0x54, 0x22, 0x97, 0x10, 0x5c, 0xd2, 0xff, 0xb1, 0xc1, 0xf3, 0x02, + 0xf2, 0x39, 0x7f, 0xf9, 0xe7, 0xea, 0x40, 0xe4, 0xc9, 0xb4, 0x39, 0x41, + 0x5d, 0x03, 0xc9, 0x54, 0xbd, 0x5d, 0x03, 0x9e, 0xa1, 0xc1, 0xe2, 0xd6, + 0xce, 0x6f, 0xc3, 0x9d, 0x7f, 0x1c, 0xbf, 0xf4, 0xa0, 0x67, 0x53, 0x63, + 0xfc, 0x8e, 0x5f, 0xc2, 0xe1, 0x07, 0x20, 0x39, 0x4d, 0x68, 0x95, 0x98, + 0x9b, 0x48, 0x37, 0xde, 0x9f, 0x02, 0x72, 0xff, 0x91, 0x55, 0x36, 0x06, + 0x26, 0x8e, 0x54, 0xc7, 0xbc, 0xd0, 0x8e, 0xf3, 0x6d, 0xb6, 0x72, 0xff, + 0xfd, 0x8c, 0xf0, 0xc0, 0x30, 0x3a, 0xc6, 0x42, 0xca, 0x7d, 0x34, 0x17, + 0xfe, 0xce, 0x7e, 0x0e, 0x71, 0xda, 0x68, 0xe5, 0xfc, 0xbe, 0xa4, 0x0a, + 0xce, 0x54, 0x1f, 0x76, 0x21, 0x5f, 0xed, 0xc7, 0x91, 0x68, 0x13, 0x97, + 0xe9, 0x4d, 0x98, 0xb3, 0x96, 0xd9, 0xca, 0x6a, 0x0f, 0xae, 0x0c, 0x94, + 0x28, 0xac, 0x54, 0xd2, 0x90, 0x92, 0xea, 0x28, 0xc3, 0x4f, 0x50, 0x8b, + 0xbd, 0xe9, 0x74, 0xe5, 0x90, 0xe5, 0xfd, 0xd8, 0xf8, 0xb4, 0x9c, 0xe5, + 0xff, 0xe9, 0xba, 0xec, 0xcd, 0xaa, 0xaf, 0xe3, 0xe3, 0x97, 0xf6, 0xdf, + 0x63, 0x12, 0x39, 0x7f, 0xfc, 0xfe, 0xee, 0x71, 0xea, 0x7c, 0xd6, 0x91, + 0x87, 0x2f, 0xfc, 0x92, 0x4d, 0xf3, 0x03, 0x1a, 0x39, 0x5c, 0x2e, 0x9a, + 0x50, 0x44, 0x30, 0xc3, 0x69, 0xc2, 0x59, 0xe5, 0x3b, 0xa5, 0xf5, 0xab, + 0x6f, 0x0b, 0x78, 0x66, 0xc8, 0x85, 0xac, 0xe6, 0x12, 0x86, 0xd0, 0x63, + 0x00, 0xc9, 0xc6, 0xd5, 0x5e, 0x97, 0x1a, 0xa7, 0x31, 0xc0, 0xa1, 0x84, + 0xd0, 0xfd, 0xdc, 0x71, 0xfd, 0x8c, 0x85, 0xe1, 0x34, 0x08, 0x7a, 0x8c, + 0x64, 0x9a, 0x9d, 0x29, 0xf4, 0xb7, 0x16, 0x8b, 0x0a, 0x46, 0xcf, 0x7f, + 0xfb, 0x78, 0xd8, 0x7b, 0x93, 0x0e, 0x6e, 0x47, 0x2f, 0x6f, 0x1a, 0xce, + 0x5f, 0xfa, 0x1b, 0x52, 0x7d, 0x63, 0x21, 0xac, 0xe5, 0x6d, 0x15, 0xcc, + 0x4b, 0xf0, 0xfd, 0xff, 0xf3, 0xb2, 0x36, 0xbd, 0xfe, 0xae, 0xff, 0x7d, + 0x1c, 0xac, 0x44, 0x1f, 0xe6, 0x17, 0xfb, 0x6b, 0xfd, 0xc2, 0xc8, 0x39, + 0x7f, 0xf4, 0x6d, 0x4f, 0x27, 0xbb, 0x81, 0x43, 0x97, 0xfe, 0xe8, 0xc4, + 0xea, 0x77, 0xae, 0xd6, 0x72, 0xa1, 0x17, 0x73, 0x9a, 0x62, 0x25, 0xe6, + 0xa6, 0xd4, 0x48, 0xe5, 0xe7, 0xdc, 0xe7, 0x2e, 0x6d, 0xb3, 0x97, 0x9d, + 0x7f, 0x56, 0x6d, 0x9b, 0x1d, 0xbf, 0xa3, 0x6f, 0x24, 0xe9, 0xcb, 0xf6, + 0x33, 0xae, 0x13, 0x96, 0xfb, 0x0e, 0xa0, 0x24, 0x29, 0xb9, 0x1e, 0x62, + 0xa5, 0x4b, 0x97, 0xd9, 0x31, 0x5e, 0xe1, 0x54, 0xf5, 0xe2, 0x70, 0xca, + 0xc4, 0xd4, 0x37, 0xbc, 0x5f, 0xc5, 0x79, 0xb3, 0x5e, 0x02, 0xca, 0x93, + 0xbe, 0x32, 0x0c, 0xfd, 0x47, 0x31, 0xaa, 0xec, 0xa9, 0x90, 0x8f, 0xec, + 0xa0, 0x60, 0x43, 0x6c, 0x4e, 0x35, 0x39, 0xfd, 0xe9, 0x5a, 0xbf, 0xda, + 0x89, 0x7b, 0xfb, 0x51, 0x34, 0x92, 0x63, 0x97, 0xfd, 0xe8, 0x14, 0x06, + 0x73, 0xe3, 0x97, 0xcd, 0x1c, 0x40, 0x72, 0xe8, 0x9f, 0x0f, 0x6d, 0x43, + 0x8b, 0x7d, 0xd2, 0x2e, 0x14, 0x84, 0x55, 0xff, 0x9d, 0x7f, 0x7f, 0x02, + 0x4b, 0x24, 0x72, 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x1a, 0xaf, 0x2b, 0xce, + 0x8e, 0x5b, 0xec, 0xe8, 0x94, 0xc4, 0x1f, 0x1a, 0x5f, 0xff, 0xee, 0x30, + 0x3e, 0xfa, 0xfc, 0x5c, 0x38, 0x17, 0x63, 0x84, 0xe5, 0xfb, 0x6b, 0x77, + 0x59, 0xa2, 0xa5, 0x5c, 0xeb, 0x34, 0x43, 0x4b, 0x7d, 0xc3, 0xd7, 0x73, + 0x4b, 0xf6, 0xd6, 0xee, 0xb3, 0x44, 0x7c, 0xbf, 0xfb, 0xfd, 0x81, 0x7d, + 0x49, 0x86, 0x00, 0x72, 0xff, 0xf8, 0x5f, 0xd2, 0x85, 0x7e, 0x47, 0xb5, + 0x00, 0x39, 0x79, 0xe5, 0xf7, 0x11, 0x97, 0xa3, 0x45, 0x11, 0xaf, 0xfc, + 0xf3, 0xc7, 0x53, 0x69, 0x0c, 0x39, 0x7f, 0xa3, 0x78, 0x3e, 0xce, 0x9c, + 0xbc, 0xcc, 0xfa, 0xd0, 0xfb, 0x94, 0x3d, 0xaf, 0xa8, 0xe9, 0x88, 0x58, + 0xdf, 0xff, 0xf4, 0xbf, 0xda, 0xaf, 0xac, 0x0c, 0x73, 0xa5, 0x3c, 0xaa, + 0x2a, 0x72, 0xf3, 0x6a, 0xac, 0xe5, 0xfb, 0x9e, 0x65, 0x9e, 0x39, 0x5a, + 0x3c, 0x9f, 0xc7, 0xef, 0xff, 0x70, 0xa5, 0x5b, 0x6b, 0x9c, 0x3c, 0x37, + 0xcf, 0x9d, 0x68, 0x72, 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x63, 0xaf, 0xf6, + 0x20, 0xcf, 0xec, 0xe9, 0xcb, 0x9f, 0x47, 0x2f, 0xe9, 0xd4, 0xde, 0xf3, + 0x67, 0x2a, 0x47, 0x8c, 0xe2, 0xd7, 0xfc, 0x2e, 0xaf, 0x52, 0x06, 0x73, + 0x97, 0xff, 0xf7, 0xe2, 0xea, 0xfc, 0xf2, 0xb0, 0x32, 0xce, 0xa3, 0x0e, + 0x5f, 0xff, 0x81, 0x29, 0xf8, 0x54, 0x35, 0x73, 0xaf, 0x7f, 0x3e, 0x75, + 0xa1, 0xcb, 0x92, 0x47, 0x2f, 0xf7, 0x87, 0x38, 0xf5, 0xe4, 0x72, 0x82, + 0x79, 0x58, 0x2d, 0x7e, 0x4f, 0x79, 0x3c, 0x72, 0xff, 0xfd, 0xf8, 0xba, + 0xbe, 0x56, 0x06, 0x59, 0xd4, 0x61, 0xcb, 0xed, 0xef, 0x1a, 0x1c, 0xac, + 0x45, 0x0b, 0x09, 0xdd, 0x5a, 0xfd, 0x9b, 0xcc, 0x98, 0xe5, 0xbe, 0xc2, + 0xe3, 0x64, 0xf0, 0xb6, 0x91, 0x1e, 0x32, 0x2a, 0x68, 0x8f, 0x13, 0x10, + 0xb0, 0xe3, 0xab, 0xc3, 0x0b, 0x5d, 0x43, 0x09, 0x42, 0xeb, 0xdc, 0x29, + 0x8a, 0x9c, 0xbf, 0xb8, 0x41, 0xce, 0xbf, 0x8e, 0x5f, 0xe7, 0x06, 0x9f, + 0xde, 0x73, 0x97, 0x31, 0x67, 0x28, 0x4f, 0x27, 0xc6, 0x57, 0xfe, 0xc6, + 0xf7, 0x82, 0xfc, 0xcb, 0x47, 0x2f, 0xdd, 0x76, 0x40, 0x9c, 0xbe, 0xd7, + 0x51, 0xb3, 0x97, 0xe8, 0x6f, 0xd9, 0xd3, 0x97, 0xa1, 0x4c, 0x39, 0x5f, + 0x11, 0x1b, 0x84, 0xc2, 0x47, 0xa2, 0x8b, 0xe0, 0x31, 0x36, 0x72, 0xfe, + 0x4f, 0x26, 0x38, 0x9c, 0xbf, 0xff, 0xe8, 0xd8, 0xe0, 0x73, 0xbd, 0x45, + 0xf5, 0x3d, 0xa7, 0xe4, 0xe5, 0xff, 0x3f, 0x23, 0x9e, 0xd6, 0x36, 0x72, + 0x91, 0x1d, 0x4d, 0x64, 0x5d, 0x2a, 0xfd, 0x96, 0xfd, 0xd4, 0xdf, 0xf2, + 0x39, 0x7f, 0x46, 0xc0, 0xd3, 0xff, 0x1c, 0xbf, 0xe8, 0x1f, 0x70, 0xcf, + 0xef, 0xe0, 0xe5, 0xff, 0xe8, 0xec, 0x31, 0x7d, 0x4f, 0x66, 0x30, 0xe5, + 0xf0, 0x00, 0x8a, 0x1c, 0xbf, 0x4b, 0x53, 0xe3, 0x67, 0x2f, 0x3b, 0xac, + 0xd1, 0x68, 0x2f, 0xfc, 0xed, 0xf0, 0x2d, 0xf7, 0x3e, 0x36, 0x72, 0xfe, + 0x04, 0x0c, 0x7b, 0x47, 0x2a, 0x11, 0x84, 0xb2, 0xad, 0x94, 0x01, 0x12, + 0xff, 0xff, 0xf9, 0x37, 0xd7, 0x14, 0x8f, 0x27, 0x63, 0x5d, 0xcd, 0x6f, + 0x17, 0x9e, 0x39, 0x7f, 0xff, 0xfb, 0xfd, 0x3e, 0xe5, 0xa4, 0x0e, 0x6e, + 0x74, 0xd7, 0x5c, 0x1a, 0xc1, 0x39, 0x7f, 0x44, 0xec, 0x77, 0x13, 0x97, + 0xff, 0xee, 0xe3, 0x7e, 0x64, 0x67, 0xbb, 0x98, 0x2b, 0x39, 0x7f, 0xfe, + 0x4f, 0x4b, 0x37, 0xb7, 0x92, 0x82, 0xfe, 0xd1, 0xca, 0x85, 0x78, 0xd2, + 0x29, 0x09, 0x8a, 0xcf, 0x51, 0x23, 0x70, 0xe5, 0xe9, 0xe0, 0xbc, 0xe9, + 0xe3, 0xc5, 0x9c, 0x55, 0x2e, 0xc6, 0x1c, 0xbf, 0xf9, 0xf9, 0xe3, 0xd6, + 0xb4, 0xf0, 0xc3, 0x0e, 0x56, 0xcf, 0x7d, 0xc5, 0xaf, 0xff, 0xc9, 0xed, + 0x3f, 0x3a, 0xd6, 0x75, 0x35, 0xfc, 0xe7, 0x2f, 0xff, 0xbf, 0x9f, 0x69, + 0xe9, 0xff, 0xdc, 0xb4, 0xd6, 0x87, 0x2b, 0xa8, 0xb0, 0x15, 0x8b, 0xfb, + 0x4e, 0xa6, 0x73, 0xe3, 0x97, 0xf9, 0x03, 0x8c, 0xf9, 0x81, 0x39, 0x7f, + 0xfd, 0xfe, 0xf7, 0x03, 0x8a, 0xa7, 0x7b, 0x8a, 0x1c, 0xb7, 0x0e, 0x72, + 0xb6, 0x7c, 0xff, 0xa8, 0xdf, 0xe6, 0x7e, 0x3e, 0xd7, 0xfb, 0x39, 0x52, + 0x47, 0xa6, 0xe1, 0x36, 0xd0, 0x8e, 0xfe, 0x76, 0xbc, 0x16, 0x21, 0xcb, + 0xff, 0x9d, 0xbf, 0x67, 0x75, 0x36, 0x64, 0xe7, 0x2f, 0xd3, 0x77, 0x00, + 0xe7, 0x2b, 0xa8, 0x9c, 0x12, 0xee, 0x28, 0xd7, 0xff, 0xfb, 0x33, 0xda, + 0x89, 0xbb, 0x1c, 0x47, 0x03, 0xd8, 0xd1, 0xcb, 0xf0, 0xad, 0xf4, 0x87, + 0x2f, 0xff, 0xed, 0x8c, 0x47, 0x3f, 0x35, 0xe1, 0x80, 0xf6, 0x3c, 0x72, + 0xe4, 0xe9, 0xcb, 0xe9, 0x0b, 0xa8, 0x72, 0xff, 0x05, 0xc1, 0xbd, 0xb8, + 0x0e, 0x5f, 0x6d, 0x6d, 0x6d, 0x9c, 0xbe, 0x57, 0x84, 0x76, 0xce, 0x56, + 0x1e, 0x83, 0x93, 0xd2, 0x22, 0x8c, 0x61, 0x07, 0x50, 0x9c, 0x1e, 0x13, + 0x35, 0xae, 0x38, 0xb7, 0xf0, 0xc5, 0xbc, 0xed, 0x68, 0x72, 0xff, 0xca, + 0x79, 0x54, 0x56, 0x30, 0x60, 0xe5, 0xf9, 0x4f, 0x0c, 0x00, 0xe5, 0x72, + 0x88, 0x5d, 0x8f, 0x71, 0x3f, 0xbf, 0x47, 0xb3, 0xb0, 0x72, 0xff, 0xff, + 0xf7, 0x50, 0x38, 0x93, 0xf6, 0x23, 0xe6, 0x73, 0x2d, 0x27, 0x9c, 0x70, + 0xe5, 0xff, 0xb3, 0x99, 0x6a, 0x6d, 0xbf, 0xb4, 0x72, 0xff, 0xf7, 0xb5, + 0x93, 0x76, 0x38, 0xe7, 0x7b, 0x07, 0x2f, 0xf3, 0x83, 0x4c, 0x7e, 0x7c, + 0x72, 0xb1, 0x10, 0x0e, 0x99, 0x7f, 0xc3, 0x11, 0x36, 0x71, 0x4d, 0x9c, + 0xa9, 0xd3, 0xb8, 0x59, 0x30, 0x1d, 0xc6, 0x18, 0x3e, 0x21, 0xbf, 0x7c, + 0x9a, 0x49, 0x31, 0xca, 0x85, 0x4c, 0xf9, 0x1f, 0x5a, 0x28, 0x5f, 0xfd, + 0xd4, 0xf9, 0x83, 0x89, 0xb7, 0xe2, 0x72, 0xff, 0xe4, 0x17, 0x08, 0xe0, + 0x7b, 0x1a, 0x39, 0x79, 0x48, 0xd9, 0xcb, 0xff, 0xfd, 0xd8, 0x1c, 0x06, + 0xb0, 0x3d, 0x89, 0xd9, 0xf8, 0x84, 0xe5, 0xf9, 0x3d, 0xe8, 0x91, 0xca, + 0x55, 0x32, 0xb5, 0xa2, 0xed, 0x07, 0xc3, 0xbc, 0x58, 0x6f, 0xff, 0xe8, + 0x9b, 0x03, 0xd8, 0xe3, 0xdc, 0xf0, 0xc4, 0x30, 0xe5, 0xfd, 0xce, 0x94, + 0x9f, 0xf1, 0x39, 0x7f, 0xd0, 0xbe, 0xa4, 0xce, 0xf3, 0x9c, 0xa6, 0x23, + 0x19, 0xd6, 0xc0, 0x65, 0x7f, 0xa5, 0x1b, 0x9e, 0x37, 0x39, 0xcb, 0xf8, + 0x67, 0x7e, 0xa0, 0x9c, 0xbf, 0xe4, 0xfc, 0x65, 0xb8, 0xc0, 0x9c, 0xbf, + 0xff, 0xee, 0xe4, 0x97, 0xd4, 0xec, 0x66, 0xe5, 0xe1, 0x86, 0x68, 0xe5, + 0xf7, 0xf1, 0xc8, 0x4e, 0x53, 0xa3, 0xb7, 0x45, 0x9e, 0x38, 0x6d, 0x96, + 0xfb, 0x82, 0x37, 0x39, 0xca, 0x84, 0xe1, 0x72, 0x32, 0x27, 0x3d, 0xbf, + 0xdb, 0x5c, 0xd8, 0x9d, 0xfc, 0xe5, 0xff, 0x93, 0x88, 0xe6, 0xbc, 0xaa, + 0x2c, 0xe5, 0xfe, 0xf7, 0x5a, 0xd3, 0xaf, 0x31, 0xcb, 0xfa, 0x16, 0x2f, + 0xcf, 0x8e, 0x54, 0x91, 0x48, 0xd6, 0x80, 0xc3, 0x7b, 0xf4, 0x7a, 0x7c, + 0x6c, 0xe5, 0xff, 0xb9, 0x58, 0xbc, 0xef, 0x24, 0xe9, 0xca, 0xd9, 0xf4, + 0x7e, 0x53, 0x79, 0xc4, 0x07, 0x2f, 0xff, 0xff, 0x93, 0xfd, 0xf7, 0x26, + 0x99, 0xf7, 0x37, 0xbb, 0xf8, 0x35, 0x89, 0xc4, 0x30, 0x72, 0xfd, 0xee, + 0xb8, 0xaa, 0x72, 0xff, 0x87, 0xf9, 0xc3, 0xdc, 0x18, 0x39, 0x6c, 0x0a, + 0x39, 0x72, 0x10, 0x8b, 0x28, 0xbf, 0xf8, 0x0b, 0x00, 0xe7, 0xb4, 0xee, + 0x27, 0x2f, 0x31, 0xf9, 0x39, 0x5b, 0x3d, 0xf0, 0x21, 0x54, 0x2b, 0x51, + 0xc8, 0x6c, 0xa4, 0x26, 0xdc, 0x8c, 0x63, 0x00, 0xfe, 0x13, 0x17, 0xfb, + 0x3b, 0x32, 0x75, 0x18, 0x72, 0xff, 0x4b, 0x37, 0xa1, 0x89, 0xce, 0x5e, + 0x69, 0x93, 0x9c, 0xbf, 0xe8, 0x18, 0x5e, 0xd2, 0x18, 0x72, 0xf6, 0x75, + 0xce, 0x5f, 0xa6, 0x0f, 0xff, 0x89, 0xca, 0x09, 0xe3, 0x38, 0xdd, 0xe6, + 0xb4, 0x61, 0xcb, 0xff, 0xf3, 0xb8, 0x35, 0x00, 0xf6, 0x20, 0x70, 0x66, + 0x39, 0xd2, 0xfe, 0xff, 0x63, 0x78, 0xb5, 0xe3, 0x67, 0x2f, 0xfb, 0x96, + 0x66, 0x0f, 0x9a, 0x61, 0xcb, 0xca, 0xcb, 0xf3, 0x97, 0xee, 0xc6, 0xe7, + 0x61, 0xcb, 0xfd, 0xfb, 0x8f, 0x71, 0xe6, 0x39, 0x6e, 0x66, 0x3d, 0xc6, + 0xca, 0x69, 0x11, 0x4c, 0xef, 0x75, 0x89, 0x9a, 0xb9, 0xa0, 0xc3, 0x82, + 0xb1, 0x58, 0x5f, 0x26, 0x68, 0x67, 0xd1, 0xf7, 0x7c, 0x14, 0x0d, 0x47, + 0x2f, 0x78, 0x70, 0x07, 0x2d, 0x07, 0x28, 0x06, 0xaf, 0xc3, 0x77, 0x3f, + 0x8e, 0x56, 0xcd, 0xbf, 0x48, 0x6f, 0x99, 0x1b, 0xd1, 0xcb, 0xfe, 0xde, + 0x77, 0x27, 0xf8, 0x9a, 0x39, 0x58, 0x7f, 0xc8, 0x43, 0xf9, 0x15, 0xfc, + 0x83, 0xfc, 0xb3, 0x47, 0x2f, 0xfd, 0x9e, 0x8e, 0x40, 0xfd, 0xea, 0x1c, + 0xb3, 0x0e, 0x5f, 0xc8, 0x3f, 0xcb, 0x35, 0xf0, 0xf3, 0xf8, 0x9f, 0x52, + 0xa8, 0xc4, 0xf3, 0xe5, 0xbe, 0xb5, 0x6d, 0xeb, 0x8f, 0x0c, 0x49, 0x0f, + 0x53, 0x90, 0xca, 0x19, 0x81, 0x8c, 0x9f, 0x27, 0x01, 0x95, 0x87, 0xea, + 0xe1, 0xa3, 0xc9, 0x12, 0x46, 0x47, 0x34, 0x34, 0xf6, 0x62, 0xc8, 0xf9, + 0x3b, 0x2c, 0xf5, 0xe3, 0x60, 0x04, 0x62, 0x83, 0x1d, 0xa6, 0xa5, 0xc2, + 0xfa, 0x5b, 0xab, 0x48, 0xd2, 0x54, 0x87, 0x95, 0xfd, 0xc0, 0x81, 0x18, + 0x98, 0xe5, 0xe8, 0x71, 0x39, 0x7d, 0x9d, 0x7f, 0x1c, 0xb7, 0x09, 0x87, + 0xd7, 0xd3, 0x01, 0x1a, 0xbf, 0xff, 0xfd, 0xd7, 0x1f, 0x6a, 0x12, 0x59, + 0xc0, 0x3e, 0x8e, 0xc2, 0xbf, 0xc7, 0x01, 0xcb, 0xec, 0xd0, 0x10, 0xe5, + 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0xd6, 0x5f, 0xe6, 0x23, 0x1e, 0x6c, 0xe9, + 0xcb, 0xfb, 0x38, 0x34, 0xe2, 0xb3, 0x97, 0xb7, 0x0c, 0x39, 0x7f, 0x77, + 0x35, 0x13, 0xf0, 0x1c, 0xbf, 0xe9, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x8a, + 0x0d, 0x58, 0x7f, 0x0e, 0x63, 0x7d, 0x93, 0x47, 0x8e, 0x5f, 0xf4, 0x4a, + 0x37, 0x3c, 0x6e, 0x73, 0x97, 0xf9, 0x22, 0x60, 0x38, 0xcc, 0x72, 0xff, + 0xfb, 0x49, 0x3b, 0xe9, 0xc5, 0xfd, 0xd8, 0x98, 0xe5, 0xff, 0x9c, 0x41, + 0x9e, 0x81, 0x40, 0x1c, 0xaf, 0x22, 0x29, 0xa2, 0x7d, 0xbe, 0xf0, 0xca, + 0xd7, 0x60, 0xe2, 0x4f, 0x98, 0x42, 0x86, 0x93, 0x19, 0xec, 0xbd, 0x90, + 0x94, 0xe9, 0x00, 0x91, 0x78, 0xe9, 0x48, 0x5e, 0xdf, 0xfe, 0xfa, 0xc7, + 0x97, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0xa2, 0xd7, 0xfb, 0xee, 0x6d, 0x6e, + 0xeb, 0x34, 0x5d, 0x4a, 0x87, 0x5a, 0x31, 0x28, 0x62, 0xe1, 0xc2, 0xe1, + 0x76, 0x91, 0xee, 0x32, 0x72, 0x57, 0xb5, 0xf1, 0x80, 0x27, 0x5a, 0x35, + 0x0b, 0xcf, 0x2d, 0x5f, 0xb6, 0xb7, 0x75, 0x9a, 0x22, 0x15, 0xee, 0xa0, + 0x9c, 0xbb, 0x02, 0x72, 0xcb, 0x39, 0x4b, 0x3c, 0x2e, 0x8d, 0x88, 0xb5, + 0xf6, 0x71, 0x4d, 0x9c, 0xbe, 0x4d, 0xe7, 0x27, 0x2d, 0xf7, 0x11, 0xd3, + 0xcb, 0xb3, 0x59, 0x73, 0x42, 0x3b, 0x34, 0x39, 0x7d, 0x1d, 0x86, 0x1c, + 0xbe, 0x5b, 0xba, 0xcd, 0x11, 0xb2, 0x96, 0x79, 0xfb, 0x21, 0xb7, 0xd0, + 0xa2, 0x13, 0x18, 0xaf, 0xf7, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0xa6, 0xd7, + 0xed, 0xad, 0xdd, 0x66, 0x8a, 0x81, 0x7b, 0x39, 0x6c, 0xe5, 0xbe, 0xe1, + 0xe9, 0x74, 0xd2, 0xff, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x8a, 0x99, 0x7e, + 0xda, 0xdd, 0xd6, 0x68, 0xac, 0x17, 0xe4, 0x6c, 0x3f, 0xec, 0xe5, 0xda, + 0x13, 0x97, 0x33, 0x47, 0x2f, 0xe4, 0x68, 0xf0, 0x8d, 0x0e, 0x5f, 0xef, + 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x1f, 0xaf, 0x0c, 0x04, 0xe5, 0x42, 0x22, + 0xe4, 0x5e, 0x88, 0x37, 0xb2, 0x27, 0x39, 0x7f, 0x73, 0x27, 0x92, 0x09, + 0xcb, 0xd0, 0x33, 0x1c, 0xac, 0x3c, 0x95, 0x4b, 0x6e, 0x7f, 0x1c, 0xbb, + 0xde, 0x39, 0x6f, 0xb8, 0x9f, 0xc2, 0xcd, 0x10, 0xa9, 0x82, 0xcf, 0x0a, + 0x21, 0x2e, 0xf3, 0x2b, 0x42, 0x2e, 0x01, 0x6b, 0xff, 0xdf, 0x58, 0xf2, + 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x13, 0x7a, 0xff, 0xe6, 0x3c, 0xbe, 0xe6, + 0xd6, 0xee, 0xb3, 0x44, 0xfc, 0xbc, 0xb5, 0x18, 0x72, 0xfd, 0xb8, 0xef, + 0xf0, 0x72, 0xfd, 0xdc, 0xf4, 0x04, 0xe5, 0x70, 0x87, 0xda, 0x83, 0xce, + 0x51, 0x70, 0xac, 0xe5, 0xf6, 0xa6, 0x66, 0x8e, 0x5c, 0xb5, 0x9c, 0xbf, + 0xcb, 0xea, 0x7b, 0x31, 0x87, 0x2e, 0xe2, 0xb3, 0xc6, 0x04, 0xa8, 0x45, + 0x4a, 0x0b, 0x00, 0x93, 0x42, 0xfe, 0x32, 0xbf, 0x35, 0x5c, 0x23, 0x4c, + 0xe4, 0xe5, 0xfc, 0xd4, 0x3c, 0xfd, 0x46, 0xb3, 0x97, 0xe6, 0xad, 0x55, + 0x71, 0xac, 0xe5, 0xfd, 0xe4, 0x16, 0xf0, 0x4e, 0x5d, 0xc5, 0x67, 0x8c, + 0x05, 0x6e, 0x9c, 0xa6, 0xa1, 0x30, 0x0e, 0x10, 0xd7, 0x85, 0x8d, 0xb0, + 0xcb, 0xc5, 0x9f, 0x93, 0x5f, 0x35, 0x7b, 0x7c, 0x39, 0x7d, 0xc3, 0x4e, + 0xcd, 0x1c, 0xbf, 0xff, 0x0b, 0xfa, 0x05, 0x68, 0xc0, 0xfe, 0xfb, 0x91, + 0xcb, 0xf3, 0x7e, 0xf4, 0x30, 0xe5, 0x35, 0x67, 0xfb, 0x3a, 0xa5, 0xff, + 0x3f, 0x53, 0x8f, 0xd6, 0xdb, 0x6c, 0xa5, 0xfe, 0xeb, 0xfb, 0xce, 0xed, + 0x9c, 0xae, 0x19, 0x34, 0x16, 0xa7, 0x0a, 0x66, 0xa4, 0x51, 0xc2, 0xc8, + 0x17, 0xff, 0xf9, 0xaa, 0xe1, 0x35, 0xb8, 0x4f, 0x77, 0x02, 0x9a, 0xc1, + 0x01, 0xcb, 0xf9, 0xae, 0x36, 0xef, 0x23, 0x97, 0xee, 0xa3, 0x83, 0x85, + 0x8e, 0x53, 0x50, 0x8c, 0x6e, 0x14, 0xd3, 0xe2, 0xfb, 0x39, 0xcb, 0xe1, + 0xc4, 0x01, 0xcb, 0xee, 0x17, 0x02, 0xb0, 0x72, 0xb8, 0x43, 0xca, 0xe1, + 0x88, 0x2f, 0xfd, 0x11, 0x11, 0x11, 0x1c, 0xe8, 0xe5, 0xe9, 0xa3, 0xc7, + 0x2e, 0x88, 0x83, 0xd8, 0x98, 0xee, 0xf2, 0x73, 0x87, 0x2f, 0xdb, 0x49, + 0xdd, 0x85, 0x2e, 0x6d, 0xb2, 0x95, 0x87, 0x82, 0xd9, 0x45, 0xbf, 0x29, + 0xf4, 0xd1, 0x5e, 0xee, 0x2c, 0xe5, 0x42, 0x3a, 0xc0, 0x59, 0xa7, 0xf5, + 0x09, 0x2f, 0xdf, 0xb4, 0x8f, 0xf9, 0x39, 0x7c, 0xe3, 0x1c, 0x07, 0x2b, + 0x0f, 0x41, 0xcb, 0x6f, 0xff, 0x20, 0xe3, 0x23, 0x5a, 0xc9, 0x34, 0xc3, + 0x97, 0xfb, 0x02, 0x9c, 0x74, 0x05, 0x9c, 0xbf, 0xff, 0xf6, 0x71, 0x4f, + 0x4b, 0x01, 0xa1, 0xc0, 0x6e, 0x27, 0x7d, 0xac, 0xe5, 0xd1, 0x27, 0x45, + 0x16, 0x8d, 0x6f, 0xef, 0x6b, 0x32, 0x78, 0x39, 0x5d, 0x3d, 0xa1, 0x2d, + 0xbe, 0xd0, 0x7d, 0xf9, 0xcb, 0xfd, 0xbf, 0xc7, 0xff, 0x7f, 0xe3, 0x97, + 0xbb, 0x02, 0x72, 0xd0, 0x87, 0xa5, 0xe3, 0x7a, 0x84, 0x5e, 0xac, 0x87, + 0xae, 0xd7, 0x85, 0x20, 0xe5, 0xfa, 0x14, 0x67, 0x50, 0xe5, 0x6c, 0xf0, + 0x84, 0x6a, 0xfc, 0xf3, 0xc3, 0xac, 0xe5, 0xfc, 0xa7, 0xc8, 0xd4, 0x30, + 0xe5, 0x74, 0xf5, 0xdc, 0x9e, 0xfe, 0x96, 0xbd, 0x82, 0xa9, 0xcb, 0xff, + 0xa1, 0x79, 0xbc, 0xea, 0x6f, 0xae, 0x72, 0xf3, 0x6e, 0xd9, 0xcb, 0xff, + 0xde, 0xdb, 0xce, 0x1e, 0xc6, 0xbd, 0xff, 0x4e, 0x5d, 0x8c, 0xda, 0x2b, + 0x7a, 0x85, 0xa1, 0xeb, 0xf3, 0xaf, 0xa9, 0xb3, 0x97, 0xff, 0xff, 0x85, + 0xd5, 0x4d, 0xc4, 0xbe, 0x75, 0x18, 0x18, 0xf8, 0xd3, 0xfe, 0xa6, 0xce, + 0x5f, 0x3c, 0x93, 0x93, 0x97, 0xfe, 0xea, 0x7b, 0x37, 0xbf, 0xe7, 0xe2, + 0x72, 0xff, 0x93, 0xd9, 0xbd, 0xff, 0x3f, 0x13, 0x97, 0xb5, 0xf8, 0xfc, + 0x44, 0x07, 0x50, 0xe8, 0x29, 0xdc, 0xec, 0xef, 0xa4, 0xe2, 0xfd, 0xa8, + 0x51, 0x5f, 0x31, 0x03, 0x07, 0x2f, 0xe4, 0xee, 0xf6, 0x93, 0x9c, 0xa8, + 0x3c, 0xfe, 0x90, 0xdc, 0xdf, 0x8e, 0x5f, 0xfc, 0x89, 0xd9, 0xb3, 0xd1, + 0xe8, 0x09, 0xcb, 0x41, 0xcb, 0xff, 0xe8, 0xe6, 0x4e, 0x20, 0xf8, 0x04, + 0xda, 0x2a, 0x72, 0xa1, 0x17, 0xb3, 0x0c, 0x34, 0x43, 0xe0, 0x10, 0xbe, + 0xf6, 0xba, 0x87, 0x2f, 0xa7, 0x62, 0x48, 0xe5, 0xf4, 0x01, 0x46, 0x1c, + 0xbe, 0x1f, 0xde, 0x47, 0x29, 0x67, 0x8b, 0xa2, 0x3b, 0xfd, 0xd8, 0x67, + 0xd0, 0x02, 0x0e, 0x54, 0x22, 0xff, 0x1a, 0x10, 0x8a, 0xfe, 0x99, 0x3b, + 0xec, 0x59, 0xca, 0xc4, 0xcf, 0x37, 0x0e, 0x17, 0x2d, 0xbf, 0xee, 0x42, + 0xa4, 0x35, 0xf7, 0xfd, 0x1c, 0xb9, 0xfa, 0x72, 0xf2, 0xb1, 0xe3, 0x97, + 0xff, 0xe0, 0xf6, 0x36, 0x80, 0x85, 0x22, 0x61, 0x86, 0x1c, 0xbf, 0xca, + 0xc0, 0xfb, 0x4f, 0xd3, 0x94, 0x88, 0x88, 0x75, 0x5b, 0xf0, 0xe3, 0x8c, + 0xe7, 0x2a, 0x13, 0x42, 0x44, 0x07, 0x16, 0x18, 0x52, 0xe8, 0x86, 0xff, + 0x76, 0x27, 0xdc, 0x60, 0x4e, 0x5f, 0xff, 0x0e, 0x71, 0x5b, 0xee, 0x77, + 0xf3, 0xf2, 0x03, 0x95, 0x08, 0x85, 0x73, 0x3b, 0xfc, 0x2f, 0x3f, 0x32, + 0x8e, 0x03, 0x97, 0xfb, 0x5d, 0x75, 0x3b, 0x12, 0x39, 0x53, 0x9f, 0x5f, + 0x26, 0xf7, 0xb3, 0x26, 0x39, 0x7f, 0xfe, 0x9b, 0xb0, 0xc4, 0xda, 0x70, + 0x42, 0x93, 0xe3, 0x67, 0x2f, 0xfc, 0x9b, 0x8d, 0x28, 0x23, 0x1b, 0x39, + 0x7f, 0xd1, 0x21, 0x7f, 0x49, 0x38, 0x9c, 0xbc, 0xa4, 0x00, 0xe5, 0x74, + 0xf5, 0xb4, 0x73, 0x66, 0xb3, 0x97, 0xbd, 0x2c, 0x39, 0x76, 0xb0, 0xe5, + 0xff, 0xda, 0x8d, 0xaf, 0xc3, 0x93, 0xb8, 0x9c, 0xa8, 0x4e, 0x66, 0x75, + 0xbc, 0x84, 0x9a, 0x11, 0x38, 0xa0, 0x07, 0x3c, 0x2d, 0x7f, 0x7f, 0x37, + 0xfe, 0x8e, 0x9c, 0xbf, 0xf8, 0x31, 0xe7, 0xd6, 0x77, 0xa8, 0xc3, 0x97, + 0xf0, 0x61, 0xf6, 0x0f, 0xce, 0x5d, 0x9d, 0x39, 0x53, 0x9e, 0x27, 0x12, + 0xeb, 0xde, 0x49, 0x8e, 0x54, 0x23, 0x27, 0x21, 0x0f, 0xa2, 0x5b, 0xfe, + 0xda, 0x6b, 0xae, 0xc8, 0x6b, 0x39, 0x7e, 0x86, 0xb4, 0x6d, 0x67, 0x2a, + 0x19, 0xfd, 0xb3, 0xc2, 0x36, 0x44, 0x01, 0x94, 0x05, 0x8e, 0x2b, 0x78, + 0xe4, 0x85, 0x25, 0x4a, 0x35, 0xc2, 0x7a, 0x68, 0x6f, 0x6e, 0x37, 0xe6, + 0x46, 0xed, 0xd8, 0x68, 0xbc, 0x23, 0x00, 0x48, 0x31, 0xda, 0xe9, 0x9f, + 0xd0, 0xfa, 0xe2, 0x66, 0xa1, 0xdd, 0xff, 0xff, 0x35, 0x3e, 0x1a, 0x31, + 0xa9, 0x6f, 0x86, 0xe1, 0x5c, 0x5a, 0xf8, 0x5b, 0xff, 0x9f, 0x3a, 0xd0, + 0xe5, 0xe9, 0x94, 0x61, 0xcb, 0xfe, 0xcf, 0x6b, 0x3d, 0xdc, 0x01, 0xca, + 0x73, 0xd7, 0x11, 0xfb, 0x9c, 0x4e, 0x56, 0xcd, 0xab, 0x08, 0x2f, 0xa3, + 0xd8, 0xc3, 0x97, 0xef, 0x40, 0xa0, 0x0e, 0x5f, 0xd8, 0xdb, 0x81, 0x98, + 0x72, 0xbe, 0x1f, 0xa6, 0x10, 0x89, 0x35, 0xfc, 0x83, 0xee, 0xe4, 0x8e, + 0x5f, 0xe1, 0x86, 0xda, 0x66, 0xe0, 0xe5, 0x9b, 0x91, 0xf0, 0x04, 0xb2, + 0xfd, 0xb9, 0xe3, 0xda, 0x39, 0x7c, 0xfb, 0x79, 0x1c, 0xb6, 0xf0, 0xf2, + 0x84, 0xa6, 0xf3, 0x6d, 0xb6, 0x72, 0xfa, 0x71, 0x48, 0x29, 0xf4, 0xd0, + 0x5f, 0xf3, 0x5f, 0x5c, 0x64, 0x18, 0x9c, 0xe5, 0xdc, 0xc8, 0xe5, 0xfe, + 0x56, 0x3d, 0xae, 0xbf, 0xe7, 0x2f, 0xc9, 0x3e, 0x73, 0xe3, 0x97, 0x22, + 0xce, 0x54, 0x22, 0x31, 0x51, 0x86, 0x1a, 0xf8, 0xa6, 0xfc, 0xab, 0xeb, + 0x8c, 0x8e, 0x57, 0x27, 0xd1, 0xe3, 0xda, 0xe1, 0x4b, 0x90, 0xf1, 0x19, + 0x20, 0x61, 0x2b, 0x90, 0x8f, 0x47, 0x3e, 0xa3, 0x39, 0x9f, 0xf1, 0x98, + 0x5f, 0xfd, 0xc5, 0xbc, 0xd0, 0xa4, 0x6f, 0x27, 0x39, 0x7f, 0xff, 0xff, + 0xe6, 0xbf, 0x9d, 0xce, 0x65, 0xd6, 0x7c, 0x5f, 0x7f, 0xf7, 0xb0, 0x7b, + 0x9e, 0x80, 0xfc, 0xf9, 0xd6, 0x87, 0x2f, 0xf8, 0x39, 0xff, 0x0e, 0x9d, + 0x76, 0x1c, 0xbf, 0x43, 0x07, 0x26, 0x39, 0x86, 0xfa, 0xf7, 0x1c, 0x09, + 0xcb, 0xfb, 0xa9, 0x03, 0xfc, 0x1c, 0xbf, 0xd0, 0xd6, 0xae, 0x69, 0xda, + 0xce, 0x52, 0xa7, 0xcb, 0xd2, 0xca, 0xea, 0x29, 0x9e, 0x10, 0x74, 0x14, + 0xc0, 0xf5, 0x0d, 0xcb, 0xfa, 0x25, 0xd8, 0xe2, 0x87, 0x2f, 0xcc, 0xfc, + 0x61, 0x87, 0x2f, 0xb7, 0xfb, 0xe8, 0xe5, 0x41, 0xe5, 0xb9, 0x45, 0xd2, + 0xf1, 0xcb, 0xe9, 0xa3, 0xce, 0x72, 0xfb, 0xf0, 0x60, 0xac, 0xdc, 0xfe, + 0x2f, 0x69, 0x1c, 0xa9, 0xcf, 0x2b, 0xa7, 0x37, 0xff, 0x47, 0x54, 0x0f, + 0x93, 0x26, 0x86, 0x1c, 0xbf, 0xf7, 0x91, 0xb5, 0xf5, 0x38, 0xa0, 0x4e, + 0x5f, 0xed, 0xcb, 0xb9, 0xc6, 0x18, 0x72, 0xb9, 0x3f, 0x64, 0x41, 0xbf, + 0x3c, 0xb4, 0x9c, 0x4e, 0x5f, 0xf6, 0x6f, 0x3e, 0x66, 0xe0, 0x27, 0x2f, + 0xec, 0x97, 0x32, 0xcf, 0x1c, 0xb7, 0xa4, 0x7c, 0xfd, 0x39, 0xbe, 0x8f, + 0x7e, 0xc3, 0x94, 0x68, 0x83, 0x97, 0xf3, 0xce, 0x07, 0x10, 0x92, 0xb0, + 0x6a, 0xda, 0x59, 0xe9, 0xb4, 0x18, 0xa6, 0x22, 0x83, 0xce, 0xd7, 0xff, + 0xe6, 0x69, 0xe5, 0xd4, 0xcf, 0x6b, 0x78, 0x1c, 0x39, 0x7f, 0xd1, 0xe1, + 0xce, 0x23, 0x9a, 0x39, 0x50, 0x8a, 0xfc, 0x23, 0xd2, 0xa5, 0xfc, 0xfd, + 0x86, 0xbf, 0xe4, 0x72, 0xa4, 0xb9, 0x04, 0xb7, 0x9d, 0xc2, 0x8d, 0x84, + 0x7d, 0x85, 0xd8, 0x08, 0x86, 0x12, 0x1e, 0x8d, 0xdf, 0x89, 0x75, 0xfd, + 0x21, 0xce, 0x7d, 0x87, 0x2f, 0xff, 0xca, 0x00, 0x11, 0xce, 0x4e, 0x17, + 0x75, 0xb8, 0x4e, 0x54, 0x22, 0x13, 0x65, 0xb7, 0xf0, 0xfa, 0x59, 0xbc, + 0x39, 0x73, 0x47, 0x39, 0x4e, 0x78, 0x8a, 0x16, 0x5f, 0xee, 0xe2, 0xdf, + 0xb1, 0xd3, 0x97, 0xff, 0x3a, 0x7a, 0x05, 0x79, 0xee, 0xa1, 0xcb, 0xf8, + 0x50, 0x1a, 0xea, 0x1c, 0xbb, 0x61, 0x39, 0x73, 0x6d, 0x9c, 0xa9, 0x1b, + 0x06, 0xc5, 0xef, 0x42, 0x71, 0x29, 0xf4, 0xd1, 0x5f, 0xf2, 0x0a, 0x03, + 0x59, 0xd7, 0x39, 0x58, 0x9a, 0xb7, 0x4c, 0x9d, 0x07, 0x4f, 0xde, 0x2f, + 0xb8, 0x1a, 0x39, 0x7f, 0x27, 0x51, 0x55, 0x60, 0xe5, 0xda, 0x50, 0x27, + 0x8b, 0xe1, 0x7a, 0x44, 0x5e, 0xa9, 0x08, 0xeb, 0xcd, 0xb6, 0xd9, 0x4a, + 0x29, 0xf4, 0xd0, 0x5f, 0x23, 0x69, 0x31, 0x4a, 0x59, 0xe0, 0x20, 0xed, + 0xfb, 0x37, 0x1c, 0x70, 0xe5, 0x43, 0x2d, 0x92, 0x74, 0x6c, 0x8f, 0xb1, + 0x27, 0x2a, 0xf7, 0x18, 0xdb, 0x19, 0xbb, 0x28, 0xd4, 0x61, 0x11, 0xa2, + 0x1b, 0xed, 0xcb, 0xfc, 0x39, 0x7f, 0x87, 0x9f, 0x29, 0xd7, 0x01, 0xcb, + 0xc2, 0x9a, 0x39, 0x7c, 0x17, 0x10, 0x1c, 0xbf, 0xfa, 0x04, 0x03, 0x1c, + 0xcd, 0x02, 0x03, 0x95, 0x88, 0xb4, 0x43, 0x50, 0x0d, 0xe8, 0x86, 0xfd, + 0x33, 0x40, 0x34, 0xc3, 0x96, 0x43, 0x97, 0xfc, 0xea, 0xaf, 0xa8, 0x17, + 0x91, 0xcb, 0xe9, 0xe7, 0x7e, 0x4e, 0x5c, 0x0d, 0x21, 0xf7, 0x08, 0x82, + 0x87, 0x37, 0xe8, 0xcd, 0xf5, 0x0e, 0x5f, 0xfe, 0x6c, 0x1d, 0xcc, 0x9d, + 0x33, 0x8c, 0x72, 0x72, 0xff, 0xf0, 0x21, 0x9b, 0xdc, 0x4f, 0xe7, 0x75, + 0x4e, 0x5f, 0xe9, 0x67, 0x71, 0x90, 0xb3, 0x97, 0xb1, 0x8d, 0x67, 0x2f, + 0xfc, 0xfc, 0x71, 0x41, 0x8e, 0xa4, 0xe7, 0x2f, 0xf6, 0x68, 0x73, 0xdd, + 0x43, 0x94, 0x14, 0x48, 0x6c, 0x7c, 0x50, 0x2b, 0x13, 0xe9, 0x98, 0xeb, + 0xa4, 0xc0, 0x4d, 0xf2, 0x5f, 0x18, 0x61, 0x5f, 0xde, 0xc9, 0x86, 0x18, + 0x78, 0x80, 0x97, 0xe7, 0x10, 0xf6, 0x0d, 0x10, 0x13, 0xe9, 0xba, 0xbf, + 0xf9, 0x39, 0xd0, 0x70, 0x60, 0x7f, 0x83, 0x97, 0xff, 0x7e, 0xb5, 0x77, + 0x9c, 0xe8, 0x0f, 0xe3, 0x97, 0xe8, 0x93, 0xf2, 0xd9, 0xcb, 0xff, 0x2f, + 0xe6, 0xf7, 0x9d, 0xe6, 0x5a, 0x39, 0x7e, 0x76, 0xc2, 0xaf, 0x13, 0x95, + 0x89, 0x91, 0xa2, 0x1e, 0xd2, 0x1c, 0xa4, 0x50, 0xed, 0x39, 0xcb, 0xf7, + 0xcc, 0x99, 0x18, 0x72, 0xff, 0xf7, 0xf1, 0xf3, 0x83, 0xc9, 0xae, 0xf2, + 0xed, 0x9c, 0xa9, 0xcf, 0xf3, 0x45, 0x57, 0xfe, 0xc0, 0xf5, 0xfe, 0xc7, + 0x63, 0x93, 0x95, 0xc2, 0x23, 0xc7, 0x70, 0x8e, 0x61, 0x1d, 0xff, 0x0a, + 0xbb, 0x14, 0x5f, 0xe2, 0x72, 0xfd, 0xe8, 0xc1, 0x83, 0x94, 0x87, 0xbc, + 0x27, 0x37, 0xd3, 0xa8, 0x3e, 0x39, 0x7f, 0xfe, 0x7e, 0x79, 0xd4, 0x0f, + 0x94, 0x9b, 0xa9, 0xed, 0x1c, 0xa8, 0x4c, 0xd7, 0x21, 0x30, 0x84, 0x1f, + 0x92, 0x5f, 0x32, 0x31, 0x87, 0x2f, 0xfd, 0x8c, 0x85, 0xa7, 0xb7, 0xfb, + 0x0e, 0x5e, 0x4e, 0x74, 0x72, 0xa4, 0x7b, 0x80, 0x3f, 0xbe, 0xdb, 0xca, + 0x63, 0x97, 0xed, 0x6a, 0x00, 0xd4, 0x1c, 0xa5, 0x4f, 0x41, 0xb2, 0x3a, + 0x84, 0x4b, 0x3b, 0x95, 0xfe, 0xdc, 0xda, 0x41, 0xf2, 0x1c, 0xbf, 0xdd, + 0x4e, 0x41, 0xb7, 0x09, 0xcb, 0xee, 0x41, 0xb8, 0x29, 0x73, 0x6d, 0x94, + 0xa8, 0x37, 0x8d, 0x91, 0xdc, 0x28, 0x53, 0xe9, 0xa1, 0xbf, 0xff, 0xf8, + 0x7e, 0xe6, 0x70, 0x44, 0xc8, 0xc8, 0x9b, 0xe0, 0xf3, 0x2e, 0xfe, 0x03, + 0x94, 0x72, 0xf3, 0xee, 0x5f, 0x13, 0x3e, 0x94, 0x24, 0x79, 0x27, 0x03, + 0xdd, 0x35, 0x6c, 0xb4, 0x18, 0x86, 0xbc, 0x8e, 0xf2, 0x54, 0x22, 0x42, + 0x67, 0x71, 0xb4, 0x76, 0x53, 0x6b, 0xa0, 0x8c, 0x62, 0x7e, 0x21, 0xfe, + 0x37, 0x1b, 0xde, 0x46, 0xce, 0x5e, 0x9d, 0xd8, 0x72, 0xf7, 0x91, 0xb3, + 0xc6, 0x10, 0xbe, 0xf7, 0xee, 0xa1, 0xa2, 0x07, 0x72, 0x6a, 0xa9, 0xd1, + 0x13, 0xfa, 0x3d, 0xe1, 0xdf, 0x0e, 0x72, 0xff, 0x62, 0xe2, 0x71, 0x85, + 0x9c, 0xb0, 0x0e, 0x59, 0xaf, 0xe1, 0xe1, 0xa1, 0x95, 0xd1, 0xf9, 0xcb, + 0xf7, 0xe2, 0x05, 0x24, 0x72, 0xff, 0xf8, 0x73, 0x5f, 0x14, 0xec, 0x01, + 0x8f, 0x2f, 0x98, 0x78, 0x3a, 0x17, 0xaf, 0xd1, 0xaf, 0xc5, 0xb6, 0xff, + 0xdd, 0xfe, 0x78, 0xf9, 0x1e, 0x80, 0x9c, 0xbc, 0xfb, 0x9c, 0xe5, 0xcd, + 0xb6, 0x72, 0xff, 0x6d, 0x33, 0x8a, 0x92, 0xfa, 0xb3, 0x6c, 0xd8, 0xed, + 0xff, 0x91, 0x5f, 0x9a, 0xfc, 0x0c, 0x89, 0x1c, 0xbf, 0xda, 0xcf, 0x3b, + 0x30, 0x4e, 0x50, 0x53, 0x3b, 0xdb, 0xc7, 0x53, 0xfc, 0x87, 0x7f, 0xed, + 0x60, 0xe7, 0x71, 0x78, 0x27, 0x2f, 0xfd, 0x8a, 0xf5, 0xe4, 0xa3, 0xf3, + 0x07, 0x2a, 0x47, 0xf6, 0x27, 0x75, 0x08, 0xda, 0xc8, 0x5c, 0xdf, 0xfc, + 0xc6, 0x3c, 0xb3, 0x6b, 0x77, 0x59, 0xa2, 0x18, 0x5f, 0xff, 0xfe, 0x7d, + 0x60, 0xe2, 0xfb, 0x1c, 0xc9, 0xa6, 0x75, 0x69, 0x82, 0xea, 0x9c, 0xac, + 0x46, 0x3f, 0xea, 0x15, 0x0b, 0x90, 0xc9, 0x19, 0xdf, 0x65, 0x1d, 0x8c, + 0x3b, 0x6f, 0xee, 0xbc, 0xe3, 0x12, 0x29, 0x7f, 0xef, 0x75, 0xd3, 0xd1, + 0xb8, 0x01, 0xcb, 0xf7, 0x5c, 0x54, 0x9c, 0xe5, 0x31, 0x12, 0x62, 0x5a, + 0xd9, 0xed, 0xff, 0x91, 0x71, 0xa7, 0xde, 0xd1, 0xb3, 0x97, 0xff, 0xda, + 0x02, 0x6d, 0x55, 0xf5, 0x3a, 0x3f, 0xce, 0x72, 0xed, 0x7e, 0x72, 0xfe, + 0x97, 0x5d, 0xc6, 0x0e, 0x5a, 0x16, 0x78, 0x7c, 0x8c, 0x5f, 0xb6, 0xb7, + 0x75, 0x9a, 0x20, 0xa5, 0xee, 0xc3, 0x0e, 0x5f, 0xfa, 0x27, 0x7f, 0x6f, + 0x24, 0xd3, 0x0e, 0x56, 0x22, 0x41, 0x0d, 0x04, 0x72, 0xfd, 0xd8, 0x67, + 0xfc, 0x9c, 0xbe, 0xf6, 0xa0, 0x05, 0x2f, 0x3e, 0xe7, 0x29, 0x7d, 0xf8, + 0xba, 0xa5, 0x2f, 0xf2, 0x4f, 0x9e, 0xd4, 0x00, 0xa5, 0x14, 0xbf, 0xb1, + 0x71, 0xd8, 0x61, 0x4b, 0x9b, 0x6c, 0xa5, 0xfc, 0x30, 0x33, 0xa6, 0xca, + 0x56, 0x26, 0x22, 0xb2, 0x26, 0x0e, 0xf4, 0x8c, 0x06, 0x62, 0x16, 0xd9, + 0x62, 0x83, 0x37, 0x26, 0xca, 0x7d, 0x3f, 0x2a, 0x92, 0xa0, 0x39, 0x8b, + 0x7b, 0x1d, 0x6d, 0xff, 0xfa, 0x1b, 0xd0, 0xe7, 0x3e, 0x71, 0x9f, 0x39, + 0xf1, 0xca, 0x85, 0xc4, 0xfc, 0x30, 0x43, 0xee, 0xc2, 0x59, 0xe5, 0x5d, + 0x89, 0xcd, 0xfd, 0x83, 0xa4, 0x1c, 0x39, 0x7b, 0xbf, 0xb0, 0xe5, 0x74, + 0xf2, 0x38, 0x0a, 0xaf, 0xf3, 0x8e, 0x6b, 0x71, 0xa3, 0x97, 0xf0, 0x70, + 0x5f, 0xda, 0x39, 0x68, 0x91, 0xee, 0xe8, 0xc6, 0xfd, 0xbe, 0x65, 0x9e, + 0x39, 0x7f, 0xfc, 0xe8, 0x0d, 0x62, 0xae, 0xcd, 0xc6, 0x09, 0xcb, 0xf7, + 0x93, 0x39, 0xf1, 0xcb, 0xff, 0xfe, 0xea, 0x6f, 0x02, 0xec, 0xc1, 0xf0, + 0xc3, 0x79, 0xed, 0x1c, 0xb4, 0x1c, 0xbe, 0x8e, 0x21, 0x85, 0x9f, 0xa0, + 0x19, 0x2f, 0xfc, 0xf2, 0xeb, 0xfb, 0x58, 0x32, 0x39, 0x5d, 0x3f, 0x7f, + 0x1d, 0x56, 0xd3, 0xab, 0xe9, 0x4e, 0x93, 0x7d, 0x18, 0x9d, 0xfd, 0x26, + 0x90, 0xbc, 0x61, 0xcb, 0xf9, 0xf7, 0x1e, 0x4e, 0x27, 0x2b, 0x93, 0xdd, + 0x12, 0xfb, 0xff, 0xff, 0x6f, 0x71, 0xcc, 0xb9, 0xd2, 0x6d, 0x7d, 0xc5, + 0x36, 0x90, 0x13, 0x97, 0xfc, 0xfb, 0xce, 0x65, 0x00, 0x83, 0x95, 0x08, + 0xc9, 0xc2, 0x2f, 0xdb, 0xef, 0xff, 0xcb, 0x55, 0xf5, 0x9b, 0x92, 0x75, + 0xc7, 0x99, 0x1c, 0xbf, 0xf2, 0xe3, 0xda, 0xcf, 0x27, 0x2d, 0x9c, 0xb3, + 0xe2, 0x25, 0x95, 0x56, 0xa8, 0x54, 0xaf, 0xd8, 0xda, 0x86, 0x18, 0xb7, + 0xcf, 0x3a, 0x8b, 0x39, 0x73, 0x80, 0xe5, 0x48, 0xdd, 0x78, 0x92, 0xff, + 0xfc, 0xef, 0x27, 0xef, 0xcc, 0x9f, 0xff, 0x7e, 0xea, 0x1a, 0x2f, 0xb5, + 0xe0, 0x40, 0x4e, 0x5f, 0xce, 0xb8, 0x18, 0x01, 0xcb, 0xff, 0x69, 0x07, + 0x99, 0x6f, 0xf8, 0xd1, 0xca, 0x99, 0x1d, 0xdb, 0x67, 0xe8, 0xe7, 0x8a, + 0xef, 0xdd, 0xc9, 0xa1, 0xac, 0xe5, 0xf8, 0x3b, 0xde, 0x36, 0x72, 0xd1, + 0x39, 0xea, 0x09, 0x5d, 0x96, 0x72, 0xff, 0xff, 0x01, 0x36, 0xaf, 0x61, + 0x93, 0x49, 0x07, 0xb1, 0xb8, 0x39, 0x6f, 0x61, 0xf9, 0x68, 0x46, 0xfb, + 0xc3, 0x92, 0x39, 0x50, 0x79, 0x08, 0x4f, 0x7f, 0xe1, 0x49, 0x7b, 0xb9, + 0xb4, 0xd1, 0xcb, 0xfa, 0x24, 0x39, 0x93, 0x9c, 0xbf, 0xce, 0x18, 0x04, + 0x37, 0xa3, 0x95, 0xd3, 0xdf, 0x72, 0xcb, 0xf9, 0xa3, 0x52, 0xf9, 0xf3, + 0xad, 0x0f, 0x10, 0x0a, 0xff, 0x78, 0x0a, 0x0c, 0xbb, 0x87, 0x88, 0x05, + 0x79, 0xf7, 0x23, 0xc4, 0x02, 0xac, 0x3e, 0xaf, 0xd0, 0x6e, 0x79, 0x1e, + 0x20, 0x15, 0xf3, 0x8f, 0x32, 0x3c, 0x40, 0x2b, 0xfc, 0x8b, 0xee, 0x00, + 0x10, 0x78, 0x80, 0x57, 0x90, 0x42, 0x78, 0x80, 0x54, 0x14, 0x5c, 0xb0, + 0x8f, 0xa5, 0xfc, 0x4f, 0xec, 0xa9, 0xe2, 0x01, 0x5e, 0xdc, 0x78, 0xf1, + 0x00, 0xa8, 0xf1, 0x00, 0xaf, 0x34, 0x40, 0x1e, 0x20, 0x15, 0xd0, 0xc3, + 0xc4, 0x02, 0xa0, 0x9f, 0x36, 0x0c, 0x21, 0x5d, 0xf2, 0x30, 0x30, 0x78, + 0x80, 0x57, 0xbc, 0xeb, 0x3c, 0x40, 0x2b, 0xff, 0x0b, 0xcb, 0xef, 0x51, + 0x6f, 0xb3, 0xc4, 0x02, 0xbf, 0xf9, 0xfd, 0xfc, 0xe8, 0x3e, 0xeb, 0xc8, + 0xf1, 0x00, 0xae, 0x70, 0x9e, 0x20, 0x15, 0xfe, 0x17, 0x6f, 0x5a, 0x80, + 0x1e, 0x20, 0x15, 0xf9, 0x15, 0x71, 0x01, 0xe2, 0x01, 0x5c, 0x9a, 0x3c, + 0x40, 0x2a, 0xd9, 0xeb, 0xf8, 0xd2, 0xff, 0xf7, 0x53, 0xde, 0xcd, 0x7c, + 0xda, 0x43, 0x0f, 0x10, 0x0a, 0xfd, 0xe1, 0x8e, 0x64, 0x68, 0x80, 0x57, + 0x02, 0x0f, 0x10, 0x0b, 0xe9, 0xb5, 0xbf, 0x24, 0x31, 0xc2, 0x78, 0x80, + 0x57, 0xdf, 0xb8, 0xac, 0xf1, 0x00, 0xaf, 0x46, 0xd6, 0x78, 0x80, 0x57, + 0xfe, 0xce, 0x74, 0x18, 0xc1, 0x06, 0x8f, 0x10, 0x0a, 0xfd, 0xfb, 0xca, + 0x50, 0x78, 0x80, 0x57, 0xe7, 0x5f, 0x63, 0x93, 0xc4, 0x02, 0xac, 0x45, + 0xaf, 0x52, 0xff, 0x35, 0xbb, 0x60, 0x3c, 0x40, 0x2a, 0x92, 0xb3, 0x20, + 0x91, 0xe4, 0x25, 0xd6, 0x44, 0x90, 0x8d, 0xe9, 0xa8, 0x0c, 0xf4, 0x5f, + 0xe8, 0x6f, 0x7e, 0x61, 0x7e, 0xcf, 0x69, 0xf9, 0x3c, 0x40, 0x2b, 0xfc, + 0x18, 0x5c, 0xdb, 0x8f, 0x1e, 0x20, 0x10, 0x4d, 0xad, 0xed, 0xc3, 0x67, + 0x88, 0x05, 0x4b, 0x3f, 0xbd, 0xa8, 0xdf, 0xef, 0xde, 0x52, 0x85, 0x18, + 0x78, 0x80, 0x57, 0xc8, 0x32, 0xd1, 0xe2, 0x01, 0x5f, 0xcf, 0x34, 0xb3, + 0x99, 0x1e, 0x20, 0x15, 0x62, 0x33, 0xba, 0x44, 0x04, 0x2f, 0xcb, 0xaf, + 0xfb, 0xb1, 0xaf, 0xba, 0xff, 0x60, 0x3c, 0x40, 0x2b, 0x21, 0xe2, 0x01, + 0x5c, 0xf3, 0x84, 0xf9, 0xfa, 0x95, 0x76, 0xc0, 0x78, 0x80, 0x57, 0xe7, + 0xf6, 0x93, 0x93, 0xc4, 0x02, 0xbf, 0x90, 0x7f, 0x96, 0x68, 0xf1, 0x00, + 0xaa, 0x11, 0x26, 0x24, 0x9e, 0x35, 0xa8, 0x65, 0x3e, 0x06, 0x16, 0x99, + 0x0d, 0xb4, 0x3f, 0x98, 0x7f, 0x70, 0x8f, 0xe9, 0x6b, 0x97, 0x00, 0xa4, + 0x53, 0x35, 0x2e, 0x13, 0xd2, 0x86, 0x5a, 0x42, 0x91, 0x48, 0x60, 0xde, + 0xf2, 0x36, 0x78, 0xc2, 0x57, 0x9d, 0xd6, 0x68, 0x80, 0x5f, 0x53, 0x13, + 0xe6, 0x1d, 0x37, 0xca, 0xf0, 0xb8, 0x58, 0x72, 0xee, 0x33, 0x9c, 0xbf, + 0x71, 0x18, 0x0f, 0x4e, 0x54, 0x1e, 0x1a, 0x0d, 0x5f, 0xfd, 0x21, 0xc5, + 0xf5, 0x00, 0x0f, 0xe6, 0x39, 0x7e, 0xf6, 0x05, 0xfa, 0x72, 0xe0, 0x41, + 0x4b, 0x2a, 0x52, 0xf7, 0x62, 0x73, 0x97, 0x36, 0xd9, 0x4a, 0x43, 0xde, + 0x6b, 0x16, 0x98, 0x49, 0xb1, 0xdb, 0x68, 0xa7, 0xd3, 0xc0, 0xb3, 0x31, + 0x1d, 0x29, 0x0c, 0x5b, 0xc9, 0xff, 0x8e, 0x5f, 0xfe, 0xf6, 0xb1, 0x54, + 0xda, 0x80, 0x04, 0x72, 0x72, 0xa7, 0x67, 0x87, 0xc8, 0x80, 0x30, 0x9c, + 0x5d, 0x2e, 0xc1, 0x14, 0x36, 0xdc, 0xe4, 0x00, 0x8c, 0xbf, 0xc5, 0x8a, + 0x0e, 0xdf, 0xf6, 0x49, 0x02, 0xeb, 0xd4, 0x8e, 0x5f, 0xf3, 0x10, 0x56, + 0x9b, 0x40, 0x1c, 0xa5, 0x9f, 0x7f, 0x4e, 0x2f, 0x2f, 0xa2, 0x72, 0xff, + 0xef, 0x34, 0xc9, 0xa4, 0xfb, 0x9c, 0x30, 0x72, 0x98, 0x7c, 0x82, 0x39, + 0x7f, 0x79, 0x4e, 0x3c, 0x63, 0x47, 0x2f, 0xf6, 0x73, 0xef, 0x3c, 0xb4, + 0x72, 0xf4, 0xb8, 0x79, 0x1c, 0xbb, 0x99, 0x1e, 0x30, 0x05, 0x72, 0x78, + 0xe2, 0x45, 0x50, 0x9b, 0xbe, 0x42, 0x19, 0x08, 0x76, 0x66, 0xef, 0x77, + 0xff, 0xf2, 0x08, 0xff, 0xce, 0x73, 0xe0, 0xed, 0xf9, 0xc9, 0xce, 0x5f, + 0xa6, 0x94, 0x6e, 0x73, 0x97, 0xd0, 0xac, 0x30, 0xe5, 0x49, 0x15, 0x5b, + 0x5e, 0x61, 0x55, 0xff, 0xa5, 0xaf, 0x83, 0x8c, 0x8d, 0xaa, 0x72, 0xfe, + 0x94, 0x6c, 0x0a, 0x30, 0xe5, 0xff, 0xdc, 0x47, 0x35, 0xec, 0x19, 0x66, + 0x8e, 0x5f, 0x32, 0x3f, 0xf1, 0xca, 0xc3, 0xe7, 0x74, 0x4b, 0xf3, 0xfb, + 0xcf, 0xb3, 0x97, 0xbc, 0xe2, 0x72, 0xee, 0xbe, 0x23, 0xe0, 0x61, 0x2d, + 0xa2, 0x0e, 0x02, 0x7b, 0xfe, 0x86, 0xb0, 0xf6, 0x27, 0x71, 0x39, 0x7f, + 0xd0, 0xb8, 0x62, 0x30, 0x08, 0x72, 0xb6, 0x8c, 0x0e, 0xa7, 0x70, 0x1d, + 0xdf, 0xca, 0x37, 0xb4, 0xce, 0x94, 0xbf, 0x6b, 0xb1, 0x93, 0x9c, 0xbf, + 0xf8, 0x02, 0x99, 0xcf, 0xa6, 0x93, 0xec, 0xe5, 0xf4, 0xdd, 0x79, 0x8e, + 0x5f, 0x2d, 0xf7, 0x39, 0xcb, 0xf6, 0x4d, 0x28, 0xe4, 0xe5, 0xee, 0xa4, + 0xc7, 0x2f, 0x0c, 0x48, 0xa5, 0xff, 0x84, 0x09, 0xc1, 0xc1, 0xfc, 0xa1, + 0xac, 0xe5, 0x61, 0xf1, 0xb8, 0xdd, 0x7c, 0x4d, 0xf7, 0x92, 0x8d, 0xa2, + 0xf4, 0x90, 0x48, 0xfc, 0x53, 0xc1, 0x08, 0x0a, 0x85, 0xc7, 0x7c, 0x30, + 0x48, 0xfe, 0x7a, 0x66, 0xf1, 0xd6, 0x5f, 0xdc, 0xeb, 0x7b, 0x8f, 0x1c, + 0xbf, 0xa5, 0xa5, 0x76, 0xeb, 0x39, 0x78, 0x7d, 0xa3, 0x97, 0x85, 0x24, + 0x72, 0xfd, 0xaf, 0xc7, 0xf5, 0x9c, 0xbf, 0xbd, 0x34, 0xb3, 0x99, 0x1c, + 0xa8, 0x46, 0x02, 0x17, 0xb8, 0xe7, 0xe3, 0x6a, 0x15, 0x5f, 0xfd, 0xd6, + 0xe3, 0x7a, 0xc6, 0xdf, 0x6a, 0x9c, 0xbe, 0x08, 0x71, 0x87, 0x2e, 0x04, + 0x14, 0xb9, 0xb6, 0xca, 0x52, 0x1a, 0xf6, 0xc5, 0xaf, 0xc1, 0xfd, 0xf7, + 0x22, 0x9f, 0x4d, 0x0d, 0x62, 0x2b, 0x55, 0x72, 0xbf, 0xfd, 0xee, 0x56, + 0x9d, 0x69, 0x1e, 0xea, 0x9a, 0x39, 0x7f, 0xa2, 0x49, 0xe9, 0x47, 0x8e, + 0x5d, 0xc3, 0xe8, 0xe6, 0xcd, 0x95, 0xff, 0x75, 0xfd, 0xa5, 0x8e, 0x4e, + 0x72, 0xe5, 0xa1, 0xcb, 0xe1, 0x4e, 0x64, 0x72, 0xff, 0x93, 0x9e, 0xe0, + 0x76, 0xeb, 0x39, 0x50, 0x7b, 0x7b, 0x22, 0xbf, 0xda, 0xc4, 0xf2, 0xa9, + 0xd3, 0x97, 0xfd, 0xd8, 0xdc, 0x2d, 0x05, 0x67, 0x2f, 0x2a, 0xfa, 0x5a, + 0x3f, 0x36, 0xe3, 0xe2, 0x1e, 0x03, 0x3a, 0xc4, 0xe1, 0xfd, 0x19, 0xad, + 0x49, 0x5b, 0xa6, 0xe1, 0xe8, 0xc2, 0x3f, 0xe1, 0x02, 0xdc, 0x76, 0x77, + 0xf3, 0x6a, 0xbf, 0x86, 0x0e, 0x5f, 0x7e, 0xcc, 0x09, 0xca, 0xe4, 0xf4, + 0x78, 0x0b, 0xaf, 0xfd, 0xdc, 0xe0, 0x71, 0x57, 0x39, 0xf1, 0xcb, 0xfe, + 0xc5, 0xf5, 0x03, 0xdf, 0xd5, 0x39, 0x7b, 0xd8, 0xb3, 0x94, 0xc3, 0xd7, + 0xd1, 0xdd, 0xe9, 0x30, 0x07, 0x29, 0x54, 0x6c, 0x02, 0x13, 0x3e, 0x22, + 0xbf, 0xe5, 0x5f, 0xe4, 0x30, 0x51, 0x53, 0x97, 0xfe, 0x7d, 0x32, 0x13, + 0x7b, 0x46, 0xce, 0x5b, 0x4a, 0x9f, 0xcf, 0x4e, 0xef, 0x9e, 0x4f, 0xb3, + 0x97, 0xfd, 0x9e, 0xf2, 0x2b, 0xec, 0x59, 0xcb, 0xfa, 0x39, 0xd6, 0x73, + 0xe3, 0x97, 0x6e, 0x0e, 0x50, 0x4f, 0x17, 0xc5, 0xf7, 0xfb, 0xc8, 0xb4, + 0x0c, 0x78, 0xe5, 0xfb, 0x50, 0xbc, 0x61, 0xca, 0x83, 0xd9, 0xd1, 0x95, + 0xb4, 0x14, 0xc6, 0xb1, 0xfb, 0x6f, 0x75, 0xca, 0x73, 0x4c, 0x29, 0xf4, + 0x67, 0x77, 0xfd, 0xe4, 0x9e, 0x39, 0x06, 0xe0, 0xe5, 0xed, 0x7b, 0x0e, + 0x5d, 0x9a, 0xf8, 0x7a, 0xca, 0x1d, 0x5f, 0xfd, 0x9e, 0x4e, 0x64, 0x31, + 0xc3, 0x35, 0x36, 0x87, 0x2f, 0xff, 0x7f, 0x2e, 0xba, 0x79, 0x07, 0xdf, + 0xf4, 0xe5, 0xfb, 0x3c, 0x07, 0xf1, 0xca, 0x92, 0x30, 0xf6, 0xa2, 0xd1, + 0x2e, 0xff, 0xfd, 0x1d, 0x7c, 0x18, 0xda, 0xa1, 0xfd, 0xf7, 0x23, 0x95, + 0x24, 0xde, 0xbd, 0x0f, 0x3e, 0x03, 0x2a, 0x85, 0xe3, 0x7c, 0x85, 0x7a, + 0x43, 0xf9, 0xe5, 0x24, 0xff, 0x28, 0x22, 0xfb, 0xa8, 0xf2, 0x39, 0x7f, + 0xb0, 0x65, 0x9a, 0x51, 0x87, 0x2f, 0xcc, 0xd0, 0x1d, 0xce, 0x57, 0x8f, + 0x69, 0x43, 0x3b, 0xfe, 0xde, 0x0f, 0xce, 0xe7, 0x2d, 0x9c, 0xbf, 0xe9, + 0x0f, 0xe0, 0xf8, 0xb6, 0x00, 0xe5, 0x4e, 0x98, 0xbc, 0x9e, 0xf0, 0x8f, + 0x93, 0xcb, 0xff, 0x9f, 0xba, 0x49, 0x27, 0xa3, 0xda, 0x39, 0x7f, 0xb3, + 0xdd, 0x46, 0x8f, 0x39, 0xcb, 0xfe, 0x18, 0xce, 0x7d, 0x9b, 0x83, 0x97, + 0xfe, 0x8e, 0xa9, 0xa1, 0xcf, 0x77, 0x0e, 0x54, 0x26, 0x58, 0x87, 0xfd, + 0x43, 0x73, 0x50, 0x1b, 0xdf, 0x9f, 0x88, 0x43, 0x07, 0x2e, 0xd6, 0x8e, + 0x5e, 0x6d, 0xb6, 0xce, 0x5c, 0x07, 0x29, 0xf4, 0xd0, 0x56, 0xcf, 0x7f, + 0x46, 0xf7, 0xfe, 0xcd, 0x0b, 0xab, 0x30, 0xa4, 0xc7, 0x2f, 0xe0, 0x44, + 0xba, 0xa6, 0x8e, 0x5f, 0xc8, 0x20, 0x5a, 0xd0, 0xe5, 0xe7, 0x06, 0x14, + 0xa9, 0x26, 0xbe, 0xc8, 0x44, 0x74, 0x88, 0x07, 0xfc, 0x4b, 0xda, 0x16, + 0x5f, 0x40, 0x50, 0x27, 0x2f, 0xc1, 0xda, 0x7f, 0x39, 0xcb, 0xfc, 0xde, + 0x0e, 0x71, 0x4d, 0x9c, 0xbf, 0x87, 0x39, 0x02, 0x92, 0x39, 0x53, 0x22, + 0x34, 0x4a, 0xbc, 0x69, 0x7e, 0xcc, 0xf7, 0x70, 0xe5, 0xce, 0xc3, 0x97, + 0xfb, 0x38, 0xe7, 0xd6, 0xdb, 0x6c, 0xa5, 0xfa, 0x68, 0xce, 0xe8, 0xe5, + 0x09, 0xf1, 0x28, 0x75, 0x7f, 0xb8, 0x78, 0xfd, 0x7d, 0x4d, 0x9c, 0xbc, + 0xc7, 0xf1, 0xca, 0x99, 0x1d, 0xfd, 0x78, 0xfc, 0x8b, 0x89, 0xcd, 0xfc, + 0x3c, 0x5d, 0x88, 0xc3, 0x97, 0xec, 0x9a, 0x51, 0x23, 0x97, 0xf4, 0xe1, + 0x8c, 0x10, 0x9c, 0xa8, 0x56, 0x31, 0x26, 0x14, 0x85, 0x77, 0x4c, 0x1e, + 0x31, 0x5d, 0x20, 0xf8, 0xb9, 0x42, 0x8b, 0xce, 0x04, 0x39, 0x7f, 0xc1, + 0x1f, 0xf5, 0x93, 0xe4, 0xe7, 0x2f, 0x46, 0xc4, 0xe5, 0xfe, 0xc0, 0x8b, + 0xe9, 0x02, 0x72, 0xdd, 0x39, 0x7b, 0xf7, 0x9c, 0x4f, 0x0b, 0x46, 0x36, + 0x4d, 0xa2, 0x47, 0xcb, 0xb4, 0xc4, 0xc3, 0xdc, 0x6f, 0x87, 0x86, 0x65, + 0x84, 0xe5, 0xf4, 0x4f, 0x12, 0x39, 0x4e, 0x6c, 0x84, 0x42, 0xff, 0xf6, + 0x05, 0xd9, 0x9c, 0xcb, 0x01, 0x81, 0x39, 0x77, 0x5c, 0xe5, 0xd3, 0x68, + 0xe5, 0xfb, 0x38, 0xa0, 0x87, 0x0d, 0x72, 0x82, 0xd7, 0xf7, 0xcf, 0x66, + 0xb5, 0x07, 0x2f, 0xdd, 0xce, 0x7d, 0x07, 0x2f, 0xdc, 0x0f, 0x3a, 0x92, + 0x39, 0x5f, 0x13, 0x39, 0xfa, 0xef, 0x07, 0xd8, 0x5f, 0xf9, 0x45, 0xf0, + 0x73, 0xae, 0x72, 0xff, 0xd8, 0x32, 0xee, 0x08, 0xc3, 0x67, 0x2f, 0xfd, + 0x9b, 0xdb, 0xcb, 0xe7, 0x18, 0x6b, 0x39, 0x50, 0x88, 0x19, 0x1e, 0x56, + 0xd3, 0x12, 0x14, 0xef, 0x42, 0x8a, 0xff, 0x6f, 0x5d, 0xc1, 0x4d, 0x1c, + 0xa8, 0x55, 0xa2, 0x92, 0x9a, 0x9c, 0xd6, 0xff, 0xb0, 0x38, 0x30, 0x3f, + 0xc1, 0xcb, 0xa1, 0xb3, 0x95, 0x0f, 0x83, 0x6f, 0x3c, 0x29, 0xa5, 0x39, + 0x52, 0x19, 0xd3, 0x1c, 0x85, 0x4a, 0xb0, 0x82, 0x5c, 0xe1, 0x4f, 0x2e, + 0xa9, 0x18, 0x7c, 0xd0, 0x92, 0xdd, 0x3f, 0xc1, 0x92, 0xa2, 0x7b, 0x3a, + 0xda, 0xea, 0xa0, 0x87, 0x78, 0xd2, 0x7d, 0x35, 0x2a, 0x97, 0xd3, 0x97, + 0xff, 0xc7, 0x17, 0xc6, 0x59, 0xea, 0x86, 0xdc, 0x06, 0xd7, 0xfd, 0x9b, + 0x18, 0xf4, 0xb3, 0xa7, 0x2f, 0xe1, 0x06, 0x05, 0xe4, 0x72, 0xff, 0xbd, + 0xae, 0xa4, 0x31, 0xc2, 0x72, 0xff, 0xdd, 0x41, 0x8e, 0x74, 0x8c, 0x83, + 0x97, 0xb5, 0x1b, 0x39, 0x77, 0xb4, 0xb3, 0xd9, 0xe4, 0xf6, 0xa1, 0x18, + 0x1f, 0xc2, 0x46, 0xff, 0x2c, 0x72, 0x52, 0x7d, 0x1c, 0xbf, 0x9d, 0xbc, + 0x02, 0x9e, 0x39, 0x7e, 0x79, 0x7c, 0x0a, 0x1c, 0xbf, 0xb5, 0x81, 0x4d, + 0x4e, 0x72, 0xf4, 0xa0, 0x07, 0x2f, 0xca, 0x4d, 0x28, 0x6b, 0x29, 0x50, + 0xa9, 0x33, 0x0d, 0xd5, 0x87, 0x62, 0x14, 0x6c, 0xcb, 0xa5, 0xfa, 0x29, + 0xf1, 0x72, 0x83, 0x96, 0x59, 0xcb, 0xff, 0x95, 0x1f, 0xdd, 0x4c, 0xd2, + 0x40, 0x9c, 0xbc, 0xd1, 0x02, 0x72, 0xb6, 0x7c, 0x4c, 0x44, 0xbf, 0x99, + 0xee, 0xc7, 0x18, 0x39, 0x7f, 0xf7, 0x3e, 0xfd, 0x9d, 0x84, 0x17, 0x09, + 0xcb, 0xe5, 0x76, 0xed, 0x9c, 0xb2, 0x86, 0x88, 0x15, 0x6f, 0x1a, 0x81, + 0x45, 0x78, 0xde, 0xb6, 0x3f, 0x58, 0x88, 0x34, 0x61, 0xbf, 0x93, 0x87, + 0x5f, 0x61, 0xb3, 0x97, 0xfb, 0xa8, 0xa7, 0xd0, 0x02, 0x0a, 0x56, 0xcf, + 0xa5, 0xa1, 0x9d, 0xf0, 0xf0, 0x70, 0xfa, 0x39, 0x48, 0x79, 0xca, 0x12, + 0x5f, 0xdd, 0xcf, 0xf8, 0x7c, 0xd1, 0xcb, 0xfe, 0x1f, 0x6b, 0xfe, 0x7c, + 0x8d, 0x9c, 0xbf, 0xdf, 0xbe, 0xb3, 0x05, 0x53, 0x95, 0x07, 0xdf, 0xd3, + 0xcb, 0xfe, 0x8f, 0x6b, 0xe6, 0x31, 0x02, 0x72, 0xff, 0xdf, 0x05, 0xd5, + 0xf9, 0xa0, 0x02, 0x0e, 0x5f, 0xfe, 0x9f, 0xf0, 0x6a, 0x49, 0xad, 0x46, + 0xe4, 0x72, 0xc8, 0xaa, 0x24, 0x36, 0x87, 0x7f, 0x9f, 0xbc, 0xea, 0x07, + 0xc7, 0x2b, 0x47, 0xb9, 0xe2, 0x9b, 0xfd, 0xd4, 0x9a, 0x50, 0x32, 0x39, + 0x7f, 0xe8, 0x6f, 0x5c, 0x23, 0xaf, 0x39, 0xf1, 0xca, 0x59, 0xfc, 0x78, + 0xce, 0xfa, 0x5d, 0xc9, 0xce, 0x5f, 0xf4, 0x72, 0xc7, 0xf6, 0x73, 0xe3, + 0x95, 0xc9, 0xee, 0x89, 0x1d, 0xfb, 0xfe, 0xee, 0x1b, 0x39, 0x73, 0x47, + 0x39, 0x74, 0x2f, 0xc7, 0x84, 0xa1, 0x55, 0xdb, 0x73, 0x97, 0xff, 0x71, + 0x4d, 0x6b, 0x05, 0x6e, 0x20, 0x39, 0x7f, 0xba, 0x81, 0x0e, 0x37, 0x31, + 0xcb, 0xd1, 0xb0, 0x61, 0xfc, 0xad, 0x12, 0xb6, 0x8c, 0x1e, 0xc2, 0x3e, + 0xff, 0xcf, 0xce, 0xb3, 0xc8, 0xc7, 0x91, 0xcb, 0x78, 0xe5, 0x00, 0xf3, + 0xd4, 0x3e, 0xbf, 0xff, 0xd3, 0x0c, 0x33, 0x70, 0xbc, 0xde, 0x75, 0x37, + 0xd7, 0x39, 0x7f, 0xfc, 0xfb, 0x03, 0x4c, 0xdc, 0x49, 0x39, 0xf6, 0x1c, + 0xbf, 0xff, 0xfb, 0xfd, 0x75, 0xe5, 0xa9, 0x27, 0x94, 0xdc, 0x76, 0x3d, + 0xa7, 0xe4, 0xe5, 0xfa, 0x30, 0x7c, 0xd0, 0xe5, 0xfc, 0x9c, 0x83, 0x6e, + 0x13, 0x96, 0x61, 0xca, 0x61, 0xf3, 0xf4, 0xa0, 0x4b, 0xae, 0xdb, 0x59, + 0xcb, 0xd2, 0xfc, 0x27, 0x2e, 0x7e, 0x7e, 0x1f, 0x34, 0xc5, 0xce, 0x35, + 0x58, 0xa8, 0xbd, 0x17, 0xf6, 0xa3, 0xa8, 0xd0, 0xaf, 0xff, 0xec, 0x19, + 0xf5, 0xa8, 0x06, 0x75, 0x36, 0xed, 0xf8, 0xe5, 0xfc, 0x1c, 0x15, 0x77, + 0x07, 0x2a, 0x4b, 0xfd, 0x21, 0x85, 0x12, 0xc8, 0x79, 0x8c, 0x9a, 0x68, + 0x4d, 0x6d, 0xfd, 0x8c, 0x9d, 0x87, 0x78, 0x1d, 0xfd, 0x29, 0x49, 0xb4, + 0x36, 0x8b, 0x77, 0xff, 0xf8, 0x70, 0x3d, 0x86, 0xc7, 0x12, 0x76, 0x9f, + 0xf5, 0x36, 0x72, 0xa1, 0x92, 0x6e, 0x94, 0x80, 0xbf, 0xe1, 0x93, 0x68, + 0x39, 0x7f, 0xfd, 0x33, 0xbc, 0xb5, 0x0c, 0x0f, 0x60, 0x56, 0x72, 0xa0, + 0xf7, 0xd0, 0x42, 0xff, 0xb2, 0x69, 0x47, 0x39, 0xcf, 0x8e, 0x5d, 0xb9, + 0xf0, 0xf6, 0xc4, 0x82, 0xf8, 0x3d, 0xfe, 0x73, 0x97, 0xf8, 0x2f, 0x2c, + 0x9f, 0xf1, 0x39, 0x7f, 0xed, 0xe3, 0x5c, 0xdd, 0x76, 0x26, 0x8e, 0x5a, + 0x78, 0x44, 0xde, 0x12, 0xec, 0xd2, 0xee, 0x1f, 0x0e, 0x56, 0x1e, 0x83, + 0x9a, 0xdf, 0xde, 0x69, 0xff, 0x71, 0x67, 0x2f, 0xf6, 0xe3, 0xc8, 0x08, + 0x91, 0xcb, 0xfb, 0x99, 0xde, 0x50, 0xd6, 0x72, 0xe1, 0x91, 0xca, 0x83, + 0xc8, 0x9c, 0xca, 0xb8, 0x46, 0x74, 0xdc, 0x39, 0xaa, 0x44, 0x85, 0xec, + 0x86, 0x47, 0x69, 0x41, 0xef, 0x0f, 0xb1, 0x8c, 0x63, 0x44, 0x1e, 0x31, + 0xfd, 0xea, 0xff, 0xdc, 0x22, 0x90, 0xc5, 0xf5, 0xf9, 0x01, 0xcb, 0xfd, + 0x29, 0xb0, 0x5f, 0xb8, 0x72, 0xfb, 0x99, 0x43, 0x0e, 0x5f, 0xcf, 0x30, + 0x60, 0x67, 0x39, 0x53, 0x9e, 0x8f, 0x12, 0x3b, 0xf3, 0xc4, 0xc9, 0xd3, + 0x97, 0xd1, 0xff, 0x0e, 0x87, 0x2f, 0xf2, 0x6e, 0x27, 0x7d, 0xac, 0xe5, + 0xbd, 0xf1, 0x10, 0x3b, 0x27, 0xf1, 0x3d, 0xff, 0xed, 0xac, 0x73, 0x88, + 0xe4, 0x6e, 0x34, 0x72, 0xff, 0x3c, 0xdd, 0xc6, 0x66, 0x8e, 0x56, 0x1f, + 0xe7, 0x14, 0x9b, 0xfc, 0x2a, 0xfc, 0x8e, 0x29, 0xc4, 0xe5, 0xf9, 0x5f, + 0x66, 0x30, 0xe5, 0x61, 0xf0, 0xa1, 0xcd, 0xff, 0xe9, 0x87, 0x15, 0x55, + 0xfd, 0xa4, 0x19, 0x8e, 0x5f, 0xb0, 0x29, 0xbd, 0x1c, 0xbf, 0x6d, 0x71, + 0x93, 0x9c, 0xbd, 0xef, 0x72, 0x72, 0xff, 0xee, 0x56, 0x9d, 0xf9, 0xc1, + 0x9d, 0x46, 0x1c, 0xa0, 0x1f, 0x47, 0x87, 0xae, 0xff, 0x67, 0x2b, 0x11, + 0x95, 0xa8, 0x48, 0x34, 0x22, 0xb4, 0x4e, 0x99, 0x3b, 0x70, 0xf1, 0xa8, + 0x57, 0x43, 0x90, 0xa6, 0x48, 0x5a, 0x76, 0x10, 0x8e, 0x41, 0xe8, 0xdc, + 0xef, 0xfc, 0x28, 0xa7, 0x39, 0xc7, 0x98, 0x50, 0xe5, 0xff, 0xe4, 0xcd, + 0x86, 0x1b, 0xce, 0xc7, 0x3a, 0x39, 0x7c, 0xa4, 0x6c, 0x07, 0x2f, 0xfd, + 0x1c, 0xf7, 0xb1, 0x3c, 0x7e, 0xc3, 0x97, 0x3e, 0xce, 0x5f, 0xde, 0x49, + 0xd9, 0x0b, 0x39, 0x41, 0x3c, 0x4e, 0x8b, 0x5f, 0xfe, 0x04, 0xd2, 0x4d, + 0xca, 0x69, 0x26, 0xe4, 0x72, 0xf7, 0x92, 0x73, 0x95, 0xc9, 0xf5, 0x6d, + 0x36, 0xec, 0xe0, 0x39, 0x7c, 0x05, 0x06, 0x47, 0x2c, 0xe2, 0x6f, 0x3c, + 0x33, 0x7e, 0xd6, 0xb0, 0x40, 0x72, 0x80, 0x79, 0x82, 0x4b, 0x50, 0x9a, + 0xc2, 0x42, 0x33, 0xf8, 0x55, 0xdd, 0xcc, 0xc7, 0x2f, 0xca, 0x78, 0x0c, + 0xc3, 0x94, 0xc3, 0xc2, 0x00, 0xcd, 0xe5, 0xc6, 0x8e, 0x5f, 0xf4, 0x9f, + 0x7e, 0x18, 0x66, 0x8e, 0x5f, 0xe8, 0x0c, 0x6f, 0xf8, 0x01, 0xcb, 0x99, + 0xa9, 0x8f, 0xad, 0x87, 0x17, 0xff, 0xf3, 0xb6, 0x17, 0x7d, 0xcf, 0xd7, + 0xf7, 0x53, 0x72, 0x39, 0x7f, 0xe8, 0x71, 0xcf, 0x79, 0x1b, 0xf1, 0xca, + 0x84, 0xdc, 0x70, 0x89, 0x21, 0x0e, 0x25, 0xff, 0xae, 0x57, 0x0c, 0xc9, + 0x9b, 0x84, 0x69, 0x4e, 0x12, 0x63, 0x52, 0xd0, 0xe6, 0x4a, 0xe9, 0x1e, + 0xa3, 0xdd, 0xf4, 0x7d, 0xb7, 0xf4, 0x7f, 0xca, 0x73, 0xc0, 0x72, 0xfd, + 0x8d, 0xe7, 0x3e, 0x39, 0x5f, 0x0f, 0x71, 0x0c, 0xef, 0xf7, 0x32, 0xc0, + 0xf7, 0x27, 0x39, 0x5b, 0x3d, 0x81, 0x23, 0xbe, 0x57, 0x79, 0xa3, 0x97, + 0xff, 0x60, 0xfe, 0xbe, 0xe3, 0x26, 0x75, 0x9c, 0xa4, 0x3e, 0x8d, 0x11, + 0xdf, 0xe1, 0x57, 0xb0, 0xc6, 0x09, 0xcb, 0xf9, 0xad, 0x23, 0x83, 0xff, + 0x1c, 0xbf, 0x44, 0xd9, 0x8b, 0x39, 0x58, 0x88, 0xe4, 0x33, 0xe9, 0xa5, + 0xff, 0xbb, 0x93, 0x24, 0xdf, 0xf0, 0x7f, 0xa3, 0x97, 0x93, 0x6a, 0x9c, + 0xa4, 0x3e, 0x31, 0x46, 0xbf, 0x47, 0x07, 0x62, 0x63, 0x95, 0x23, 0xcb, + 0xd1, 0x05, 0xff, 0xdf, 0xcc, 0x9d, 0x8e, 0x65, 0x13, 0x41, 0xcb, 0xf0, + 0x5c, 0x63, 0xa7, 0x2f, 0xe9, 0x47, 0x3e, 0xce, 0x9c, 0xbf, 0xfd, 0xed, + 0x20, 0x22, 0x5a, 0xcc, 0xe7, 0xc7, 0x2a, 0x63, 0xf8, 0xd1, 0x75, 0x75, + 0x18, 0x2d, 0xc2, 0x7a, 0xff, 0x75, 0xe6, 0xc4, 0xe0, 0x09, 0xca, 0x43, + 0xdf, 0xd1, 0x4d, 0xff, 0xfb, 0x7f, 0xef, 0x70, 0x38, 0xaa, 0x77, 0xb8, + 0xa1, 0xcb, 0xf3, 0xa0, 0x60, 0x4e, 0x5d, 0x1f, 0x9c, 0xa1, 0x37, 0x9a, + 0x25, 0xbe, 0x9e, 0x38, 0x20, 0xe5, 0xf7, 0x40, 0xfe, 0x39, 0x6e, 0x9c, + 0xb7, 0x17, 0x36, 0x7f, 0x91, 0x5f, 0xfc, 0x8c, 0x4d, 0x76, 0x13, 0x7f, + 0xb5, 0x9c, 0xa8, 0x46, 0x42, 0x2c, 0x39, 0x4d, 0xfc, 0x3a, 0x4e, 0x30, + 0x13, 0x97, 0x85, 0x15, 0x39, 0x7f, 0x79, 0x36, 0x9e, 0xfc, 0xe5, 0xa1, + 0x87, 0x94, 0xa0, 0xe5, 0xfd, 0xfa, 0x9d, 0xce, 0x74, 0x72, 0xff, 0xff, + 0xfd, 0xb8, 0xf0, 0xba, 0xd3, 0x53, 0x26, 0xd7, 0x1a, 0xf4, 0x73, 0x0a, + 0x66, 0x8e, 0x5f, 0xee, 0xe7, 0x31, 0xb4, 0x61, 0xcb, 0xff, 0xff, 0xfe, + 0xd6, 0x7b, 0xae, 0xcd, 0x6f, 0x69, 0xcf, 0x9d, 0xd5, 0xcc, 0x9b, 0xff, + 0x43, 0x7c, 0xc1, 0xcb, 0xf7, 0xf3, 0x63, 0x4c, 0x39, 0x5a, 0x46, 0x1f, + 0xa1, 0x31, 0x7b, 0xb9, 0xb3, 0x97, 0xf7, 0x85, 0xc1, 0x82, 0x72, 0xfc, + 0x2e, 0x0c, 0x13, 0x95, 0xf0, 0xf4, 0x3c, 0x57, 0x50, 0xa8, 0xc4, 0x30, + 0x83, 0x78, 0x7b, 0x78, 0xa3, 0xf6, 0xcb, 0xff, 0x79, 0x34, 0x2f, 0xe9, + 0x9c, 0x27, 0x2f, 0x80, 0xfc, 0xe8, 0xe5, 0xcd, 0xb6, 0x72, 0xb4, 0x6f, + 0x1b, 0x23, 0xbe, 0xeb, 0xe7, 0x4a, 0x7d, 0x34, 0x55, 0x88, 0xcf, 0x48, + 0x4e, 0x5f, 0x94, 0xc6, 0x26, 0xce, 0x5f, 0xf7, 0xfe, 0x81, 0x5b, 0x56, + 0x06, 0x1c, 0xbd, 0xd8, 0x01, 0xcb, 0xff, 0x7e, 0x1e, 0xa6, 0xd3, 0x99, + 0xa0, 0xe5, 0x62, 0x31, 0x10, 0xa1, 0xcf, 0xc4, 0x72, 0xf7, 0x7e, 0x35, + 0x9c, 0xbf, 0x76, 0x07, 0x27, 0x39, 0x50, 0x79, 0x2e, 0x45, 0x7f, 0xbb, + 0x1e, 0xfd, 0x9f, 0xf8, 0xe5, 0x43, 0x2d, 0x3a, 0x50, 0x89, 0x0c, 0x2b, + 0xf9, 0x86, 0xe3, 0x59, 0x14, 0xd1, 0xb3, 0xec, 0x85, 0x90, 0x93, 0xec, + 0x3a, 0x1c, 0xb4, 0x0f, 0x1c, 0x39, 0x40, 0xca, 0x62, 0xd4, 0x64, 0x9e, + 0x87, 0x57, 0x18, 0x41, 0x70, 0x10, 0x5f, 0x26, 0xd4, 0x98, 0xe5, 0xd9, + 0x87, 0x2f, 0x97, 0xd4, 0x50, 0xe5, 0x74, 0xf7, 0x38, 0x72, 0x45, 0x05, + 0x6f, 0xd3, 0x44, 0xdd, 0x83, 0x97, 0x29, 0x07, 0x2f, 0x36, 0xdb, 0x65, + 0x2f, 0xa5, 0xec, 0x59, 0x4f, 0xa6, 0x82, 0xfd, 0x81, 0x40, 0x68, 0xf7, + 0x7f, 0x2b, 0x67, 0xd0, 0x26, 0x95, 0x08, 0xe9, 0xd9, 0x4b, 0xc2, 0x7e, + 0xef, 0x68, 0xe5, 0xfe, 0xf7, 0x63, 0xda, 0xea, 0x1c, 0xbf, 0x7c, 0xc9, + 0x92, 0x73, 0x95, 0xf0, 0xf7, 0xb4, 0x67, 0x6d, 0x1c, 0xbf, 0xde, 0xe6, + 0x5d, 0x81, 0x9c, 0xa5, 0xff, 0xb3, 0x99, 0x26, 0x08, 0xe0, 0x4e, 0x5f, + 0xa7, 0x67, 0xfc, 0xf8, 0xe5, 0x42, 0x68, 0xfc, 0xba, 0xec, 0x90, 0x44, + 0x74, 0x6b, 0xe3, 0xcb, 0xfd, 0xcc, 0xbf, 0x75, 0x1c, 0x27, 0x2f, 0xf8, + 0x61, 0xbd, 0x20, 0xf3, 0x23, 0x97, 0x42, 0xce, 0x50, 0x9e, 0x7f, 0x13, + 0x9b, 0xe9, 0xd4, 0x86, 0xb3, 0x97, 0xe1, 0x86, 0xf0, 0x4e, 0x5f, 0xf7, + 0x79, 0x85, 0x66, 0x94, 0x35, 0x9c, 0xb6, 0x82, 0x7c, 0xb8, 0x4d, 0x5b, + 0x45, 0x9f, 0xa1, 0x19, 0x50, 0x9e, 0xd6, 0x2b, 0xa4, 0x21, 0x5e, 0x1a, + 0xd7, 0xf0, 0xf3, 0xa9, 0xb3, 0xc7, 0x2f, 0xe4, 0xf0, 0xb8, 0x34, 0x72, + 0xff, 0xf7, 0xa6, 0xcd, 0xe3, 0xb2, 0x3a, 0x81, 0x39, 0x7f, 0x7e, 0xcc, + 0xef, 0x2e, 0x72, 0x95, 0x45, 0x20, 0x96, 0x69, 0x26, 0xff, 0xf2, 0x04, + 0x5f, 0x91, 0xcf, 0x62, 0x00, 0xe5, 0xf2, 0xc3, 0xfc, 0xe7, 0x2f, 0x4b, + 0x5f, 0x9c, 0xba, 0x3d, 0x87, 0x87, 0xd2, 0x5b, 0xf7, 0x5f, 0x79, 0xb3, + 0x97, 0x7e, 0xe7, 0x29, 0x66, 0xf8, 0x49, 0xef, 0xed, 0xc2, 0x49, 0xf4, + 0x72, 0xff, 0xdc, 0xe9, 0x15, 0xcf, 0x26, 0xf0, 0xe5, 0xa2, 0x74, 0x45, + 0x89, 0x07, 0x8b, 0x2f, 0xd3, 0xb5, 0xa6, 0x72, 0x72, 0xfc, 0x9a, 0x89, + 0xd8, 0x7b, 0x3f, 0x57, 0xe8, 0x7d, 0x83, 0xf3, 0xd9, 0xfa, 0xb9, 0xe4, + 0x7b, 0x3f, 0x57, 0xdf, 0xcb, 0x34, 0x7b, 0x3f, 0x54, 0x13, 0xd3, 0x12, + 0x3b, 0xf4, 0x66, 0xb0, 0x4f, 0x67, 0xea, 0x8f, 0x67, 0xea, 0xe7, 0xf1, + 0xec, 0xfd, 0x30, 0xb8, 0xb4, 0x84, 0xff, 0x3f, 0x4a, 0xbe, 0xc6, 0x88, + 0x03, 0xd9, 0xfa, 0xa3, 0xd9, 0xfa, 0xb8, 0x10, 0x7b, 0x3f, 0x57, 0xfd, + 0x80, 0x7d, 0xe7, 0x1c, 0x09, 0xec, 0xfd, 0x5f, 0xd9, 0xd4, 0xd7, 0xf3, + 0x9e, 0xcf, 0xd5, 0x01, 0x14, 0xa2, 0x47, 0xa4, 0x6b, 0xed, 0xcf, 0x1e, + 0x3d, 0x9f, 0xaa, 0x3d, 0x9f, 0xac, 0x36, 0x17, 0x36, 0xd9, 0xec, 0xfd, + 0x54, 0x95, 0x8d, 0x84, 0xd7, 0x21, 0x11, 0xcc, 0x27, 0x76, 0x50, 0xc3, + 0x0d, 0x42, 0xf7, 0xcb, 0xed, 0x93, 0xde, 0x94, 0x2a, 0x5b, 0x3f, 0x4f, + 0xa8, 0x90, 0xbf, 0xda, 0xc9, 0x4a, 0x3d, 0xc9, 0xca, 0xc3, 0xf3, 0xd1, + 0xfd, 0xff, 0xb1, 0x61, 0xcd, 0xb6, 0xfd, 0x98, 0xe5, 0xff, 0xda, 0x1c, + 0x9a, 0x27, 0x03, 0xf3, 0xa3, 0x97, 0x4a, 0x72, 0x97, 0xd3, 0x3b, 0xec, + 0xe5, 0x4e, 0x8e, 0x1e, 0x48, 0x7a, 0x80, 0x28, 0xdc, 0x03, 0x17, 0x24, + 0xe7, 0x2b, 0x6b, 0xb2, 0x0f, 0x3a, 0x57, 0xe4, 0xeb, 0xfc, 0xcd, 0x0e, + 0x7b, 0x00, 0x72, 0xfe, 0xf6, 0x76, 0x36, 0x03, 0x97, 0xfc, 0xb8, 0x00, + 0x7f, 0x7d, 0xc8, 0xe5, 0xff, 0x9d, 0xe7, 0xc6, 0x38, 0xf3, 0x23, 0x97, + 0x9d, 0x5d, 0x61, 0xfc, 0x4c, 0x75, 0x66, 0xfe, 0x23, 0x64, 0x61, 0x4b, + 0x50, 0x99, 0xdb, 0xc6, 0x17, 0x7e, 0x1f, 0x77, 0x27, 0x39, 0x70, 0x5b, + 0x39, 0x50, 0x78, 0x18, 0x51, 0x7f, 0xfe, 0x96, 0xe3, 0x8b, 0xcd, 0x01, + 0xec, 0x31, 0xe6, 0x39, 0x7f, 0xb8, 0x1f, 0x49, 0xa9, 0xb0, 0xe5, 0x72, + 0x88, 0xed, 0xac, 0x54, 0x33, 0xa3, 0xa5, 0x2d, 0x53, 0x11, 0x12, 0x1a, + 0x6d, 0x66, 0x1b, 0x84, 0x57, 0x61, 0xea, 0xf3, 0xb8, 0xa3, 0x1b, 0xae, + 0x9a, 0x3f, 0x85, 0x75, 0xff, 0xff, 0x27, 0x5f, 0xb1, 0x2f, 0xb8, 0x08, + 0x96, 0x83, 0xd8, 0xd9, 0xcb, 0xff, 0x2b, 0x1c, 0x8c, 0x77, 0xbf, 0xac, + 0xe5, 0xff, 0xdb, 0x8c, 0x1c, 0x92, 0x77, 0x38, 0x9c, 0xbf, 0xfe, 0x17, + 0x57, 0x59, 0xc6, 0x39, 0xf6, 0xbf, 0x61, 0xca, 0x0a, 0x25, 0xc5, 0x0e, + 0xfe, 0x17, 0x57, 0xaf, 0x23, 0x97, 0xe5, 0xe3, 0x23, 0x47, 0x2f, 0x36, + 0xdb, 0x65, 0x2f, 0x29, 0x00, 0x29, 0xf4, 0xd0, 0x5f, 0xf3, 0xc9, 0x4d, + 0xe7, 0x17, 0xd9, 0xcb, 0xff, 0xf7, 0x72, 0x4a, 0x08, 0xe4, 0xf3, 0x4a, + 0x37, 0x39, 0xca, 0x14, 0x49, 0xf8, 0xee, 0xff, 0xbc, 0xe3, 0x9a, 0xdc, + 0x68, 0xe5, 0xf4, 0xa0, 0x1c, 0x9c, 0xbf, 0x81, 0x03, 0x9c, 0xf8, 0xe5, + 0xce, 0x0f, 0x87, 0xa0, 0xa1, 0x1d, 0x3a, 0x2d, 0xc6, 0x10, 0xf7, 0xb8, + 0xc6, 0xce, 0x54, 0x95, 0xda, 0x05, 0x9f, 0x21, 0xb0, 0xc2, 0x27, 0x2d, + 0x02, 0x38, 0xc3, 0x0b, 0xd0, 0xd9, 0xe2, 0x4d, 0x72, 0x4e, 0x72, 0xff, + 0x0a, 0xc2, 0x9c, 0x60, 0x27, 0x28, 0x27, 0x97, 0xf8, 0xbd, 0x80, 0x72, + 0xff, 0xb2, 0x1a, 0xfe, 0x75, 0xf3, 0x67, 0x2f, 0x31, 0x26, 0x39, 0x7e, + 0xc0, 0x6a, 0x24, 0x72, 0xfc, 0x8c, 0x08, 0x70, 0xe5, 0x80, 0x27, 0x9c, + 0xd0, 0x9e, 0xff, 0xbd, 0xdc, 0xd7, 0xcf, 0x24, 0xe7, 0x2a, 0x0f, 0x95, + 0x0a, 0x6f, 0xf8, 0x53, 0xfe, 0x1f, 0x4d, 0x23, 0xc7, 0x2a, 0x49, 0xbe, + 0xcc, 0x22, 0xc3, 0xce, 0xc3, 0x40, 0x48, 0x2f, 0xb3, 0xca, 0x4e, 0x72, + 0xf3, 0x6d, 0xb6, 0x58, 0x84, 0x0b, 0xe5, 0xbb, 0xac, 0xb1, 0x08, 0x1f, + 0x4d, 0x75, 0xf3, 0xef, 0x1b, 0x39, 0x5b, 0x3e, 0x3e, 0x28, 0x37, 0x9b, + 0x6d, 0xb2, 0xc4, 0x1e, 0x51, 0x62, 0x0f, 0x3e, 0x9a, 0xeb, 0xfb, 0x3d, + 0xdf, 0xde, 0x47, 0x2f, 0x36, 0xdb, 0x67, 0x2f, 0x6a, 0x15, 0x29, 0xf4, + 0xd0, 0x56, 0x23, 0xe9, 0x6a, 0x42, 0x57, 0xe4, 0xea, 0x6b, 0x4f, 0xa9, + 0x91, 0xd7, 0xdf, 0xfd, 0xd8, 0x92, 0x7b, 0x3a, 0xb8, 0x61, 0xca, 0x83, + 0xf0, 0xe2, 0x5b, 0x7f, 0xfb, 0x3a, 0x9b, 0xeb, 0xe6, 0x91, 0xe7, 0x39, + 0x7d, 0x1e, 0x86, 0x1c, 0xa6, 0x1f, 0x4f, 0x92, 0x2f, 0xe6, 0xdc, 0x3f, + 0xba, 0x87, 0x2f, 0x85, 0x21, 0x53, 0x97, 0x94, 0x80, 0x1c, 0xa9, 0xcd, + 0xf3, 0x08, 0x6f, 0xcb, 0x8e, 0xc3, 0x0a, 0x5f, 0x85, 0xc4, 0x70, 0xa5, + 0xd8, 0xb2, 0x97, 0x36, 0xd9, 0x4a, 0xc3, 0xfa, 0xd1, 0x3f, 0x89, 0x1b, + 0x16, 0xbf, 0xc2, 0xa4, 0x03, 0xb9, 0xc0, 0x53, 0xe9, 0xbc, 0xbf, 0xfd, + 0x38, 0x76, 0xeb, 0x1c, 0xe3, 0xb4, 0xd1, 0xca, 0x84, 0xff, 0x30, 0x89, + 0x1b, 0x9e, 0x1b, 0x1f, 0xa4, 0x5f, 0xfd, 0x00, 0xd6, 0x60, 0x5c, 0x5d, + 0x53, 0x97, 0xff, 0xee, 0xa7, 0x14, 0x10, 0xea, 0x36, 0x99, 0xce, 0x8e, + 0x5f, 0xc3, 0x19, 0xb7, 0x01, 0xcb, 0xff, 0x46, 0xfb, 0x09, 0xd8, 0x14, + 0x39, 0x74, 0xb4, 0xb4, 0x5e, 0x79, 0x59, 0xb2, 0xbb, 0xfd, 0x03, 0x8c, + 0x4e, 0x64, 0x72, 0xff, 0xfb, 0x43, 0x9c, 0x81, 0xf4, 0xfb, 0x4e, 0x40, + 0x72, 0xb9, 0x45, 0xff, 0x8f, 0x5b, 0x32, 0xae, 0xa7, 0xde, 0xf1, 0xde, + 0xdf, 0xda, 0x50, 0x3f, 0x8c, 0x8e, 0x5f, 0xc8, 0xb0, 0xe3, 0x80, 0xe5, + 0xff, 0xfb, 0xda, 0xe7, 0xe0, 0x70, 0x30, 0xfb, 0xc1, 0x01, 0xcb, 0xff, + 0xff, 0x7c, 0xf4, 0xb0, 0x0d, 0x33, 0xe0, 0x70, 0x30, 0xfb, 0xc1, 0x01, + 0x10, 0xbf, 0xfb, 0x3d, 0xf1, 0x7d, 0x4e, 0xf5, 0x00, 0x68, 0x42, 0xd5, + 0x24, 0x63, 0xe9, 0xd2, 0xf4, 0x4f, 0xf7, 0x49, 0xa0, 0xfa, 0x31, 0xeb, + 0xf3, 0x34, 0xdb, 0xf2, 0x72, 0xda, 0x09, 0xf4, 0x28, 0x7d, 0x7f, 0x64, + 0xd2, 0x4d, 0xe8, 0xe5, 0xfd, 0x1c, 0xa9, 0xa8, 0xc3, 0x95, 0x0c, 0xc9, + 0xa0, 0xc3, 0x67, 0x23, 0xa0, 0x49, 0x55, 0x5b, 0x95, 0x10, 0xf2, 0x8f, + 0x38, 0x72, 0x91, 0x30, 0xd4, 0x7a, 0xbe, 0x29, 0xfc, 0xba, 0xf3, 0x6d, + 0xb6, 0x52, 0xf3, 0x88, 0x4a, 0x7d, 0x34, 0x17, 0xd9, 0xbc, 0xf1, 0xca, + 0x01, 0xe7, 0x68, 0xb6, 0xfb, 0xa8, 0xf2, 0x39, 0x7f, 0xbd, 0xa4, 0xde, + 0xd1, 0x87, 0x2f, 0x32, 0x70, 0x9c, 0xa1, 0x3d, 0x1f, 0x19, 0xde, 0xf8, + 0xab, 0x43, 0x97, 0xbc, 0xe1, 0x39, 0x5b, 0x37, 0xda, 0x22, 0xbf, 0x97, + 0x00, 0x4d, 0xaa, 0x52, 0xfe, 0x53, 0x37, 0x99, 0x31, 0xcb, 0xf3, 0xf7, + 0xe0, 0x60, 0xe5, 0x49, 0x39, 0x90, 0x91, 0x63, 0x92, 0x2f, 0x89, 0x0e, + 0x8b, 0xbc, 0x5d, 0x7e, 0x7d, 0xef, 0x39, 0x39, 0x7f, 0xfb, 0xdd, 0x47, + 0x06, 0x6c, 0x30, 0x32, 0x39, 0x7f, 0xfb, 0x9f, 0x9c, 0x82, 0x05, 0x6f, + 0x38, 0xb9, 0xca, 0x84, 0x5e, 0xe1, 0x40, 0xa4, 0x5f, 0xa3, 0x4a, 0x0c, + 0x8e, 0x5f, 0x7c, 0x5a, 0x48, 0xe5, 0xff, 0x97, 0x9b, 0xc4, 0xd7, 0x63, + 0x89, 0xcb, 0xff, 0xff, 0x9d, 0x3c, 0x9d, 0x5a, 0x7c, 0x92, 0x75, 0xc7, + 0xd2, 0xcd, 0xe1, 0xcb, 0xdd, 0xce, 0x03, 0x95, 0xd4, 0x47, 0xbb, 0x85, + 0xff, 0x0c, 0x73, 0xa8, 0xf4, 0x04, 0xe5, 0xed, 0x29, 0xaf, 0x87, 0xb5, + 0x84, 0x54, 0x14, 0xe0, 0xb9, 0x24, 0xf4, 0x65, 0x17, 0xff, 0xff, 0xfd, + 0x1a, 0x8f, 0x4f, 0x8d, 0xef, 0x3a, 0xea, 0x6b, 0x15, 0x71, 0x04, 0x0c, + 0x4d, 0xd8, 0x39, 0x7e, 0xd7, 0x5d, 0x70, 0x72, 0x85, 0x17, 0x6d, 0xc2, + 0x52, 0xff, 0xff, 0xe4, 0x57, 0x99, 0x7b, 0x07, 0xda, 0xf9, 0xad, 0x66, + 0xf0, 0x5e, 0x47, 0x2f, 0xfe, 0xfa, 0x11, 0x8f, 0xd7, 0x8a, 0xa6, 0xce, + 0x5d, 0x8d, 0x9c, 0xb6, 0x41, 0xef, 0x69, 0x1e, 0xff, 0x07, 0xb1, 0x33, + 0xbf, 0x27, 0x2f, 0x74, 0x1c, 0x4e, 0x56, 0xcf, 0x4f, 0x80, 0xd2, 0xa4, + 0x89, 0xe7, 0x79, 0xbf, 0xfb, 0x36, 0x06, 0x26, 0x94, 0xd4, 0x61, 0xcb, + 0xf0, 0x77, 0x1c, 0xb5, 0x9c, 0xbf, 0xff, 0xf7, 0xa3, 0x60, 0x5f, 0x52, + 0x49, 0xb7, 0x07, 0x86, 0x19, 0xa3, 0x97, 0x35, 0xe8, 0xe5, 0x2a, 0x88, + 0x57, 0x6b, 0xa9, 0x26, 0x31, 0x88, 0x8f, 0x0b, 0x1b, 0xcd, 0x40, 0x80, + 0xe5, 0xd8, 0xc3, 0x97, 0xff, 0x60, 0x83, 0xe2, 0x9b, 0x03, 0x13, 0x47, + 0x28, 0x27, 0xba, 0xc1, 0x6b, 0xe0, 0x7b, 0x00, 0x72, 0xfd, 0x1a, 0xd2, + 0x71, 0x39, 0x48, 0x7d, 0xbb, 0x22, 0xe9, 0x15, 0xe6, 0x9c, 0xc1, 0xcb, + 0xfe, 0x5f, 0x46, 0x39, 0x48, 0xe9, 0xca, 0x86, 0x42, 0xfc, 0xa3, 0x1f, + 0x09, 0x6e, 0x47, 0x54, 0x90, 0xf3, 0xd9, 0x43, 0xc6, 0xe0, 0x31, 0x9d, + 0x68, 0xd3, 0xf8, 0x75, 0xb4, 0x2e, 0x50, 0x7e, 0xff, 0xce, 0x81, 0xff, + 0xda, 0x9f, 0x1b, 0x39, 0x7e, 0xd6, 0x2b, 0x1a, 0x39, 0x7f, 0x35, 0xe9, + 0x07, 0x99, 0x1c, 0xbf, 0xf3, 0xed, 0xa2, 0x77, 0x1f, 0x90, 0x1c, 0xbf, + 0xff, 0x27, 0xa1, 0x99, 0xcf, 0xa1, 0x8a, 0x6d, 0xc0, 0x72, 0xf9, 0x05, + 0xc2, 0x72, 0xff, 0xb5, 0x1b, 0xf4, 0x7d, 0x0a, 0x1c, 0xa9, 0x22, 0xc0, + 0x2a, 0xda, 0x20, 0xbf, 0xfd, 0xa4, 0xdc, 0x4b, 0xb1, 0x30, 0xfe, 0xa9, + 0xcb, 0x96, 0xd0, 0xe5, 0xfc, 0xaf, 0xa3, 0xb1, 0xa3, 0x97, 0xf7, 0x53, + 0x9d, 0x3f, 0x27, 0x2a, 0x47, 0xec, 0x83, 0x20, 0x2e, 0xbf, 0xe7, 0x9b, + 0xaf, 0xbd, 0xa0, 0x4e, 0x5f, 0x27, 0x5d, 0x87, 0x28, 0x4f, 0x6b, 0xc7, + 0x37, 0xed, 0xe6, 0x91, 0xb3, 0x97, 0xa1, 0xa9, 0xb9, 0xcb, 0xf9, 0x48, + 0xfd, 0x7f, 0xb0, 0xe5, 0xc8, 0x27, 0x2f, 0xa5, 0x02, 0xb3, 0x94, 0x13, + 0x6d, 0x82, 0xb7, 0xf4, 0x7b, 0x84, 0x78, 0xe4, 0xe5, 0x7c, 0x3d, 0x24, + 0x20, 0xbe, 0x80, 0x60, 0x9c, 0xa9, 0x2e, 0x14, 0xe1, 0x42, 0xcc, 0x52, + 0x1e, 0x13, 0x18, 0x6e, 0x18, 0x4c, 0x84, 0x43, 0x90, 0xe8, 0xa3, 0xf2, + 0x16, 0xe1, 0x72, 0xd0, 0x8e, 0xfc, 0x8c, 0xe1, 0x4d, 0x4d, 0xab, 0x39, + 0x7c, 0xa4, 0x37, 0xa3, 0x97, 0x03, 0xc7, 0x2e, 0x07, 0x4e, 0x5f, 0x6f, + 0x79, 0xa3, 0x97, 0x64, 0xc7, 0x2d, 0x2f, 0x88, 0x8b, 0x9c, 0x91, 0x82, + 0xee, 0x2e, 0xa1, 0x15, 0xf9, 0x3c, 0xe3, 0x87, 0x2f, 0xdb, 0x0e, 0x60, + 0x9c, 0xbf, 0xf9, 0xad, 0x33, 0xb1, 0xc7, 0x5d, 0x8e, 0x4e, 0x5f, 0xdc, + 0xef, 0xfe, 0x7d, 0x23, 0x94, 0xe8, 0xa1, 0xd1, 0x37, 0xe9, 0x37, 0xe6, + 0xfd, 0xec, 0x9c, 0xe5, 0xff, 0x60, 0xef, 0x35, 0x89, 0xd3, 0x97, 0xff, + 0xd2, 0xf0, 0xe3, 0xf8, 0x73, 0xde, 0xc6, 0xce, 0x5d, 0x9c, 0x4e, 0x5f, + 0xf2, 0xfb, 0x81, 0x62, 0x6f, 0x0e, 0x54, 0xe7, 0xa1, 0x83, 0x17, 0xf4, + 0x46, 0xfb, 0x1c, 0x4e, 0x5f, 0xfe, 0xf6, 0xb2, 0x6e, 0xc7, 0x1c, 0xef, + 0x60, 0xe5, 0xfd, 0xd0, 0xa7, 0x18, 0x09, 0xca, 0xc3, 0xfb, 0x74, 0xcb, + 0xed, 0x26, 0x00, 0xe5, 0xf6, 0x79, 0x34, 0x72, 0xfe, 0x6a, 0x26, 0x16, + 0xae, 0x7f, 0xce, 0x56, 0x8f, 0x73, 0xc4, 0x35, 0x25, 0x6f, 0xc1, 0x86, + 0x36, 0x18, 0x2c, 0xab, 0x93, 0x6d, 0xc2, 0x7b, 0xa4, 0x43, 0x0a, 0x9d, + 0x10, 0x79, 0xf6, 0xff, 0xfd, 0xe4, 0xd4, 0xf8, 0xde, 0x92, 0x71, 0x7e, + 0x7c, 0x72, 0xf3, 0x79, 0xd3, 0x97, 0xfb, 0x48, 0xaf, 0x5c, 0x50, 0xe5, + 0xfa, 0x70, 0x8b, 0xaa, 0x72, 0xf9, 0x35, 0x81, 0xc4, 0x68, 0x3a, 0xc7, + 0x87, 0x54, 0x32, 0xbf, 0xf3, 0xb5, 0x83, 0xfd, 0x20, 0xf3, 0x23, 0x97, + 0xf8, 0x38, 0x28, 0xdf, 0x7f, 0x39, 0x7f, 0xfd, 0xd4, 0x8f, 0x20, 0x22, + 0x5f, 0x5b, 0x6d, 0xb2, 0x97, 0xff, 0x24, 0x78, 0x11, 0x2f, 0xad, 0xb6, + 0xd9, 0x4a, 0xc4, 0x4e, 0xf5, 0x52, 0xa7, 0x47, 0x9f, 0xa1, 0xa3, 0x7f, + 0xbb, 0xfb, 0xb0, 0x2e, 0xc3, 0x94, 0x27, 0xbb, 0xe2, 0x9b, 0xe0, 0xe6, + 0x2a, 0x52, 0xf9, 0xc0, 0xfe, 0x39, 0x7f, 0xdb, 0x75, 0xfc, 0xec, 0x28, + 0x27, 0x2f, 0x7f, 0x1b, 0x39, 0x77, 0xb4, 0x13, 0xd8, 0x98, 0xee, 0xf4, + 0x87, 0xf3, 0x44, 0x32, 0xbd, 0xd8, 0x9c, 0xe5, 0xfb, 0xd1, 0x25, 0x58, + 0x72, 0xf3, 0x6d, 0xb6, 0x52, 0xf6, 0x0a, 0xca, 0x7d, 0x34, 0x17, 0xfe, + 0xc9, 0xf0, 0x2f, 0x21, 0x89, 0xce, 0x54, 0x22, 0xd0, 0x09, 0x22, 0x5b, + 0x7c, 0xe2, 0xd4, 0xb8, 0x63, 0x97, 0x35, 0x26, 0xa4, 0x72, 0xfd, 0x9e, + 0xf7, 0xf3, 0x9c, 0xb4, 0x9a, 0x91, 0xe6, 0x89, 0x1d, 0xe7, 0x6b, 0x83, + 0x97, 0xec, 0x0f, 0x5d, 0xac, 0xe5, 0xf8, 0x70, 0x30, 0xc3, 0x95, 0x0a, + 0xca, 0x27, 0x21, 0x09, 0x16, 0x3c, 0xf2, 0x5f, 0x31, 0x56, 0xe1, 0xa3, + 0xd2, 0xe7, 0x79, 0xfc, 0xb7, 0x88, 0xf3, 0x65, 0x57, 0xf3, 0x31, 0x37, + 0x34, 0x8e, 0x5f, 0xff, 0x2a, 0xa3, 0x8f, 0x5e, 0x5a, 0xc6, 0x43, 0x59, + 0xca, 0x84, 0x40, 0xa1, 0x75, 0xef, 0x24, 0x1c, 0xbb, 0x04, 0xe5, 0x21, + 0xb0, 0xfc, 0x6e, 0xfc, 0x31, 0xcc, 0x68, 0xe5, 0xff, 0xb1, 0x05, 0xfd, + 0xa6, 0xe0, 0x4e, 0x5e, 0xeb, 0xee, 0x0f, 0x8f, 0x44, 0xf7, 0xc9, 0xb8, + 0xf1, 0xcb, 0xed, 0x64, 0x48, 0xe5, 0x04, 0xf0, 0x84, 0x86, 0xfd, 0x12, + 0xee, 0x72, 0x72, 0xee, 0x40, 0x72, 0xfe, 0x64, 0x68, 0x08, 0xb3, 0x97, + 0xb5, 0x0a, 0x80, 0xf1, 0x74, 0x31, 0x7f, 0xbf, 0xcd, 0x80, 0x08, 0x27, + 0x2f, 0x3b, 0x57, 0x39, 0xcb, 0xff, 0x63, 0x10, 0x3b, 0xc0, 0xbb, 0x0e, + 0x5f, 0x63, 0x14, 0x09, 0xca, 0xe9, 0xf0, 0x09, 0xed, 0xff, 0xe4, 0x0f, + 0x54, 0xd6, 0x6d, 0x6e, 0xeb, 0x34, 0x41, 0x8b, 0xff, 0x77, 0xf7, 0x57, + 0x3d, 0xec, 0xe9, 0xcb, 0xff, 0x68, 0x0f, 0xce, 0x94, 0xdf, 0x5c, 0xe5, + 0xf7, 0xfd, 0xc5, 0x9c, 0xa9, 0x23, 0xec, 0x2a, 0xfe, 0x40, 0x68, 0x83, + 0x7f, 0xda, 0xd4, 0x6e, 0x4b, 0x49, 0xce, 0x5f, 0xdf, 0xaa, 0x39, 0x3f, + 0xe7, 0x2a, 0x0f, 0xaf, 0xa7, 0x57, 0xbb, 0xfb, 0x59, 0xcb, 0xff, 0xdb, + 0x7e, 0x38, 0x2b, 0xea, 0x01, 0x4f, 0x1c, 0xa8, 0x4c, 0xe2, 0x50, 0xaa, + 0xe1, 0xc8, 0x7f, 0x21, 0xae, 0x55, 0xc2, 0xf4, 0xd0, 0x4c, 0xf5, 0x08, + 0x2f, 0x4a, 0x54, 0xbc, 0xfc, 0x70, 0xe5, 0xc0, 0x01, 0xcb, 0xfe, 0x5f, + 0x53, 0x62, 0x9e, 0xd1, 0xca, 0x61, 0xe7, 0x80, 0x5e, 0xff, 0x01, 0x3b, + 0xdc, 0x03, 0x9c, 0xbf, 0xff, 0xe6, 0x67, 0xbc, 0xfb, 0x18, 0xe6, 0x4a, + 0x6c, 0x0c, 0x4d, 0x1c, 0xbf, 0xe6, 0x23, 0x78, 0x21, 0xec, 0x1c, 0xbb, + 0xbf, 0x9c, 0xbf, 0xff, 0x49, 0x04, 0x3d, 0xce, 0x54, 0x71, 0xf0, 0x84, + 0xe5, 0xe4, 0x6d, 0xac, 0xe5, 0xfe, 0xce, 0x3a, 0xf7, 0xa1, 0x87, 0x2b, + 0x67, 0xab, 0xd2, 0x0a, 0x84, 0xe1, 0x31, 0xa1, 0x0e, 0x26, 0x18, 0xd4, + 0x2a, 0xaf, 0xe4, 0x62, 0xf0, 0x56, 0x72, 0xfe, 0xcd, 0x34, 0xcd, 0xc1, + 0xca, 0xd9, 0xed, 0x34, 0x2c, 0xa9, 0x32, 0x1c, 0xc3, 0x08, 0x4c, 0x74, + 0x59, 0x0a, 0x4b, 0xf2, 0x62, 0xc3, 0xb6, 0x00, 0x8b, 0x51, 0xdb, 0x7a, + 0x15, 0x17, 0xfb, 0x5a, 0xc1, 0x03, 0x4c, 0x39, 0x7c, 0x29, 0xc1, 0x07, + 0x2d, 0x31, 0xcb, 0xfb, 0x58, 0x20, 0x69, 0x87, 0x2d, 0xc7, 0xe2, 0x25, + 0xf0, 0xd0, 0x04, 0x7a, 0x12, 0xbf, 0xef, 0xfc, 0x0f, 0xd9, 0x19, 0xe3, + 0x97, 0xff, 0x86, 0x7f, 0x93, 0x20, 0xe0, 0x70, 0x55, 0x39, 0x7f, 0x27, + 0x3c, 0x1d, 0x8f, 0x1c, 0xbc, 0xa6, 0x41, 0xca, 0x84, 0x4c, 0xb5, 0xa6, + 0x39, 0x8d, 0xff, 0xfe, 0xc1, 0x7f, 0x6b, 0x36, 0x00, 0x46, 0x73, 0xed, + 0x21, 0xcb, 0xb1, 0xa1, 0xcb, 0x38, 0x4f, 0xdf, 0xcb, 0xf7, 0xa3, 0x73, + 0x1c, 0xaf, 0x8d, 0xeb, 0x54, 0x4e, 0x35, 0x4f, 0x0b, 0xe0, 0xc3, 0x13, + 0x25, 0xe8, 0xae, 0x36, 0xbe, 0x54, 0x92, 0x72, 0xef, 0xb1, 0x98, 0xbd, + 0x23, 0x10, 0x11, 0x9d, 0x0a, 0x37, 0xf0, 0xd4, 0x6e, 0x15, 0x0d, 0x09, + 0xef, 0x73, 0x3f, 0x13, 0x97, 0xf7, 0xc5, 0xf6, 0x39, 0xe0, 0x39, 0x7b, + 0xe0, 0x1b, 0x39, 0x5c, 0x9e, 0xa7, 0x8d, 0x2f, 0xec, 0x6f, 0x30, 0x55, + 0x39, 0x7c, 0xc7, 0xcd, 0x1c, 0xa4, 0x3c, 0xe7, 0x2d, 0xbf, 0xfe, 0x5c, + 0x6b, 0x50, 0xcc, 0xf2, 0x6b, 0xae, 0x72, 0xff, 0x08, 0xc4, 0x99, 0x08, + 0x72, 0xff, 0x79, 0x38, 0xa7, 0xa5, 0x05, 0x2c, 0xc3, 0x97, 0xf6, 0x0a, + 0xbb, 0x8f, 0xa8, 0x78, 0xaa, 0x1a, 0x56, 0x26, 0x12, 0x89, 0xda, 0x75, + 0xbe, 0xdf, 0xfc, 0xc8, 0xe5, 0xfe, 0x19, 0x0e, 0x32, 0x16, 0x72, 0xf3, + 0x03, 0x87, 0x2a, 0x0f, 0xcb, 0x09, 0x5c, 0xc6, 0xf3, 0x4f, 0xfc, 0x72, + 0xf9, 0xf6, 0xea, 0x1c, 0xbf, 0xfd, 0xe8, 0x62, 0x07, 0x05, 0x5e, 0xc3, + 0x0e, 0x52, 0xd1, 0x17, 0xa2, 0x0f, 0x11, 0x5f, 0xff, 0x27, 0xbb, 0x1a, + 0x8e, 0xc2, 0x4f, 0x0a, 0x9c, 0xbf, 0xdd, 0x89, 0xa4, 0x9b, 0x91, 0xcb, + 0xfd, 0xe4, 0x6e, 0x61, 0x76, 0xce, 0x5f, 0xbd, 0xed, 0x38, 0x0e, 0x5f, + 0xa1, 0x9e, 0xc5, 0x9c, 0xb9, 0x27, 0x39, 0x50, 0x98, 0xf0, 0x53, 0xf9, + 0x34, 0x43, 0x5e, 0x94, 0x78, 0x9e, 0xfc, 0xda, 0x07, 0x81, 0x0e, 0x5f, + 0xf7, 0x62, 0x48, 0x38, 0xc8, 0x39, 0x7f, 0xd9, 0xee, 0xe3, 0x05, 0xfc, + 0x72, 0xfe, 0xe2, 0x9b, 0xe6, 0x1a, 0xce, 0x58, 0x42, 0x7d, 0x58, 0x6f, + 0x7e, 0x64, 0x2e, 0x70, 0x9c, 0xbe, 0x94, 0x31, 0xce, 0x5f, 0xb6, 0x06, + 0x26, 0x8e, 0x5d, 0xed, 0x61, 0xf9, 0x39, 0x4a, 0x84, 0x35, 0x08, 0xd2, + 0xfe, 0x13, 0x16, 0xd1, 0xcb, 0xfa, 0x27, 0xc1, 0x45, 0x4e, 0x56, 0xcd, + 0xf6, 0x84, 0x6f, 0xfe, 0x81, 0x7e, 0xc0, 0x3e, 0xef, 0x5a, 0x29, 0x53, + 0xaa, 0x3e, 0x0c, 0x6e, 0x58, 0xcc, 0xc2, 0x1b, 0xfc, 0xe1, 0xd6, 0xa3, + 0x72, 0x39, 0x77, 0xf3, 0x9c, 0xbf, 0xdc, 0xcb, 0x9d, 0x27, 0xa0, 0xe5, + 0xe4, 0xe7, 0x47, 0x2b, 0x0f, 0x49, 0x0d, 0x69, 0x11, 0x17, 0xd6, 0xbb, + 0xb1, 0x67, 0x2f, 0x6f, 0x34, 0x73, 0xc5, 0xb5, 0xff, 0xf0, 0x7e, 0x3a, + 0x66, 0xa2, 0x7c, 0x14, 0x54, 0xe5, 0xfe, 0xdb, 0x23, 0x9f, 0x3a, 0xce, + 0x5f, 0xff, 0xc3, 0x9e, 0xee, 0x4b, 0x17, 0x0b, 0xf0, 0xbb, 0x0e, 0x56, + 0x23, 0x71, 0x14, 0x34, 0x69, 0x7c, 0x8c, 0x89, 0x8e, 0x5f, 0xfd, 0xa4, + 0xe4, 0x72, 0x6d, 0xc7, 0xb4, 0x72, 0xfb, 0x27, 0xfe, 0x47, 0x2a, 0x64, + 0x45, 0x80, 0x89, 0xb4, 0x5b, 0xef, 0xc2, 0x18, 0x39, 0x50, 0x7a, 0xae, + 0x65, 0x76, 0x36, 0x72, 0x8b, 0x88, 0x61, 0x7f, 0x69, 0x48, 0xdc, 0x30, + 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc2, + 0x8b, 0x88, 0x61, 0x52, 0x45, 0xca, 0x0c, 0x80, 0xf3, 0xf1, 0x96, 0x83, + 0x3c, 0x03, 0x37, 0x77, 0x0b, 0x88, 0x61, 0x7f, 0x3b, 0xfa, 0x68, 0x61, + 0x71, 0x0c, 0x3e, 0x1a, 0x4b, 0x70, 0xe5, 0xc4, 0x30, 0xa2, 0xe2, 0x18, + 0x51, 0x71, 0x0c, 0x2a, 0x46, 0xc9, 0x06, 0x68, 0xb8, 0x86, 0x14, 0x5c, + 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x45, + 0xc4, 0x30, 0xa9, 0xd1, 0x2c, 0x11, 0x94, 0x19, 0x00, 0xce, 0x86, 0x78, + 0x8c, 0xd1, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x15, 0x23, 0x65, 0xa1, 0x9a, + 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x45, 0xc4, 0x30, + 0xa9, 0x1f, 0x20, 0x06, 0x7c, 0x33, 0xc0, 0x33, 0x45, 0xc4, 0x30, 0xa2, + 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x15, 0x39, 0xf2, 0x2a, + 0x33, 0xb1, 0x9e, 0x8c, 0xd9, 0x52, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x28, + 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x04, 0xf9, 0x39, + 0x19, 0x00, 0xcf, 0xe3, 0x34, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x17, + 0x10, 0xc2, 0xfd, 0xd8, 0x06, 0xb0, 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, + 0x92, 0x26, 0x56, 0x33, 0xd1, 0x97, 0x19, 0x01, 0xad, 0x96, 0x5c, 0x43, + 0x0a, 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, 0x45, 0xc4, + 0x30, 0xa9, 0x1f, 0x27, 0x23, 0x28, 0x33, 0xc4, 0x66, 0x8b, 0x88, 0x61, + 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x2a, 0x47, 0xc8, + 0x11, 0x9e, 0x8c, 0x88, 0xcd, 0xba, 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, + 0x17, 0x10, 0xc2, 0xd2, 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc3, 0x92, 0xfe, + 0x8b, 0x88, 0x61, 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, + 0x2a, 0x74, 0x6f, 0x48, 0x65, 0x53, 0x85, 0x94, 0xcc, 0x32, 0x01, 0x9f, + 0x0c, 0xdb, 0x0b, 0x88, 0x61, 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x5a, + 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x72, 0x5f, 0xd1, 0x71, 0x0c, 0x28, + 0xb8, 0x86, 0x15, 0x08, 0xac, 0x90, 0xca, 0x1c, 0x6c, 0xa5, 0x83, 0x34, + 0x5c, 0x43, 0x0a, 0x2e, 0x21, 0x85, 0x17, 0x10, 0xc2, 0x8b, 0x88, 0x61, + 0x45, 0xc4, 0x30, 0xa8, 0x3f, 0xde, 0x46, 0x76, 0x32, 0xc1, 0x91, 0x19, + 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x28, 0xb8, 0x86, 0x15, 0xb3, 0xcb, + 0xd0, 0xcf, 0x86, 0x68, 0xb8, 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x2e, 0x21, + 0x85, 0x30, 0xf2, 0xc4, 0x67, 0xc3, 0x36, 0x61, 0x71, 0x0c, 0x28, 0xb8, + 0x86, 0x14, 0x5c, 0x43, 0x0a, 0x01, 0xb2, 0xfc, 0x66, 0x8b, 0x88, 0x61, + 0x45, 0xc4, 0x30, 0xa2, 0xe2, 0x18, 0x51, 0x71, 0x0c, 0x2a, 0x0f, 0x92, + 0x61, 0x9e, 0x8c, 0xfe, 0x33, 0x50, 0xcc, 0x10, 0x9e, 0x10, 0x12, 0x4d, + 0x0a, 0xb6, 0x42, 0xd9, 0x70, 0x8b, 0xe6, 0x10, 0xa9, 0x0a, 0x36, 0xb3, + 0xe9, 0xa1, 0x09, 0xb8, 0x6b, 0xb1, 0x27, 0xb0, 0x83, 0x78, 0x51, 0x00, + 0xec, 0x61, 0xfb, 0xa6, 0x7f, 0x43, 0x2b, 0xf8, 0x62, 0xf1, 0x84, 0x9b, + 0x6f, 0x4d, 0x0b, 0x94, 0x51, 0xe0, 0x84, 0x35, 0xfa, 0x43, 0x19, 0xa2, + 0xe2, 0x18, 0x7d, 0x4e, 0x5a, 0xf2, 0x43, 0x0b, 0x88, 0x61, 0x7c, 0x8b, + 0x7d, 0x9f, 0x10, 0xc5, 0xe4, 0x0e, 0x1f, 0x10, 0xc5, 0xbe, 0xf2, 0x8c, + 0x8d, 0xa4, 0xf4, 0xa7, 0xc5, 0xd6, 0x8e, 0x2c, 0xf8, 0x45, 0x29, 0xe7, + 0xd7, 0xfb, 0xa8, 0xd8, 0x77, 0x13, 0x9c, 0xbc, 0x9c, 0x78, 0x73, 0x95, + 0xca, 0x24, 0x26, 0x38, 0xf1, 0xad, 0xfb, 0x32, 0x67, 0x50, 0xe5, 0xc0, + 0x83, 0x97, 0xf6, 0xdc, 0x54, 0x80, 0x1c, 0xb9, 0xf6, 0x72, 0xc8, 0x71, + 0x65, 0xb5, 0x96, 0x72, 0xcc, 0x39, 0x73, 0x4f, 0xa8, 0x89, 0xad, 0x8b, + 0x75, 0x0d, 0xc7, 0xd4, 0x11, 0xbf, 0xee, 0xc3, 0x32, 0x68, 0x19, 0xce, + 0x5f, 0xfd, 0xf1, 0xd6, 0x1e, 0xc0, 0x30, 0x40, 0x72, 0xe0, 0x41, 0xca, + 0xc3, 0xdb, 0x02, 0x2d, 0x62, 0x61, 0xc0, 0x59, 0xfe, 0x12, 0x97, 0xff, + 0x08, 0xc4, 0xe3, 0x89, 0xc6, 0x1a, 0x1c, 0xbd, 0x1c, 0xe8, 0xe5, 0x39, + 0xf1, 0x69, 0x16, 0xf3, 0xee, 0x0e, 0x5f, 0x91, 0xa3, 0x88, 0x0e, 0x54, + 0x8f, 0x0d, 0x83, 0x77, 0xfc, 0xa3, 0x87, 0x58, 0xc8, 0x6b, 0x39, 0x7b, + 0x39, 0x6c, 0xe5, 0xee, 0x41, 0x9b, 0x3d, 0xa1, 0x3c, 0xbe, 0xe3, 0x9b, + 0x91, 0xcb, 0xc1, 0x71, 0x39, 0x48, 0x6f, 0xdc, 0x92, 0xff, 0xfa, 0x3e, + 0x3e, 0xf6, 0xe0, 0x8f, 0xad, 0xb6, 0xd9, 0xca, 0x84, 0xd8, 0xdd, 0xf3, + 0x4e, 0x5f, 0x8f, 0xdf, 0xfd, 0xfa, 0x93, 0x7c, 0x85, 0x1d, 0x71, 0xd3, + 0x95, 0xc2, 0x37, 0xfc, 0x30, 0xeb, 0x3b, 0x8c, 0xa3, 0x29, 0x0c, 0x28, + 0x72, 0x16, 0xeb, 0x8d, 0x3b, 0x95, 0x74, 0x94, 0xd2, 0xd6, 0x8b, 0x34, + 0x2f, 0xb6, 0x70, 0xc8, 0xc1, 0xfb, 0x18, 0x73, 0xd6, 0x06, 0x80, 0x32, + 0x18, 0xf4, 0x35, 0x09, 0x8f, 0x47, 0x8e, 0xa1, 0xed, 0xe6, 0x69, 0x67, + 0x2f, 0x0a, 0xe0, 0xe5, 0x7c, 0x37, 0x08, 0x3b, 0x7f, 0x36, 0xfb, 0xdb, + 0xf2, 0x72, 0xff, 0xfd, 0xad, 0xed, 0x26, 0xd6, 0xe3, 0xc8, 0xb4, 0x09, + 0xca, 0x62, 0x29, 0xc4, 0x89, 0xb2, 0xfb, 0xe6, 0x7a, 0x34, 0x72, 0xfc, + 0x04, 0x9d, 0x02, 0x72, 0xfb, 0x68, 0x2a, 0x9c, 0xbf, 0xde, 0x8f, 0xd7, + 0xd4, 0xd9, 0xcb, 0xfb, 0x17, 0xd8, 0xe6, 0x47, 0x2f, 0xe6, 0x69, 0x15, + 0xf3, 0x67, 0x2f, 0xd1, 0xcf, 0x62, 0x47, 0x2b, 0x68, 0xdc, 0x12, 0x2f, + 0x1a, 0x28, 0x5d, 0xc0, 0x61, 0x7f, 0xd9, 0xc8, 0xe7, 0xbd, 0x93, 0x9c, + 0xbb, 0x9f, 0x1c, 0xbf, 0x60, 0xce, 0x9b, 0x39, 0x7e, 0xf3, 0x8f, 0xf8, + 0x72, 0xff, 0x6b, 0x18, 0x9e, 0xeb, 0x9c, 0xb4, 0x62, 0x26, 0x36, 0x30, + 0x24, 0xfe, 0x27, 0xbd, 0xf1, 0x88, 0x72, 0xe1, 0x61, 0xca, 0x91, 0xb4, + 0xd0, 0xf5, 0xee, 0x0d, 0xc1, 0xcb, 0xfd, 0xb4, 0x98, 0x73, 0x8b, 0x9c, + 0xbb, 0x9d, 0x7c, 0x3f, 0x48, 0x21, 0xd8, 0xfd, 0xff, 0x0c, 0x3c, 0xfd, + 0x8d, 0x80, 0xe5, 0xfe, 0x4d, 0x8f, 0xbd, 0x93, 0x9c, 0xb9, 0xf8, 0x9c, + 0xbf, 0xa4, 0x29, 0x2e, 0xe1, 0xcb, 0xf4, 0xe9, 0xb8, 0x91, 0xca, 0x55, + 0x13, 0xf3, 0x19, 0xec, 0x60, 0x4b, 0x2f, 0xdf, 0xf9, 0xa6, 0x78, 0xe5, + 0xe0, 0xa2, 0xa7, 0x2a, 0x0f, 0x23, 0x0a, 0xef, 0x6c, 0x0a, 0x1c, 0xbf, + 0xf9, 0x3d, 0x1e, 0xd7, 0x5d, 0x3b, 0xf9, 0xca, 0x83, 0xe2, 0x71, 0xeb, + 0xe1, 0x1f, 0xe4, 0x72, 0xff, 0xdd, 0x8d, 0x80, 0x71, 0xb7, 0x01, 0xcb, + 0xd9, 0x93, 0x1c, 0xb6, 0x74, 0xf6, 0x80, 0x7d, 0x7a, 0x39, 0x6c, 0xe5, + 0xfb, 0x7f, 0xb1, 0xc4, 0xe5, 0x78, 0xf1, 0xbf, 0x1e, 0xbe, 0x64, 0x64, + 0xe7, 0x2f, 0xd9, 0xc4, 0x63, 0x93, 0x94, 0x87, 0x97, 0xa2, 0x2b, 0xe8, + 0x1f, 0x2c, 0xe5, 0x05, 0x5c, 0xc6, 0x43, 0x5f, 0x70, 0x86, 0xec, 0x20, + 0x9c, 0x80, 0x5f, 0x34, 0xdb, 0xe6, 0xe6, 0x84, 0x37, 0xf8, 0x0a, 0x60, + 0x87, 0xb0, 0x72, 0xa1, 0x18, 0x2f, 0x08, 0xeb, 0xfb, 0x58, 0xc4, 0xec, + 0x1c, 0xbd, 0xcc, 0xb4, 0x72, 0xb9, 0x3c, 0xad, 0x96, 0x5e, 0xd0, 0x1b, + 0x39, 0x7f, 0xd2, 0x63, 0xcb, 0xda, 0x85, 0x4e, 0x54, 0x1f, 0xde, 0x11, + 0xb8, 0xf5, 0xf7, 0xef, 0xb9, 0x1c, 0xbe, 0x8f, 0xf8, 0x7d, 0x14, 0xbf, + 0x4b, 0xeb, 0x6d, 0xb6, 0x72, 0x84, 0xf5, 0xbf, 0x28, 0xbe, 0x7f, 0x33, + 0xc7, 0x28, 0x28, 0xbd, 0xc7, 0x90, 0x11, 0x5f, 0xe5, 0x04, 0x5d, 0xb7, + 0xe9, 0xca, 0x86, 0x51, 0x46, 0x18, 0x72, 0x44, 0x91, 0x82, 0x6d, 0x35, + 0x90, 0xd1, 0x78, 0x74, 0x02, 0x72, 0x58, 0x61, 0xd7, 0xfc, 0x3a, 0x5b, + 0x2f, 0xbc, 0xd5, 0x35, 0x3e, 0x10, 0xe5, 0xe9, 0x0b, 0x9c, 0xb7, 0x2d, + 0x51, 0xe4, 0x41, 0x6d, 0xfb, 0x82, 0x25, 0xb8, 0x39, 0x7b, 0xce, 0x03, + 0x97, 0xf4, 0x6e, 0x78, 0xdc, 0xe7, 0x2f, 0xfd, 0x03, 0xee, 0xfe, 0xf2, + 0x94, 0x1c, 0xbf, 0x7e, 0x0c, 0x15, 0x9c, 0xbd, 0xb8, 0x98, 0xe5, 0xf2, + 0x0b, 0xcc, 0x72, 0xff, 0xc3, 0x0a, 0xf5, 0xfc, 0xa6, 0x00, 0xe5, 0xed, + 0x6f, 0x0e, 0x5f, 0xd9, 0xb0, 0x0f, 0xe0, 0x39, 0x48, 0x79, 0x5a, 0x1c, + 0xb3, 0x59, 0xcb, 0xfb, 0x14, 0x89, 0x93, 0x47, 0x28, 0x4f, 0x0b, 0xc2, + 0x95, 0x0a, 0x89, 0xa7, 0x2a, 0x90, 0xe0, 0x4b, 0xf6, 0x7c, 0xc2, 0x8e, + 0x8e, 0x89, 0x0f, 0xa1, 0x13, 0xc5, 0x8e, 0xff, 0xa1, 0x3b, 0x0c, 0x9f, + 0x1b, 0x39, 0x7e, 0xea, 0x4e, 0xe2, 0x72, 0xfd, 0xfa, 0xae, 0x20, 0x39, + 0x7f, 0x6b, 0x71, 0x81, 0x43, 0x95, 0x07, 0xf9, 0xd2, 0x7e, 0x25, 0x37, + 0xfd, 0x38, 0xe4, 0xbb, 0x80, 0xd1, 0xcb, 0xff, 0x60, 0xf3, 0x2d, 0x6f, + 0xf8, 0x01, 0xcb, 0xf6, 0x7b, 0x58, 0xa9, 0xca, 0x43, 0xe8, 0x62, 0x05, + 0xfc, 0x3e, 0xf9, 0xdc, 0xe0, 0x39, 0x78, 0x31, 0xc4, 0xe5, 0xff, 0xe1, + 0x18, 0x6c, 0x23, 0x1c, 0xc9, 0x04, 0xe5, 0xf9, 0x99, 0xd7, 0xe0, 0x39, + 0x58, 0x7e, 0x48, 0x91, 0x7f, 0xf9, 0xfe, 0x4d, 0x28, 0xdc, 0xff, 0x1b, + 0xce, 0x9c, 0xa8, 0x4c, 0xcc, 0x26, 0x5d, 0x84, 0x80, 0x90, 0x5f, 0xf3, + 0x3b, 0x9e, 0xcf, 0xf7, 0x39, 0xcb, 0xff, 0xe5, 0x5f, 0xda, 0x41, 0x9a, + 0x17, 0xbc, 0xe4, 0xe5, 0xff, 0x47, 0xb3, 0x6b, 0x77, 0x59, 0xa2, 0xf8, + 0x5f, 0xb3, 0x71, 0xcc, 0x8e, 0x5e, 0xec, 0x31, 0x67, 0xd9, 0xe4, 0x4b, + 0xff, 0xf0, 0xaf, 0xe7, 0x61, 0x36, 0x8c, 0x46, 0x90, 0xc3, 0x97, 0x9f, + 0x73, 0x9a, 0x2f, 0xf5, 0x42, 0x2d, 0x30, 0xcd, 0x6a, 0xf7, 0xfc, 0xfe, + 0xd2, 0x0f, 0x32, 0x61, 0xcb, 0xfe, 0x8c, 0xdf, 0xc9, 0x27, 0x32, 0x39, + 0x40, 0x3f, 0x4f, 0x1c, 0xdf, 0xff, 0xee, 0xbe, 0x92, 0x35, 0xf3, 0xdd, + 0xc6, 0x62, 0xdf, 0x67, 0x2e, 0x8e, 0x03, 0x97, 0xda, 0xd3, 0xb0, 0xe5, + 0x75, 0x13, 0x80, 0x61, 0xf0, 0xcd, 0xf7, 0x32, 0xf3, 0x9c, 0xbf, 0xfe, + 0x0a, 0xfa, 0x83, 0x9c, 0x5e, 0x5a, 0x40, 0x9c, 0xb4, 0xb0, 0xfc, 0xdc, + 0x8e, 0xff, 0xa1, 0x9f, 0x03, 0x98, 0x0d, 0x1c, 0xbe, 0x46, 0x6e, 0x73, + 0x97, 0xfe, 0xf4, 0x6b, 0x50, 0x93, 0xbf, 0x8e, 0x5f, 0xf2, 0x60, 0x85, + 0x54, 0xcd, 0x9c, 0xa4, 0x46, 0x96, 0xce, 0xbc, 0x47, 0xc0, 0x7d, 0x7b, + 0xd9, 0xc9, 0xcb, 0xf9, 0xf7, 0xcc, 0xb3, 0xc7, 0x2f, 0xfd, 0xed, 0x26, + 0xfc, 0x3f, 0xbc, 0x8e, 0x5f, 0xfe, 0x64, 0x34, 0xcf, 0xc7, 0x33, 0x8c, + 0x72, 0x72, 0xff, 0xd1, 0x9b, 0xcd, 0x81, 0x89, 0xa3, 0x97, 0x9f, 0x9e, + 0x03, 0x97, 0xf3, 0xfb, 0x51, 0x93, 0x9c, 0xa8, 0x4d, 0x13, 0x0b, 0x90, + 0xfc, 0x53, 0x78, 0x9e, 0xb6, 0x41, 0x7f, 0xdf, 0xc3, 0x35, 0x8c, 0x86, + 0xb3, 0x97, 0xfe, 0xdc, 0xf8, 0x1c, 0xef, 0x71, 0xac, 0xe5, 0xff, 0xb0, + 0x7d, 0xa5, 0x38, 0xc6, 0x72, 0x72, 0xb1, 0x10, 0x7a, 0x42, 0xbf, 0xfe, + 0x94, 0x6e, 0x7f, 0x22, 0xba, 0xd3, 0x8c, 0x8e, 0x5f, 0xd3, 0xeb, 0x19, + 0x0d, 0x67, 0x2c, 0xdc, 0xc8, 0x82, 0x51, 0x46, 0xf2, 0x75, 0x0e, 0x5f, + 0x4b, 0x61, 0x91, 0xcb, 0xe6, 0x79, 0x27, 0x39, 0x58, 0x78, 0xc8, 0x47, + 0x7f, 0xf7, 0x1f, 0x2b, 0x03, 0x2c, 0xea, 0x30, 0xe5, 0xd3, 0xf8, 0xe5, + 0xfe, 0xe3, 0xd7, 0x94, 0x60, 0x9c, 0xa8, 0x3c, 0xbc, 0x18, 0xbf, 0xff, + 0x4b, 0xb1, 0xb7, 0xf7, 0xfe, 0x4f, 0x6b, 0xa8, 0x72, 0xfe, 0xc6, 0xd4, + 0xeb, 0xf8, 0xe5, 0xfd, 0x26, 0x78, 0x7f, 0x98, 0xe5, 0xff, 0xf2, 0x92, + 0x8e, 0x28, 0x20, 0xda, 0x43, 0x30, 0xa5, 0x6d, 0x10, 0x1e, 0x30, 0xbe, + 0xea, 0x9c, 0xf8, 0xe5, 0xfb, 0x19, 0x89, 0xc4, 0xe5, 0xe9, 0xe6, 0x6b, + 0x39, 0x50, 0x9c, 0xbc, 0xea, 0xd9, 0x0a, 0xf5, 0x91, 0xa1, 0x2f, 0xe5, + 0x17, 0x7b, 0x0e, 0x5f, 0xb6, 0x93, 0xbb, 0x0d, 0x30, 0x9a, 0xfb, 0xdf, + 0xc3, 0x9a, 0x61, 0x35, 0xc0, 0x83, 0x50, 0x26, 0xbf, 0xc2, 0xea, 0xfa, + 0x36, 0x03, 0x50, 0x26, 0xbf, 0xda, 0xce, 0xa6, 0xbf, 0x9c, 0xd3, 0x09, + 0xae, 0xc0, 0x9a, 0x61, 0x35, 0xcd, 0xb6, 0x79, 0x84, 0xd5, 0x89, 0xa9, + 0x72, 0x6a, 0x85, 0xec, 0x23, 0xd2, 0x07, 0x14, 0x26, 0xc8, 0xed, 0xe2, + 0xcc, 0x26, 0x7d, 0x3e, 0x7b, 0x27, 0x2a, 0x80, 0x5b, 0x8f, 0x3e, 0xa1, + 0x76, 0x11, 0x0b, 0x3a, 0xc2, 0xe4, 0x03, 0x09, 0x1d, 0x47, 0x6f, 0xe9, + 0x4b, 0xb7, 0xcf, 0xc7, 0x1b, 0x39, 0x7f, 0xfe, 0xeb, 0xcb, 0xb1, 0x09, + 0xed, 0x20, 0xf3, 0x23, 0x97, 0x84, 0x0c, 0x39, 0x7f, 0xd1, 0xff, 0x85, + 0x38, 0xa8, 0xc3, 0x97, 0x66, 0xb0, 0xf6, 0x36, 0x39, 0x5b, 0x47, 0xe3, + 0x92, 0x0c, 0x2b, 0x2f, 0xb1, 0x36, 0xa9, 0xcb, 0xc1, 0x04, 0xc7, 0x2a, + 0x1b, 0x19, 0xf9, 0xe1, 0x42, 0x18, 0xd5, 0x31, 0x05, 0x53, 0xb5, 0xc6, + 0xe3, 0xcc, 0x28, 0x92, 0x17, 0xd3, 0x42, 0x8f, 0x70, 0xf8, 0x61, 0xff, + 0x63, 0x61, 0x15, 0x7d, 0x42, 0xff, 0xd3, 0xc5, 0x1c, 0x63, 0x71, 0x68, + 0x66, 0xa1, 0x15, 0xf8, 0x39, 0xb4, 0x54, 0xe5, 0xfd, 0xd8, 0x50, 0x79, + 0x01, 0xcb, 0xcd, 0x5e, 0x70, 0x1c, 0xbd, 0x98, 0xd9, 0xcb, 0x91, 0x53, + 0x95, 0x39, 0xb3, 0x41, 0xcb, 0xf7, 0xb2, 0x64, 0x61, 0xcb, 0xf4, 0x72, + 0x00, 0x41, 0xca, 0x83, 0xd0, 0x12, 0x8b, 0xf4, 0x71, 0x81, 0xf1, 0xcb, + 0xf2, 0x71, 0xf2, 0x4e, 0x72, 0xfc, 0xf2, 0xf6, 0x2c, 0xe5, 0xf8, 0x71, + 0x4c, 0x98, 0xe5, 0xff, 0xf0, 0xad, 0x18, 0x1f, 0xdf, 0x72, 0xce, 0x7c, + 0x72, 0xff, 0xce, 0x20, 0xe7, 0xdb, 0x8c, 0x6c, 0xe5, 0xff, 0xb5, 0xd4, + 0xf9, 0xcc, 0xa3, 0x27, 0x39, 0x6c, 0x6b, 0x44, 0x08, 0x0f, 0xef, 0xfb, + 0xae, 0xce, 0xa4, 0x73, 0x23, 0x97, 0xf2, 0x83, 0x26, 0x8f, 0x39, 0xca, + 0x84, 0xd9, 0xe5, 0x0d, 0x24, 0x2b, 0x01, 0xcd, 0x4e, 0xa9, 0xa4, 0x24, + 0x0b, 0x28, 0xd9, 0x50, 0x93, 0xfa, 0x38, 0xfb, 0xff, 0x63, 0xf6, 0x64, + 0x1e, 0xe7, 0x27, 0x2f, 0xe0, 0x4d, 0x28, 0xf6, 0x8e, 0x5f, 0xff, 0xff, + 0xb3, 0xb8, 0x20, 0xc1, 0xf7, 0x73, 0xb1, 0x93, 0x26, 0xe6, 0xea, 0x73, + 0xe3, 0x97, 0xc3, 0x18, 0xd9, 0xcb, 0xe8, 0xe7, 0x4e, 0x72, 0xa1, 0xb9, + 0x6b, 0x9e, 0x12, 0x61, 0x85, 0xae, 0x56, 0x39, 0xe9, 0x19, 0xdb, 0x59, + 0x44, 0xc5, 0xfb, 0x57, 0x79, 0x5b, 0x42, 0xbf, 0xe3, 0xef, 0xcb, 0xf8, + 0xc2, 0x09, 0x42, 0x1b, 0xff, 0xe4, 0x1c, 0x64, 0x28, 0x3f, 0xc8, 0x71, + 0x87, 0x2f, 0xf8, 0x29, 0x83, 0xfc, 0xb3, 0x47, 0x2f, 0xfb, 0x7b, 0x85, + 0xf7, 0x97, 0x6b, 0x39, 0x6f, 0xce, 0x5f, 0xcb, 0xfd, 0xc2, 0xc8, 0x39, + 0x7f, 0xdd, 0x49, 0x75, 0xe4, 0x8c, 0x39, 0x7f, 0xed, 0x20, 0xf3, 0x2f, + 0x26, 0x90, 0xe5, 0x61, 0xfb, 0x78, 0xe2, 0xfd, 0xa6, 0x40, 0x60, 0xe5, + 0x49, 0x3c, 0x1c, 0x4e, 0x43, 0x89, 0x8f, 0x76, 0x24, 0xc8, 0x52, 0x78, + 0x86, 0xf8, 0x63, 0x72, 0x39, 0x7f, 0xdd, 0x89, 0x20, 0x8f, 0xfc, 0x9c, + 0xbf, 0xe8, 0x92, 0x7a, 0x50, 0x20, 0x39, 0x7f, 0xd1, 0x9e, 0x50, 0x00, + 0x8e, 0x4e, 0x5b, 0x70, 0x8c, 0xbc, 0x21, 0xd9, 0xcb, 0x0d, 0xef, 0xe1, + 0x85, 0xee, 0x24, 0x72, 0xff, 0xfb, 0xae, 0x9e, 0x97, 0xe3, 0xed, 0x75, + 0xe4, 0x71, 0x43, 0x59, 0x7f, 0xed, 0x29, 0xe4, 0x1f, 0xe5, 0x9a, 0x39, + 0x70, 0x74, 0x72, 0x9a, 0xd1, 0x71, 0xd6, 0x11, 0x40, 0xbf, 0xff, 0xb3, + 0x9c, 0xd3, 0x8f, 0x52, 0x3d, 0xdf, 0xdd, 0x87, 0x2a, 0x13, 0xb1, 0x78, + 0xc9, 0x44, 0xca, 0xfd, 0xfb, 0x13, 0xb0, 0x72, 0xfd, 0x9b, 0x5c, 0x61, + 0xca, 0x13, 0xce, 0x50, 0xa2, 0xff, 0xfc, 0xe3, 0xe7, 0x7e, 0x8c, 0x7b, + 0x4d, 0xe7, 0x4e, 0x5f, 0xf4, 0x7b, 0xb8, 0xcc, 0xde, 0x1c, 0xbf, 0x7b, + 0xa9, 0x1a, 0x39, 0x7a, 0x77, 0x1d, 0x9e, 0xf6, 0x8d, 0xef, 0xfa, 0x01, + 0xa0, 0xfe, 0xfb, 0x91, 0xcb, 0xdb, 0xd6, 0x8f, 0x10, 0x1a, 0xf9, 0x6e, + 0xeb, 0x34, 0x40, 0x6f, 0xa6, 0xaa, 0xfe, 0xdc, 0x76, 0x3e, 0x64, 0x91, + 0x49, 0xb6, 0x4a, 0x74, 0xc7, 0x54, 0x86, 0xbd, 0x01, 0x3f, 0x7f, 0x47, + 0x9d, 0x7b, 0x8c, 0x74, 0xe5, 0x62, 0xa6, 0x14, 0x94, 0x32, 0xa1, 0x55, + 0xee, 0xbb, 0x59, 0xcb, 0xe8, 0x03, 0x4c, 0x39, 0x40, 0x3c, 0x2f, 0x0f, + 0xdf, 0x0f, 0x81, 0xf9, 0xcb, 0xf3, 0x1a, 0xa6, 0xa9, 0xaa, 0x6a, 0x0e, + 0x5f, 0xff, 0xd2, 0xcd, 0x26, 0xf6, 0x8c, 0x53, 0xdd, 0xc6, 0xfc, 0x72, + 0xb1, 0x17, 0xa8, 0x46, 0xe7, 0xb7, 0xff, 0x9b, 0xc1, 0xf6, 0x0c, 0xb3, + 0x4a, 0x30, 0xe5, 0xff, 0xe9, 0x67, 0x32, 0x52, 0x01, 0xf5, 0xb6, 0xdb, + 0x29, 0x7e, 0x63, 0x78, 0x9c, 0x4e, 0x5e, 0x96, 0x0c, 0xc7, 0xf8, 0xa2, + 0x95, 0x42, 0x3e, 0x9e, 0x18, 0xd5, 0x0a, 0x8b, 0x3b, 0x0d, 0xf1, 0x8c, + 0x9e, 0xff, 0x90, 0x65, 0xa6, 0xa4, 0xd4, 0x35, 0x4d, 0x41, 0xcb, 0xe9, + 0xb5, 0x93, 0x1c, 0xbf, 0x02, 0x3d, 0x8d, 0x67, 0x2f, 0xf4, 0x66, 0xd6, + 0xee, 0xb3, 0x44, 0x12, 0xbf, 0xe8, 0xf6, 0x6d, 0x6e, 0xeb, 0x34, 0x5f, + 0x2b, 0xf3, 0x87, 0xb0, 0xa9, 0xcb, 0xc3, 0x9a, 0x0a, 0x2a, 0x96, 0x7c, + 0xc4, 0x4a, 0x14, 0xc5, 0x38, 0xc3, 0x52, 0xff, 0xe8, 0xea, 0x2b, 0x9b, + 0x9d, 0x9f, 0xf2, 0x72, 0xff, 0x83, 0xbc, 0x66, 0x49, 0xc2, 0x72, 0xb1, + 0x3e, 0x24, 0x8c, 0xe3, 0xa5, 0x4e, 0x91, 0x7f, 0xbf, 0xeb, 0x4e, 0xa2, + 0xfa, 0x72, 0xff, 0xd3, 0xbf, 0x2d, 0x33, 0xc2, 0xfc, 0x4e, 0x5f, 0xff, + 0x67, 0xa0, 0x7d, 0xac, 0xc5, 0x55, 0x79, 0x1c, 0xbf, 0x95, 0xcf, 0x7b, + 0x02, 0x72, 0xff, 0xd8, 0x18, 0x94, 0x77, 0x00, 0xe7, 0x2f, 0xe7, 0x97, + 0xf2, 0x70, 0x9c, 0xbf, 0xba, 0x93, 0xeb, 0x4e, 0x72, 0xf3, 0x6d, 0xb6, + 0x52, 0xfd, 0xdc, 0x5b, 0xec, 0xa7, 0xd3, 0x41, 0x7f, 0xff, 0xa6, 0xdc, + 0x71, 0xf8, 0xab, 0xfc, 0x52, 0x6d, 0x7c, 0xce, 0x7c, 0x72, 0xa1, 0x1e, + 0xde, 0x4e, 0x50, 0xe6, 0xff, 0xf2, 0x6d, 0x3d, 0xfe, 0x79, 0xd9, 0x82, + 0x72, 0xa7, 0x55, 0x30, 0xb4, 0x3d, 0xa7, 0xb0, 0xb8, 0x07, 0x83, 0x19, + 0x27, 0x8c, 0x2f, 0xfc, 0xc8, 0xe7, 0x43, 0x93, 0xa9, 0x23, 0x97, 0xff, + 0xf9, 0x3a, 0xe3, 0xcc, 0x94, 0x94, 0x0c, 0x9d, 0x98, 0x13, 0x97, 0xff, + 0xb3, 0x3a, 0x1e, 0xc6, 0xb3, 0xa8, 0x03, 0x97, 0xf9, 0x5f, 0x93, 0x4a, + 0x37, 0xa3, 0x95, 0x3a, 0x64, 0x32, 0x41, 0x0b, 0x02, 0x24, 0x5f, 0x7c, + 0x4e, 0xfe, 0x72, 0xfd, 0x92, 0xec, 0x6c, 0xe5, 0x2c, 0xf3, 0x1a, 0xc9, + 0x6f, 0xf7, 0xa1, 0x3a, 0xac, 0x72, 0x72, 0xff, 0xef, 0x69, 0xe5, 0xac, + 0x5c, 0x31, 0x0e, 0x5f, 0xfe, 0xe4, 0x7e, 0x2f, 0xa8, 0x00, 0x46, 0xe4, + 0x72, 0xa1, 0x1d, 0x28, 0x4b, 0xf9, 0xa2, 0x88, 0x77, 0xf2, 0x6b, 0x02, + 0xa6, 0x1c, 0xbf, 0x70, 0x20, 0xe7, 0x13, 0x97, 0xfb, 0x78, 0x14, 0xfd, + 0x7d, 0x59, 0xec, 0x39, 0x6d, 0xfe, 0xd0, 0xe7, 0x1e, 0xbc, 0x8e, 0x5e, + 0xd4, 0xb8, 0x9c, 0xa4, 0x3d, 0x36, 0xb3, 0x4b, 0xff, 0xd1, 0x3a, 0x9d, + 0x8e, 0x7d, 0x93, 0x88, 0x4e, 0x52, 0x26, 0x1c, 0xf0, 0x9d, 0x12, 0x4b, + 0xfd, 0x18, 0x3e, 0xe1, 0x1b, 0x59, 0xcb, 0xfd, 0xdc, 0xe3, 0xf3, 0x52, + 0x59, 0xcb, 0x7f, 0xa3, 0xf0, 0xf1, 0xc5, 0xfc, 0x3f, 0x14, 0xdf, 0x5c, + 0xe5, 0xff, 0xbf, 0x79, 0x7c, 0x84, 0x0e, 0x30, 0xe5, 0x39, 0xf8, 0x09, + 0x85, 0xfb, 0x36, 0xfc, 0xb6, 0x72, 0xff, 0xff, 0x4f, 0x8d, 0x8e, 0x07, + 0x69, 0xfc, 0xe1, 0xec, 0x0c, 0xe7, 0x2a, 0x74, 0x46, 0xe8, 0xa6, 0xff, + 0x4c, 0x2e, 0xdf, 0xb3, 0xa7, 0x2f, 0x36, 0xdb, 0x65, 0x2f, 0xe0, 0x40, + 0xe7, 0x3e, 0x29, 0xf4, 0xd0, 0x57, 0xc4, 0x49, 0xa8, 0xa9, 0x7f, 0xff, + 0x70, 0xff, 0x17, 0xd4, 0x08, 0x71, 0xbf, 0x9e, 0xd6, 0x4e, 0x72, 0xba, + 0x88, 0xdf, 0xc9, 0xa9, 0x13, 0x68, 0x78, 0xd1, 0x2a, 0x76, 0x6a, 0xe4, + 0xa5, 0x18, 0x05, 0x05, 0x25, 0x67, 0xee, 0x38, 0xd6, 0x46, 0xe7, 0xd8, + 0xe8, 0xc6, 0x14, 0x7a, 0x84, 0xcf, 0xa5, 0x0a, 0xdf, 0xfb, 0x10, 0x67, + 0x71, 0xf6, 0x30, 0xe5, 0xff, 0xed, 0xaa, 0xa7, 0x93, 0x43, 0x9c, 0x50, + 0x27, 0x2f, 0xf9, 0x1b, 0x0f, 0x73, 0xcd, 0x30, 0xe5, 0x42, 0x22, 0x3a, + 0x9b, 0x7c, 0x2f, 0xcf, 0x8e, 0x5e, 0xc1, 0x01, 0xcb, 0xec, 0xf4, 0xd2, + 0x39, 0x7f, 0xf7, 0x00, 0xc7, 0x06, 0x9c, 0x54, 0x06, 0x8e, 0x57, 0x4f, + 0xb5, 0xc8, 0xef, 0xfd, 0x9e, 0x8d, 0xeb, 0xb0, 0x3e, 0x3c, 0x41, 0x0b, + 0xfb, 0x36, 0xb7, 0x75, 0x9a, 0x20, 0x87, 0xd3, 0xca, 0xbd, 0x01, 0x43, + 0x95, 0x07, 0xcf, 0xa4, 0xcb, 0xdc, 0x61, 0x87, 0x2f, 0xe7, 0xee, 0xf6, + 0x8d, 0x9c, 0xbf, 0x9a, 0xc2, 0xdb, 0x8c, 0x8e, 0x56, 0x1f, 0xe8, 0x8f, + 0x7e, 0x5d, 0x7f, 0xfe, 0x80, 0xcd, 0x24, 0x1f, 0x40, 0x26, 0x14, 0x98, + 0xe5, 0x4e, 0xaa, 0x79, 0x52, 0x2e, 0xc2, 0x20, 0x10, 0xd2, 0x18, 0x4f, + 0x71, 0x2e, 0xbf, 0xbb, 0x9e, 0xf2, 0x30, 0xe5, 0xfd, 0xe5, 0x33, 0xaf, + 0xc9, 0xca, 0xe4, 0xf7, 0x04, 0xb6, 0xfe, 0xce, 0x7d, 0xbd, 0xc1, 0xcb, + 0xff, 0xb4, 0x2f, 0xe7, 0x62, 0x91, 0x3e, 0x1c, 0xa0, 0x9f, 0x96, 0x8b, + 0xaa, 0x11, 0x6d, 0xfc, 0x25, 0x2f, 0xec, 0x5a, 0x9c, 0x7b, 0x87, 0x2e, + 0x85, 0x4e, 0x5c, 0x82, 0x72, 0xcd, 0x9c, 0xa0, 0x9a, 0x75, 0x05, 0x6f, + 0x0f, 0xf3, 0x9c, 0xbf, 0x75, 0xe5, 0x82, 0x72, 0xfe, 0x4f, 0x0e, 0x75, + 0x0e, 0x5d, 0x9d, 0xf8, 0x7a, 0x30, 0x4d, 0x73, 0xb7, 0xf1, 0x1f, 0xb8, + 0x7d, 0xd2, 0x2f, 0x37, 0xd4, 0x93, 0x9f, 0xc2, 0x81, 0x8c, 0xb6, 0xfe, + 0xd2, 0x04, 0x38, 0x27, 0x2f, 0xff, 0xef, 0x77, 0x35, 0xac, 0xcf, 0xf7, + 0x3e, 0x7e, 0x3e, 0x39, 0x7f, 0xdd, 0x8d, 0xf8, 0x63, 0x39, 0x39, 0x7f, + 0xff, 0xc9, 0x3c, 0x4b, 0x5b, 0xda, 0x73, 0x34, 0x9f, 0x6c, 0xce, 0x4e, + 0x5f, 0xe8, 0x79, 0xdf, 0x6e, 0xa1, 0xcb, 0xdd, 0xc1, 0x0a, 0x35, 0x7a, + 0x71, 0xe6, 0xaa, 0xc4, 0xe7, 0x90, 0xb3, 0xd1, 0x99, 0x5f, 0xa3, 0x73, + 0x6a, 0x73, 0x97, 0xfd, 0xd8, 0xcd, 0xcb, 0x5f, 0xb0, 0xe5, 0x4e, 0x7c, + 0x8b, 0x2a, 0xb9, 0x34, 0x72, 0xff, 0xb2, 0x77, 0xf0, 0x14, 0x19, 0x1c, + 0xbf, 0x9f, 0xdf, 0x22, 0x4a, 0x9c, 0xbf, 0x94, 0x66, 0x9b, 0x7e, 0x4e, + 0x54, 0x26, 0xdb, 0x90, 0x99, 0x54, 0x8f, 0x62, 0xce, 0x75, 0xe3, 0x0b, + 0xdb, 0xce, 0x9c, 0xbd, 0xa4, 0x61, 0xca, 0xd9, 0xb8, 0xf0, 0xe5, 0xc9, + 0x39, 0xca, 0x83, 0x71, 0xc0, 0x43, 0x7f, 0xf7, 0x52, 0x07, 0xe3, 0x8c, + 0x91, 0x87, 0x2f, 0x92, 0x64, 0x6c, 0xe5, 0xff, 0xcc, 0x7e, 0x54, 0xf2, + 0x6e, 0x3f, 0xe1, 0xce, 0x5f, 0xff, 0xbf, 0x9c, 0x63, 0x3b, 0xf6, 0x3d, + 0x9d, 0xff, 0x67, 0x2f, 0xbd, 0xa5, 0x35, 0xf1, 0x30, 0xb0, 0xa1, 0xe1, + 0x1a, 0x89, 0x97, 0xed, 0x33, 0x3d, 0xa3, 0x97, 0xff, 0x22, 0xb9, 0xe4, + 0xee, 0x7a, 0x36, 0x72, 0xfc, 0xf2, 0x14, 0x83, 0x97, 0xf4, 0x38, 0xfb, + 0x04, 0xe5, 0x49, 0x52, 0x0e, 0x46, 0x5c, 0x8b, 0x3b, 0x28, 0x62, 0x18, + 0x92, 0xdf, 0xba, 0x8d, 0x11, 0x53, 0x97, 0xd8, 0x04, 0xe2, 0x72, 0x96, + 0x79, 0xa2, 0x55, 0x7f, 0xf9, 0x01, 0x1a, 0x64, 0x26, 0xf6, 0x8d, 0x9c, + 0xbe, 0x6b, 0xee, 0x4e, 0x72, 0xff, 0x40, 0x73, 0xc9, 0xdf, 0xce, 0x59, + 0x90, 0x7b, 0x21, 0x26, 0xbf, 0xf7, 0x94, 0x04, 0x29, 0x00, 0x80, 0x1c, + 0xbf, 0xff, 0xf3, 0x1c, 0x41, 0x24, 0xd7, 0xec, 0xea, 0x47, 0xbb, 0xfb, + 0xb0, 0xe5, 0xff, 0xf0, 0xff, 0xe9, 0x20, 0x3a, 0xe9, 0xe7, 0x61, 0xcb, + 0xbe, 0x35, 0x9c, 0xbf, 0xff, 0x3a, 0x79, 0x03, 0x81, 0xcf, 0x23, 0x13, + 0x67, 0x2f, 0xff, 0x42, 0xc3, 0x8a, 0x79, 0x37, 0x1f, 0xf0, 0xe7, 0x2f, + 0x6d, 0xf5, 0x89, 0x86, 0xed, 0x3f, 0xa3, 0x82, 0xa5, 0x6f, 0x3a, 0x78, + 0xff, 0xc6, 0xf5, 0x5c, 0xaa, 0x37, 0x49, 0x40, 0xf7, 0x4a, 0x0e, 0x5f, + 0xfe, 0x9c, 0x3d, 0x8e, 0xe7, 0x20, 0xcf, 0x68, 0xe5, 0x39, 0xf1, 0x7e, + 0x2d, 0x41, 0x57, 0xa3, 0x84, 0x29, 0x0a, 0x27, 0x94, 0xbc, 0x30, 0x8e, + 0xbf, 0xb7, 0x13, 0xa0, 0xf8, 0xe5, 0xe0, 0xa8, 0xc3, 0x97, 0xe1, 0x80, + 0xe4, 0xc7, 0x2f, 0xb5, 0xfe, 0xd5, 0x39, 0x7e, 0x8e, 0xfa, 0x24, 0x72, + 0xf8, 0x3f, 0xfb, 0x50, 0x7e, 0x7c, 0x93, 0x80, 0x96, 0xfc, 0x0c, 0x64, + 0x74, 0xe5, 0xff, 0xff, 0xec, 0x9f, 0x50, 0xab, 0xeb, 0xd2, 0xc5, 0x55, + 0xce, 0x7d, 0xb8, 0xce, 0x4e, 0x5f, 0xa3, 0xe6, 0xc6, 0x47, 0x2b, 0x48, + 0xa5, 0xfd, 0xf2, 0xf7, 0x0f, 0xdc, 0x39, 0x41, 0x54, 0x2f, 0x85, 0xa9, + 0x09, 0x11, 0x48, 0xf4, 0x33, 0x3f, 0x24, 0xbd, 0xb5, 0x34, 0x72, 0xdc, + 0x2e, 0x72, 0xfd, 0xef, 0x7b, 0x1b, 0x39, 0x50, 0x78, 0x28, 0x31, 0x7f, + 0xe7, 0x15, 0xe6, 0xd6, 0xee, 0xb3, 0x44, 0x22, 0xba, 0x53, 0x9c, 0xa8, + 0x47, 0x00, 0x17, 0xff, 0x20, 0xe2, 0x93, 0x7e, 0xc9, 0xf4, 0x07, 0x39, + 0x7f, 0xff, 0xfb, 0xb9, 0xfe, 0xd5, 0xea, 0x73, 0x1e, 0xff, 0xa3, 0x9c, + 0xfb, 0xf7, 0xd1, 0xcb, 0xff, 0xb3, 0x95, 0x3c, 0x83, 0xfc, 0xb3, 0x47, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x33, 0x8b, 0x86, 0x06, 0x78, + 0xd8, 0x70, 0x73, 0xda, 0x45, 0xe0, 0xa9, 0x3e, 0x6e, 0x34, 0x2e, 0xae, + 0xb1, 0x00, 0x0f, 0xc0, 0x2e, 0x18, 0x19, 0xe3, 0x67, 0x2a, 0x13, 0x4e, + 0xc4, 0x6b, 0xff, 0xbc, 0xe3, 0x3f, 0x32, 0x18, 0xcd, 0x1c, 0xbf, 0xff, + 0x40, 0x26, 0x94, 0x4e, 0x2e, 0xae, 0x86, 0x24, 0x72, 0xff, 0xca, 0x67, + 0x5d, 0x9f, 0x5b, 0x6d, 0xb3, 0x97, 0xff, 0xec, 0x5f, 0x60, 0x42, 0x29, + 0x3e, 0x0a, 0x2a, 0x72, 0xcf, 0x3a, 0x26, 0x24, 0x8b, 0x52, 0x4c, 0x5d, + 0xe1, 0xdd, 0x7f, 0xff, 0x4c, 0x30, 0x0d, 0x2f, 0xa9, 0xb9, 0x86, 0x01, + 0xa3, 0x97, 0xff, 0x7b, 0xa9, 0xc7, 0xaf, 0x2d, 0xc2, 0xa7, 0x2f, 0xef, + 0xfc, 0x9f, 0x8a, 0xa7, 0x2f, 0xec, 0x6f, 0x07, 0xf0, 0x1c, 0xbf, 0x4b, + 0x3d, 0x00, 0x39, 0x74, 0x32, 0x73, 0xd5, 0xe4, 0xba, 0xff, 0xff, 0xe0, + 0x31, 0xe5, 0xd7, 0x4f, 0x20, 0x70, 0x39, 0xe4, 0x62, 0x6c, 0xe5, 0x69, + 0x13, 0xdf, 0x97, 0xdf, 0xff, 0x87, 0x35, 0x9d, 0x7e, 0x05, 0xf5, 0x19, + 0x0b, 0x39, 0x7e, 0x9d, 0x90, 0x18, 0x39, 0x52, 0x5d, 0xd8, 0x0c, 0x79, + 0x7c, 0x91, 0x4d, 0x1a, 0xde, 0xca, 0x3a, 0xb9, 0xa4, 0x7f, 0x46, 0x47, + 0xc4, 0x91, 0x45, 0x6b, 0xff, 0x42, 0xaa, 0xc0, 0xe7, 0xba, 0x87, 0x2f, + 0xf4, 0x6b, 0x51, 0x3e, 0x36, 0x72, 0xff, 0x77, 0x19, 0x9d, 0xfc, 0x4e, + 0x50, 0x4f, 0x9f, 0xc6, 0x97, 0xd9, 0xb5, 0x50, 0xe5, 0x42, 0xfc, 0x76, + 0x4f, 0x00, 0x24, 0x29, 0x5e, 0x14, 0xbf, 0x91, 0x5e, 0x6d, 0xb6, 0xca, + 0x5f, 0xf6, 0x01, 0xf7, 0x9c, 0x70, 0x25, 0x3e, 0x9a, 0x0b, 0x9b, 0x6c, + 0xa5, 0xe6, 0xdb, 0x6c, 0xa5, 0xfc, 0xf3, 0x87, 0xb1, 0xa2, 0x9f, 0x4d, + 0x05, 0x0a, 0x31, 0x1b, 0x4b, 0x68, 0x73, 0x7e, 0x5a, 0x05, 0x46, 0x14, + 0xfa, 0x6c, 0xaf, 0x36, 0xdb, 0x65, 0x2f, 0x6a, 0x36, 0x53, 0xe9, 0xa0, + 0xbe, 0x71, 0xe7, 0xc7, 0x2c, 0x04, 0x45, 0x5f, 0x96, 0xdb, 0x2e, 0xbf, + 0x82, 0x31, 0x27, 0x59, 0xcb, 0xf6, 0xbf, 0x9d, 0xa0, 0x9c, 0xbf, 0x05, + 0x38, 0xc0, 0x4e, 0x5f, 0x60, 0xe3, 0x59, 0xca, 0xd9, 0xe6, 0x30, 0xa6, + 0x91, 0x13, 0x4a, 0x3c, 0x5f, 0xfd, 0xd7, 0x90, 0xba, 0xb3, 0x0a, 0x4c, + 0x72, 0xff, 0xdb, 0x9e, 0x39, 0xd2, 0x0e, 0x00, 0xe5, 0xff, 0x62, 0xe2, + 0x70, 0xf6, 0x34, 0x72, 0xb0, 0xfe, 0x1a, 0x1f, 0xdf, 0xdd, 0xce, 0x39, + 0xed, 0x1c, 0xa5, 0xa6, 0x1e, 0x08, 0x5e, 0xf8, 0x8e, 0xb6, 0xa8, 0xbb, + 0xb0, 0xc6, 0x18, 0xcc, 0xae, 0x9f, 0xc7, 0x2a, 0x15, 0x5c, 0x64, 0xa6, + 0x41, 0x3c, 0xbd, 0xcb, 0x52, 0x6a, 0x0e, 0x5f, 0x97, 0x1d, 0x86, 0x1c, + 0xb9, 0xfc, 0x72, 0xfd, 0x8d, 0x6e, 0x20, 0xc3, 0x7a, 0x24, 0xf7, 0xfd, + 0x03, 0x21, 0x0f, 0x62, 0x73, 0x97, 0xf0, 0x73, 0x6d, 0x18, 0x13, 0x97, + 0xba, 0x93, 0x14, 0xad, 0x9e, 0x6e, 0x8c, 0x2f, 0xf9, 0xf9, 0xf6, 0x4d, + 0xfe, 0xd5, 0x39, 0x65, 0xa1, 0xef, 0xfe, 0x45, 0x7f, 0x87, 0x39, 0x96, + 0x91, 0x53, 0x97, 0xce, 0xfb, 0x54, 0xe5, 0x7c, 0x3d, 0x69, 0xcd, 0x2f, + 0xfb, 0x31, 0x60, 0x8c, 0xe6, 0x47, 0x2f, 0xa1, 0xd9, 0xc4, 0xa5, 0xff, + 0xdd, 0x47, 0x00, 0x20, 0x11, 0xdd, 0x1c, 0xbf, 0xbb, 0x8c, 0x63, 0xc8, + 0xe5, 0xe6, 0xdb, 0x6c, 0xa5, 0xfe, 0x1f, 0x75, 0x20, 0x67, 0x29, 0xf4, + 0xd0, 0x5e, 0x80, 0x64, 0x91, 0x23, 0x89, 0xb5, 0xe4, 0xc1, 0x94, 0x86, + 0xa5, 0xb1, 0x69, 0xa9, 0xb2, 0x32, 0x9b, 0xf8, 0x10, 0x08, 0xee, 0x8e, + 0x5f, 0xe8, 0x53, 0x7b, 0x4f, 0x68, 0xe5, 0x42, 0xe2, 0x2c, 0x99, 0x95, + 0x3d, 0xe6, 0x1c, 0x88, 0xfd, 0x31, 0x2f, 0x63, 0x8b, 0x01, 0x78, 0x96, + 0xdf, 0x81, 0x89, 0xd5, 0x4e, 0x5f, 0xff, 0x62, 0xe0, 0x5f, 0xda, 0x0f, + 0xef, 0xb9, 0x1c, 0xae, 0x4f, 0xdd, 0x85, 0x17, 0xf4, 0x0a, 0xda, 0xa6, + 0xa6, 0xd5, 0x9c, 0xbf, 0x43, 0x37, 0x1c, 0x4e, 0x5f, 0xff, 0xfc, 0x2e, + 0xc8, 0xda, 0xc3, 0xd8, 0xd7, 0xee, 0x92, 0xd7, 0x5e, 0x47, 0x2f, 0x7f, + 0xed, 0x1c, 0xbc, 0xb8, 0xd1, 0xcb, 0xff, 0x94, 0x96, 0x75, 0xfa, 0x9b, + 0xdc, 0x1c, 0xac, 0x3e, 0x00, 0x0e, 0x5f, 0xa3, 0xda, 0xe3, 0x87, 0x2f, + 0xdf, 0xed, 0x5e, 0xa1, 0xca, 0x84, 0xfb, 0x02, 0x46, 0xb3, 0xd7, 0x29, + 0x03, 0x88, 0xbf, 0x78, 0x85, 0xa1, 0x4d, 0xfe, 0x17, 0x6f, 0x05, 0xd5, + 0x39, 0x7f, 0xf6, 0x7b, 0x4a, 0x69, 0x83, 0x1b, 0x83, 0x97, 0xb8, 0xe0, + 0x84, 0xfd, 0x98, 0x65, 0x7f, 0xf3, 0x71, 0xb1, 0x79, 0xe3, 0x71, 0x23, + 0x94, 0x87, 0xf1, 0xd3, 0x4b, 0xff, 0xfe, 0x0f, 0x51, 0xbc, 0xe0, 0x46, + 0x3f, 0xb5, 0xfc, 0xb3, 0x9f, 0x1c, 0xac, 0x44, 0x6b, 0x90, 0xdf, 0xf4, + 0xcb, 0xea, 0x32, 0x36, 0xa9, 0xcb, 0xf4, 0xff, 0x3f, 0x89, 0x8e, 0x5a, + 0x47, 0x2f, 0x28, 0x33, 0x1c, 0xa9, 0x1a, 0xf0, 0x08, 0xd6, 0x22, 0xe1, + 0xce, 0xf4, 0xb9, 0x50, 0xf8, 0x5b, 0x53, 0xca, 0xe5, 0x94, 0xae, 0x30, + 0xca, 0xa6, 0xca, 0x6c, 0xba, 0xb0, 0xbf, 0x5c, 0x31, 0x12, 0x56, 0x04, + 0xd2, 0xc7, 0x37, 0x2d, 0x01, 0x92, 0xc3, 0x3b, 0x38, 0xf4, 0xf2, 0x9c, + 0x01, 0x1a, 0x08, 0xcf, 0xe6, 0xea, 0x73, 0x57, 0xd3, 0x8f, 0x7f, 0xca, + 0xef, 0x6e, 0x3e, 0xc5, 0x21, 0xb3, 0x7b, 0x8c, 0x09, 0xcb, 0xff, 0xec, + 0x1f, 0xbe, 0x55, 0x39, 0xd7, 0x70, 0x0e, 0x72, 0xa4, 0x7d, 0xe1, 0x1d, + 0xb8, 0x10, 0x72, 0xfc, 0xbc, 0xf7, 0x50, 0xe5, 0x9d, 0x0d, 0xe8, 0x8b, + 0x5f, 0xff, 0xf6, 0x75, 0xd4, 0xd6, 0x2a, 0xe2, 0x08, 0x18, 0x9b, 0xb0, + 0x72, 0xd0, 0x72, 0xff, 0xfd, 0x1b, 0xec, 0x33, 0x83, 0xf8, 0x18, 0x9b, + 0xb0, 0x72, 0xfc, 0x9b, 0x9a, 0x3b, 0xb4, 0x66, 0x81, 0x94, 0x44, 0x2b, + 0x94, 0xe7, 0x18, 0xbe, 0xa4, 0x3c, 0x6d, 0xc2, 0xe7, 0x2f, 0xfc, 0xe2, + 0x0f, 0x81, 0xfd, 0xf7, 0x23, 0x97, 0xc8, 0x33, 0xc1, 0xcb, 0xde, 0xdc, + 0x1c, 0xbf, 0xe1, 0x86, 0x20, 0xe3, 0x20, 0xe5, 0xc8, 0x1c, 0x3d, 0x19, + 0x87, 0x29, 0xad, 0x1c, 0x1b, 0x41, 0x17, 0x2b, 0xff, 0x87, 0xda, 0xeb, + 0xcb, 0xe6, 0x73, 0xe3, 0x94, 0xd4, 0xd3, 0x71, 0xc8, 0x7c, 0x7e, 0x65, + 0x7a, 0x06, 0x73, 0x97, 0xc9, 0xd4, 0x61, 0xcb, 0x75, 0x0d, 0xec, 0xc3, + 0x97, 0xf4, 0x2e, 0x35, 0xe4, 0x39, 0x7f, 0xd1, 0xee, 0xb8, 0x1f, 0x9d, + 0x1c, 0xa0, 0x9f, 0x28, 0x96, 0x5f, 0xff, 0xe1, 0xfd, 0xd7, 0xaf, 0xdd, + 0x25, 0x02, 0xbc, 0xe7, 0xc7, 0x2f, 0xfd, 0xb0, 0x7c, 0xea, 0x2f, 0xfd, + 0x80, 0xe5, 0xe9, 0xbf, 0xd9, 0xcb, 0xff, 0x3a, 0x6f, 0x39, 0xfa, 0xdb, + 0x6d, 0x9c, 0xa8, 0x45, 0x33, 0xa1, 0xe8, 0x7e, 0xff, 0xf8, 0x62, 0x5f, + 0x14, 0xf2, 0x0f, 0xf2, 0xcd, 0x1c, 0xac, 0x54, 0x68, 0xb8, 0x46, 0x30, + 0x87, 0xb1, 0x83, 0x80, 0xba, 0xf0, 0x1d, 0x87, 0x2e, 0xc0, 0x1c, 0xa8, + 0x36, 0x58, 0x39, 0x79, 0xf1, 0x87, 0x2e, 0x19, 0x09, 0xba, 0xe0, 0x1f, + 0xbf, 0xcd, 0xe8, 0x70, 0x22, 0xe7, 0x2f, 0xb4, 0xb5, 0xa1, 0xca, 0x84, + 0x41, 0x21, 0x73, 0x99, 0x5f, 0xb7, 0xa1, 0x89, 0xce, 0x5f, 0xff, 0x37, + 0x8b, 0xd6, 0x7a, 0x6c, 0x54, 0x70, 0x07, 0x2b, 0x0f, 0xe5, 0x0a, 0x2f, + 0xe7, 0xf7, 0x5c, 0x40, 0x72, 0xff, 0xcf, 0xec, 0x99, 0xe0, 0x62, 0x63, + 0x97, 0xfe, 0xea, 0x62, 0x99, 0x33, 0x71, 0xc9, 0xcb, 0x26, 0xd1, 0x55, + 0xd2, 0xcd, 0x1e, 0xdc, 0xb5, 0x9a, 0x30, 0x45, 0x49, 0x32, 0x35, 0xc3, + 0x28, 0x06, 0xb7, 0x60, 0x9c, 0xbf, 0xfd, 0xe8, 0x15, 0xe7, 0xba, 0x9b, + 0x02, 0xce, 0x5f, 0x82, 0x9a, 0xea, 0x1c, 0xbf, 0x90, 0x73, 0xdd, 0x43, + 0x96, 0x8c, 0x3d, 0x2d, 0x13, 0xd0, 0x51, 0xad, 0x82, 0xbf, 0xc2, 0x6e, + 0xff, 0xe0, 0x6b, 0xa9, 0xbc, 0xf6, 0x9f, 0x93, 0x97, 0xfa, 0x19, 0xad, + 0x38, 0xce, 0x72, 0xff, 0x81, 0xa9, 0x27, 0x5d, 0x27, 0x39, 0x7d, 0xac, + 0x1f, 0x1c, 0xbd, 0xc1, 0x1b, 0x39, 0x48, 0x7f, 0x2e, 0x73, 0xf9, 0x0d, + 0xef, 0x3b, 0x59, 0xcb, 0xfd, 0xee, 0xa7, 0xd0, 0x3a, 0x1c, 0xbb, 0xf1, + 0x39, 0x72, 0x98, 0x72, 0x82, 0x9e, 0xae, 0xcd, 0x7a, 0x8a, 0x30, 0xac, + 0xf1, 0x77, 0xe3, 0xed, 0x0d, 0x14, 0x17, 0xbf, 0x2a, 0x04, 0x9b, 0x47, + 0x2f, 0xba, 0x8f, 0x23, 0x97, 0x82, 0xf2, 0x39, 0x50, 0x6f, 0x70, 0x86, + 0xdf, 0xc2, 0x21, 0x80, 0xcf, 0x77, 0xb4, 0x72, 0xfc, 0xea, 0xb7, 0x1b, + 0x39, 0x4e, 0x78, 0x02, 0x2f, 0x7f, 0xf2, 0x2c, 0x71, 0x91, 0x30, 0x62, + 0x73, 0x97, 0xfc, 0xbc, 0xf4, 0x71, 0x41, 0x01, 0xcb, 0xff, 0xfb, 0xf8, + 0xf6, 0xb0, 0x7e, 0x6e, 0x10, 0x22, 0xf2, 0x39, 0x7e, 0x5f, 0x79, 0x76, + 0xb3, 0x97, 0xff, 0x20, 0x47, 0xff, 0x6a, 0x06, 0x34, 0x72, 0x96, 0x9a, + 0x3a, 0x22, 0x09, 0xcf, 0xeb, 0x7c, 0x4b, 0x2f, 0xfc, 0xfb, 0xce, 0x38, + 0x1d, 0x8b, 0x67, 0x2f, 0xff, 0xe4, 0xfc, 0x65, 0x83, 0xe4, 0x69, 0x9e, + 0x17, 0x91, 0xca, 0x02, 0x26, 0xbc, 0x81, 0x7f, 0xff, 0x0e, 0x6b, 0xff, + 0x99, 0xd7, 0x1c, 0x9a, 0x51, 0xc9, 0xcb, 0xf6, 0xd6, 0xee, 0xb3, 0x44, + 0x0c, 0xbf, 0x9e, 0x70, 0x38, 0x84, 0x95, 0x83, 0xd7, 0xb3, 0x5f, 0xe1, + 0xf7, 0xb4, 0x34, 0xbd, 0xd7, 0x97, 0xc4, 0xc0, 0x46, 0x19, 0x97, 0xfd, + 0xd4, 0xc1, 0xc5, 0x87, 0x0e, 0x53, 0x13, 0x95, 0xf4, 0x64, 0x9c, 0x4e, + 0xef, 0x7b, 0xf8, 0x39, 0x7c, 0x0d, 0xeb, 0x47, 0x2f, 0xf0, 0x3c, 0x93, + 0xb2, 0x16, 0x72, 0xb9, 0x3f, 0x47, 0x1d, 0x12, 0x3b, 0xf0, 0x5a, 0xb7, + 0x0b, 0x56, 0x72, 0xa1, 0x5c, 0x46, 0x4a, 0x7b, 0x48, 0x56, 0xb9, 0x75, + 0xc9, 0x23, 0x97, 0xf7, 0x3e, 0x0e, 0x62, 0xa7, 0x28, 0x27, 0x8b, 0x82, + 0xd7, 0xf6, 0x7a, 0x05, 0x00, 0x72, 0xff, 0x83, 0xb1, 0x76, 0xd4, 0xe5, + 0xb3, 0x97, 0x9f, 0x73, 0x9a, 0x30, 0x55, 0xff, 0x9f, 0x78, 0x20, 0xd7, + 0xb5, 0xc9, 0xcb, 0xff, 0xff, 0xfb, 0x3d, 0xd7, 0x15, 0x7e, 0x6b, 0x6e, + 0xfe, 0xe3, 0x81, 0xf9, 0x8c, 0x71, 0xe6, 0x47, 0x88, 0x2d, 0x7f, 0xe7, + 0x75, 0x56, 0xe1, 0xf8, 0xab, 0x67, 0x88, 0x2d, 0x7f, 0xf7, 0x53, 0xa9, + 0x03, 0xef, 0x8a, 0xb6, 0x78, 0x82, 0xd7, 0xfa, 0x10, 0x7d, 0xf1, 0x56, + 0xcf, 0x10, 0x5a, 0xfe, 0x66, 0x07, 0xe2, 0xad, 0x9e, 0x20, 0xb5, 0xff, + 0xff, 0x38, 0x8a, 0x33, 0xe6, 0x97, 0xd4, 0xda, 0x2b, 0x3e, 0x36, 0x78, + 0x82, 0xd7, 0x73, 0xf0, 0x29, 0xce, 0x2d, 0x43, 0x6a, 0x8e, 0x86, 0x27, + 0xf5, 0x0a, 0xb3, 0xba, 0x7e, 0x32, 0x8d, 0xef, 0xf2, 0x42, 0xba, 0xf6, + 0xb9, 0x39, 0x7c, 0xfb, 0x03, 0x9c, 0xbf, 0xfb, 0xa9, 0xd4, 0x81, 0xf7, + 0xc5, 0x5b, 0x3c, 0x41, 0x6b, 0xfe, 0x9b, 0x4b, 0x49, 0xfe, 0x2a, 0xd9, + 0xe2, 0x0b, 0x5f, 0xbd, 0xa8, 0x67, 0xc5, 0xa2, 0x85, 0x45, 0x4b, 0xff, + 0xdf, 0x17, 0xd4, 0x5c, 0x7b, 0x5f, 0x15, 0x6c, 0xf1, 0x05, 0xaf, 0xff, + 0xfe, 0x11, 0x46, 0x7c, 0xff, 0x3e, 0x69, 0x7d, 0x4d, 0xa2, 0xb3, 0xe3, + 0x67, 0x88, 0x2d, 0x58, 0x99, 0x37, 0x28, 0x6e, 0xbd, 0x7f, 0xdd, 0x4d, + 0xa2, 0xb3, 0xe3, 0x67, 0x88, 0x2d, 0x7f, 0xfc, 0xef, 0xcc, 0xb5, 0xd4, + 0x08, 0x63, 0x70, 0x52, 0xff, 0xd9, 0x29, 0x7f, 0xad, 0x8c, 0xed, 0x0f, + 0x10, 0x5a, 0x96, 0x8e, 0x7d, 0xa4, 0x69, 0x3e, 0xff, 0xcb, 0x4d, 0xf9, + 0xc1, 0xaf, 0x8d, 0x9e, 0x20, 0xb5, 0xfd, 0xd4, 0xef, 0x50, 0x06, 0x80, + 0x2d, 0x7e, 0xc0, 0x7c, 0x55, 0xb3, 0xc4, 0x16, 0xbb, 0x3c, 0xb3, 0xf3, + 0xe9, 0xd5, 0x72, 0x8e, 0xfd, 0x43, 0x0a, 0xfe, 0x66, 0x07, 0xe2, 0xad, + 0x9e, 0x20, 0xb5, 0xff, 0x97, 0xd4, 0xda, 0x2b, 0x3e, 0x36, 0x78, 0x82, + 0xd7, 0x67, 0xc7, 0x44, 0x6e, 0x8f, 0xef, 0xf7, 0xe8, 0xc7, 0x1e, 0x64, + 0x78, 0x82, 0xd7, 0xfe, 0xc4, 0xe3, 0x83, 0x81, 0x79, 0x1e, 0x20, 0xb3, + 0x0f, 0x06, 0x82, 0xbc, 0x17, 0xb3, 0x70, 0x1a, 0x8c, 0x7d, 0x1a, 0x8c, + 0x5f, 0xd1, 0x8f, 0xff, 0x0b, 0x66, 0xdc, 0x2e, 0x04, 0x1a, 0x20, 0xb7, + 0xd4, 0x46, 0x5c, 0xeb, 0x39, 0x6d, 0x2d, 0x93, 0xb8, 0x0a, 0x4c, 0x7f, + 0x8d, 0xee, 0x97, 0x01, 0xcb, 0xd1, 0x2e, 0x03, 0x95, 0x06, 0xe4, 0x46, + 0xaa, 0x76, 0x58, 0x00, 0x48, 0x79, 0x2b, 0x05, 0x28, 0x64, 0x5f, 0x2f, + 0xfe, 0xc9, 0x0e, 0x7b, 0xa9, 0x9c, 0xf8, 0xe5, 0xfe, 0x8e, 0xa3, 0x7c, + 0xcb, 0x47, 0x2f, 0xd1, 0xed, 0x75, 0x0e, 0x5f, 0xf7, 0x23, 0x88, 0xcc, + 0x10, 0x1c, 0xbf, 0xf6, 0xa6, 0x97, 0xe1, 0x9a, 0x5f, 0x84, 0xe5, 0x4e, + 0x8d, 0x89, 0x1a, 0xe1, 0x3f, 0x8d, 0xef, 0xfe, 0x8e, 0x64, 0xa3, 0x35, + 0xe8, 0xe5, 0xb3, 0x97, 0xe9, 0x70, 0x70, 0x7f, 0x39, 0xcb, 0x75, 0x0f, + 0xe9, 0xd2, 0x6f, 0xdb, 0x8e, 0x65, 0xa3, 0x95, 0x23, 0xcf, 0xd9, 0x35, + 0xe6, 0x3f, 0x8e, 0x5f, 0xfb, 0xfd, 0x34, 0xcd, 0x81, 0x89, 0xa3, 0x97, + 0xff, 0x71, 0xe3, 0x1a, 0x7e, 0xf3, 0x2c, 0xf1, 0xca, 0x02, 0x22, 0xd4, + 0x42, 0xbf, 0xc0, 0xff, 0xc3, 0x1e, 0xd1, 0xca, 0x92, 0x3f, 0xc1, 0x0a, + 0x7d, 0x12, 0x54, 0x2a, 0x5c, 0xc8, 0xc1, 0x9e, 0x32, 0x1b, 0xf9, 0xe5, + 0x1c, 0x5f, 0xa7, 0x2f, 0xfe, 0xce, 0x7d, 0xa4, 0x18, 0x03, 0xb0, 0xe5, + 0xff, 0xb8, 0x7c, 0x11, 0xc5, 0x20, 0x40, 0x72, 0xa7, 0x44, 0x27, 0xe8, + 0x77, 0xdc, 0xea, 0x39, 0x39, 0x7f, 0xe9, 0x67, 0x32, 0xdc, 0x79, 0xfc, + 0x72, 0xf3, 0x22, 0x47, 0x2f, 0xd8, 0x1e, 0xfe, 0xd9, 0xca, 0xf8, 0x8a, + 0x99, 0x89, 0x1c, 0xfc, 0x47, 0x2f, 0x05, 0xfc, 0x72, 0xff, 0xda, 0x81, + 0x89, 0x7b, 0xb8, 0x27, 0x2b, 0x68, 0x96, 0x73, 0xed, 0x0e, 0x5e, 0x46, + 0x98, 0x72, 0xf3, 0xec, 0x07, 0x2d, 0xcc, 0x1b, 0x9f, 0x0e, 0xdf, 0x37, + 0x9d, 0x73, 0x97, 0xca, 0xed, 0x1b, 0x39, 0x7e, 0x9d, 0xfb, 0x0d, 0x67, + 0x29, 0xa8, 0x3c, 0xfc, 0x24, 0xa8, 0x56, 0x79, 0x90, 0xb2, 0x48, 0xd9, + 0x1d, 0xa0, 0x04, 0xe2, 0xe3, 0x7f, 0xf0, 0xc4, 0xec, 0xea, 0x6f, 0x6f, + 0x23, 0x94, 0x72, 0x84, 0xf3, 0xda, 0x22, 0x5f, 0xe9, 0xe7, 0x81, 0xe7, + 0x3c, 0x72, 0xb0, 0xf6, 0x10, 0x8e, 0xff, 0xed, 0x8f, 0xfc, 0xf8, 0x72, + 0x77, 0x13, 0x97, 0x9f, 0x73, 0x9c, 0xb8, 0x10, 0x72, 0xf9, 0x21, 0x98, + 0x72, 0x8e, 0x5f, 0xce, 0xaf, 0xa3, 0x60, 0x39, 0x41, 0x37, 0x22, 0x17, + 0x7f, 0xff, 0xa1, 0x02, 0x31, 0xfa, 0xfd, 0x8b, 0x0c, 0x2d, 0x46, 0x1c, + 0xb8, 0x10, 0x72, 0xe8, 0x54, 0xe5, 0xff, 0x67, 0xb5, 0x0c, 0x53, 0x26, + 0x39, 0x7f, 0xb5, 0x9d, 0x4d, 0x7f, 0x39, 0xcb, 0x9b, 0x6c, 0xa5, 0xff, + 0x0e, 0x71, 0x79, 0x69, 0x02, 0x72, 0x96, 0x9f, 0xda, 0x0e, 0xec, 0x59, + 0x8b, 0x3d, 0x20, 0x03, 0x0f, 0x0e, 0x2c, 0x22, 0xfa, 0x3a, 0x6c, 0xd5, + 0x41, 0x9b, 0xcd, 0xb6, 0xd9, 0x4b, 0x30, 0xa7, 0xd3, 0x41, 0x7d, 0x33, + 0xbe, 0xca, 0x7d, 0x47, 0x0a, 0x90, 0xbe, 0xa9, 0xd5, 0xb5, 0x3c, 0xb2, + 0x1b, 0xfb, 0xd1, 0x9d, 0xc9, 0xce, 0x5d, 0x8c, 0x39, 0x5c, 0x9e, 0x1e, + 0x8b, 0x6a, 0x1d, 0x44, 0x84, 0xa3, 0xa9, 0xc9, 0x55, 0xaa, 0xc6, 0x89, + 0xcc, 0x79, 0x29, 0x2b, 0x87, 0x71, 0x80, 0x31, 0xa7, 0xb3, 0x9d, 0xef, + 0x4b, 0x8c, 0x02, 0xc0, 0xcb, 0x77, 0xd4, 0xb7, 0x7f, 0x46, 0x0d, 0xfc, + 0xb8, 0xae, 0x2d, 0xf7, 0xf6, 0x00, 0x09, 0xb9, 0x1c, 0xb9, 0x78, 0x72, + 0x82, 0x78, 0x6e, 0x5b, 0x76, 0x36, 0x72, 0xe8, 0xf1, 0xca, 0x9c, 0xd6, + 0xac, 0x5e, 0xcc, 0x39, 0x58, 0x6c, 0xfc, 0x45, 0x7f, 0xa4, 0x83, 0x8c, + 0xff, 0xa7, 0x2f, 0xfd, 0x9e, 0xd7, 0x51, 0x8f, 0x9b, 0x39, 0x50, 0x7e, + 0x02, 0x67, 0x7e, 0xcf, 0x98, 0x0f, 0x1c, 0xbe, 0xf9, 0xe8, 0xe2, 0x72, + 0xfb, 0x19, 0x9e, 0x39, 0x7b, 0xce, 0xa9, 0xcb, 0xe7, 0x63, 0xcc, 0x72, + 0xff, 0xff, 0xcf, 0x37, 0xf2, 0xfd, 0x7f, 0x3a, 0x9e, 0xf4, 0x73, 0x13, + 0xc6, 0x8e, 0x5f, 0x85, 0xda, 0xe7, 0x98, 0xe5, 0xf4, 0xda, 0x8f, 0x1c, + 0xa5, 0xa3, 0x0a, 0x67, 0x3f, 0xcb, 0x2f, 0xff, 0xf9, 0xac, 0x5d, 0xf8, + 0xc4, 0xbb, 0x1b, 0x9e, 0x3d, 0xa7, 0x91, 0xcb, 0xc9, 0xcc, 0xc7, 0x2f, + 0xd9, 0x93, 0xff, 0xa3, 0x97, 0xdb, 0x14, 0x01, 0xcb, 0xe4, 0x5b, 0xec, + 0xe5, 0xd0, 0x03, 0x97, 0xdf, 0xcf, 0xff, 0xde, 0x9b, 0x75, 0x08, 0x69, + 0x11, 0x2f, 0xd5, 0x8b, 0x9a, 0xc0, 0x72, 0xfc, 0xf1, 0xce, 0x2c, 0xe5, + 0xff, 0x75, 0xf5, 0xd4, 0x9d, 0xc4, 0xe5, 0xf3, 0xce, 0xa4, 0x8e, 0x57, + 0x0c, 0xb9, 0xb7, 0x10, 0x81, 0x94, 0x24, 0x02, 0x41, 0x85, 0x3c, 0x93, + 0x21, 0x0b, 0x58, 0xee, 0xe1, 0xc8, 0xe6, 0x40, 0x6a, 0xd0, 0xf7, 0xa1, + 0x81, 0xf9, 0x13, 0x63, 0x4a, 0x13, 0xf0, 0x1c, 0x5f, 0xc3, 0xf8, 0x58, + 0xf2, 0x39, 0x79, 0x27, 0xfc, 0xe5, 0xfa, 0x00, 0x9c, 0xe1, 0xcb, 0x99, + 0xc4, 0xe5, 0x83, 0x07, 0x80, 0x24, 0xf7, 0xff, 0xa4, 0x31, 0xf1, 0x83, + 0x0a, 0xf9, 0x27, 0x39, 0x7e, 0x76, 0x67, 0x58, 0x72, 0xb9, 0x3f, 0x3f, + 0x26, 0x5e, 0xf6, 0xe0, 0xe5, 0xfe, 0xd7, 0xb8, 0xe0, 0xe0, 0x4e, 0x5f, + 0xd9, 0xac, 0x92, 0x6c, 0xe5, 0xee, 0xc7, 0x13, 0x97, 0xb5, 0x29, 0xce, + 0x56, 0x1b, 0xc5, 0x07, 0xaa, 0x15, 0x10, 0xc8, 0xbb, 0x17, 0x92, 0x13, + 0x2c, 0x23, 0x71, 0xc1, 0x34, 0xf3, 0x45, 0xe7, 0xf8, 0xa1, 0xcb, 0xd3, + 0x27, 0x4e, 0x5f, 0xd1, 0xb7, 0x99, 0x3a, 0x72, 0xfd, 0xa0, 0xc0, 0xce, + 0xe7, 0x95, 0xa1, 0xdb, 0xcc, 0x86, 0x1c, 0xae, 0x4f, 0x69, 0x87, 0xd7, + 0xff, 0xc3, 0x2f, 0x98, 0x14, 0xd7, 0x3e, 0xfd, 0xf4, 0x72, 0xfd, 0xdf, + 0xc6, 0x38, 0x9c, 0xbf, 0x85, 0xfd, 0x28, 0x54, 0xe5, 0x41, 0xeb, 0xa8, + 0x55, 0x7d, 0x99, 0xcc, 0x8e, 0x5e, 0xd2, 0x4c, 0x72, 0xca, 0x89, 0xbf, + 0xd1, 0x15, 0xff, 0x6d, 0x23, 0xd9, 0xc5, 0xc2, 0x72, 0xff, 0xe7, 0x9c, + 0x63, 0x94, 0x08, 0xc4, 0xe7, 0x2b, 0x68, 0xa4, 0xe9, 0x38, 0x9c, 0xdf, + 0xbe, 0x76, 0x37, 0x23, 0x95, 0xf1, 0x57, 0x74, 0x43, 0x0f, 0x08, 0xd7, + 0x0a, 0xa7, 0x8c, 0x15, 0xb2, 0xfb, 0xcc, 0xd4, 0x1c, 0xbf, 0xa7, 0x9a, + 0x5c, 0x36, 0xe7, 0x39, 0x7c, 0xcc, 0x7e, 0x9c, 0xb4, 0xe7, 0x2f, 0xde, + 0xea, 0x33, 0x67, 0x2a, 0x46, 0xeb, 0x62, 0x57, 0xba, 0x14, 0x39, 0x7e, + 0xee, 0x24, 0xb4, 0x72, 0xff, 0xfb, 0xb0, 0xa7, 0xdf, 0x0b, 0x83, 0x5a, + 0x80, 0x14, 0xbf, 0x67, 0x9f, 0xfe, 0x1c, 0xe5, 0xfb, 0x6b, 0x77, 0x59, + 0xe2, 0x04, 0x5e, 0xd4, 0x72, 0x72, 0xc0, 0xc3, 0xd1, 0xe4, 0xd2, 0xf7, + 0x92, 0x73, 0x97, 0xa7, 0x71, 0x39, 0x52, 0x4d, 0x60, 0x24, 0xfc, 0xa9, + 0x6d, 0xf9, 0x85, 0x1e, 0x1d, 0xbf, 0x85, 0x6e, 0xaf, 0x50, 0xe5, 0xdc, + 0x12, 0x39, 0x7d, 0xe9, 0xdc, 0x4e, 0x5e, 0x17, 0x54, 0xe5, 0xfe, 0x57, + 0x27, 0xff, 0xdc, 0x7c, 0x72, 0xff, 0x9e, 0x5b, 0x89, 0xdf, 0x6b, 0x39, + 0x79, 0x54, 0xf1, 0xcb, 0xda, 0x7f, 0x1c, 0xa5, 0x4d, 0xcf, 0x23, 0xb7, + 0x7c, 0xe9, 0xcb, 0xf9, 0x9e, 0x40, 0xff, 0x07, 0x2f, 0x33, 0xcb, 0x39, + 0x6f, 0x41, 0xe5, 0xe1, 0x75, 0xfd, 0x0c, 0xc5, 0x63, 0x47, 0x2a, 0x74, + 0xf7, 0x70, 0x69, 0x64, 0x5b, 0x1c, 0x61, 0xcf, 0x5c, 0x80, 0x46, 0x2c, + 0x9e, 0x26, 0xbb, 0x7f, 0x9c, 0xbf, 0xc2, 0xed, 0xeb, 0x50, 0x03, 0x97, + 0x9a, 0x3a, 0xa7, 0x2f, 0xfa, 0x19, 0x2c, 0x9f, 0x3f, 0xe1, 0xce, 0x5f, + 0x3f, 0xb8, 0x79, 0xce, 0x56, 0x22, 0x19, 0x07, 0xdc, 0xfe, 0xf3, 0x70, + 0xa1, 0xcb, 0xcd, 0xb6, 0xd9, 0xea, 0xfa, 0x5e, 0x71, 0x09, 0x6a, 0xfa, + 0xbe, 0x9a, 0xdb, 0xe9, 0x7f, 0x0a, 0x9c, 0xb0, 0x0e, 0x56, 0x1b, 0x57, + 0x24, 0xa8, 0x4f, 0x60, 0x23, 0x1b, 0x85, 0xcf, 0x4b, 0x40, 0x97, 0xe7, + 0x0b, 0xfd, 0xee, 0xe4, 0xba, 0x9c, 0x4e, 0x5f, 0x33, 0x7f, 0xce, 0x72, + 0xff, 0xf8, 0x51, 0x5f, 0xba, 0xf7, 0x7f, 0x79, 0x4a, 0x0e, 0x54, 0x1f, + 0xc6, 0x12, 0xd4, 0xe9, 0x94, 0xc9, 0x71, 0x58, 0x56, 0xdf, 0x60, 0x5e, + 0x47, 0x2f, 0xce, 0x22, 0x8c, 0x39, 0x72, 0x74, 0xe5, 0xe0, 0xbc, 0x8e, + 0x5f, 0xe4, 0xde, 0x23, 0x21, 0xac, 0xe5, 0x04, 0xf9, 0xb0, 0x5b, 0xa3, + 0x97, 0xe4, 0x63, 0x8e, 0x1c, 0xaf, 0x8c, 0x95, 0xc6, 0xa8, 0x72, 0x0d, + 0xe4, 0xb6, 0x12, 0x1c, 0x8d, 0xd1, 0x55, 0x94, 0x94, 0x14, 0xf2, 0xdf, + 0xc0, 0x70, 0x24, 0x3f, 0xc2, 0x2d, 0xa1, 0x75, 0xfd, 0x9d, 0xc5, 0xff, + 0x87, 0x2f, 0xc9, 0xe8, 0xf6, 0x8a, 0x5f, 0x2e, 0x3d, 0xa2, 0x97, 0x36, + 0xd9, 0x4a, 0x91, 0xf1, 0x61, 0x3b, 0x64, 0x57, 0x63, 0x65, 0x3e, 0x9a, + 0xfb, 0xe9, 0x85, 0xdb, 0x39, 0x7f, 0xfd, 0xe8, 0x5e, 0x60, 0xfb, 0xa9, + 0x03, 0x39, 0xca, 0x39, 0x58, 0x7b, 0x1a, 0x4d, 0xa9, 0x93, 0x83, 0x04, + 0x2f, 0x84, 0xa5, 0xb7, 0xbb, 0xff, 0xc3, 0x1c, 0x83, 0x06, 0x25, 0xbd, + 0xc1, 0xcb, 0xff, 0x7b, 0x58, 0xbe, 0xb8, 0xfb, 0x47, 0x2f, 0x20, 0x80, + 0xe7, 0xc3, 0x7d, 0x68, 0x62, 0x2c, 0xf8, 0xc2, 0x1a, 0xfb, 0xae, 0xfa, + 0x39, 0x7e, 0x97, 0x7f, 0x8d, 0x9c, 0xbf, 0xf9, 0xd9, 0xb8, 0xe2, 0x9c, + 0x47, 0xfd, 0x1c, 0xae, 0x4f, 0xc7, 0xa5, 0x37, 0xec, 0xfd, 0x91, 0xa3, + 0x94, 0x72, 0xec, 0x9b, 0x66, 0xcf, 0x45, 0x17, 0xfc, 0x9f, 0xf0, 0xfd, + 0x85, 0x06, 0x73, 0x97, 0xfd, 0x13, 0xc7, 0x3e, 0x1c, 0x9c, 0xe5, 0x62, + 0x29, 0xd6, 0x5a, 0x88, 0x17, 0xe7, 0x60, 0xc7, 0x27, 0x2a, 0x64, 0xd4, + 0xb7, 0x0f, 0xde, 0x97, 0x5f, 0x67, 0x72, 0x73, 0x97, 0xa4, 0xfb, 0x39, + 0x7e, 0x96, 0x7b, 0x02, 0x52, 0xfa, 0x04, 0x60, 0xe5, 0x4c, 0x7c, 0x5e, + 0x1c, 0x50, 0x9e, 0xf8, 0x1a, 0x66, 0xce, 0x52, 0xa8, 0xd8, 0x48, 0x42, + 0x78, 0xc6, 0xff, 0x87, 0x3b, 0x9f, 0x3b, 0x93, 0x9c, 0xbf, 0xff, 0xf8, + 0x10, 0x2b, 0x7f, 0x3f, 0x20, 0xe7, 0xc8, 0xcd, 0x76, 0x14, 0x13, 0x97, + 0xf7, 0xfc, 0x3a, 0x6f, 0x78, 0x72, 0xfb, 0xca, 0xe7, 0x4e, 0x5f, 0xf8, + 0x73, 0xde, 0xfe, 0x7f, 0x62, 0xce, 0x5f, 0x83, 0xfb, 0xee, 0x47, 0x2d, + 0xa3, 0x97, 0x20, 0x0e, 0x5d, 0xd4, 0x39, 0x77, 0xfa, 0xf8, 0x6b, 0x26, + 0x16, 0xa7, 0x3e, 0xe0, 0x1e, 0xdc, 0x08, 0x39, 0x70, 0x20, 0xe5, 0xfb, + 0xf9, 0x60, 0xfd, 0x43, 0x58, 0x01, 0x6a, 0x84, 0xe1, 0x95, 0x23, 0x44, + 0x00, 0x42, 0x5c, 0x53, 0x6f, 0xff, 0xb0, 0x5f, 0x9d, 0x2a, 0xab, 0xfc, + 0x5b, 0x00, 0x72, 0xff, 0xef, 0x77, 0x18, 0xa4, 0x03, 0x39, 0xf1, 0xcb, + 0xfd, 0xca, 0xd3, 0x6a, 0x40, 0x4e, 0x5f, 0x01, 0x8f, 0x2f, 0x88, 0xcf, + 0xd2, 0xa7, 0x91, 0xae, 0xff, 0xc7, 0x2f, 0xe0, 0x31, 0x4d, 0x29, 0x39, + 0xcb, 0xfb, 0x48, 0x23, 0x1c, 0x9c, 0xbb, 0x39, 0x39, 0x5c, 0x9f, 0xaf, + 0x8c, 0x9a, 0x16, 0x5f, 0x03, 0x69, 0xb3, 0x95, 0x09, 0x95, 0x49, 0x25, + 0xe1, 0x1a, 0xd9, 0x95, 0xef, 0xf9, 0xf1, 0xcb, 0x39, 0xca, 0xd1, 0xaf, + 0xf0, 0xfd, 0xd8, 0xd9, 0xcb, 0xfe, 0x8e, 0x70, 0x11, 0xc7, 0x27, 0x39, + 0x7f, 0x0e, 0x7b, 0x4e, 0x03, 0x95, 0xb3, 0xfe, 0x00, 0xbe, 0x8e, 0xef, + 0xfa, 0x27, 0xd6, 0xf1, 0x71, 0x39, 0xcb, 0xfd, 0x83, 0x3e, 0x05, 0xfa, + 0x72, 0xa6, 0x3e, 0xc6, 0xce, 0xaf, 0xec, 0x66, 0x05, 0x1b, 0x39, 0x73, + 0x20, 0xe5, 0x30, 0xf0, 0xdc, 0xb6, 0xfe, 0x1c, 0x9b, 0xa9, 0xe3, 0x97, + 0xd9, 0x9d, 0xd1, 0xca, 0xc4, 0x6b, 0x3b, 0x3f, 0x88, 0x78, 0x0b, 0x6f, + 0x36, 0xdb, 0x65, 0x2f, 0xd8, 0xa8, 0xff, 0xa2, 0x9f, 0x4d, 0x05, 0xf7, + 0xd6, 0xdb, 0x6c, 0xe5, 0xd8, 0x03, 0x95, 0x86, 0xfb, 0xc5, 0x15, 0x08, + 0x99, 0xf3, 0xcd, 0xff, 0xf2, 0x49, 0xf4, 0xc6, 0x3c, 0x9d, 0x5e, 0xa1, + 0xcb, 0xe4, 0xd8, 0x34, 0x72, 0xff, 0xb5, 0xb8, 0xff, 0xc2, 0x9c, 0x4e, + 0x5f, 0xf8, 0x73, 0x4b, 0xea, 0x2e, 0x04, 0xe5, 0xff, 0xfe, 0x55, 0xb7, + 0xda, 0xbf, 0x75, 0x92, 0x1f, 0xdf, 0x58, 0x27, 0x2a, 0x11, 0xb9, 0x87, + 0x68, 0x79, 0x7c, 0xdb, 0x8c, 0x8e, 0x5f, 0xf7, 0xa3, 0x90, 0x3f, 0x7a, + 0x87, 0x2d, 0xd3, 0x95, 0x87, 0x94, 0xb3, 0x9b, 0xf0, 0xe7, 0xa3, 0x67, + 0x2f, 0x36, 0xdb, 0x65, 0x2f, 0xce, 0xaf, 0x53, 0xc5, 0x3e, 0x9a, 0x0a, + 0x84, 0x40, 0x22, 0x35, 0xee, 0x30, 0xc3, 0x97, 0xbc, 0x8d, 0x9c, 0xbd, + 0xa7, 0xd9, 0xca, 0xe4, 0xdc, 0xf8, 0x76, 0xf7, 0x60, 0x27, 0x2b, 0x11, + 0x2a, 0x8a, 0xee, 0x45, 0x7e, 0xc0, 0x66, 0x4c, 0x72, 0xda, 0xf8, 0x9d, + 0x5e, 0xe1, 0x43, 0xd8, 0x5b, 0x09, 0x6d, 0xdf, 0xc8, 0x2a, 0x99, 0xb2, + 0x50, 0xbd, 0xfb, 0x87, 0xec, 0x4f, 0xf9, 0xcb, 0xff, 0x93, 0xd1, 0xbc, + 0x1f, 0x3b, 0x89, 0xca, 0x99, 0x70, 0xe3, 0xb0, 0xfe, 0x19, 0x52, 0x7f, + 0x9c, 0x71, 0x2f, 0xbd, 0x1c, 0x60, 0xe5, 0x62, 0xe8, 0x02, 0x4e, 0x43, + 0x8a, 0xe5, 0xe1, 0x8e, 0x27, 0x2f, 0xfe, 0xdc, 0x2f, 0xa2, 0xfe, 0x18, + 0x6c, 0xe5, 0xdc, 0x3a, 0x1c, 0xb9, 0x3a, 0x72, 0xa7, 0x36, 0x3b, 0x1b, + 0xa8, 0x44, 0xb3, 0xba, 0x5f, 0x7b, 0x5f, 0xb5, 0x9c, 0xbf, 0xd0, 0x32, + 0x14, 0x8e, 0x4e, 0x54, 0x36, 0x5f, 0x32, 0x87, 0xb8, 0x4b, 0xf2, 0x3e, + 0x45, 0x63, 0x0f, 0x59, 0xaf, 0x27, 0x48, 0xe7, 0xb8, 0xee, 0x7b, 0x29, + 0x1d, 0xdc, 0x41, 0x09, 0xf1, 0x8d, 0xc7, 0x50, 0xf7, 0xf4, 0xe9, 0x17, + 0x13, 0x86, 0x90, 0xb3, 0x50, 0x87, 0x80, 0x9e, 0xfc, 0x93, 0x49, 0x04, + 0xe5, 0xcd, 0x42, 0x1c, 0xbf, 0xe9, 0xbd, 0xc1, 0xa8, 0x9b, 0xfd, 0x9c, + 0xbf, 0xc1, 0x81, 0x64, 0x06, 0x0e, 0x54, 0x1f, 0x8b, 0xa0, 0x5f, 0xfd, + 0x89, 0xd8, 0x0f, 0x7f, 0x8e, 0x74, 0x72, 0xf0, 0x55, 0x01, 0xcb, 0xf3, + 0x37, 0xb7, 0xf1, 0xca, 0xf8, 0x78, 0xd0, 0x3d, 0x7f, 0xf4, 0xce, 0xbe, + 0xc4, 0xbc, 0x38, 0xc3, 0x97, 0xf6, 0xf0, 0x45, 0xe7, 0x39, 0x4b, 0x3f, + 0x04, 0x44, 0xbf, 0xfe, 0x46, 0x73, 0x2d, 0x7c, 0xc1, 0x1c, 0x40, 0x1c, + 0xbc, 0x9d, 0xfc, 0xe5, 0x7c, 0x54, 0xfe, 0xd5, 0x13, 0xca, 0x11, 0x9b, + 0x20, 0xec, 0x22, 0xde, 0x12, 0x7e, 0x21, 0xe2, 0xa1, 0x6f, 0xad, 0x44, + 0x7b, 0x1e, 0x5c, 0x24, 0x36, 0xda, 0xb8, 0xd2, 0x38, 0x66, 0x9e, 0x17, + 0x8d, 0x9d, 0xa9, 0xc6, 0x42, 0xd4, 0x8e, 0xf8, 0x52, 0xd4, 0x56, 0x2b, + 0x93, 0xce, 0xed, 0x4a, 0x97, 0xe2, 0x1a, 0x5f, 0x06, 0x5e, 0x13, 0xf2, + 0xb2, 0xfd, 0x17, 0x4f, 0x1f, 0xe6, 0x94, 0xa6, 0x94, 0xc9, 0xc6, 0xb8, + 0xe2, 0x26, 0xa7, 0xd6, 0x6e, 0xb1, 0x12, 0x65, 0x2c, 0xa7, 0xb5, 0xf1, + 0xa3, 0xda, 0x0f, 0xb0, 0x53, 0x1a, 0x78, 0x78, 0xc1, 0x06, 0xbb, 0xbe, + 0xd5, 0xe2, 0xc4, 0xfa, 0xd6, 0x19, 0xff, 0x3c, 0x9f, 0xc6, 0x59, 0x4b, + 0x72, 0xd8, 0x5a, 0x52, 0x71, 0x54, 0xad, 0x54, 0x78, 0x25, 0xe2, 0x57, + 0xd8, 0xf7, 0x30, 0xe5, 0x9e, 0xcd, 0x8d, 0xe6, 0x67, 0x8e, 0x5f, 0xe7, + 0x64, 0x79, 0x34, 0x87, 0x2d, 0xf4, 0x07, 0x9a, 0x23, 0x97, 0xfb, 0xee, + 0x6d, 0x6e, 0xeb, 0x34, 0x5c, 0x6b, 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, + 0x2e, 0xb5, 0xff, 0xdf, 0x5e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x51, + 0x54, 0x47, 0xc6, 0x3f, 0x28, 0x67, 0x04, 0xa9, 0x58, 0x49, 0xac, 0xa5, + 0x25, 0x1c, 0xb5, 0xc2, 0x35, 0xf3, 0xdd, 0x1d, 0x04, 0x22, 0x74, 0x53, + 0xe4, 0x1e, 0x04, 0x1b, 0xff, 0xdf, 0x58, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, + 0xcd, 0x12, 0xd2, 0xff, 0xb8, 0x5b, 0xa8, 0xd6, 0xf1, 0xcf, 0x01, 0xcb, + 0xf6, 0xd6, 0xee, 0xb3, 0x44, 0x6e, 0xbf, 0xfb, 0xb0, 0x9b, 0x4e, 0x1d, + 0x7d, 0x86, 0xce, 0x5f, 0xf9, 0xe5, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x25, + 0xf5, 0xfd, 0x1e, 0x53, 0xaf, 0xe3, 0x97, 0xfb, 0x14, 0xda, 0xbd, 0xff, + 0x47, 0x2f, 0xbf, 0xea, 0x6c, 0xe5, 0xe9, 0xb5, 0xb3, 0x96, 0xfa, 0xd4, + 0x93, 0xb5, 0xc4, 0x65, 0x9a, 0x31, 0x27, 0xa9, 0x82, 0x5c, 0xd0, 0xdd, + 0x42, 0x3b, 0xff, 0xdc, 0xcb, 0xc9, 0x37, 0xd0, 0xa7, 0x18, 0x09, 0xcb, + 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x2a, 0xb5, 0xc9, 0xc0, 0x72, 0xf9, + 0x18, 0xfc, 0x4e, 0x52, 0xa6, 0xf3, 0xc3, 0x37, 0x87, 0x81, 0xb3, 0x97, + 0xf7, 0x63, 0x8f, 0xe1, 0xc3, 0x97, 0xf3, 0xf6, 0x61, 0x80, 0x9c, 0xbf, + 0xfb, 0xdd, 0x8d, 0x0b, 0xff, 0xc3, 0xa6, 0xce, 0x5e, 0x89, 0x61, 0xca, + 0x92, 0x30, 0x42, 0x61, 0xc9, 0x6c, 0xc9, 0x37, 0xfc, 0xae, 0x0e, 0x73, + 0xe7, 0x61, 0xcb, 0xdc, 0x11, 0xe3, 0x97, 0xfb, 0x70, 0xc5, 0x20, 0x56, + 0x72, 0xf7, 0x2f, 0xc9, 0xcb, 0xe7, 0xf3, 0xf2, 0x72, 0xe0, 0xa1, 0xcb, + 0xfb, 0x36, 0xb7, 0x75, 0x9a, 0x24, 0x05, 0x7c, 0x3c, 0xff, 0xa2, 0xd7, + 0xed, 0x38, 0xbf, 0x27, 0x2e, 0xfe, 0x0e, 0x54, 0x8f, 0x93, 0x92, 0x6d, + 0x93, 0xdf, 0xe9, 0x46, 0xe7, 0x8d, 0xce, 0x72, 0xff, 0x6e, 0x76, 0x40, + 0xcb, 0x47, 0x2a, 0x0f, 0xa7, 0x0d, 0x6f, 0xb2, 0x77, 0x09, 0xcb, 0xb8, + 0x4e, 0x9c, 0xbf, 0xfd, 0x93, 0x75, 0xd9, 0xee, 0xc7, 0xbf, 0x61, 0xca, + 0x9d, 0x70, 0x0c, 0x24, 0x59, 0x0e, 0x15, 0x4f, 0xda, 0xce, 0x66, 0x1f, + 0x61, 0x9f, 0x47, 0x9e, 0x1a, 0xa3, 0x09, 0x9f, 0x10, 0x34, 0x22, 0x50, + 0x72, 0xfd, 0x02, 0x39, 0xe3, 0x97, 0xdb, 0xda, 0x2c, 0xe5, 0xf0, 0xe4, + 0xff, 0x5a, 0x1e, 0x3a, 0x84, 0xb7, 0xfb, 0xef, 0x5d, 0x99, 0x01, 0x39, + 0x5f, 0x53, 0x83, 0xdc, 0x62, 0x2d, 0x0f, 0xaf, 0xf7, 0xdc, 0xda, 0xdd, + 0xd6, 0x68, 0xb2, 0x17, 0xfb, 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x5a, 0xeb, + 0xff, 0xd8, 0xa4, 0x4f, 0xf7, 0x26, 0xf0, 0x60, 0x4e, 0x5f, 0xef, 0xb9, + 0xb5, 0xbb, 0xac, 0xd1, 0x72, 0x2f, 0xdb, 0x5b, 0xba, 0xcd, 0x17, 0x62, + 0xff, 0xcf, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x47, 0x2d, 0xf7, 0x11, + 0x00, 0xc3, 0x4b, 0xe1, 0x89, 0x30, 0xe5, 0xff, 0xb8, 0x6e, 0x11, 0x91, + 0xb9, 0x62, 0x71, 0x39, 0x69, 0x1c, 0xbf, 0x6d, 0x6e, 0xeb, 0x34, 0x52, + 0xab, 0xfe, 0x5f, 0x52, 0x6e, 0xc4, 0xf8, 0x72, 0xff, 0xf7, 0x62, 0x78, + 0xea, 0x71, 0x70, 0xf5, 0x0e, 0x7d, 0x37, 0x57, 0x4b, 0xee, 0x23, 0x2e, + 0x66, 0xea, 0xe5, 0x30, 0xd7, 0x86, 0xe5, 0xff, 0x9d, 0x3d, 0x2f, 0xc2, + 0xe2, 0x03, 0x96, 0xfa, 0x14, 0xf7, 0xf9, 0x21, 0x64, 0x6a, 0xfd, 0x29, + 0xa9, 0xd9, 0xa0, 0x92, 0x94, 0x1f, 0x90, 0x81, 0xe5, 0x41, 0x27, 0x80, + 0xd8, 0x76, 0x04, 0x11, 0x41, 0xd2, 0x6f, 0xa1, 0x83, 0xc6, 0x50, 0x4d, + 0xff, 0x4b, 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x47, 0x0b, 0xfe, 0x4f, 0xb9, + 0xb5, 0xbb, 0xac, 0xd1, 0x5a, 0xad, 0xf5, 0xd1, 0x1b, 0xe4, 0x7b, 0xff, + 0xdf, 0x58, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x12, 0xda, 0xf7, 0xfb, + 0x01, 0xcb, 0xb3, 0x93, 0x97, 0xf8, 0x38, 0xc6, 0x42, 0x68, 0xe5, 0xee, + 0x3f, 0xc8, 0xe5, 0x2d, 0x10, 0xfc, 0x8f, 0x20, 0xbf, 0x13, 0x2b, 0xdd, + 0x0c, 0x8e, 0x5f, 0xf6, 0x72, 0x38, 0x00, 0x3c, 0x8e, 0x5c, 0xc5, 0x9c, + 0xbf, 0xd8, 0x9c, 0xe8, 0x38, 0x27, 0x2a, 0x11, 0x03, 0x23, 0x8d, 0x8b, + 0xdf, 0x0c, 0x73, 0x23, 0x97, 0xff, 0xe7, 0xe4, 0x01, 0xeb, 0xcb, 0x34, + 0x3f, 0xba, 0x87, 0x2f, 0x81, 0x9b, 0x98, 0xe5, 0x2d, 0x13, 0x9d, 0x22, + 0x02, 0xbd, 0x95, 0x39, 0x7f, 0x26, 0xc5, 0x3d, 0xa3, 0x97, 0xed, 0xb8, + 0xe4, 0x1c, 0xa3, 0x44, 0x36, 0x43, 0xe3, 0xe8, 0x93, 0x96, 0x5d, 0x02, + 0x72, 0xfe, 0x41, 0x0e, 0x20, 0x4e, 0x54, 0x1e, 0x04, 0x85, 0x6f, 0xb2, + 0x69, 0x61, 0xcb, 0xff, 0x3c, 0xbe, 0xe6, 0xd6, 0xee, 0xb3, 0x44, 0xc0, + 0xbc, 0xda, 0x00, 0xe5, 0xf6, 0x9c, 0x40, 0x72, 0xa6, 0x37, 0xc0, 0x1d, + 0xbf, 0xdf, 0xf3, 0xb4, 0x86, 0x61, 0xcb, 0xf7, 0x52, 0x06, 0x73, 0x97, + 0xfd, 0x13, 0xf8, 0x63, 0xff, 0x68, 0xe5, 0xbd, 0xd4, 0x4a, 0xe8, 0xd1, + 0xa1, 0x3d, 0xf7, 0x2b, 0x45, 0x4e, 0x56, 0x1e, 0xe7, 0x8e, 0x2f, 0xf6, + 0xd3, 0xd8, 0xc8, 0xe9, 0xcb, 0xfd, 0xa4, 0xea, 0x33, 0x15, 0x39, 0x7f, + 0xf9, 0xe7, 0xea, 0x40, 0xe4, 0xc9, 0xb4, 0x39, 0x58, 0x8a, 0xdf, 0x19, + 0x36, 0x67, 0x72, 0xf0, 0xe5, 0xdf, 0x80, 0xa5, 0x21, 0xae, 0xd8, 0xb5, + 0xf9, 0x58, 0x96, 0x04, 0xe5, 0xfe, 0xc0, 0x8e, 0x7b, 0xb8, 0x72, 0xee, + 0x19, 0x67, 0x8c, 0x29, 0x7f, 0x4e, 0xa3, 0x47, 0x10, 0x1c, 0xbf, 0xb3, + 0xde, 0x8d, 0xe8, 0xe5, 0xfc, 0xe2, 0x09, 0xc1, 0xe3, 0x95, 0x08, 0x8c, + 0x13, 0x16, 0x85, 0xb6, 0xfb, 0x0b, 0xe4, 0xd3, 0x9f, 0x86, 0x13, 0xd9, + 0x0c, 0xb5, 0xc2, 0x4f, 0x98, 0x40, 0xec, 0x85, 0x84, 0x4f, 0x08, 0xa1, + 0x8c, 0x4f, 0x50, 0xce, 0xf2, 0xf7, 0xe4, 0x1c, 0x4a, 0x1b, 0x31, 0x52, + 0x16, 0xb7, 0x99, 0xfe, 0xca, 0x5f, 0xf9, 0xe5, 0xf7, 0x36, 0xb7, 0x75, + 0x9a, 0x26, 0x35, 0xf4, 0x6e, 0x38, 0x0e, 0x5b, 0xea, 0x22, 0x39, 0x83, + 0xdd, 0x4c, 0xbe, 0x89, 0xe3, 0x67, 0x2f, 0xd9, 0x13, 0x23, 0x0e, 0x52, + 0x1e, 0x4e, 0xc8, 0xaf, 0xe0, 0xb2, 0x33, 0xda, 0x39, 0x7f, 0xbb, 0x1b, + 0x9d, 0x4f, 0xc0, 0x72, 0xe7, 0xd1, 0xcb, 0xef, 0x9e, 0xce, 0x9c, 0xb4, + 0x74, 0xdd, 0x68, 0x5a, 0xf4, 0x0c, 0xe7, 0x2f, 0xff, 0xff, 0xa5, 0xae, + 0xe7, 0xed, 0xeb, 0xb8, 0xbc, 0xd7, 0xcc, 0xe6, 0x5a, 0x41, 0x43, 0x97, + 0x9d, 0xd6, 0x68, 0xac, 0x57, 0xce, 0xa4, 0x2a, 0x72, 0x96, 0x79, 0x7b, + 0x28, 0xbf, 0xf3, 0x4c, 0xf0, 0xe7, 0xf0, 0x3e, 0x39, 0x4a, 0xa6, 0xde, + 0xb2, 0x6e, 0x47, 0x37, 0x0c, 0xcf, 0x11, 0x5f, 0xfc, 0x3e, 0x57, 0xf8, + 0x1c, 0x5c, 0x6c, 0xe5, 0xfe, 0xdc, 0xfe, 0xd3, 0xf2, 0xb3, 0x95, 0x07, + 0xf4, 0xe8, 0x97, 0xee, 0x0f, 0x67, 0x33, 0x1c, 0xbf, 0xff, 0xff, 0xcf, + 0xef, 0x67, 0x74, 0xf2, 0x41, 0xf4, 0xb3, 0x79, 0xac, 0xeb, 0xce, 0x31, + 0x23, 0x95, 0x08, 0xb8, 0xd1, 0x6d, 0xfd, 0xfb, 0x45, 0xf5, 0x38, 0x73, + 0x97, 0xf6, 0x6b, 0x99, 0x47, 0x4e, 0x5d, 0x1c, 0x4e, 0x57, 0x4f, 0x18, + 0x4b, 0xaf, 0xf4, 0xcf, 0x89, 0x25, 0x18, 0x72, 0x82, 0x7a, 0xa8, 0x43, + 0x7f, 0xd1, 0xcc, 0xa6, 0x93, 0xee, 0x73, 0x95, 0x09, 0x97, 0x64, 0x34, + 0x50, 0x86, 0xf4, 0x4b, 0xc7, 0x2f, 0xfd, 0x81, 0xda, 0x7f, 0x38, 0x35, + 0x23, 0x97, 0xcc, 0x7e, 0x7c, 0x72, 0xff, 0xe9, 0xe3, 0xdf, 0x14, 0x5a, + 0x9c, 0x0a, 0x68, 0xe5, 0xff, 0x6e, 0x34, 0xfb, 0x18, 0x91, 0xca, 0xda, + 0x21, 0xb8, 0xa7, 0xde, 0x93, 0xce, 0x72, 0xf7, 0xc9, 0xd8, 0x72, 0xe0, + 0xf8, 0xe5, 0x70, 0xc9, 0x91, 0x64, 0x2a, 0x79, 0x25, 0x41, 0xd1, 0x20, + 0xbf, 0xf0, 0xb8, 0x7b, 0x1c, 0x7a, 0xe2, 0x72, 0xff, 0xff, 0xdf, 0xcf, + 0x8b, 0xf8, 0x3f, 0xf0, 0x7c, 0xce, 0x65, 0x9f, 0x88, 0x34, 0x72, 0xff, + 0xf4, 0xf9, 0xcf, 0xb4, 0x83, 0x00, 0x76, 0x1c, 0xbf, 0xdc, 0x8e, 0x07, + 0xae, 0xd9, 0xca, 0xc3, 0xfe, 0x74, 0xaa, 0x0a, 0x6a, 0x82, 0x7d, 0xa8, + 0x7b, 0x5f, 0xd3, 0xcd, 0x2e, 0x1b, 0x73, 0x9c, 0xbe, 0x11, 0xcf, 0x1c, + 0xbf, 0x23, 0x5e, 0xf6, 0x87, 0x29, 0xaa, 0x44, 0x0c, 0x1b, 0xf4, 0x82, + 0xfe, 0x9d, 0x46, 0x8e, 0x20, 0x39, 0x7c, 0xd7, 0x1a, 0x13, 0x97, 0xfe, + 0xeb, 0xb3, 0xdd, 0x8f, 0x7e, 0xc3, 0x95, 0x87, 0xc9, 0x31, 0x25, 0xff, + 0xd9, 0x8a, 0xb2, 0x13, 0x7b, 0x46, 0xce, 0x5f, 0xf2, 0x49, 0x3b, 0xfb, + 0x18, 0x87, 0x2e, 0xcf, 0x1c, 0xa8, 0x4d, 0x2b, 0x21, 0x2b, 0xb2, 0x2f, + 0x22, 0x34, 0x39, 0xbd, 0xd4, 0xfb, 0x0c, 0xaf, 0xf9, 0xc8, 0x64, 0x5b, + 0x91, 0xf0, 0x2e, 0x19, 0x9b, 0x86, 0xc7, 0x63, 0x50, 0x73, 0x31, 0x1c, + 0xd4, 0x6c, 0x7e, 0x8e, 0x9d, 0xa4, 0x2d, 0x94, 0x8d, 0xfa, 0xf7, 0x0b, + 0x34, 0x6a, 0x8e, 0x5d, 0x21, 0x39, 0x7f, 0x6f, 0x70, 0x1c, 0x61, 0xcb, + 0xe9, 0xf7, 0x13, 0x9c, 0xb9, 0x40, 0x1c, 0xbd, 0xd4, 0x61, 0xcb, 0x4c, + 0x72, 0x9c, 0xd7, 0x7e, 0x39, 0x7e, 0x71, 0x9f, 0xfd, 0x1c, 0xbf, 0xe8, + 0x0f, 0x70, 0x3b, 0x75, 0x9c, 0xa4, 0x4c, 0x65, 0xcb, 0x40, 0x48, 0x28, + 0xda, 0x21, 0xf1, 0x4d, 0xba, 0x72, 0xf6, 0x94, 0xd1, 0xcb, 0xee, 0x67, + 0x85, 0x4e, 0x54, 0xe7, 0xa8, 0x11, 0x1f, 0xc7, 0xae, 0xf4, 0x1c, 0xbf, + 0xdc, 0xee, 0x12, 0x4f, 0xa3, 0x97, 0xd8, 0x31, 0x23, 0x95, 0x87, 0xa6, + 0xc3, 0x3b, 0xfd, 0x80, 0xd6, 0x79, 0x36, 0x72, 0xfb, 0xff, 0x66, 0x8e, + 0x5f, 0x46, 0xdc, 0x4e, 0x5f, 0xb3, 0x72, 0x86, 0x1c, 0xbf, 0xcf, 0xb9, + 0x01, 0x39, 0xd1, 0xcb, 0xed, 0x6a, 0x00, 0x72, 0xa1, 0x31, 0x3c, 0x21, + 0x43, 0x2e, 0x91, 0xb9, 0x07, 0xe4, 0xed, 0x9a, 0x5f, 0xc8, 0x23, 0x9c, + 0x5c, 0xe5, 0xe9, 0x29, 0xe3, 0x97, 0xd2, 0x07, 0xf2, 0x39, 0x7d, 0xb5, + 0x20, 0x07, 0x2a, 0x0f, 0x1d, 0x09, 0x2f, 0xf2, 0x4e, 0xec, 0x00, 0x20, + 0xe5, 0xc8, 0x13, 0x97, 0xfc, 0x8b, 0xee, 0x4c, 0x30, 0x13, 0x97, 0xd2, + 0xf6, 0x28, 0x72, 0xf2, 0xe0, 0x07, 0x2f, 0x6e, 0x18, 0x72, 0x9c, 0xf6, + 0xff, 0x23, 0x6c, 0x72, 0xfa, 0x75, 0x32, 0x63, 0x97, 0xa3, 0x73, 0x9c, + 0xa8, 0x3c, 0x24, 0x25, 0xbd, 0x03, 0x23, 0x97, 0xde, 0x14, 0xe0, 0x39, + 0x41, 0x54, 0xbd, 0xc9, 0x64, 0xcc, 0xbb, 0x20, 0x61, 0x9f, 0x45, 0x86, + 0x12, 0x7a, 0x72, 0xf1, 0x07, 0xe3, 0x77, 0xfb, 0xaf, 0x2e, 0x0e, 0x0f, + 0xe7, 0x39, 0x77, 0x5a, 0x1c, 0xbf, 0xf4, 0x66, 0xbe, 0x42, 0x05, 0x49, + 0x1c, 0xbf, 0x91, 0xbd, 0x4f, 0x8d, 0x9c, 0xa1, 0x3f, 0x0f, 0x20, 0x5f, + 0xa0, 0x3e, 0xc5, 0x9c, 0xbe, 0xec, 0x0a, 0xce, 0x54, 0x8f, 0xa7, 0x44, + 0x3e, 0x27, 0xbe, 0x71, 0x79, 0x8e, 0x5f, 0x93, 0xc3, 0x92, 0x39, 0x7d, + 0x0d, 0xc4, 0xc7, 0x2e, 0x51, 0x87, 0x2f, 0xef, 0x0b, 0x83, 0x04, 0xe5, + 0xf8, 0x5c, 0x18, 0x27, 0x2d, 0xff, 0xc3, 0xd0, 0xf1, 0x5d, 0x4e, 0x8f, + 0xd5, 0x48, 0x50, 0x9b, 0xa4, 0x62, 0xd1, 0x7f, 0xa1, 0xb0, 0xfe, 0xfb, + 0x91, 0xcb, 0xf9, 0x37, 0xce, 0xa2, 0x47, 0x2d, 0xc4, 0xe5, 0x6c, 0xfd, + 0xba, 0x6b, 0xc0, 0x5d, 0x78, 0x51, 0x53, 0x97, 0xd8, 0x14, 0xe2, 0x72, + 0xe8, 0x66, 0x1b, 0xf7, 0x1c, 0xbf, 0xec, 0x6d, 0xf9, 0xec, 0x28, 0x27, + 0x2d, 0xa3, 0x94, 0x87, 0xeb, 0xb2, 0xa7, 0x3a, 0xb7, 0x27, 0x2e, 0x04, + 0x14, 0xb9, 0xb6, 0xca, 0x52, 0x1a, 0xf6, 0xc5, 0xaf, 0xe9, 0x0e, 0x7b, + 0xa8, 0x53, 0xe9, 0xa1, 0xa0, 0xa2, 0x81, 0xd8, 0xaf, 0x3f, 0x3a, 0x39, + 0x6d, 0x1c, 0xbe, 0x53, 0xaf, 0xe3, 0x94, 0x13, 0xd1, 0xe4, 0x77, 0xc2, + 0x37, 0xa0, 0x66, 0x39, 0x70, 0xc1, 0xcb, 0x4c, 0x72, 0xa6, 0x3c, 0x3d, + 0x8e, 0x38, 0xad, 0xff, 0xca, 0xa0, 0xaf, 0x50, 0xc7, 0xe7, 0xc7, 0x2f, + 0x03, 0x38, 0x0e, 0x52, 0xa7, 0xc9, 0xb4, 0x5b, 0xe6, 0x6b, 0xf6, 0x1c, + 0xb2, 0xa7, 0x2c, 0xd0, 0xe5, 0xdb, 0x54, 0xe5, 0x41, 0xf0, 0xa1, 0x27, + 0xe2, 0x4a, 0x09, 0xdf, 0xff, 0x77, 0x25, 0xa8, 0xf4, 0xb1, 0xad, 0xc4, + 0x07, 0x2f, 0xfd, 0x24, 0xf7, 0x73, 0x9f, 0x7f, 0x07, 0x2e, 0xcd, 0x1c, + 0xa8, 0x3d, 0x69, 0x20, 0x56, 0x91, 0x91, 0xe8, 0x53, 0xd8, 0x07, 0x2f, + 0xc9, 0x0c, 0x86, 0x1c, 0xb6, 0x1c, 0xa4, 0x3e, 0xf7, 0x28, 0xd0, 0x8b, + 0x42, 0x6a, 0x85, 0x67, 0x38, 0xe6, 0x90, 0x93, 0xec, 0x21, 0x1e, 0x37, + 0x3b, 0xda, 0x89, 0x8e, 0x5f, 0xd8, 0x1c, 0xe2, 0x9b, 0x39, 0x47, 0x2c, + 0xc3, 0x95, 0xe2, 0xf3, 0x88, 0x5d, 0xf8, 0x09, 0xb4, 0x54, 0xe5, 0xce, + 0xa9, 0xca, 0x99, 0x19, 0x0c, 0x1d, 0xea, 0x50, 0x08, 0x84, 0xa2, 0xec, + 0xd9, 0xcb, 0xbd, 0x07, 0x2f, 0xd1, 0xdc, 0xe2, 0xe7, 0x29, 0x87, 0xa8, + 0xe2, 0xc0, 0x16, 0xbf, 0x93, 0xd9, 0xd7, 0x54, 0xe5, 0xfd, 0xdf, 0xde, + 0x7e, 0xa1, 0xcb, 0xcd, 0xb6, 0xd9, 0x4b, 0xfe, 0x0c, 0x4e, 0xa6, 0x75, + 0xf9, 0x29, 0xf4, 0xd0, 0x5d, 0x93, 0x9c, 0xbd, 0x28, 0x61, 0xca, 0x0a, + 0x33, 0xd6, 0x9e, 0x89, 0xb3, 0x0b, 0xde, 0x86, 0x21, 0xca, 0xc3, 0xd8, + 0x59, 0xed, 0xf2, 0x6f, 0x80, 0x27, 0x2f, 0xdd, 0x8e, 0x5d, 0xac, 0xe5, + 0xff, 0xf4, 0x7b, 0x41, 0xcf, 0x27, 0x7f, 0xce, 0x7c, 0x72, 0xba, 0x7f, + 0x9e, 0x2b, 0xb6, 0xce, 0x5f, 0xec, 0xc5, 0xa9, 0xc7, 0xb8, 0x72, 0xff, + 0xc9, 0x03, 0xe1, 0xcf, 0x43, 0x67, 0x2f, 0x7b, 0x7f, 0x9c, 0xb6, 0x8e, + 0x50, 0x9a, 0xff, 0xc7, 0xaf, 0xff, 0xd8, 0x18, 0xce, 0x54, 0xf2, 0x0f, + 0xf2, 0xcd, 0x1c, 0xb9, 0x80, 0x39, 0x73, 0x89, 0xca, 0xe9, 0xac, 0x71, + 0x7b, 0xf3, 0x13, 0xc0, 0x73, 0x95, 0x3a, 0xa5, 0xec, 0x85, 0x0b, 0x59, + 0x14, 0xc2, 0x3b, 0x35, 0x76, 0xb1, 0x21, 0xf4, 0x20, 0xbf, 0x20, 0xbb, + 0x6a, 0x9c, 0xbe, 0xef, 0x92, 0x73, 0x97, 0xf9, 0x69, 0xa1, 0xce, 0x2e, + 0x72, 0xfa, 0x27, 0x79, 0x1c, 0xbe, 0xf6, 0xba, 0x87, 0x2f, 0xe1, 0x7f, + 0x4f, 0x8d, 0x9c, 0xa3, 0x94, 0x26, 0xe7, 0xc5, 0xd5, 0x07, 0xf7, 0x8b, + 0x77, 0xec, 0x9c, 0x73, 0x93, 0x95, 0x09, 0xa9, 0xe0, 0xc7, 0x24, 0x7b, + 0x33, 0xec, 0x27, 0x44, 0x82, 0xf0, 0xa3, 0x59, 0xcb, 0xe0, 0xb4, 0x75, + 0x4e, 0x54, 0x1e, 0x1e, 0x0f, 0x5e, 0xec, 0x04, 0xe5, 0xdb, 0xd1, 0xca, + 0x38, 0x85, 0xbd, 0xfe, 0x81, 0x93, 0xb3, 0x02, 0x72, 0xfb, 0xcc, 0x66, + 0xce, 0x5f, 0xfc, 0x08, 0x15, 0xbf, 0x80, 0xa0, 0xc8, 0xe5, 0xe9, 0x27, + 0x4e, 0x5f, 0x78, 0x72, 0x47, 0x2f, 0xd9, 0xff, 0x0f, 0xa7, 0x39, 0x7f, + 0xf9, 0x35, 0xdc, 0x08, 0xe7, 0x11, 0xcd, 0x1c, 0xa9, 0x26, 0x96, 0xa9, + 0x8f, 0x24, 0x73, 0x22, 0x6c, 0x70, 0x48, 0x7c, 0x5b, 0x4d, 0x53, 0x73, + 0xb3, 0xc3, 0x15, 0xc4, 0x65, 0xf3, 0xc2, 0xa6, 0x46, 0x21, 0x8d, 0xf3, + 0x25, 0x60, 0xab, 0x09, 0x45, 0x9e, 0x73, 0x0f, 0x24, 0x8c, 0xb2, 0x68, + 0x60, 0x6e, 0x1c, 0xcc, 0x86, 0x6f, 0x65, 0xd6, 0x3c, 0x64, 0x00, 0x84, + 0xf7, 0x0e, 0x5c, 0x31, 0xaa, 0x6a, 0x53, 0xff, 0xa3, 0xe0, 0xe3, 0x09, + 0xe6, 0xc8, 0x1a, 0x19, 0xa9, 0x1b, 0x25, 0xff, 0x7d, 0xf2, 0x67, 0x06, + 0xbf, 0x83, 0x97, 0xff, 0xfd, 0xfc, 0x7d, 0xf6, 0x93, 0xae, 0x9e, 0xcd, + 0x81, 0x8f, 0x23, 0x95, 0xf5, 0x53, 0xa4, 0xf1, 0xe7, 0x04, 0xfa, 0xfd, + 0xb5, 0xbb, 0xac, 0xd1, 0x5b, 0xaf, 0xfc, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, + 0xcd, 0x13, 0x82, 0xdf, 0x71, 0x10, 0x0c, 0x34, 0xbb, 0x86, 0x09, 0xcb, + 0x74, 0xe5, 0xb4, 0x72, 0xbf, 0x34, 0x4d, 0x04, 0x6f, 0x96, 0xee, 0xb3, + 0x45, 0xa2, 0xbf, 0xfd, 0x81, 0xeb, 0xab, 0x34, 0xc9, 0xaf, 0xd8, 0x72, + 0xb6, 0x7f, 0x9d, 0x2e, 0xbe, 0x5b, 0x88, 0x0e, 0x5f, 0xf4, 0xd8, 0xd7, + 0xad, 0xed, 0xfc, 0x72, 0xfe, 0x87, 0x1f, 0xc3, 0x87, 0x2f, 0xfe, 0x1c, + 0xe3, 0xac, 0xee, 0x0a, 0x81, 0x39, 0x7f, 0xb3, 0x60, 0xc9, 0x94, 0xd1, + 0xcb, 0x2a, 0x72, 0xff, 0xb2, 0x27, 0xc9, 0xb6, 0x9a, 0x39, 0x48, 0x79, + 0x73, 0x09, 0x5f, 0xff, 0xa7, 0x8f, 0x40, 0x77, 0x1d, 0x7d, 0x0e, 0x00, + 0xe5, 0xff, 0xa3, 0x97, 0x6b, 0xe8, 0xbb, 0x5c, 0xe7, 0x2f, 0xfd, 0x1b, + 0x06, 0x26, 0x6f, 0xdf, 0x9c, 0xa8, 0x46, 0xbf, 0x55, 0x34, 0x8b, 0x6c, + 0x0a, 0x7d, 0xa8, 0x8b, 0x34, 0x20, 0x35, 0x0f, 0x9b, 0xfd, 0xde, 0xfe, + 0xab, 0x23, 0x47, 0x2f, 0xff, 0xc9, 0xa1, 0xce, 0x2f, 0xe1, 0xcd, 0x75, + 0xe6, 0x39, 0x7e, 0x8f, 0x69, 0x4e, 0x9c, 0xac, 0x45, 0xa4, 0xc6, 0xc2, + 0xab, 0x7d, 0x80, 0x7e, 0x9c, 0xbb, 0xba, 0x39, 0x6f, 0xbc, 0x22, 0xe6, + 0xfb, 0x56, 0x7d, 0x90, 0xa0, 0x59, 0x14, 0xc4, 0x2c, 0x3d, 0xec, 0xa1, + 0x9f, 0x46, 0x02, 0xd0, 0xbd, 0x42, 0x1b, 0xff, 0xff, 0x76, 0x00, 0xc7, + 0x97, 0xcf, 0x77, 0x19, 0x8b, 0x8e, 0xc3, 0x0e, 0x5f, 0xc9, 0x3f, 0xc7, + 0x10, 0x1c, 0xbe, 0x5b, 0xba, 0xcd, 0x16, 0xd2, 0xff, 0xfe, 0x87, 0xf4, + 0x76, 0x34, 0x89, 0x24, 0xde, 0x04, 0xe5, 0xfd, 0xd8, 0x64, 0x20, 0x4e, + 0x52, 0x26, 0x9b, 0x33, 0x6e, 0xcb, 0xf4, 0x5d, 0xe5, 0x7b, 0xff, 0x75, + 0x02, 0xf2, 0x0f, 0x51, 0x87, 0x2f, 0xfb, 0x31, 0x6d, 0x3f, 0xea, 0x6c, + 0xe5, 0xf4, 0x71, 0xc4, 0x39, 0x77, 0x80, 0x72, 0xff, 0xa2, 0x51, 0xb9, + 0xe3, 0x73, 0x9c, 0xbf, 0xff, 0x7e, 0x29, 0xc5, 0x3d, 0xd8, 0xf6, 0xa3, + 0x8c, 0x1c, 0xb9, 0xc2, 0x72, 0xff, 0xa3, 0x7f, 0x35, 0x1d, 0x74, 0x39, + 0x7f, 0xba, 0x8f, 0x2f, 0x24, 0xe7, 0x2f, 0xc1, 0x8c, 0x14, 0x39, 0x58, + 0xa8, 0xd9, 0x69, 0x73, 0x1f, 0x6c, 0xed, 0x84, 0x42, 0x2f, 0xa3, 0xaf, + 0x2c, 0x36, 0x2c, 0xd0, 0xe5, 0x43, 0x3b, 0xf9, 0x57, 0xd8, 0x7f, 0x13, + 0x97, 0xbf, 0xe6, 0x47, 0x2f, 0xe1, 0x68, 0x9b, 0xc5, 0x4e, 0x5f, 0x92, + 0x76, 0x42, 0xce, 0x5f, 0x9f, 0x99, 0x29, 0xa3, 0x97, 0xfe, 0x49, 0xb5, + 0xc5, 0xc6, 0x7f, 0xc2, 0x72, 0xdf, 0x55, 0x4c, 0x4b, 0xa5, 0xe2, 0x3f, + 0xe2, 0xfe, 0x25, 0x0a, 0x15, 0x57, 0xd5, 0x42, 0x40, 0x8e, 0xbe, 0xe6, + 0x74, 0xe5, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0xe5, 0x5f, 0xce, 0x1e, 0xc0, + 0xce, 0x72, 0xdf, 0x42, 0x7f, 0x18, 0x2f, 0xd3, 0x4b, 0xf6, 0xd6, 0xee, + 0xb3, 0x45, 0xda, 0xbf, 0xe4, 0x94, 0x90, 0x41, 0x12, 0x39, 0x7c, 0x9b, + 0x70, 0x1c, 0xb7, 0xdc, 0x44, 0x63, 0x9a, 0x68, 0xde, 0xa1, 0xf0, 0x0f, + 0x27, 0x2a, 0x95, 0x20, 0x1c, 0x31, 0xcf, 0x2b, 0x4b, 0x7f, 0x4a, 0xf5, + 0x0d, 0xae, 0x17, 0x7d, 0x9d, 0x09, 0x19, 0xe4, 0xad, 0x42, 0x97, 0xd0, + 0xc2, 0xbf, 0xdf, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0xa7, 0x5f, 0x87, 0xee, + 0xf5, 0xa3, 0x97, 0x4e, 0xc3, 0x97, 0xee, 0x58, 0xee, 0x27, 0x28, 0x26, + 0xff, 0xf1, 0x8b, 0x78, 0xe5, 0xff, 0x43, 0xcf, 0xf3, 0x9d, 0x40, 0x4e, + 0x52, 0x1e, 0x68, 0x88, 0xdf, 0x2d, 0xdd, 0x66, 0x8a, 0xe5, 0x7f, 0xbe, + 0xe6, 0xd6, 0xee, 0xb3, 0x45, 0x9c, 0xbc, 0xef, 0x23, 0x97, 0xf2, 0x6b, + 0x05, 0xdb, 0x39, 0x5b, 0x45, 0xb7, 0x4b, 0x85, 0x07, 0xc3, 0x77, 0xff, + 0xbd, 0x1a, 0xf9, 0xfe, 0xbd, 0x13, 0x4c, 0x87, 0x2f, 0xe4, 0x64, 0xff, + 0xee, 0x47, 0x2f, 0xcc, 0xc9, 0x9c, 0x07, 0x2f, 0xa7, 0xeb, 0xf8, 0xe5, + 0x39, 0xe5, 0xfe, 0x51, 0x7f, 0xa3, 0xbf, 0x18, 0xd5, 0xf0, 0x9e, 0x39, + 0x58, 0x99, 0x67, 0x53, 0xc5, 0xef, 0x89, 0x15, 0xfb, 0x79, 0xe4, 0x61, + 0xcb, 0xe7, 0x18, 0x09, 0xcb, 0xf4, 0xd0, 0xc8, 0x50, 0xe5, 0xd2, 0x61, + 0xca, 0xc3, 0xc0, 0x12, 0x9b, 0xff, 0xdd, 0x4f, 0x9d, 0x74, 0xf4, 0x60, + 0x50, 0xe5, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0x42, 0x5f, 0xfb, 0x19, 0x8f, + 0xb9, 0xfe, 0x72, 0xc3, 0x97, 0xfb, 0x9d, 0x78, 0x61, 0x9a, 0x39, 0x7f, + 0xf9, 0xc5, 0x7f, 0x02, 0x2f, 0x2e, 0xbc, 0x8e, 0x52, 0x1f, 0xf7, 0xe6, + 0x96, 0xfb, 0x24, 0xd7, 0xf1, 0x27, 0xa6, 0x80, 0x86, 0x05, 0xc9, 0xd3, + 0x97, 0xfe, 0x75, 0x26, 0x14, 0xf0, 0xc0, 0x0e, 0x54, 0x91, 0x3d, 0xca, + 0x57, 0x85, 0xaf, 0xfe, 0xea, 0x33, 0x35, 0xf3, 0x99, 0x67, 0x8e, 0x5f, + 0x4b, 0xaa, 0x68, 0xe5, 0x41, 0xf5, 0xe2, 0x3d, 0xf3, 0x57, 0xd8, 0x61, + 0xcb, 0xfb, 0xba, 0xd6, 0x6e, 0x73, 0x97, 0x43, 0x67, 0x2b, 0x0f, 0x19, + 0x0b, 0xef, 0x33, 0x8c, 0x8e, 0x5f, 0xfe, 0xec, 0x01, 0x8f, 0x2d, 0x7b, + 0x31, 0x87, 0x2d, 0xf6, 0x75, 0xf4, 0x00, 0xb7, 0xe4, 0x35, 0x92, 0x36, + 0x8d, 0x9f, 0x30, 0x9f, 0xac, 0x0f, 0x28, 0x74, 0x61, 0x39, 0xa2, 0x0f, + 0x36, 0xfe, 0x40, 0xa0, 0xfd, 0xff, 0xec, 0xe7, 0xe8, 0x7f, 0x7d, 0xcb, + 0xad, 0xb9, 0xcb, 0xff, 0xbe, 0xf5, 0xf4, 0x39, 0xef, 0x40, 0x0e, 0x5f, + 0xfe, 0xfa, 0xc7, 0x97, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0x9f, 0x14, 0xb6, + 0x4d, 0x5a, 0x20, 0xb5, 0xcf, 0xd4, 0xee, 0x1a, 0x6c, 0x4f, 0xea, 0x2d, + 0xff, 0xfd, 0xf8, 0xba, 0xbf, 0x3c, 0xac, 0x0c, 0xb3, 0xa8, 0xc3, 0x97, + 0x27, 0x27, 0x2f, 0xff, 0xa5, 0x3f, 0x0a, 0x86, 0xae, 0x75, 0xef, 0xe7, + 0xce, 0xb4, 0x39, 0x52, 0x3f, 0xc0, 0x0b, 0xdf, 0xfe, 0x19, 0xfb, 0x09, + 0xed, 0x20, 0xf3, 0x23, 0x97, 0xfe, 0xf2, 0xb0, 0x32, 0xce, 0xa3, 0x0e, + 0x5f, 0xf2, 0xb0, 0x32, 0xce, 0xa3, 0x0e, 0x5f, 0x7e, 0x2e, 0xaf, 0xc3, + 0xf6, 0xf1, 0xf5, 0xfb, 0x60, 0x4e, 0xc1, 0xca, 0x61, 0xf1, 0xfe, 0x79, + 0x7e, 0xcd, 0xe6, 0x4c, 0x72, 0xdf, 0x58, 0xa9, 0xa7, 0xb0, 0xda, 0x72, + 0x2d, 0x46, 0x46, 0xa1, 0x1d, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0xb2, 0x5f, + 0xf9, 0xe5, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x26, 0xe5, 0xbe, 0xe2, 0x20, + 0x18, 0x69, 0x4b, 0x4c, 0x25, 0x21, 0xbf, 0x7c, 0xb7, 0x75, 0x9a, 0x25, + 0x65, 0xff, 0xf6, 0xe7, 0x18, 0xdb, 0x84, 0x5f, 0x71, 0xc4, 0xe5, 0x6c, + 0xff, 0xbf, 0x2e, 0xbf, 0x0c, 0x05, 0xfa, 0x72, 0xff, 0x42, 0x0c, 0x4a, + 0x38, 0x0e, 0x5f, 0xbe, 0xb1, 0xe5, 0xf7, 0x0f, 0xf1, 0x08, 0xf4, 0x4d, + 0x7f, 0xef, 0x67, 0xdc, 0xda, 0x4e, 0xec, 0x39, 0x7f, 0xf9, 0xa8, 0x6a, + 0xb8, 0x4d, 0x63, 0xc9, 0x33, 0x78, 0x72, 0xff, 0xc9, 0xaf, 0xd8, 0x29, + 0xc7, 0xf7, 0x39, 0x7f, 0x40, 0xba, 0xdd, 0xac, 0xe5, 0x48, 0xfb, 0xd8, + 0x83, 0x70, 0x76, 0x72, 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x2e, 0x2f, 0xf9, + 0x1e, 0x5e, 0x18, 0x66, 0x8e, 0x5f, 0xa4, 0xd1, 0x3a, 0xe7, 0x2f, 0x43, + 0x48, 0x39, 0x79, 0x06, 0x0e, 0x54, 0x8f, 0x80, 0x25, 0x3c, 0x47, 0x6f, + 0xff, 0xcf, 0xe4, 0xfe, 0x42, 0x92, 0x8f, 0x0f, 0xf2, 0x39, 0x7f, 0x4b, + 0xb8, 0x38, 0xb3, 0x97, 0xa5, 0xdf, 0x1c, 0xbb, 0xb0, 0x87, 0x93, 0xd2, + 0xcb, 0xff, 0x85, 0x01, 0xad, 0xc2, 0x49, 0xf4, 0x72, 0xb0, 0xfb, 0x90, + 0xb2, 0xfe, 0xda, 0x30, 0x5e, 0x47, 0x2f, 0x3c, 0xbe, 0xb5, 0x35, 0x6a, + 0x71, 0x0c, 0x69, 0x11, 0x60, 0xbf, 0x4d, 0x1e, 0x12, 0xfa, 0x31, 0xf4, + 0x61, 0x9f, 0x90, 0x5f, 0xfb, 0xf6, 0x7d, 0xd4, 0x0f, 0xb3, 0x67, 0x2f, + 0xf8, 0x39, 0xf6, 0x36, 0x9d, 0xfc, 0xe5, 0xbe, 0xa2, 0xe5, 0xb3, 0x25, + 0xc9, 0xea, 0x14, 0xff, 0xa0, 0xdf, 0xfd, 0xf5, 0xe5, 0xf7, 0x36, 0xb7, + 0x75, 0x9a, 0x23, 0xb5, 0xff, 0x7b, 0xb9, 0x2f, 0xae, 0x3a, 0x39, 0x7f, + 0x70, 0xc3, 0x0b, 0xc1, 0x39, 0x77, 0xfd, 0x39, 0x7f, 0x70, 0x83, 0x9d, + 0x7f, 0x1c, 0xbf, 0xff, 0xbd, 0x24, 0x0f, 0x53, 0x8f, 0xcc, 0x0e, 0xd3, + 0xf5, 0x9c, 0xbf, 0xd8, 0xde, 0xa0, 0x7d, 0xa3, 0x97, 0xf0, 0x07, 0x39, + 0xf6, 0x1c, 0xbf, 0x3a, 0xbd, 0xc0, 0x1c, 0xbf, 0x84, 0x0f, 0xb7, 0x50, + 0xe5, 0x42, 0x20, 0xb6, 0x5a, 0xe5, 0x17, 0xfe, 0x4d, 0xfc, 0xd0, 0xe3, + 0x21, 0x67, 0x2f, 0xfd, 0x03, 0xff, 0x91, 0xf8, 0xbc, 0x8e, 0x5f, 0xf8, + 0x7f, 0x97, 0xcc, 0x41, 0x86, 0x1c, 0xbe, 0x5b, 0xba, 0xcd, 0x15, 0x0a, + 0xff, 0xb3, 0xb8, 0x2f, 0xbd, 0xa1, 0xca, 0x55, 0x32, 0x15, 0x9f, 0xa1, + 0xfe, 0xcf, 0xf4, 0x5d, 0x79, 0xad, 0xe0, 0xe5, 0xd2, 0xc3, 0x97, 0xfd, + 0x2f, 0x26, 0xdd, 0x68, 0x27, 0x2f, 0xa4, 0x0d, 0x61, 0xcb, 0xff, 0xce, + 0xcc, 0xd8, 0xe2, 0x71, 0x4d, 0xb9, 0xcb, 0xff, 0xba, 0x39, 0x37, 0xbb, + 0x9b, 0x4d, 0x1c, 0xbf, 0x72, 0x28, 0xc4, 0x39, 0x7e, 0x8e, 0x1a, 0x7c, + 0x6c, 0xe5, 0x42, 0x38, 0x71, 0x21, 0x11, 0x36, 0x4f, 0x7f, 0xa3, 0xcf, + 0xdf, 0x81, 0x83, 0x97, 0xfe, 0xcf, 0x6b, 0x79, 0x37, 0x51, 0x53, 0x97, + 0xfe, 0x1c, 0x57, 0x18, 0x8d, 0x21, 0x87, 0x2f, 0xfb, 0xe3, 0x8e, 0x70, + 0x7c, 0xef, 0xe7, 0x29, 0x11, 0x7e, 0xe8, 0x1f, 0x9f, 0xdf, 0xe9, 0x46, + 0xe7, 0x8d, 0xce, 0x72, 0xff, 0xda, 0xc1, 0xf6, 0xb2, 0x49, 0xd3, 0x97, + 0xf6, 0xb3, 0x88, 0xc7, 0x27, 0x2b, 0x47, 0xd9, 0xe3, 0xdb, 0xff, 0xe8, + 0x06, 0x0f, 0xc7, 0xf7, 0xce, 0xe0, 0x1c, 0xe5, 0xc3, 0x39, 0xca, 0x84, + 0xca, 0xf2, 0x14, 0x28, 0x44, 0x2a, 0x37, 0xf7, 0x17, 0x67, 0x5b, 0x73, + 0x97, 0xff, 0xf9, 0x23, 0xcf, 0xdf, 0xba, 0xee, 0x0f, 0xbe, 0x02, 0x5a, + 0x39, 0x48, 0x89, 0x41, 0x30, 0xbd, 0xaf, 0xf6, 0x72, 0xb0, 0xdf, 0xa1, + 0x0d, 0xf7, 0x7d, 0x93, 0x9c, 0xbf, 0x64, 0xee, 0x3c, 0x4e, 0x5f, 0xff, + 0xff, 0xe8, 0x97, 0xcf, 0x75, 0x23, 0x5f, 0x33, 0xf5, 0xc7, 0x1f, 0x99, + 0xbd, 0xe7, 0x1f, 0xdf, 0xa7, 0x2f, 0xba, 0x2f, 0xc0, 0x72, 0xb1, 0x30, + 0x91, 0x23, 0xd1, 0x4f, 0xa1, 0x33, 0x7f, 0xff, 0xdf, 0xbb, 0x5a, 0x4f, + 0xd7, 0x4f, 0x47, 0x53, 0xda, 0xc0, 0x9c, 0xb7, 0xde, 0x11, 0x94, 0x02, + 0xd5, 0x98, 0x70, 0xc3, 0x10, 0x63, 0x3b, 0x00, 0x61, 0x6b, 0x91, 0xa7, + 0xaa, 0x96, 0xb1, 0xee, 0x45, 0x90, 0xdf, 0x71, 0x81, 0xb0, 0xeb, 0xb0, + 0xf3, 0x18, 0xd6, 0xb5, 0x18, 0x97, 0xa3, 0x28, 0x68, 0x83, 0x7c, 0xb7, + 0x75, 0x9a, 0x2a, 0x85, 0xfe, 0xdc, 0x71, 0xe6, 0x59, 0xe3, 0x95, 0xb3, + 0xe4, 0xfc, 0xba, 0xff, 0xcf, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x35, + 0xaf, 0xa3, 0x71, 0xe3, 0x97, 0x3f, 0x8e, 0x50, 0x4d, 0xbb, 0x08, 0x6d, + 0xf7, 0x11, 0x8e, 0xc2, 0x37, 0x84, 0x1d, 0xfb, 0x6b, 0x77, 0x59, 0xa2, + 0xac, 0x5f, 0xf4, 0x4a, 0x37, 0x3c, 0x6e, 0x73, 0x96, 0xfb, 0x87, 0xdc, + 0x26, 0x97, 0xfd, 0xd8, 0xe7, 0xd1, 0xd7, 0x6b, 0x39, 0x7f, 0xf0, 0x30, + 0x7e, 0xc8, 0x1a, 0x9d, 0xc4, 0xe5, 0x7d, 0x44, 0x14, 0x1e, 0x5f, 0xfd, + 0xf5, 0xe5, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x24, 0x45, 0xfb, 0x6b, 0x77, + 0x59, 0xa2, 0xd2, 0x5f, 0xf9, 0xe5, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x27, + 0xd5, 0xbe, 0xe2, 0x20, 0x18, 0x69, 0x7f, 0xfb, 0xeb, 0x1e, 0x5f, 0x73, + 0x6b, 0x77, 0x59, 0xa2, 0x84, 0x5f, 0xfd, 0x8d, 0xfd, 0xf2, 0xaf, 0xa4, + 0xf4, 0x1c, 0xbf, 0x7b, 0xf5, 0xbe, 0x8e, 0x5f, 0x24, 0xf1, 0xb3, 0x94, + 0xc3, 0xcb, 0xe9, 0x4d, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0x8f, 0x5f, 0xf4, + 0x4a, 0x37, 0x3c, 0x6e, 0x73, 0x97, 0xff, 0xff, 0xf9, 0x44, 0xdc, 0xd1, + 0xdd, 0xe7, 0x5d, 0x4d, 0x62, 0xae, 0x20, 0x81, 0x89, 0xbb, 0x07, 0x2f, + 0xcf, 0xa4, 0xf4, 0x1c, 0xbf, 0xe8, 0x9a, 0x06, 0x26, 0xec, 0x1c, 0xa8, + 0x47, 0x6a, 0xb0, 0x8f, 0x12, 0x6b, 0xff, 0xfb, 0x03, 0xd8, 0x53, 0xef, + 0x85, 0xc1, 0xad, 0x40, 0x0a, 0x5e, 0x79, 0x7d, 0x85, 0x41, 0xd8, 0x44, + 0x26, 0x9e, 0x8c, 0x9d, 0xa1, 0xa5, 0xff, 0xd9, 0xdf, 0xbe, 0x55, 0xf4, + 0x9e, 0x83, 0x96, 0xfb, 0x3a, 0xb4, 0xa6, 0x4a, 0xa0, 0xf3, 0x25, 0x43, + 0x71, 0x49, 0x3c, 0xe8, 0x24, 0x95, 0x31, 0x51, 0x5a, 0x51, 0xda, 0xe5, + 0x31, 0x73, 0x0a, 0x94, 0x85, 0x54, 0xc4, 0x9d, 0x86, 0xa0, 0x0a, 0xbd, + 0x2e, 0x92, 0xff, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x88, 0x89, 0x7f, 0x66, + 0xd6, 0xee, 0xb3, 0x44, 0x56, 0xbf, 0xe6, 0xbf, 0xb9, 0xb5, 0xbb, 0xac, + 0xd1, 0x5c, 0x2b, 0xea, 0x20, 0xdc, 0xe6, 0xff, 0xf0, 0x20, 0x57, 0xf5, + 0xfc, 0x05, 0x06, 0x47, 0x2f, 0xbe, 0xcf, 0x33, 0x59, 0xcb, 0x27, 0x27, + 0xec, 0x04, 0xcb, 0xec, 0xeb, 0xf8, 0xe5, 0xfe, 0xc4, 0xd8, 0x01, 0xfe, + 0x8e, 0x5b, 0x84, 0x13, 0xd5, 0xd1, 0x0d, 0xff, 0xfd, 0xed, 0x27, 0x5d, + 0x24, 0x83, 0xef, 0xfb, 0xbc, 0x39, 0x7e, 0xda, 0xdd, 0xd6, 0x68, 0xa7, + 0x97, 0xf9, 0x88, 0x1f, 0xdf, 0x72, 0x39, 0x73, 0x10, 0xe5, 0x41, 0xe5, + 0x2c, 0xd2, 0xff, 0xff, 0x4a, 0x3d, 0xaf, 0xd8, 0xb4, 0x04, 0x67, 0x53, + 0xf5, 0x9c, 0xbf, 0xff, 0xb7, 0xbf, 0xf7, 0xb8, 0x1c, 0x55, 0x3b, 0xdc, + 0x50, 0xe5, 0xff, 0xc9, 0x2c, 0x10, 0x43, 0x13, 0x72, 0x39, 0x7f, 0xa5, + 0x1b, 0x9e, 0x37, 0x39, 0xcb, 0xef, 0x82, 0xf2, 0x39, 0x7e, 0x7c, 0xea, + 0x30, 0xe5, 0x68, 0xf2, 0x78, 0x91, 0xd4, 0x22, 0x8b, 0x1f, 0xaf, 0xfb, + 0x8b, 0xb3, 0xe0, 0x7a, 0x8c, 0x39, 0x7f, 0xc3, 0x0c, 0x89, 0x0e, 0x30, + 0xe5, 0x61, 0xf9, 0xa1, 0xed, 0xff, 0x40, 0xaf, 0x38, 0xe7, 0xb4, 0x72, + 0xfc, 0xf3, 0xc6, 0xff, 0x39, 0x5c, 0x32, 0xbd, 0xe8, 0x2c, 0xc5, 0xa5, + 0xbf, 0x72, 0x42, 0x8c, 0x4e, 0xba, 0x30, 0xe4, 0xd4, 0x25, 0x38, 0x90, + 0x34, 0x39, 0xbf, 0xfc, 0xf2, 0xfa, 0x11, 0x76, 0xf5, 0xa8, 0x01, 0xcb, + 0xff, 0xc0, 0x07, 0xfa, 0xfa, 0xa0, 0xbb, 0x06, 0x0e, 0x5f, 0xfc, 0x38, + 0x07, 0x10, 0x7d, 0x62, 0x30, 0xe5, 0x6d, 0x12, 0x3e, 0x4d, 0xbf, 0xff, + 0xc8, 0x20, 0x1c, 0xf7, 0x73, 0xef, 0x5f, 0xbd, 0x49, 0x8e, 0x57, 0xd5, + 0x41, 0x41, 0x85, 0x4a, 0x43, 0x77, 0x44, 0x76, 0xc3, 0x97, 0xe1, 0x8f, + 0xf8, 0x7d, 0x1c, 0xbf, 0x95, 0xdb, 0x85, 0xc4, 0xe5, 0x04, 0xfa, 0xb0, + 0x41, 0xcb, 0x6f, 0xfe, 0x40, 0xed, 0xf9, 0xfb, 0xbd, 0xc4, 0xe7, 0x2b, + 0xe9, 0xfa, 0xf4, 0xb6, 0xe0, 0xc1, 0xcb, 0xff, 0xf7, 0x63, 0x79, 0x24, + 0x7f, 0x60, 0x53, 0xf5, 0x94, 0xbf, 0x44, 0x81, 0xfc, 0x8e, 0x5f, 0x2d, + 0xdd, 0x66, 0x8a, 0xcd, 0x53, 0x1e, 0xbe, 0xca, 0x6f, 0xbc, 0x8c, 0xd1, + 0xcb, 0xca, 0xe9, 0x53, 0x97, 0xf4, 0xec, 0x81, 0x96, 0x8e, 0x5f, 0x7b, + 0x4a, 0x68, 0xe5, 0x9c, 0xe5, 0x61, 0xb4, 0xd1, 0x25, 0xd3, 0xa1, 0xcb, + 0xfd, 0xa9, 0x90, 0x7b, 0x9c, 0x9c, 0xa8, 0x3c, 0xbc, 0x17, 0xbf, 0x78, + 0x0a, 0x0c, 0x8e, 0x5f, 0xff, 0x43, 0x3d, 0x98, 0x3e, 0xd7, 0x70, 0x0e, + 0x72, 0xf7, 0xef, 0xa3, 0x97, 0xfd, 0x92, 0x4f, 0xda, 0xda, 0xb0, 0x30, + 0xe5, 0x90, 0xe5, 0xfd, 0xdc, 0x11, 0x7f, 0x1c, 0xd1, 0x61, 0x7e, 0xc9, + 0xa7, 0xfc, 0x07, 0x2f, 0xef, 0x46, 0xc1, 0x13, 0x1c, 0xb7, 0xd8, 0x57, + 0x14, 0x11, 0x6c, 0x85, 0x5f, 0x24, 0x68, 0x45, 0xb1, 0xf6, 0x31, 0x75, + 0xad, 0xc8, 0x00, 0x52, 0x29, 0xba, 0x1d, 0xf2, 0x92, 0x87, 0x5c, 0x05, + 0x77, 0xfe, 0xea, 0x79, 0xf7, 0x3c, 0x20, 0x4e, 0x5f, 0xfb, 0xdf, 0xb3, + 0x17, 0xbe, 0x5d, 0xb3, 0x97, 0xfb, 0x70, 0xae, 0x0a, 0x2a, 0x72, 0xff, + 0xf4, 0x36, 0xa3, 0x07, 0x39, 0xf4, 0x63, 0x67, 0x2f, 0xde, 0x41, 0xc6, + 0x1c, 0xbe, 0x93, 0x8f, 0xdc, 0x4c, 0x97, 0x93, 0xed, 0xa1, 0x28, 0x67, + 0xc0, 0x99, 0x7f, 0xe7, 0x97, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0x91, 0x57, + 0xff, 0xef, 0x77, 0x07, 0xef, 0x9d, 0xf9, 0xd2, 0xaa, 0xb9, 0xcb, 0xff, + 0x3f, 0xbe, 0xc2, 0x6d, 0x3d, 0xf9, 0xca, 0xfa, 0x8e, 0x58, 0x4c, 0x75, + 0x9b, 0xfb, 0x36, 0xb7, 0x75, 0x9a, 0x2c, 0x95, 0xff, 0xef, 0x69, 0x4d, + 0x7d, 0xc9, 0xd0, 0x65, 0xa3, 0x95, 0xf5, 0x10, 0xf8, 0x73, 0x7f, 0x75, + 0x37, 0x12, 0xd1, 0xcb, 0xf9, 0x9e, 0x4e, 0xbb, 0x0e, 0x5f, 0xfe, 0x4f, + 0x77, 0x3d, 0x83, 0x1e, 0x80, 0x9c, 0xa8, 0x3f, 0x47, 0x2d, 0xbf, 0xe7, + 0x4f, 0x7f, 0xb7, 0xd7, 0xd5, 0xa3, 0x07, 0xb0, 0xa1, 0xbf, 0xb3, 0x6b, + 0x77, 0x59, 0xa2, 0xd8, 0x5f, 0xff, 0xdc, 0x27, 0x7e, 0x0e, 0x6f, 0xda, + 0xec, 0xdf, 0x3e, 0x75, 0xa1, 0xcb, 0xdb, 0xff, 0xa7, 0x2e, 0xf7, 0xd8, + 0x44, 0x4e, 0xda, 0xeb, 0xea, 0x3c, 0x92, 0x18, 0x57, 0xb3, 0x58, 0x72, + 0xf9, 0x6e, 0xeb, 0x34, 0x5b, 0x6b, 0xed, 0x4e, 0xfb, 0x39, 0x5b, 0x3d, + 0x1f, 0x17, 0x5f, 0xc9, 0xdf, 0x20, 0x3f, 0x39, 0x7f, 0xd1, 0x28, 0xdc, + 0xf1, 0xb9, 0xce, 0x5b, 0xec, 0x91, 0xed, 0x8d, 0x93, 0x11, 0x09, 0x75, + 0xff, 0xec, 0x10, 0x7d, 0x63, 0x87, 0x30, 0x55, 0x39, 0x7b, 0x86, 0xe8, + 0x4e, 0x5e, 0x9f, 0xa8, 0x72, 0xff, 0xdc, 0x37, 0x0d, 0xc2, 0xfe, 0xee, + 0x0c, 0x00, 0xe5, 0xe6, 0xa7, 0xc2, 0xcd, 0x4c, 0xe5, 0xfd, 0x03, 0x20, + 0xfe, 0xc3, 0x97, 0xfd, 0x9b, 0xdc, 0x49, 0xf9, 0x6c, 0xe5, 0xf2, 0xdd, + 0xd6, 0x68, 0xbc, 0x17, 0xef, 0x72, 0xb4, 0xd9, 0xcb, 0xff, 0x3f, 0xa3, + 0x8e, 0xf7, 0x9c, 0xe8, 0xe5, 0x6d, 0x13, 0x0c, 0x2e, 0x12, 0x9b, 0xef, + 0x34, 0xce, 0x9c, 0xbf, 0x32, 0x06, 0x4e, 0x72, 0xfe, 0x81, 0xf7, 0x17, + 0x59, 0xcb, 0xfa, 0x51, 0xc6, 0x37, 0xc9, 0xca, 0x91, 0xef, 0x61, 0x75, + 0xfe, 0x8f, 0x3f, 0x7e, 0x06, 0x0e, 0x5f, 0xf9, 0x46, 0x73, 0x2f, 0x60, + 0xfb, 0x47, 0x2e, 0xc5, 0x4e, 0x54, 0x1e, 0xc6, 0x20, 0xdf, 0x24, 0xf8, + 0xc3, 0x97, 0xec, 0x10, 0x70, 0x41, 0xcb, 0xf4, 0x29, 0xfb, 0xe8, 0xe5, + 0xff, 0xcc, 0x85, 0xfc, 0xc1, 0xfe, 0x59, 0xa3, 0x97, 0xff, 0xfe, 0x74, + 0xf3, 0xb1, 0xc4, 0x0b, 0xea, 0x6e, 0x4a, 0x4b, 0x04, 0xe5, 0xfd, 0x1c, + 0xf3, 0x27, 0xe4, 0xe5, 0x62, 0x38, 0x3a, 0x8d, 0xfb, 0x55, 0xff, 0xd9, + 0xde, 0xbc, 0x98, 0x91, 0xb9, 0x1c, 0xba, 0x00, 0x72, 0xa4, 0x7b, 0x3e, + 0x43, 0xae, 0x11, 0x75, 0x87, 0x86, 0x22, 0x6a, 0x63, 0xbc, 0x2c, 0x9f, + 0x39, 0x80, 0x4b, 0xb2, 0x1a, 0x5c, 0x97, 0xa1, 0x24, 0xd0, 0x84, 0x61, + 0x0f, 0x61, 0x18, 0xe4, 0x00, 0x22, 0x12, 0x9d, 0x46, 0x13, 0xe8, 0x44, + 0xdf, 0xee, 0x7e, 0xe0, 0x1f, 0x7a, 0x39, 0x7f, 0x81, 0xf6, 0x69, 0x40, + 0xf8, 0xe5, 0x7d, 0x4e, 0x16, 0x23, 0x19, 0xd9, 0xb5, 0xe4, 0xce, 0x4e, + 0x5f, 0x2d, 0xdd, 0x66, 0x8b, 0xd1, 0x7f, 0xe4, 0xf7, 0x45, 0xe4, 0x07, + 0x01, 0xca, 0xd9, 0xf5, 0xb0, 0xba, 0xf3, 0x13, 0xc7, 0x2f, 0xf9, 0xfd, + 0x28, 0x57, 0xc9, 0x39, 0xca, 0x61, 0xeb, 0x08, 0xe5, 0xfb, 0x19, 0xd7, + 0x09, 0xca, 0x0a, 0x68, 0xf9, 0x08, 0x75, 0x1e, 0x38, 0x08, 0x6f, 0xff, + 0xf7, 0x1c, 0x1f, 0xa1, 0xc0, 0xf7, 0x18, 0xc7, 0x96, 0x09, 0xcb, 0xfd, + 0xf7, 0xd9, 0x34, 0x9c, 0x27, 0x29, 0x11, 0x31, 0xd6, 0x2a, 0xfa, 0x98, + 0x06, 0x43, 0x7a, 0xa1, 0xbe, 0x08, 0x9e, 0x18, 0x92, 0x84, 0xd6, 0x4f, + 0x32, 0xae, 0x32, 0x94, 0x97, 0x5d, 0x34, 0xa0, 0x0d, 0xc6, 0x98, 0xc8, + 0x5b, 0xf6, 0x1c, 0xa0, 0x8d, 0x28, 0x63, 0x1f, 0xd2, 0x27, 0xf3, 0xe6, + 0x0d, 0xca, 0x7f, 0xbb, 0xfe, 0x9c, 0xbf, 0xfb, 0xf8, 0x98, 0x73, 0x8b, + 0xb1, 0x88, 0x72, 0xfb, 0x3a, 0xfe, 0x39, 0x7f, 0xb1, 0x36, 0x00, 0x7f, + 0xa3, 0x96, 0xe1, 0x15, 0x44, 0xd8, 0xa3, 0x68, 0x86, 0xfb, 0xd1, 0xcc, + 0xe7, 0x2f, 0xfb, 0xda, 0xce, 0x65, 0xdf, 0xd5, 0x39, 0x48, 0x7c, 0x22, + 0x49, 0x7d, 0x1c, 0x62, 0x47, 0x2f, 0xf7, 0xef, 0xb9, 0x0f, 0xee, 0x72, + 0xf3, 0xba, 0xcd, 0x11, 0x1a, 0xf9, 0x55, 0xbe, 0xce, 0x52, 0xcf, 0x2d, + 0x0a, 0x2f, 0xdc, 0x37, 0xb4, 0xe0, 0x39, 0x5b, 0x3c, 0xe6, 0x10, 0xdf, + 0xff, 0x77, 0xfd, 0x6b, 0x18, 0x39, 0xc7, 0xe4, 0x35, 0x07, 0x2f, 0xfa, + 0x27, 0xde, 0x7b, 0xc9, 0xe3, 0x97, 0x86, 0x39, 0x39, 0x52, 0x3d, 0x50, + 0x9c, 0xdf, 0xf6, 0x6f, 0x35, 0x8e, 0x33, 0x9c, 0xbd, 0x81, 0x61, 0xcb, + 0xff, 0xfd, 0xd7, 0x4f, 0x47, 0x47, 0x3d, 0xd4, 0xee, 0x23, 0x67, 0x2f, + 0xff, 0xff, 0x7b, 0xc8, 0xcd, 0xa6, 0x72, 0x3f, 0xfa, 0x3b, 0xf3, 0x8a, + 0x7a, 0x68, 0x39, 0x7f, 0xd8, 0xe2, 0x0d, 0xff, 0x00, 0x39, 0x50, 0x98, + 0x9e, 0x2f, 0x6d, 0xf6, 0xff, 0x3b, 0x33, 0x72, 0x86, 0x1c, 0xba, 0x76, + 0x14, 0xb9, 0xb6, 0xca, 0x5f, 0xfb, 0xea, 0xfa, 0x93, 0x76, 0x27, 0xfa, + 0x03, 0x62, 0xd8, 0xc5, 0xf7, 0x18, 0xf4, 0x1c, 0xa9, 0x1f, 0xfa, 0x2e, + 0x5f, 0xd8, 0xec, 0xce, 0x7c, 0x72, 0xff, 0xbf, 0x8e, 0xe4, 0xd2, 0x79, + 0xce, 0x5f, 0xdf, 0x74, 0x9b, 0x70, 0x1c, 0xac, 0x3e, 0xa7, 0x3b, 0xb3, + 0x59, 0xcb, 0xfe, 0x8c, 0xe6, 0x1e, 0x4f, 0x23, 0x94, 0xd5, 0x1e, 0x58, + 0x45, 0x2f, 0xc3, 0x9d, 0x7f, 0x1c, 0xbd, 0xf3, 0x4b, 0x39, 0x4d, 0x67, + 0x8b, 0xd2, 0x6b, 0xfc, 0x8e, 0x0d, 0xef, 0xfe, 0x9c, 0xbf, 0xa1, 0x5c, + 0x14, 0x54, 0xe5, 0xfd, 0x9e, 0xe0, 0xf6, 0x74, 0xe5, 0x62, 0x2d, 0xba, + 0x4a, 0x26, 0x9a, 0x2d, 0xbf, 0xff, 0x97, 0xf7, 0x6e, 0x29, 0xef, 0xbb, + 0x8f, 0x0b, 0x80, 0xe5, 0x35, 0x6c, 0x8a, 0x5e, 0x1a, 0x16, 0x71, 0x09, + 0xc9, 0x10, 0x04, 0x8f, 0x21, 0x9a, 0xb2, 0x2e, 0x61, 0x5c, 0x84, 0x53, + 0x1b, 0xee, 0x32, 0xfe, 0x97, 0xbc, 0x38, 0x80, 0x42, 0x30, 0x97, 0xd3, + 0x5f, 0xa3, 0x22, 0xe2, 0x77, 0x77, 0x07, 0x4e, 0x5f, 0xb6, 0xb7, 0x75, + 0x9a, 0x22, 0xe5, 0xfb, 0xc0, 0x50, 0x64, 0x52, 0xfd, 0xaf, 0x76, 0x00, + 0x72, 0xfc, 0xf3, 0xc6, 0xff, 0x39, 0x6f, 0xb3, 0xa3, 0x23, 0x06, 0x9c, + 0xd3, 0xf2, 0x96, 0x85, 0x15, 0xf5, 0x52, 0x34, 0xa3, 0xf2, 0xbf, 0xf9, + 0x8f, 0x2f, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, 0x33, 0x2f, 0xee, 0x15, 0xc2, + 0xfc, 0x26, 0xa3, 0xc7, 0x2f, 0x73, 0x1a, 0x39, 0x79, 0x68, 0xc3, 0x97, + 0xdc, 0x37, 0x9c, 0x4e, 0x5c, 0xd1, 0xaa, 0x39, 0x76, 0x7e, 0x72, 0xff, + 0xe8, 0x63, 0xfb, 0x39, 0x03, 0x14, 0xe9, 0xcb, 0xff, 0xe8, 0x5e, 0xff, + 0x9f, 0x9d, 0x26, 0xd7, 0xdc, 0x39, 0x5d, 0x44, 0xc8, 0xa3, 0x5f, 0x24, + 0xff, 0x89, 0xcb, 0xf6, 0x4f, 0x80, 0x98, 0xe5, 0x7c, 0x3c, 0xcf, 0x11, + 0xdf, 0xef, 0x98, 0x2f, 0xb0, 0x34, 0x39, 0x7f, 0xfe, 0x63, 0xf7, 0x39, + 0x07, 0x5b, 0x7e, 0xcd, 0xdf, 0xce, 0x5f, 0xd9, 0xa8, 0x50, 0x60, 0xe5, + 0x05, 0x17, 0x98, 0x6d, 0xd5, 0xab, 0xb5, 0x87, 0x2e, 0xe0, 0xf1, 0xcb, + 0x70, 0xe7, 0x2c, 0x08, 0x36, 0x1f, 0x8d, 0x5f, 0xff, 0xf9, 0x06, 0x16, + 0x30, 0xcf, 0x91, 0xbd, 0xa7, 0x1d, 0xbb, 0x80, 0xe5, 0x35, 0x4a, 0xc9, + 0x16, 0x3c, 0x90, 0xb0, 0x99, 0xbb, 0xb0, 0xe0, 0x72, 0xf0, 0x23, 0x78, + 0x9e, 0xfe, 0x6e, 0x04, 0x73, 0xc7, 0x2f, 0x9f, 0xa9, 0x31, 0xcb, 0xee, + 0xcd, 0x01, 0x39, 0x58, 0x7e, 0x2b, 0x2c, 0x72, 0x2b, 0xf0, 0xc7, 0x9e, + 0x63, 0x97, 0xf9, 0x69, 0x82, 0x1e, 0xc1, 0xca, 0x39, 0x7c, 0xfe, 0x90, + 0x0e, 0x5f, 0xf6, 0x91, 0x6f, 0x9b, 0xcf, 0x1c, 0xbf, 0xcf, 0xb4, 0x86, + 0xb4, 0x61, 0xca, 0xea, 0x23, 0x7c, 0x45, 0xc4, 0xde, 0xff, 0xf7, 0xce, + 0xba, 0x78, 0x1f, 0x88, 0xbc, 0x8e, 0x5e, 0x6a, 0x6d, 0x57, 0x08, 0x72, + 0xa1, 0x39, 0xac, 0x27, 0x59, 0x8a, 0x42, 0x61, 0x86, 0x42, 0x97, 0x7f, + 0xff, 0xff, 0xff, 0xf9, 0xa9, 0xf0, 0x98, 0xd4, 0xf8, 0x6e, 0x17, 0xe1, + 0x75, 0xf0, 0xf1, 0xc2, 0xdc, 0x36, 0xe7, 0xe0, 0xcf, 0xc2, 0xd4, 0xa1, + 0xa7, 0x2a, 0x77, 0x86, 0x88, 0xe1, 0x9a, 0xf8, 0x57, 0xbe, 0x7c, 0xeb, + 0x43, 0x97, 0xff, 0xe0, 0x73, 0x2e, 0xff, 0x1b, 0xfb, 0xd4, 0x5b, 0xec, + 0xe5, 0xff, 0xdc, 0xb7, 0x1e, 0x0a, 0x35, 0xea, 0x18, 0x72, 0xf9, 0x07, + 0xda, 0x39, 0x7f, 0xff, 0xcc, 0x4d, 0xf7, 0xfd, 0x4a, 0x38, 0xee, 0x07, + 0xdd, 0xc9, 0x1c, 0xa9, 0x22, 0x29, 0x08, 0x6f, 0xfc, 0x9e, 0x45, 0xa0, + 0x7d, 0x8b, 0x39, 0x58, 0x99, 0x97, 0xa1, 0xa7, 0xc0, 0x45, 0x7d, 0xe6, + 0x99, 0xd3, 0x97, 0xff, 0xf9, 0xc5, 0x63, 0x81, 0xef, 0xff, 0x3b, 0x12, + 0xdc, 0x4e, 0x72, 0xb1, 0x10, 0xff, 0x92, 0x5f, 0xff, 0xe7, 0x54, 0x70, + 0x1f, 0xeb, 0xe4, 0x93, 0xb0, 0xb1, 0x73, 0x97, 0xde, 0x4e, 0xa1, 0xcb, + 0xfe, 0x7d, 0xcb, 0xe6, 0x2c, 0x38, 0x72, 0xb8, 0x65, 0xc5, 0xf8, 0x8c, + 0xd3, 0x23, 0x8c, 0xec, 0x2f, 0xdc, 0x8c, 0x58, 0xbf, 0x21, 0xb6, 0xce, + 0x5f, 0xde, 0xc6, 0x73, 0x8c, 0x39, 0x6e, 0xe1, 0xbf, 0x41, 0x1b, 0xfd, + 0xf8, 0x5e, 0x5a, 0x49, 0x1c, 0xbf, 0x2f, 0xf1, 0xf6, 0x8e, 0x5f, 0x44, + 0x9a, 0x36, 0x72, 0xff, 0xc3, 0x0b, 0x55, 0xf3, 0x68, 0x03, 0x97, 0xf6, + 0xb1, 0x37, 0xb7, 0x39, 0x53, 0x9f, 0x48, 0x0f, 0x6f, 0xff, 0x90, 0x67, + 0xcd, 0x23, 0xf7, 0xeb, 0x6d, 0xb6, 0x52, 0xa0, 0xfd, 0xc2, 0x47, 0x7f, + 0x73, 0x9d, 0xff, 0x90, 0x1c, 0xbf, 0x76, 0x27, 0xef, 0xe7, 0x2b, 0x0f, + 0x6f, 0xc6, 0x37, 0xfc, 0x39, 0x0a, 0xbf, 0x9d, 0x53, 0x97, 0xe9, 0x68, + 0x1f, 0xcc, 0x72, 0xf2, 0xff, 0x59, 0xca, 0xe4, 0xf2, 0x7f, 0x2b, 0xbf, + 0xe9, 0xf0, 0x01, 0xfd, 0xf7, 0x23, 0x97, 0xf3, 0xb8, 0x78, 0xe0, 0x4e, + 0x5e, 0x77, 0x59, 0xa2, 0xcf, 0x5f, 0xc0, 0x71, 0x92, 0x30, 0xe5, 0x4e, + 0x8b, 0xd0, 0x9d, 0xac, 0xb8, 0x05, 0x17, 0xfb, 0xbe, 0xd3, 0xf2, 0xa3, + 0x0e, 0x5f, 0xf7, 0x62, 0x49, 0xe8, 0xf6, 0x8e, 0x54, 0x1f, 0x72, 0x1b, + 0x5f, 0xfe, 0xdf, 0x5f, 0xe6, 0x71, 0x1c, 0xd6, 0x09, 0xcb, 0xfe, 0x84, + 0x0e, 0x31, 0xbc, 0xe9, 0xcb, 0xff, 0xb5, 0xe4, 0x99, 0xb7, 0x0c, 0x73, + 0xa3, 0x94, 0x88, 0xca, 0x74, 0xbf, 0xce, 0x2f, 0x36, 0xdb, 0x65, 0x2f, + 0xfc, 0xf2, 0xd0, 0xe2, 0xc3, 0x9b, 0x29, 0xf4, 0xd0, 0x5f, 0xb8, 0x3f, + 0x66, 0x04, 0xe5, 0xfe, 0xf7, 0x73, 0x8f, 0xc9, 0x30, 0xe5, 0x61, 0xf2, + 0x7e, 0x59, 0x7f, 0xee, 0x64, 0x3f, 0x83, 0xe2, 0xd8, 0x03, 0x97, 0x42, + 0xa7, 0x2f, 0xf8, 0x30, 0x30, 0x09, 0x75, 0x0e, 0x54, 0x22, 0x4a, 0x74, + 0x44, 0x17, 0xbf, 0xdd, 0x40, 0x8b, 0xbc, 0xc7, 0x2f, 0xf0, 0x7b, 0xfb, + 0x81, 0xa6, 0x1c, 0xa8, 0x3e, 0x84, 0x32, 0xbf, 0xd1, 0xf3, 0xd9, 0xad, + 0x41, 0xcb, 0xf8, 0x2a, 0x07, 0xff, 0x68, 0xe5, 0x93, 0x67, 0xca, 0x26, + 0x97, 0xa0, 0x55, 0x39, 0x52, 0x64, 0x18, 0x04, 0x97, 0x0d, 0x15, 0x29, + 0x5c, 0x60, 0xbc, 0xbe, 0x21, 0x0c, 0xd0, 0x81, 0xdc, 0x38, 0x59, 0x0a, + 0xce, 0xc3, 0xa8, 0x09, 0xe3, 0x0b, 0x3d, 0x42, 0xd3, 0xd0, 0x97, 0xe3, + 0x08, 0x55, 0x09, 0xae, 0x06, 0x8e, 0x5f, 0xf7, 0xfe, 0xd0, 0xe4, 0xd0, + 0xc3, 0x97, 0xc0, 0x76, 0xfc, 0x72, 0xff, 0x3b, 0x7d, 0x48, 0xdc, 0x1c, + 0xa0, 0xa2, 0x99, 0x51, 0x74, 0x3a, 0xd9, 0x1d, 0xff, 0xb6, 0x9a, 0x92, + 0x9d, 0x81, 0x83, 0x97, 0xdb, 0x48, 0x61, 0xcb, 0xff, 0xf7, 0x95, 0xfe, + 0x30, 0x3d, 0xcd, 0x73, 0x28, 0xe9, 0xca, 0xda, 0x2d, 0xd8, 0x7c, 0x24, + 0x37, 0x3c, 0x8e, 0x5f, 0xff, 0xff, 0xc2, 0xed, 0xfb, 0x3a, 0x39, 0xef, + 0xc0, 0xc7, 0x93, 0x86, 0x05, 0xf6, 0xf2, 0x39, 0x7f, 0xb3, 0xbd, 0xff, + 0xce, 0x27, 0x2f, 0xf9, 0x79, 0xd5, 0xbe, 0xde, 0x47, 0x2f, 0x24, 0xda, + 0x39, 0x50, 0x7a, 0xac, 0x38, 0xb2, 0x05, 0x34, 0x59, 0x85, 0xb7, 0x08, + 0x66, 0x42, 0x22, 0xfe, 0xf8, 0x9d, 0x76, 0x21, 0xcb, 0xdc, 0x70, 0x27, + 0x2d, 0xb9, 0xcf, 0x32, 0x62, 0xeb, 0xff, 0x63, 0x7c, 0x1b, 0xce, 0x01, + 0xfd, 0xb3, 0x95, 0x0a, 0x9f, 0xfb, 0x1b, 0xa3, 0xc2, 0x68, 0x4a, 0xaf, + 0xff, 0xff, 0x81, 0xac, 0xc1, 0x55, 0x4d, 0x8c, 0x67, 0x7e, 0xe8, 0x72, + 0x76, 0x63, 0x0e, 0x5f, 0x94, 0x81, 0x51, 0x87, 0x2b, 0x11, 0x51, 0xe7, + 0xfb, 0xf7, 0x17, 0xec, 0x28, 0x72, 0xff, 0xfb, 0xfe, 0x65, 0xa0, 0xf6, + 0x36, 0x17, 0x76, 0xce, 0x56, 0x22, 0x7d, 0x08, 0x84, 0xaa, 0xf6, 0xa2, + 0x73, 0x97, 0xfd, 0x18, 0xbe, 0xa7, 0x17, 0xd9, 0xcb, 0xb3, 0xa7, 0x28, + 0x4f, 0x3d, 0xa1, 0xcd, 0x49, 0x17, 0x9a, 0x2d, 0xf3, 0x65, 0xee, 0xfe, + 0xd9, 0xcb, 0xc0, 0xfd, 0x67, 0x2f, 0x7b, 0x14, 0x39, 0x7f, 0x47, 0x3a, + 0xf9, 0xb8, 0x39, 0x78, 0x3f, 0xac, 0xe5, 0xf0, 0x46, 0x24, 0x72, 0x90, + 0xdf, 0xb8, 0xf5, 0x05, 0x1d, 0x1c, 0x8f, 0xa0, 0xf3, 0x07, 0x7a, 0xdf, + 0x7f, 0x92, 0x67, 0x14, 0xe7, 0x47, 0x2e, 0xc5, 0x9c, 0xbf, 0xb6, 0x9c, + 0x70, 0x74, 0x72, 0xfe, 0xe7, 0xd9, 0xdf, 0xda, 0xce, 0x5f, 0xdb, 0xce, + 0xf7, 0xff, 0x1c, 0xbf, 0x74, 0x63, 0x36, 0x62, 0xfe, 0xcd, 0xcf, 0xfb, + 0x84, 0xd1, 0x06, 0xbe, 0x9a, 0x6b, 0x6e, 0x74, 0x51, 0xc9, 0x56, 0xf8, + 0x7b, 0x9c, 0x9c, 0xa8, 0x4c, 0x89, 0x21, 0xac, 0xe5, 0x57, 0xe7, 0x5a, + 0x32, 0x0e, 0x5f, 0xd2, 0xe8, 0xbf, 0x3e, 0x39, 0x4b, 0x3d, 0x41, 0x26, + 0xbe, 0x50, 0x5e, 0x73, 0x95, 0x87, 0x89, 0xa2, 0x1b, 0xf4, 0x7b, 0xe3, + 0x1b, 0x39, 0x7f, 0xa4, 0x8c, 0x8e, 0xa8, 0x13, 0x97, 0xff, 0xa3, 0x07, + 0x9f, 0x66, 0xd2, 0x77, 0x61, 0xcb, 0xf3, 0xb7, 0xec, 0xee, 0x8f, 0xf7, + 0xc6, 0x95, 0xf1, 0x5b, 0x63, 0x56, 0x67, 0x02, 0xd2, 0x8d, 0x43, 0x21, + 0x97, 0xb2, 0x11, 0x85, 0x45, 0xed, 0x64, 0x8e, 0x5d, 0x8a, 0x1c, 0xbe, + 0x07, 0x60, 0x27, 0x2f, 0xfa, 0x00, 0xc8, 0xc1, 0xf6, 0x8e, 0x52, 0x1e, + 0xcf, 0x48, 0xaf, 0xc9, 0xcc, 0x90, 0x4e, 0x5e, 0x4e, 0xe1, 0xcb, 0xa1, + 0x98, 0x78, 0x4b, 0x27, 0xbf, 0x9b, 0xc6, 0x46, 0xd5, 0x39, 0x7c, 0x1d, + 0x76, 0x0e, 0x5f, 0x87, 0x6d, 0xbc, 0xe7, 0x2a, 0x0f, 0xeb, 0x0b, 0xdc, + 0x8a, 0xfd, 0x9e, 0xd2, 0x30, 0xe5, 0xdf, 0x89, 0xca, 0x84, 0xff, 0xe4, + 0x39, 0x8e, 0x08, 0xc7, 0xb8, 0x53, 0x09, 0x66, 0x89, 0xef, 0x77, 0x04, + 0xe5, 0xe7, 0xf4, 0x1c, 0xbf, 0xd3, 0x44, 0xec, 0x79, 0xa0, 0xe5, 0xff, + 0xf3, 0xab, 0xe8, 0xd8, 0x37, 0x1e, 0x17, 0x01, 0xcb, 0xf8, 0x70, 0x18, + 0x32, 0x39, 0x7f, 0xfc, 0xaf, 0xc5, 0x05, 0xfd, 0xa4, 0xe7, 0xa8, 0xd9, + 0xcb, 0x0e, 0x22, 0x01, 0xca, 0xeb, 0x13, 0x60, 0xd8, 0xdb, 0x8d, 0x89, + 0xaf, 0xf0, 0xcf, 0xbb, 0x5c, 0x4e, 0x5c, 0x9e, 0x39, 0x7c, 0x82, 0xe1, + 0x39, 0x7f, 0xe6, 0x67, 0xb4, 0xa6, 0x9e, 0x58, 0x72, 0xfd, 0xa8, 0xdf, + 0xa0, 0xe7, 0xd3, 0x7f, 0x41, 0x44, 0xc6, 0x97, 0xef, 0xca, 0x4c, 0xef, + 0xb3, 0x97, 0xdd, 0xc4, 0xe2, 0x72, 0xfe, 0xd2, 0x6f, 0x3f, 0xd9, 0xcb, + 0xff, 0xfd, 0x13, 0x7c, 0x45, 0xff, 0xbd, 0x7f, 0xf1, 0x89, 0xee, 0xa1, + 0xca, 0xc4, 0xf3, 0x15, 0x19, 0x48, 0x57, 0x30, 0x8f, 0xa5, 0x3e, 0x23, + 0xe0, 0x2e, 0xb9, 0x9c, 0x21, 0xa2, 0xfc, 0x5f, 0x6b, 0x79, 0x87, 0x2f, + 0xfe, 0x97, 0xbf, 0x94, 0x99, 0xef, 0x43, 0x0e, 0x5f, 0xef, 0x6a, 0x27, + 0xcd, 0x04, 0xe5, 0xdd, 0xc3, 0x97, 0xff, 0xdd, 0x80, 0xe2, 0xfe, 0x60, + 0xe0, 0x7b, 0x07, 0x2f, 0xfe, 0x4c, 0x1c, 0xcd, 0x7c, 0x96, 0x98, 0x72, + 0xff, 0xcf, 0x1c, 0xcb, 0xe6, 0xb9, 0x0c, 0x1c, 0xa0, 0xa7, 0x0f, 0xc9, + 0x0a, 0x23, 0xb5, 0x9a, 0x4c, 0x2d, 0xa4, 0xff, 0x22, 0x5e, 0x56, 0x36, + 0x72, 0xfe, 0x0c, 0x03, 0x79, 0xc9, 0xca, 0xfa, 0x79, 0x6c, 0x1d, 0xbf, + 0xd0, 0xcc, 0x4d, 0xcd, 0x23, 0x97, 0x24, 0xc7, 0x2f, 0xf6, 0xe1, 0x50, + 0x8c, 0x72, 0x72, 0xff, 0xf7, 0xa3, 0xa2, 0xf3, 0xc6, 0xf6, 0xf2, 0x39, + 0x7b, 0xc9, 0x39, 0xcb, 0xf0, 0x1f, 0x98, 0x98, 0xe5, 0xe1, 0x85, 0x9c, + 0xbf, 0xf8, 0x29, 0x37, 0x63, 0x7c, 0xca, 0x36, 0x72, 0xff, 0xf2, 0x0b, + 0xf3, 0xad, 0x66, 0xc3, 0xdc, 0x39, 0x5f, 0x13, 0x84, 0x90, 0xba, 0x1a, + 0x31, 0x25, 0xc7, 0x44, 0xa7, 0x43, 0x7c, 0x08, 0xd6, 0x83, 0x97, 0xba, + 0x9e, 0x39, 0x6e, 0x38, 0x6b, 0x14, 0x10, 0xa8, 0x5d, 0x74, 0x0b, 0x66, + 0x47, 0x60, 0x90, 0xb4, 0xe9, 0x23, 0xc7, 0x6e, 0x08, 0x50, 0x5e, 0x63, + 0xa8, 0x72, 0xff, 0xb0, 0x64, 0x38, 0xc8, 0x59, 0xcb, 0xf7, 0x53, 0x8e, + 0x04, 0xe5, 0xff, 0x83, 0x03, 0x83, 0xfc, 0xb3, 0x47, 0x2f, 0xce, 0xc4, + 0xe0, 0xc3, 0x97, 0xf6, 0x75, 0xfc, 0xf3, 0x1c, 0xba, 0x39, 0x39, 0x5c, + 0x9e, 0x27, 0x8b, 0x6b, 0x11, 0x20, 0xed, 0xb7, 0xa1, 0x26, 0x39, 0x76, + 0xf0, 0xe5, 0xe1, 0x6a, 0xb8, 0x0e, 0x5f, 0xb2, 0x76, 0x46, 0x8e, 0x5f, + 0xff, 0xfa, 0x3a, 0x8c, 0xfb, 0x34, 0x9f, 0x6a, 0x75, 0x39, 0xd2, 0xd2, + 0x73, 0x95, 0x3a, 0xa5, 0xa0, 0x8e, 0xaa, 0x6c, 0x85, 0x33, 0x43, 0x37, + 0xa4, 0x20, 0x1c, 0x11, 0x6d, 0x12, 0x70, 0x14, 0x5e, 0x4e, 0xe8, 0xe5, + 0xf7, 0xc7, 0x93, 0x50, 0x72, 0xff, 0xec, 0xe3, 0x81, 0xc1, 0xfe, 0x59, + 0xa3, 0x97, 0xed, 0xc7, 0x54, 0x09, 0xca, 0xd9, 0xf7, 0x3a, 0x2d, 0xf4, + 0x24, 0xf0, 0x72, 0xf9, 0xb7, 0xcd, 0x1c, 0xbf, 0x83, 0x00, 0x1c, 0xe4, + 0xe5, 0xff, 0x49, 0x8f, 0x2f, 0x6a, 0x15, 0x39, 0x50, 0x88, 0x9c, 0x22, + 0x72, 0xdb, 0xda, 0x41, 0x39, 0x7e, 0x15, 0xfc, 0xd7, 0x27, 0x2f, 0xf2, + 0x92, 0x8e, 0x28, 0x20, 0x39, 0x58, 0x7f, 0x6e, 0x36, 0x25, 0x75, 0x8a, + 0x94, 0x9a, 0xc7, 0x1e, 0x12, 0xe0, 0x21, 0x18, 0x55, 0x7f, 0x0a, 0x8b, + 0xa7, 0x91, 0xcb, 0xc9, 0xd4, 0x39, 0x5c, 0x9b, 0x3f, 0x0c, 0x5f, 0x29, + 0xfb, 0xe8, 0xe5, 0xff, 0x22, 0xb0, 0x18, 0xe3, 0x9d, 0x39, 0x7f, 0xdd, + 0x46, 0xf9, 0x96, 0xb1, 0x67, 0x2f, 0xef, 0xf5, 0x13, 0x7f, 0xb3, 0x97, + 0xbf, 0xce, 0x4e, 0x57, 0x4f, 0x3f, 0xc6, 0x37, 0xfa, 0x5f, 0x8c, 0xfa, + 0x4e, 0x4e, 0x5f, 0x00, 0x19, 0xc9, 0xcb, 0xfb, 0x83, 0xd8, 0xe2, 0xb3, + 0x97, 0xfd, 0xfb, 0xc8, 0x39, 0x80, 0xd1, 0xcb, 0xfc, 0x04, 0xe7, 0x99, + 0x67, 0x8e, 0x57, 0x4f, 0xbb, 0x47, 0x37, 0xee, 0x74, 0xc4, 0x6b, 0x39, + 0x7f, 0xfe, 0xcd, 0x7c, 0xeb, 0xa7, 0x81, 0xf8, 0x8b, 0xc8, 0xe5, 0x42, + 0x20, 0x84, 0xb2, 0xfe, 0x79, 0xc0, 0xe2, 0x13, 0x95, 0x3a, 0xac, 0xe0, + 0x9d, 0x2e, 0x11, 0x53, 0x11, 0x6c, 0xdb, 0xa4, 0x7e, 0x84, 0xef, 0x18, + 0x52, 0x34, 0x21, 0xbf, 0xca, 0x42, 0xda, 0x66, 0xe0, 0xe5, 0xff, 0x07, + 0x3f, 0xdc, 0xeb, 0x49, 0xce, 0x5f, 0xd1, 0xd4, 0xdc, 0x30, 0xe5, 0x75, + 0x13, 0xae, 0x6b, 0xe3, 0xca, 0x85, 0xc5, 0x3c, 0x95, 0xe4, 0xf1, 0x99, + 0x5d, 0x37, 0xe7, 0x2c, 0xc3, 0x95, 0xc9, 0xaa, 0xe1, 0xc6, 0x6f, 0xf7, + 0x81, 0xf8, 0xe9, 0x02, 0x72, 0xfd, 0x20, 0x66, 0x04, 0xe5, 0xf4, 0x6f, + 0x38, 0xa1, 0xed, 0xb9, 0xa5, 0xff, 0xe9, 0x86, 0x3d, 0xaf, 0x72, 0xb4, + 0x19, 0xce, 0x5f, 0xcf, 0xcc, 0x86, 0x02, 0x72, 0xff, 0xa3, 0x99, 0x20, + 0xb1, 0xfc, 0x72, 0x91, 0x16, 0x2e, 0x98, 0x25, 0xb7, 0xe7, 0x96, 0x4f, + 0x07, 0x2f, 0xfe, 0x8d, 0x6b, 0x19, 0xe1, 0x86, 0x68, 0xe5, 0xff, 0xc9, + 0x1a, 0x17, 0x97, 0xcd, 0x66, 0xce, 0x5f, 0xff, 0xe4, 0xd4, 0xf8, 0xde, + 0x0f, 0xfc, 0x11, 0xf7, 0x05, 0xf6, 0x72, 0xff, 0x73, 0x2d, 0x4d, 0x28, + 0x9c, 0xe5, 0x05, 0x34, 0xa5, 0x93, 0x8a, 0x1f, 0x91, 0x3f, 0x65, 0xbf, + 0xff, 0xf7, 0x53, 0x9f, 0x67, 0x3e, 0xde, 0xe3, 0xc0, 0x50, 0x65, 0xdc, + 0x39, 0x7e, 0xec, 0x71, 0x0c, 0x1c, 0xbc, 0x17, 0x13, 0x97, 0xb7, 0x1c, + 0x4e, 0x5d, 0xfe, 0xce, 0x54, 0x8f, 0xe8, 0x25, 0x3b, 0x1b, 0xd0, 0xf5, + 0xff, 0xa5, 0x03, 0xed, 0xa7, 0x1c, 0x09, 0xcb, 0xff, 0x3f, 0xb5, 0xfc, + 0x94, 0x0a, 0x78, 0xe5, 0xff, 0x9f, 0xab, 0x47, 0xf9, 0xa7, 0xe9, 0xcb, + 0xfb, 0xae, 0x3c, 0xc9, 0x0e, 0x5f, 0xff, 0xb4, 0x3f, 0x3a, 0xe9, 0xe0, + 0x7e, 0x22, 0xf2, 0x39, 0x7f, 0xba, 0x8a, 0xb4, 0xff, 0x6a, 0x9c, 0xbf, + 0xe8, 0x6d, 0x9d, 0x84, 0x19, 0xce, 0x5f, 0xff, 0x0e, 0x6b, 0x19, 0x0b, + 0xcf, 0x26, 0xf0, 0xe5, 0xb1, 0x68, 0xbe, 0xf1, 0xcf, 0x13, 0x9b, 0xfa, + 0x7c, 0xda, 0x2e, 0x0e, 0x5f, 0x08, 0x61, 0x87, 0x2f, 0xff, 0xbf, 0x1f, + 0x6b, 0xa9, 0x30, 0xc3, 0x1e, 0x47, 0x2f, 0xb0, 0x7f, 0x73, 0x94, 0xc3, + 0xf1, 0xe2, 0xa1, 0x7f, 0x38, 0x30, 0x2f, 0x23, 0x95, 0x08, 0xe2, 0xc8, + 0x49, 0x21, 0x25, 0x22, 0x68, 0x3d, 0x8c, 0x3e, 0xa1, 0x7f, 0xce, 0x78, + 0x41, 0x06, 0x1d, 0x39, 0x1b, 0xba, 0xd2, 0xd2, 0x1d, 0x33, 0x1e, 0x30, + 0xff, 0xa8, 0x2e, 0x7e, 0x02, 0xd1, 0x8c, 0x53, 0xd1, 0xbc, 0x5f, 0xfd, + 0x82, 0x0c, 0xcd, 0xeb, 0xd1, 0x87, 0x2f, 0xfb, 0x9f, 0x66, 0xd2, 0x77, + 0x61, 0xcb, 0xd9, 0xc7, 0x0e, 0x5b, 0x00, 0x89, 0x81, 0x41, 0xd1, 0xd5, + 0xee, 0x1e, 0x48, 0x72, 0xfa, 0x05, 0xe4, 0x72, 0xfd, 0x8d, 0x6e, 0x20, + 0xf8, 0x78, 0x3b, 0x21, 0xbf, 0xb8, 0xf5, 0x23, 0x7a, 0x39, 0x7f, 0xee, + 0xa3, 0x03, 0x93, 0x46, 0x6c, 0xe5, 0xe9, 0x47, 0x27, 0x2f, 0xa0, 0x0e, + 0xc3, 0x97, 0x0c, 0xb0, 0xff, 0x26, 0x3e, 0x11, 0xdb, 0xed, 0x27, 0xa0, + 0xe5, 0x41, 0xed, 0x39, 0xcd, 0xf2, 0xfa, 0x93, 0x1c, 0xbf, 0xff, 0x0e, + 0x2a, 0xaa, 0x07, 0xa9, 0x37, 0x53, 0x9f, 0x1c, 0xa8, 0x3f, 0xbc, 0x23, + 0xbc, 0xb7, 0xd9, 0xcb, 0xf6, 0x97, 0x1b, 0x54, 0xe5, 0x74, 0xf1, 0x40, + 0x39, 0x7f, 0x4b, 0x10, 0x3d, 0x43, 0x97, 0x9f, 0x6a, 0x9c, 0xac, 0x3c, + 0x97, 0x2c, 0xbf, 0xfb, 0x39, 0xf6, 0x90, 0x60, 0x0e, 0xc3, 0x97, 0xa4, + 0xce, 0x9c, 0xa9, 0xcf, 0x83, 0xc8, 0x77, 0xf7, 0x3a, 0xc6, 0x43, 0x59, + 0xcb, 0xe4, 0x55, 0x1b, 0x39, 0x58, 0x7e, 0xee, 0x46, 0x26, 0x37, 0x7c, + 0xc3, 0x97, 0xda, 0x18, 0x61, 0xca, 0x83, 0x73, 0xc8, 0xc5, 0xee, 0xc9, + 0x87, 0x2e, 0xea, 0x1c, 0xac, 0x36, 0x7e, 0x1d, 0xa8, 0x5c, 0xf7, 0x93, + 0xae, 0x21, 0x2b, 0x18, 0x2f, 0x61, 0x36, 0xec, 0xa2, 0xd7, 0xa8, 0x7b, + 0xfe, 0xca, 0xd1, 0x52, 0xf0, 0x58, 0xb3, 0x96, 0xe9, 0xcb, 0x00, 0xe5, + 0xda, 0x91, 0xca, 0x01, 0xb9, 0xd0, 0x8f, 0xe2, 0x37, 0xf4, 0xf3, 0x4b, + 0x86, 0xdc, 0xe7, 0x2f, 0x3e, 0x6c, 0xe5, 0xe1, 0xcf, 0x1c, 0xae, 0x9b, + 0x61, 0x1b, 0xbb, 0xc2, 0x72, 0xf4, 0x73, 0xa3, 0x97, 0xc8, 0x32, 0xc3, + 0x97, 0xa7, 0x71, 0x39, 0x41, 0x3d, 0x96, 0x0e, 0xf8, 0x82, 0xfd, 0x9e, + 0xea, 0x78, 0xe5, 0xf9, 0xf9, 0xce, 0x7c, 0x72, 0xca, 0xf4, 0xf4, 0x3c, + 0x4f, 0x72, 0x6c, 0xe5, 0xfd, 0x3f, 0xc9, 0xdd, 0xfa, 0x72, 0x9a, 0xa4, + 0xfa, 0xe1, 0xb6, 0x44, 0x18, 0xde, 0x8f, 0xfd, 0x29, 0x71, 0x6b, 0xfe, + 0xc0, 0x85, 0x39, 0xce, 0x7c, 0x72, 0xf9, 0x63, 0x12, 0x39, 0x5d, 0x3d, + 0xb7, 0x3a, 0xbf, 0xd1, 0x9e, 0x8e, 0xb8, 0x4e, 0x54, 0xe7, 0xa4, 0x12, + 0x1b, 0xff, 0x83, 0x01, 0xdc, 0x79, 0x16, 0x81, 0x39, 0x7d, 0x34, 0x70, + 0x48, 0xe5, 0xfd, 0xe5, 0x84, 0x2c, 0xd9, 0xcb, 0xfe, 0x9b, 0x5c, 0x5c, + 0x67, 0xfc, 0x27, 0x2f, 0xb3, 0xd8, 0xc3, 0x97, 0x0a, 0xa7, 0x2d, 0xa7, + 0x37, 0x1f, 0x90, 0xdf, 0xdd, 0xfe, 0x79, 0xba, 0x87, 0x2f, 0x84, 0x73, + 0xc7, 0x2a, 0x13, 0xa9, 0x09, 0x1e, 0x21, 0xaa, 0x4c, 0x85, 0xf3, 0x3b, + 0x74, 0x9f, 0xc6, 0x37, 0xf7, 0xc9, 0xa3, 0xc3, 0xc4, 0xe5, 0xff, 0xe1, + 0x8e, 0x3b, 0x8d, 0xe2, 0x76, 0x02, 0x72, 0xf0, 0xbb, 0x0e, 0x54, 0x91, + 0x2d, 0x86, 0x48, 0x93, 0x6f, 0xad, 0x53, 0xe6, 0x5e, 0xb5, 0x68, 0x1c, + 0x2e, 0x3a, 0xd4, 0x87, 0x22, 0x5a, 0x54, 0xf0, 0xf2, 0x94, 0x78, 0xe1, + 0x9c, 0xb8, 0xca, 0x47, 0x4a, 0xb1, 0xe0, 0xae, 0x5b, 0x9f, 0x32, 0x92, + 0x92, 0x31, 0x89, 0xa5, 0xdb, 0x6e, 0x53, 0xcb, 0x23, 0xc6, 0xec, 0xfc, + 0x73, 0xca, 0xd3, 0x04, 0xae, 0x8e, 0x1e, 0x13, 0x83, 0x38, 0xeb, 0xaa, + 0x42, 0xd7, 0xa7, 0x98, 0xbf, 0x84, 0xf3, 0x6a, 0xcd, 0x25, 0x0d, 0x29, + 0x2a, 0xf3, 0x82, 0x30, 0x7a, 0xfa, 0xf9, 0xea, 0x9d, 0xbc, 0xd0, 0xfb, + 0xff, 0xdf, 0x58, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x13, 0x62, 0xff, + 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x8a, 0xb5, 0x7f, 0xa5, 0x2f, 0xfc, 0x31, + 0x23, 0x97, 0xd9, 0xd7, 0xf1, 0xcb, 0x70, 0x98, 0x7a, 0xa2, 0x69, 0x7f, + 0xd8, 0x38, 0xc8, 0x97, 0xfb, 0x39, 0x7f, 0xb7, 0x8b, 0x80, 0x28, 0xc3, + 0x97, 0xfb, 0xb1, 0x3e, 0xe3, 0x02, 0x72, 0xff, 0xfd, 0x13, 0xc6, 0xe1, + 0x91, 0x1e, 0xea, 0x01, 0x87, 0x2a, 0x11, 0x0f, 0xd3, 0x3a, 0x5a, 0x62, + 0xbb, 0x38, 0xec, 0x2e, 0xef, 0xd1, 0xb6, 0x74, 0x27, 0x2f, 0x07, 0x04, + 0xe5, 0xe7, 0x75, 0x9a, 0x2b, 0x45, 0xf9, 0x5e, 0x75, 0xff, 0x27, 0x29, + 0x67, 0xaa, 0x85, 0x17, 0xff, 0x93, 0xd2, 0x85, 0xf5, 0x3d, 0xa7, 0xe4, + 0xe5, 0x6c, 0xfa, 0xf8, 0x90, 0xdf, 0xfe, 0xea, 0x32, 0x17, 0x8c, 0xc1, + 0xf3, 0x43, 0x97, 0xff, 0xcb, 0x8d, 0xe0, 0x1d, 0x8f, 0x28, 0x45, 0x9c, + 0xbf, 0xfe, 0x96, 0xb0, 0x61, 0x8f, 0x9e, 0xf4, 0x30, 0xe5, 0xde, 0xf4, + 0x22, 0x69, 0xd3, 0x6f, 0xff, 0xff, 0x47, 0x14, 0xf6, 0xb1, 0x55, 0xf5, + 0x3d, 0x93, 0x0c, 0x32, 0x7c, 0x6c, 0xe5, 0xfe, 0x8f, 0x3f, 0x7e, 0x06, + 0x0e, 0x5f, 0x4b, 0xc9, 0x39, 0xcb, 0xf2, 0x9e, 0x18, 0x01, 0xca, 0xe4, + 0xf2, 0xf8, 0x91, 0xdf, 0xe7, 0x97, 0x92, 0x7e, 0xa1, 0xca, 0x83, 0xd8, + 0x42, 0x5b, 0xf6, 0x75, 0x31, 0x87, 0x2f, 0xc8, 0x06, 0x26, 0xce, 0x5f, + 0xfc, 0x2e, 0x8b, 0xeb, 0xff, 0x3e, 0xd0, 0xe5, 0x4e, 0x89, 0x10, 0x93, + 0x74, 0x9e, 0xff, 0x4a, 0x37, 0x3c, 0x6e, 0x73, 0x97, 0xd2, 0xde, 0x30, + 0xe5, 0xec, 0xd8, 0x0e, 0x5f, 0xa6, 0xc0, 0xb1, 0xac, 0xe5, 0xfc, 0x30, + 0xdf, 0x32, 0xd1, 0xca, 0xe5, 0x13, 0x28, 0x45, 0x30, 0xe7, 0x01, 0x65, + 0x42, 0x61, 0xf9, 0x0c, 0xeb, 0xff, 0xff, 0xfb, 0x11, 0x79, 0xe8, 0x1f, + 0x6b, 0xe4, 0x20, 0x71, 0x9f, 0x37, 0x09, 0x27, 0xd1, 0xcb, 0xfb, 0x3c, + 0xe2, 0x0f, 0xce, 0x5f, 0xdd, 0xf8, 0x93, 0xb8, 0x9c, 0xbf, 0xd0, 0xcd, + 0x04, 0x5d, 0xb3, 0x97, 0xce, 0x07, 0x09, 0xca, 0x92, 0x2c, 0x30, 0xb4, + 0x4b, 0xf4, 0x67, 0x6f, 0xbc, 0x33, 0x22, 0x2e, 0x23, 0x40, 0x9c, 0xd8, + 0x25, 0x19, 0x0d, 0xb5, 0x92, 0x24, 0x39, 0x36, 0x5a, 0xc7, 0xbe, 0xc3, + 0x5d, 0xe1, 0x62, 0x31, 0xa0, 0x68, 0x9f, 0xd1, 0x9c, 0x5f, 0xb6, 0xb7, + 0x75, 0x9a, 0x2c, 0x05, 0xf9, 0xd6, 0xa7, 0x66, 0x39, 0x6f, 0xb8, 0x7b, + 0xda, 0x34, 0xbf, 0x6d, 0x6e, 0xeb, 0x34, 0x4e, 0xab, 0xff, 0xfd, 0xd8, + 0x9c, 0x38, 0xcf, 0xba, 0xd6, 0x75, 0x35, 0xfc, 0xe7, 0x2f, 0xdf, 0x58, + 0xf2, 0xfb, 0x88, 0x9a, 0x98, 0xd2, 0xf2, 0xb0, 0xc3, 0x97, 0xce, 0xb5, + 0x18, 0x72, 0xf4, 0xb5, 0xf5, 0x53, 0xc0, 0xe2, 0x3b, 0x7e, 0xda, 0xdd, + 0xd6, 0x68, 0xb6, 0x57, 0xf7, 0x9f, 0xbf, 0x03, 0x07, 0x2f, 0xff, 0xe9, + 0x7d, 0xd4, 0x26, 0x05, 0x33, 0x59, 0xe1, 0x83, 0x95, 0x08, 0x88, 0x72, + 0xfb, 0xff, 0x02, 0x35, 0xf7, 0xa8, 0xb7, 0xd9, 0xcb, 0xfe, 0x89, 0x46, + 0xe7, 0x8d, 0xce, 0x72, 0xdf, 0x71, 0x35, 0x76, 0x42, 0xf1, 0xc8, 0x45, + 0x02, 0xff, 0xc3, 0xf5, 0x9f, 0xa7, 0x85, 0xf8, 0x0e, 0x5f, 0xfd, 0xfe, + 0xbe, 0xe6, 0xdf, 0x5d, 0x79, 0x1c, 0xb9, 0xc1, 0x88, 0x8a, 0x02, 0x1d, + 0xdc, 0xac, 0xe5, 0xf2, 0xdd, 0xd6, 0x68, 0xb9, 0x96, 0x61, 0xca, 0xd9, + 0xbf, 0x6c, 0xba, 0xff, 0x6c, 0x73, 0x90, 0x24, 0x8e, 0x5d, 0x33, 0x0e, + 0x51, 0xcb, 0x7d, 0x84, 0x67, 0xe2, 0xba, 0x11, 0x36, 0x66, 0xd0, 0x62, + 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x77, 0xaf, 0xf4, 0xbe, 0xeb, 0x7b, 0x46, + 0xce, 0x5b, 0xee, 0x1f, 0x5b, 0x9a, 0x5f, 0x7d, 0x54, 0x20, 0x39, 0x50, + 0xfc, 0x06, 0x99, 0x79, 0xf0, 0x2b, 0x38, 0xe5, 0x69, 0x29, 0x24, 0x3b, + 0x8d, 0x41, 0x90, 0xc3, 0x78, 0x42, 0x02, 0x39, 0x01, 0x86, 0x96, 0xa1, + 0xf9, 0xe8, 0x5e, 0xa8, 0x51, 0x7f, 0xe6, 0xdc, 0x67, 0xd2, 0x0f, 0x32, + 0x39, 0x7f, 0xf6, 0x4f, 0x8d, 0xf7, 0x35, 0x88, 0x27, 0x2e, 0x4f, 0xbd, + 0x44, 0x18, 0xa0, 0x5f, 0xb5, 0xa6, 0x3c, 0x8e, 0x5f, 0xff, 0xff, 0xfb, + 0xa9, 0xd4, 0x81, 0xf0, 0xba, 0xb9, 0xef, 0xfc, 0x9e, 0xd7, 0x53, 0x71, + 0x3b, 0xed, 0x67, 0x2e, 0xd4, 0x1c, 0xbf, 0xfb, 0x95, 0xfe, 0xfc, 0xfb, + 0x30, 0x55, 0x39, 0x78, 0x5f, 0xec, 0x26, 0x3c, 0xb2, 0x8d, 0x42, 0x67, + 0xc2, 0xd7, 0xbf, 0x76, 0x1c, 0xbf, 0x67, 0x07, 0xa1, 0x53, 0x96, 0xe0, + 0x39, 0x53, 0x9b, 0xfc, 0x2b, 0xad, 0x9f, 0xe8, 0xae, 0x5f, 0xfb, 0x4e, + 0xaf, 0x52, 0x07, 0xf8, 0x39, 0x7f, 0xee, 0xbf, 0x9f, 0xbc, 0xcb, 0x3c, + 0x72, 0xb0, 0xff, 0x50, 0xfa, 0xe7, 0x01, 0xcb, 0xff, 0xff, 0xc2, 0xed, + 0x8e, 0x7b, 0xd9, 0x3c, 0x0b, 0xab, 0xa6, 0x46, 0x08, 0x4e, 0x5e, 0xc5, + 0x34, 0x72, 0xb1, 0x15, 0x1b, 0x16, 0xe0, 0x75, 0xbf, 0xdd, 0xc0, 0xa7, + 0x1d, 0xe1, 0xcb, 0xfc, 0xf2, 0xde, 0x34, 0x40, 0x1c, 0xbc, 0xee, 0xb3, + 0x44, 0xae, 0xbf, 0xca, 0xb8, 0x83, 0xd9, 0xd3, 0x94, 0xb3, 0xdb, 0x42, + 0x8b, 0xfd, 0xc8, 0xba, 0xaf, 0xe9, 0x1c, 0xbf, 0xfb, 0xb9, 0x25, 0xf5, + 0x03, 0x03, 0xe3, 0x94, 0x87, 0xef, 0xe3, 0x4a, 0x92, 0x6f, 0x81, 0x34, + 0xdc, 0x23, 0xc6, 0x13, 0x17, 0xff, 0xff, 0xdb, 0x71, 0x52, 0x01, 0x92, + 0xec, 0x71, 0x0c, 0x7d, 0xc1, 0xfe, 0x59, 0xa3, 0x97, 0x4a, 0x73, 0x97, + 0xff, 0xf9, 0xf9, 0xd6, 0x6f, 0xde, 0x79, 0xd4, 0x60, 0x7a, 0x8a, 0x9c, + 0xbf, 0xec, 0x4e, 0x23, 0x19, 0xb9, 0x1c, 0xbf, 0xff, 0x7a, 0x58, 0xd6, + 0xe2, 0x0e, 0x7d, 0xb8, 0xc6, 0xce, 0x36, 0x6e, 0x2f, 0xdc, 0xfb, 0xb0, + 0x03, 0x94, 0xe8, 0x93, 0xfd, 0xaa, 0xff, 0xf4, 0xc3, 0x1e, 0xd7, 0xb9, + 0x5a, 0x0c, 0xe7, 0x2f, 0xf9, 0xdb, 0x0f, 0x62, 0x7c, 0x6c, 0xe5, 0x22, + 0x21, 0xc5, 0x32, 0xff, 0xfd, 0x88, 0x0c, 0x62, 0x7b, 0x50, 0xc7, 0xe7, + 0xc7, 0x2f, 0xfa, 0x19, 0xec, 0x9a, 0x49, 0xe3, 0x95, 0x24, 0x46, 0xf9, + 0x52, 0xfb, 0xf7, 0xdc, 0x8e, 0x5f, 0xc3, 0x13, 0x81, 0xfc, 0x72, 0xff, + 0x38, 0x54, 0xe0, 0x81, 0x91, 0xcb, 0x42, 0xcf, 0x8d, 0x85, 0xb7, 0xff, + 0xf9, 0x3c, 0xec, 0x71, 0x07, 0x5b, 0x71, 0x9d, 0x69, 0x39, 0xca, 0x0a, + 0x61, 0xc9, 0x08, 0x67, 0x27, 0xbf, 0xef, 0xc0, 0xc7, 0x96, 0xb6, 0x13, + 0x97, 0xff, 0xfb, 0x10, 0x7d, 0x83, 0xf0, 0x5c, 0x30, 0x33, 0xc6, 0xce, + 0x5b, 0x3c, 0x89, 0x9e, 0x27, 0x77, 0xfd, 0xc8, 0x33, 0x79, 0x9e, 0xd1, + 0xca, 0x0a, 0xb0, 0xfc, 0x85, 0x77, 0x63, 0x31, 0x18, 0x66, 0xa8, 0x55, + 0x7f, 0xec, 0xef, 0x5e, 0x40, 0xde, 0x72, 0x72, 0xff, 0xb3, 0x9d, 0x06, + 0x1c, 0x67, 0x39, 0x7f, 0xcf, 0x2d, 0x76, 0x36, 0xa0, 0x4e, 0x54, 0x91, + 0x65, 0x87, 0xfe, 0x39, 0xbf, 0xfb, 0xc9, 0xc5, 0x3d, 0x34, 0xa0, 0x7c, + 0x72, 0xff, 0xf3, 0xe4, 0xbb, 0x88, 0x38, 0x06, 0x98, 0x72, 0xf3, 0xcb, + 0xec, 0x32, 0xa9, 0xa5, 0x09, 0xe0, 0xc3, 0x23, 0x23, 0xae, 0xda, 0x3b, + 0x21, 0x00, 0x01, 0x81, 0x8c, 0xc3, 0x52, 0xee, 0x7d, 0x18, 0x6a, 0x85, + 0xfc, 0x08, 0xd7, 0xff, 0xb3, 0xbf, 0x47, 0x02, 0x83, 0xec, 0xe9, 0xcb, + 0xde, 0x80, 0x94, 0xbf, 0xfd, 0xd7, 0x4f, 0x44, 0x93, 0x73, 0xfe, 0x02, + 0x97, 0xf9, 0xd7, 0xf4, 0x3b, 0xe1, 0xfe, 0xc1, 0xf3, 0xe8, 0x72, 0xdf, + 0x42, 0xce, 0xac, 0x5c, 0x69, 0xac, 0xa5, 0xbb, 0xfa, 0x1c, 0xbc, 0x61, + 0x61, 0x7f, 0xfb, 0xeb, 0x1e, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x61, + 0x5f, 0xff, 0xd9, 0xc5, 0xc3, 0xd8, 0xfb, 0xee, 0xe0, 0x7f, 0xf6, 0x8e, + 0x5f, 0xfe, 0xdb, 0x83, 0xea, 0xbe, 0x93, 0x71, 0xa9, 0x1c, 0xbb, 0x3e, + 0x8a, 0x2b, 0xd4, 0x60, 0xb9, 0x9c, 0x4e, 0x5f, 0xfd, 0xc2, 0x67, 0x32, + 0xfd, 0xfc, 0x31, 0x23, 0x97, 0xe6, 0xad, 0xab, 0x6a, 0x1a, 0x35, 0x47, + 0x2f, 0xd8, 0xcf, 0x9c, 0xb5, 0x9c, 0xbf, 0xa1, 0x98, 0x08, 0xe2, 0x72, + 0x82, 0x7b, 0x9d, 0x2e, 0xbf, 0xdb, 0xc5, 0xc0, 0x14, 0x61, 0xcb, 0xf7, + 0x60, 0x28, 0xa9, 0xca, 0x43, 0xfe, 0xd9, 0x17, 0x01, 0xa5, 0xfe, 0x87, + 0x9f, 0xca, 0xbe, 0xce, 0x5f, 0x9f, 0x72, 0x76, 0x1c, 0xa1, 0x3d, 0xbf, + 0xcd, 0x2f, 0xf6, 0xa3, 0x04, 0x3d, 0x83, 0x97, 0xf4, 0x60, 0x87, 0xb0, + 0x72, 0xf7, 0xfb, 0x9b, 0xe1, 0xee, 0x68, 0xc6, 0xff, 0xf6, 0xd3, 0xfc, + 0x57, 0x3d, 0xfc, 0x72, 0x13, 0x97, 0xff, 0xe4, 0xdf, 0x5f, 0xe0, 0x72, + 0x5d, 0x8e, 0x21, 0x83, 0x97, 0xfc, 0xda, 0x9d, 0x85, 0xf5, 0x26, 0x39, + 0x7d, 0xfb, 0x30, 0x27, 0x2d, 0x9c, 0x9e, 0xff, 0x01, 0xe5, 0xfd, 0x1b, + 0x89, 0x6b, 0x0e, 0x52, 0xd3, 0x93, 0xd9, 0xc7, 0x53, 0x46, 0x16, 0xfe, + 0x2b, 0xbf, 0xfd, 0x0b, 0xd7, 0xfe, 0x4e, 0xa2, 0xbd, 0x43, 0x97, 0xf3, + 0x23, 0x07, 0xcd, 0x0e, 0x5b, 0x47, 0x2f, 0xd1, 0x83, 0xe6, 0x87, 0x2f, + 0x69, 0xf9, 0xf8, 0x7c, 0xf3, 0x17, 0x30, 0x46, 0x98, 0x8f, 0x6f, 0x42, + 0xca, 0xff, 0x9a, 0xf0, 0x3d, 0x86, 0xb1, 0x83, 0x96, 0xea, 0x1f, 0x2b, + 0x94, 0x5f, 0xde, 0x86, 0x71, 0x04, 0x8e, 0x5d, 0xe4, 0x39, 0x52, 0x3c, + 0x65, 0x4c, 0x2f, 0xff, 0xf3, 0x7c, 0x1e, 0xce, 0xfc, 0x1c, 0x9d, 0x30, + 0x79, 0x96, 0x8e, 0x5f, 0x9b, 0xf6, 0x75, 0x67, 0x2c, 0x38, 0x89, 0x07, + 0x67, 0xbf, 0xfd, 0xe1, 0x70, 0x77, 0x10, 0x3f, 0xfb, 0x47, 0x2f, 0xfa, + 0x27, 0x52, 0x5d, 0xfd, 0xe7, 0x39, 0x50, 0x88, 0x7d, 0xa5, 0x5f, 0xfd, + 0x9c, 0xcb, 0xe7, 0x5d, 0x70, 0x21, 0x39, 0x7c, 0x91, 0xce, 0x8e, 0x5f, + 0x94, 0xf0, 0xc0, 0x0e, 0x57, 0x8f, 0x2b, 0x89, 0x15, 0xf7, 0xbd, 0x8d, + 0x9c, 0xbf, 0xfd, 0x1e, 0x04, 0x4b, 0x39, 0xf4, 0xff, 0xb6, 0x72, 0xf6, + 0x9c, 0x07, 0x2a, 0x11, 0x63, 0x84, 0x88, 0x47, 0xe4, 0xeb, 0x9e, 0x47, + 0x2f, 0xff, 0x26, 0xa2, 0x5f, 0x33, 0xa9, 0xbe, 0xb9, 0xca, 0x6b, 0x3e, + 0x0e, 0x8b, 0x5f, 0xce, 0x0d, 0xed, 0x36, 0x72, 0xf7, 0xbe, 0x61, 0xca, + 0x01, 0xe5, 0xa8, 0x5b, 0x7d, 0xdf, 0xf9, 0xf1, 0xcb, 0xff, 0x75, 0x3c, + 0x98, 0xc1, 0xc9, 0xce, 0x5f, 0xda, 0x45, 0x58, 0xfe, 0x39, 0x7f, 0xff, + 0xed, 0xe7, 0x18, 0x1f, 0x7c, 0x50, 0x63, 0xae, 0x9e, 0x8f, 0x68, 0xe5, + 0xfc, 0x39, 0xaf, 0x8b, 0xe1, 0x8e, 0x52, 0xd3, 0x0d, 0xe4, 0xf7, 0x65, + 0xdc, 0x5b, 0xaf, 0xbe, 0x71, 0xe0, 0x9c, 0xe5, 0x05, 0x39, 0xec, 0x8c, + 0xc9, 0x54, 0x1b, 0x35, 0x9c, 0xbf, 0x33, 0x78, 0x1f, 0x1c, 0xbb, 0xd8, + 0x72, 0xff, 0x83, 0x03, 0x00, 0x77, 0xe0, 0x39, 0x7f, 0xfb, 0x87, 0x18, + 0x63, 0xa7, 0x5f, 0xdd, 0x83, 0x95, 0x08, 0x9b, 0x41, 0x6f, 0xce, 0x6f, + 0xf7, 0x52, 0x67, 0x5e, 0xa4, 0x72, 0xfe, 0x1f, 0x3b, 0x13, 0xc7, 0x2f, + 0xfc, 0x9e, 0xff, 0x6f, 0xaf, 0x8c, 0xf1, 0xca, 0x83, 0xee, 0x72, 0xcb, + 0xfe, 0xc4, 0xc6, 0x0e, 0x4e, 0xe7, 0x2f, 0xd1, 0xed, 0x03, 0xf3, 0x94, + 0xd5, 0x2a, 0x27, 0x81, 0x4c, 0x86, 0x1a, 0xcb, 0xfb, 0x0a, 0x21, 0x20, + 0xf1, 0xb5, 0xff, 0xfb, 0xa3, 0x9e, 0xea, 0x67, 0x3e, 0xce, 0x31, 0xa3, + 0x97, 0xcf, 0xaf, 0x4e, 0x72, 0xff, 0xe7, 0x1e, 0xc2, 0x05, 0x35, 0x92, + 0x39, 0x7a, 0x00, 0xa1, 0xcb, 0xfb, 0x38, 0xf5, 0x01, 0x31, 0xca, 0xc4, + 0xc1, 0xd5, 0x56, 0x72, 0x31, 0x41, 0xd0, 0xed, 0xe5, 0x03, 0x87, 0x2f, + 0x70, 0xfa, 0xe1, 0x8e, 0x53, 0x9e, 0x26, 0x87, 0x6f, 0xbe, 0x33, 0xe2, + 0xce, 0x5e, 0xc5, 0x84, 0xe5, 0xf7, 0xb0, 0x40, 0x72, 0xfe, 0x76, 0xe3, + 0xd9, 0x39, 0xca, 0xc3, 0xeb, 0x41, 0xc1, 0x21, 0xbe, 0x6e, 0x6d, 0x41, + 0xcb, 0xff, 0x3f, 0xb4, 0x1d, 0xbf, 0xbb, 0xf9, 0xca, 0xe4, 0xf9, 0x04, + 0x92, 0xdf, 0x5a, 0xa6, 0xc6, 0x1b, 0x86, 0x19, 0x6a, 0x49, 0x51, 0x18, + 0xc8, 0x61, 0x19, 0x92, 0x84, 0x57, 0x1d, 0x57, 0x2d, 0x93, 0x42, 0xcf, + 0x70, 0xad, 0x61, 0x17, 0x63, 0x41, 0x78, 0x4d, 0x01, 0xc0, 0x63, 0xc1, + 0xd4, 0xa5, 0xef, 0x46, 0xf3, 0xfc, 0x23, 0x5b, 0x21, 0x69, 0x09, 0x25, + 0x21, 0x21, 0x7f, 0xfd, 0xb4, 0xe6, 0x5a, 0x4f, 0x76, 0x37, 0xe8, 0x39, + 0x7e, 0xda, 0xdd, 0xd6, 0x68, 0xab, 0x97, 0xb7, 0x0c, 0x39, 0x7f, 0xa3, + 0x7e, 0x81, 0x80, 0x1c, 0xbf, 0xe9, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x88, + 0xf1, 0x7f, 0xd1, 0x28, 0xdc, 0xf1, 0xb9, 0xce, 0x5f, 0xfa, 0x3c, 0x9f, + 0xf0, 0xf9, 0x29, 0xe6, 0x39, 0x7f, 0xdc, 0xad, 0x35, 0xd4, 0xf2, 0x1c, + 0xbf, 0xdc, 0x0e, 0x18, 0xc0, 0xa1, 0xcb, 0x7d, 0x0a, 0xa0, 0x5c, 0x50, + 0xd9, 0xa7, 0x47, 0x1c, 0xc4, 0x51, 0xf4, 0x75, 0xe4, 0x6e, 0x03, 0x9b, + 0xf6, 0xd6, 0xee, 0xb3, 0x45, 0x82, 0xbc, 0xac, 0x4e, 0x72, 0xff, 0xfe, + 0x1f, 0xde, 0x76, 0x63, 0x4f, 0xf7, 0x9b, 0x92, 0x92, 0x39, 0x7e, 0xc1, + 0xcf, 0x68, 0xe5, 0xfe, 0xdb, 0xb1, 0x4d, 0xbf, 0x27, 0x2d, 0xf7, 0x13, + 0x0e, 0x54, 0xd1, 0x63, 0xce, 0xc2, 0xa1, 0x35, 0xfe, 0xfb, 0x9b, 0x5b, + 0xba, 0xcd, 0x16, 0x52, 0xfd, 0xb5, 0xbb, 0xac, 0xd1, 0x69, 0xaf, 0xf9, + 0xc3, 0xd7, 0x9b, 0xa8, 0xc3, 0x96, 0xfb, 0x87, 0xda, 0xc3, 0x4b, 0xf7, + 0x0b, 0xb5, 0x36, 0xa9, 0xaa, 0x6a, 0xce, 0x5f, 0xf7, 0x0d, 0xd4, 0x6c, + 0x2e, 0xeb, 0x39, 0x7e, 0xe1, 0x7e, 0x13, 0x59, 0x07, 0x2f, 0xf2, 0x8c, + 0xcf, 0x69, 0x34, 0x72, 0xc8, 0x72, 0xb8, 0x63, 0xc4, 0x68, 0x69, 0x7f, + 0xff, 0x27, 0x5c, 0x7d, 0x2c, 0xde, 0x40, 0x8e, 0x78, 0xe5, 0xfb, 0x8b, + 0x87, 0x18, 0x72, 0xf9, 0x91, 0xce, 0x8e, 0x5f, 0xfc, 0x98, 0xe0, 0x89, + 0x6e, 0x30, 0x4e, 0x5f, 0x27, 0x1e, 0xf1, 0x39, 0x52, 0x4c, 0x23, 0x15, + 0xa6, 0x29, 0x12, 0x3d, 0x20, 0x5f, 0xe6, 0x28, 0xc0, 0x31, 0x00, 0x72, + 0xfd, 0xf3, 0x7b, 0xff, 0xa7, 0x2f, 0xc8, 0xac, 0x0a, 0xce, 0x56, 0x8f, + 0x4f, 0xc5, 0x95, 0x08, 0xaa, 0xc8, 0x44, 0x5f, 0xff, 0x0a, 0xfa, 0x9d, + 0x4d, 0xc4, 0xcd, 0xe7, 0x4e, 0x5f, 0xf9, 0x8c, 0x79, 0x34, 0xff, 0xa9, + 0xb3, 0x97, 0xe7, 0xd7, 0xa0, 0x27, 0x2a, 0x0f, 0xa7, 0xf4, 0x2b, 0xfc, + 0xfb, 0x93, 0xf9, 0xd6, 0x72, 0xa1, 0x30, 0xde, 0xc2, 0xe7, 0xf2, 0x2b, + 0xe8, 0x52, 0x3a, 0x72, 0xf9, 0x6e, 0xeb, 0x34, 0x5b, 0x8b, 0xe9, 0xa0, + 0x38, 0x72, 0xff, 0xd9, 0xbc, 0x1f, 0x9d, 0xce, 0x5b, 0x39, 0x7e, 0x10, + 0x3f, 0x3a, 0x39, 0x50, 0x7d, 0x2e, 0x83, 0x5c, 0xa3, 0xef, 0x64, 0x4e, + 0x5d, 0xa8, 0x45, 0xdf, 0xe7, 0x10, 0x4c, 0x30, 0xc3, 0x97, 0x98, 0x28, + 0x72, 0xc2, 0x72, 0xff, 0xbb, 0xfb, 0xeb, 0x30, 0x55, 0x39, 0x7e, 0xd3, + 0xf2, 0xe1, 0x39, 0x64, 0x09, 0xf0, 0xf8, 0xe6, 0xa1, 0x16, 0x78, 0x37, + 0xd7, 0x1b, 0xfe, 0x87, 0x1e, 0xe6, 0x0a, 0xce, 0x5f, 0xef, 0x79, 0x27, + 0x64, 0x09, 0xca, 0x91, 0xf4, 0x61, 0xad, 0xff, 0x40, 0xfe, 0xc8, 0xd7, + 0x90, 0xe5, 0xe8, 0xcd, 0x9c, 0xbf, 0xdd, 0x89, 0x23, 0x4c, 0x61, 0xca, + 0x09, 0xe7, 0xe8, 0x6e, 0xfd, 0xf3, 0x9d, 0x22, 0xa7, 0x2c, 0xf3, 0x9e, + 0x77, 0x24, 0x57, 0xff, 0x4b, 0x3a, 0x9b, 0x0f, 0x60, 0x56, 0x72, 0xff, + 0x73, 0x28, 0x1f, 0x60, 0x0e, 0x5f, 0x68, 0x09, 0xe3, 0x94, 0xe8, 0xc1, + 0xd1, 0x4f, 0xe8, 0x6a, 0x19, 0xdf, 0x9f, 0x7e, 0xce, 0x9c, 0xbf, 0xf2, + 0x02, 0x24, 0x1e, 0xc0, 0xac, 0xe5, 0x48, 0xf9, 0x3c, 0x4f, 0x7f, 0x7a, + 0x59, 0xbc, 0xd1, 0xca, 0x39, 0x7b, 0xf7, 0xf1, 0xcb, 0xbf, 0x83, 0x95, + 0x23, 0x69, 0xe1, 0xda, 0x39, 0x7d, 0xca, 0xd3, 0x67, 0x2f, 0x43, 0x3e, + 0xe2, 0x23, 0xb9, 0x3f, 0x61, 0x0f, 0x82, 0xea, 0x13, 0x2d, 0xc2, 0x24, + 0x85, 0xdd, 0xe1, 0xf3, 0x43, 0x97, 0xbe, 0x35, 0x6d, 0x59, 0xcb, 0xfe, + 0x97, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0xa1, 0xd4, 0x88, 0x8e, 0x98, 0x79, + 0xca, 0x6f, 0xc0, 0x85, 0xe3, 0x0e, 0x5f, 0x44, 0xd8, 0x13, 0x95, 0xb3, + 0xc9, 0xd1, 0x3d, 0xff, 0x64, 0x07, 0xb1, 0xc1, 0x13, 0x1c, 0xbf, 0xc0, + 0x4e, 0xf7, 0x00, 0xe7, 0x29, 0x87, 0xda, 0x03, 0xba, 0x84, 0x58, 0xbc, + 0x23, 0xef, 0xfc, 0xe1, 0x80, 0xf5, 0x05, 0x18, 0x72, 0xff, 0xdc, 0x5f, + 0x7a, 0x7e, 0xea, 0x27, 0x39, 0x7f, 0xb5, 0xfa, 0xf3, 0xc3, 0x07, 0x29, + 0x88, 0xb0, 0xe9, 0xe7, 0x90, 0x6f, 0xfe, 0xfe, 0x5d, 0x7d, 0xf3, 0xe8, + 0x49, 0xce, 0x5f, 0xe9, 0x46, 0xe7, 0x8d, 0xce, 0x72, 0xfc, 0xfa, 0xe3, + 0x9a, 0x39, 0x50, 0x7b, 0xc0, 0x35, 0xbf, 0x7c, 0xee, 0x01, 0xce, 0x5f, + 0xe8, 0x93, 0xef, 0x39, 0xf1, 0xcb, 0xfe, 0xcf, 0x69, 0x4d, 0x6d, 0xf4, + 0x72, 0xfc, 0x9e, 0xd3, 0xa1, 0xcb, 0xfe, 0xd8, 0x36, 0xe3, 0xec, 0x01, + 0xca, 0x9d, 0x1e, 0x9b, 0x29, 0x61, 0x98, 0x0e, 0xbf, 0x26, 0xbc, 0xa6, + 0xe4, 0x72, 0xfe, 0x53, 0xdf, 0xc6, 0x4e, 0x72, 0xa4, 0x79, 0xd3, 0x0f, + 0x5f, 0xfc, 0xb1, 0x8f, 0x0e, 0x71, 0xcd, 0xc8, 0xe5, 0xff, 0x7e, 0x2a, + 0xa9, 0xde, 0xff, 0xa3, 0x97, 0xfc, 0xa4, 0x02, 0x69, 0x46, 0xe7, 0x39, + 0x7f, 0x0b, 0xf9, 0x48, 0x59, 0xca, 0x61, 0xf4, 0x89, 0xe5, 0xf0, 0x82, + 0x70, 0x1c, 0xac, 0x3c, 0x44, 0x21, 0xbf, 0xda, 0xf9, 0xef, 0x81, 0xc1, + 0x39, 0x60, 0x1c, 0xb2, 0x72, 0x79, 0x1b, 0x37, 0xbf, 0x3f, 0x3a, 0xf2, + 0x1c, 0xa8, 0x54, 0x15, 0x84, 0x68, 0x89, 0xd8, 0x75, 0x8b, 0x46, 0x8a, + 0x2f, 0xcf, 0xfa, 0xb0, 0xa1, 0xcb, 0xf7, 0x0d, 0x9b, 0x8d, 0x1c, 0xa9, + 0x8f, 0x58, 0x4a, 0xaf, 0xec, 0xf2, 0x07, 0x18, 0x72, 0xf8, 0x64, 0x8c, + 0x39, 0x6f, 0x93, 0x1e, 0x6b, 0x96, 0x5f, 0xed, 0x44, 0xdc, 0xcb, 0x38, + 0x9c, 0xa0, 0x9f, 0x0b, 0x95, 0x5f, 0xff, 0x83, 0xd8, 0x53, 0xef, 0x85, + 0xc1, 0xad, 0x40, 0x0a, 0x5c, 0x1c, 0x39, 0x7e, 0x9e, 0x27, 0x7d, 0x1c, + 0xac, 0x44, 0xba, 0x2c, 0x38, 0xb5, 0xc0, 0xfc, 0xe5, 0xfc, 0xe0, 0x98, + 0x60, 0x27, 0x2f, 0xf8, 0x72, 0x70, 0xf7, 0x07, 0xc7, 0x2a, 0x0f, 0xf7, + 0xa3, 0x02, 0x5b, 0x4d, 0x43, 0x6a, 0x46, 0xd5, 0xa2, 0xb5, 0x33, 0xee, + 0x14, 0xef, 0x11, 0x98, 0xca, 0x1e, 0x81, 0x8c, 0xcf, 0x23, 0x31, 0x55, + 0x09, 0x70, 0xe5, 0xe6, 0x12, 0xc8, 0x43, 0x34, 0x72, 0xdb, 0x8f, 0x3d, + 0x90, 0xc1, 0xec, 0x65, 0x2f, 0x0d, 0x60, 0x18, 0x0c, 0x29, 0x75, 0x18, + 0xaf, 0xa5, 0x52, 0x7f, 0x0b, 0x0e, 0x30, 0xd0, 0x69, 0x0b, 0x85, 0x21, + 0x55, 0x7f, 0xfe, 0x5f, 0xd0, 0x6f, 0x39, 0x5f, 0x53, 0xda, 0x7e, 0x4e, + 0x57, 0xd5, 0x45, 0x5f, 0xc7, 0xa1, 0x7d, 0x1b, 0x93, 0x0e, 0x5f, 0x73, + 0xa7, 0x6b, 0x39, 0x79, 0xf6, 0xa9, 0xcb, 0x7d, 0x9c, 0xf9, 0x50, 0x89, + 0xb2, 0x6b, 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x2f, 0x35, 0x43, 0xb1, + 0xd7, 0x93, 0x88, 0x63, 0x09, 0xca, 0xc6, 0xdb, 0x99, 0x71, 0xdb, 0x8e, + 0x59, 0x8a, 0x7d, 0x85, 0x70, 0xd6, 0xee, 0xda, 0x84, 0x9f, 0x13, 0x8b, + 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x29, 0x65, 0xfb, 0x6b, 0x77, 0x59, + 0xa2, 0xc2, 0x5f, 0xff, 0xa3, 0x04, 0x31, 0xd8, 0xe7, 0xd8, 0x2e, 0xc3, + 0x96, 0xd1, 0xcb, 0xfb, 0xfd, 0xa4, 0xee, 0xc3, 0x96, 0xfb, 0x88, 0xc6, + 0x61, 0xa6, 0x94, 0x9a, 0x08, 0xdf, 0xef, 0xb9, 0xb5, 0xbb, 0xac, 0xd1, + 0x65, 0xad, 0x23, 0x97, 0x6d, 0x53, 0x97, 0xdf, 0x55, 0xe1, 0x4d, 0x41, + 0xca, 0x29, 0x7b, 0xea, 0x8c, 0x39, 0x4b, 0x3d, 0xcd, 0x18, 0xfe, 0x17, + 0x4a, 0xa2, 0xd4, 0x44, 0x74, 0xe9, 0x74, 0x74, 0xe5, 0x80, 0x72, 0xe5, + 0x67, 0x39, 0x6d, 0xc8, 0xd5, 0x60, 0x8d, 0x2c, 0xf9, 0x9d, 0x02, 0xe4, + 0x01, 0xcb, 0xfe, 0x7e, 0x47, 0x39, 0xf4, 0x2a, 0x72, 0xff, 0x4f, 0xce, + 0xa0, 0x3e, 0x43, 0x97, 0xe8, 0xce, 0x31, 0xa3, 0x96, 0x87, 0x3d, 0xd6, + 0xcd, 0x69, 0xd1, 0x7c, 0x30, 0x97, 0xbe, 0x79, 0x48, 0x27, 0x2f, 0xe7, + 0xdc, 0x79, 0xfa, 0x72, 0xf3, 0x6d, 0xb6, 0x52, 0xff, 0xa2, 0x5c, 0xfb, + 0x71, 0x9c, 0x94, 0xfa, 0x68, 0x2f, 0xfb, 0xf7, 0xe7, 0x3c, 0x9c, 0xb6, + 0x72, 0xe8, 0xd1, 0xca, 0x0a, 0x61, 0x9d, 0x22, 0x14, 0xcd, 0x26, 0x71, + 0x3c, 0xbb, 0x85, 0x35, 0x07, 0x2f, 0xe4, 0x7d, 0x03, 0x5f, 0x9c, 0xbf, + 0xf9, 0x24, 0xfa, 0x71, 0xfd, 0x79, 0xa2, 0x97, 0xff, 0xf7, 0x53, 0xdd, + 0xcd, 0x0e, 0x33, 0xfd, 0x75, 0xe4, 0x72, 0xff, 0x44, 0xbc, 0xfd, 0x70, + 0x9c, 0xa8, 0x46, 0x86, 0x21, 0xed, 0x6e, 0xd2, 0x39, 0x69, 0x1c, 0xb4, + 0x8e, 0x54, 0x1b, 0x35, 0x44, 0x50, 0x46, 0xfe, 0xff, 0x5d, 0x79, 0x61, + 0xcb, 0xff, 0xed, 0x22, 0xf0, 0x77, 0x03, 0x81, 0xc5, 0x4e, 0x53, 0x0f, + 0xef, 0xc5, 0xd6, 0xe4, 0xe5, 0x95, 0x39, 0x6f, 0xce, 0x50, 0x9a, 0x4d, + 0x09, 0x56, 0x1f, 0xc6, 0x88, 0xbc, 0x6d, 0x76, 0x95, 0x39, 0x6c, 0x39, + 0x77, 0xe0, 0x83, 0x50, 0x11, 0x8b, 0x92, 0x0e, 0x5f, 0xc3, 0x0c, 0x18, + 0xc3, 0x97, 0x4a, 0x0e, 0x54, 0xe8, 0x82, 0x09, 0x6c, 0xc2, 0xbf, 0x95, + 0x5f, 0xff, 0xff, 0x76, 0x3d, 0xa4, 0xd6, 0xa3, 0xdd, 0x48, 0xd8, 0x18, + 0xf2, 0x97, 0x95, 0x39, 0x72, 0x72, 0x72, 0xe8, 0x61, 0xcb, 0xff, 0xf4, + 0x0f, 0xf2, 0x94, 0x7b, 0xb8, 0xc5, 0x20, 0x07, 0x2f, 0xff, 0x90, 0x7f, + 0x96, 0x6b, 0x70, 0x92, 0x7d, 0x14, 0xa9, 0x22, 0x93, 0xca, 0xd7, 0x2f, + 0xec, 0x32, 0x0d, 0x27, 0x84, 0xb4, 0x88, 0x43, 0x0d, 0x4c, 0x8c, 0xc9, + 0x54, 0xc5, 0x91, 0x6e, 0x1f, 0xce, 0xc2, 0x31, 0x90, 0x6a, 0x1b, 0x1e, + 0x40, 0xe2, 0xfc, 0xd0, 0x5d, 0x48, 0x5d, 0x5f, 0xfe, 0xfa, 0xc7, 0x97, + 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0xa3, 0x17, 0xee, 0x31, 0xb8, 0x01, 0xcb, + 0xf0, 0xb8, 0x21, 0x43, 0x97, 0xfe, 0x4e, 0x65, 0xa1, 0xcf, 0x77, 0xf3, + 0x97, 0xfc, 0x9b, 0xee, 0x60, 0xcb, 0x47, 0x2d, 0xcc, 0x8f, 0xdd, 0x68, + 0x17, 0xfe, 0x79, 0x2f, 0xa8, 0xc8, 0xda, 0xa7, 0x2d, 0xf6, 0x13, 0x2f, + 0xe9, 0x4f, 0xa1, 0x3c, 0xd9, 0x4d, 0x49, 0x9a, 0xa3, 0xb8, 0xc1, 0xd8, + 0x8c, 0xf4, 0x92, 0xad, 0x46, 0x0d, 0xe8, 0xe2, 0x6f, 0xfe, 0xfa, 0xf2, + 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x11, 0xca, 0xff, 0xf7, 0xd6, 0x3c, 0xbe, + 0xe6, 0xd6, 0xee, 0xb3, 0x44, 0xe4, 0xbf, 0xdf, 0x73, 0x6b, 0x77, 0x59, + 0xa2, 0xcc, 0x5f, 0xf4, 0xb4, 0xec, 0xfb, 0xdf, 0x00, 0xe5, 0xff, 0x70, + 0xb0, 0x71, 0x91, 0xcc, 0x30, 0xe5, 0xfe, 0xdc, 0x7b, 0xaf, 0xcc, 0x8e, + 0x5f, 0xff, 0xff, 0x44, 0xdd, 0x8f, 0x42, 0x89, 0xb9, 0xa3, 0xb9, 0xc7, + 0x3b, 0x81, 0xe3, 0x87, 0x28, 0x08, 0xb5, 0x13, 0x4b, 0xfe, 0xcd, 0x3f, + 0x80, 0xa0, 0xc8, 0xe5, 0xfe, 0xcd, 0x6f, 0x79, 0xce, 0x8e, 0x5e, 0xde, + 0x30, 0xe5, 0xf2, 0x0e, 0x68, 0xe5, 0xb3, 0xc6, 0xf3, 0x80, 0x72, 0xff, + 0xc8, 0x31, 0xa8, 0xf4, 0xf8, 0xd9, 0xcb, 0xfb, 0x6b, 0xeb, 0xa7, 0x0e, + 0x72, 0xfc, 0xe3, 0x1c, 0x7f, 0x39, 0x77, 0x2c, 0x39, 0x6f, 0xad, 0x42, + 0xa9, 0xa8, 0x87, 0xac, 0xe4, 0x52, 0x39, 0x0b, 0x83, 0x0a, 0x7f, 0x3e, + 0xe2, 0x64, 0xd0, 0xa6, 0xff, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x8b, 0x75, + 0x7f, 0x0b, 0xfd, 0xdc, 0xfd, 0x39, 0x79, 0x39, 0x01, 0xcb, 0xff, 0xb6, + 0xeb, 0x07, 0xfa, 0xf4, 0x72, 0xd9, 0xcb, 0x85, 0x53, 0x97, 0xcb, 0x77, + 0x59, 0xa2, 0x90, 0x56, 0x1e, 0x2e, 0xc5, 0xef, 0xf4, 0xbc, 0x8d, 0xe8, + 0x08, 0x72, 0xff, 0xd9, 0xd4, 0xe3, 0xdc, 0xc1, 0x59, 0xcb, 0xcf, 0x2f, + 0xa1, 0x4c, 0x83, 0x21, 0x1b, 0xc9, 0x0e, 0x8d, 0x2f, 0xf2, 0x07, 0xff, + 0x69, 0x82, 0x72, 0xf3, 0x8c, 0x8e, 0x5b, 0xea, 0xd5, 0x09, 0x6c, 0xc1, + 0x91, 0x9e, 0xba, 0xb3, 0x66, 0x97, 0xff, 0x7d, 0x79, 0x7d, 0xcd, 0xad, + 0xdd, 0x66, 0x89, 0x49, 0x53, 0xaf, 0xae, 0xcc, 0xa8, 0xc5, 0xa7, 0x41, + 0x04, 0xad, 0x61, 0x84, 0xbf, 0xa5, 0x29, 0xf0, 0x2d, 0x5f, 0xe9, 0x20, + 0xfb, 0x10, 0x27, 0x2f, 0x6b, 0xf6, 0x1c, 0xb7, 0xde, 0x4f, 0x3d, 0x0c, + 0x6f, 0x0b, 0xc8, 0xe5, 0xfb, 0x6b, 0x77, 0x59, 0xa2, 0x76, 0x5f, 0xfd, + 0x9d, 0x17, 0x97, 0xe0, 0x63, 0xc8, 0xe5, 0xe7, 0x97, 0xdc, 0x3f, 0x81, + 0x34, 0xba, 0x76, 0xb3, 0x97, 0xff, 0xe4, 0x0f, 0xec, 0x8e, 0x07, 0x08, + 0xc0, 0xe2, 0xce, 0x5f, 0xe9, 0x46, 0xe7, 0x8d, 0xce, 0x72, 0xff, 0xdd, + 0x17, 0x97, 0xe0, 0x63, 0xc8, 0xe5, 0x41, 0xfa, 0x61, 0xad, 0xbe, 0xe2, + 0x79, 0x6c, 0x84, 0x9f, 0x4c, 0xdc, 0x6c, 0x61, 0x95, 0x7f, 0xfd, 0xf5, + 0x46, 0x8e, 0x20, 0xcf, 0x40, 0xa0, 0x0e, 0x5f, 0xfc, 0xec, 0xee, 0x2d, + 0xfb, 0x0a, 0x48, 0xe5, 0xe4, 0x0b, 0x9c, 0xbf, 0xf8, 0x73, 0xaf, 0x3e, + 0x68, 0x5f, 0x93, 0x97, 0x34, 0xfa, 0x14, 0x51, 0x75, 0x13, 0x43, 0x75, + 0x25, 0x70, 0x6c, 0x8f, 0xd7, 0x4b, 0x4d, 0x21, 0xe9, 0x7f, 0xff, 0x05, + 0xfd, 0xf7, 0x35, 0x03, 0xc8, 0x35, 0xa8, 0x01, 0xcb, 0xf6, 0xd6, 0xee, + 0xb3, 0x44, 0x58, 0xbf, 0xf3, 0xcb, 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x4b, + 0xab, 0xff, 0xfb, 0x03, 0xd8, 0x53, 0xef, 0x85, 0xc1, 0xad, 0x40, 0x0a, + 0x5b, 0xee, 0x23, 0x75, 0x86, 0x8d, 0x13, 0x2f, 0xfe, 0x63, 0xcb, 0xee, + 0x6d, 0x6e, 0xeb, 0x34, 0x4c, 0x4b, 0xff, 0xec, 0x5c, 0x7d, 0xeb, 0xa3, + 0x44, 0x06, 0x04, 0xe5, 0x7d, 0x45, 0x1f, 0x54, 0xaf, 0xdb, 0x5b, 0xba, + 0xcd, 0x15, 0x4a, 0xd8, 0x72, 0xb0, 0xf1, 0x15, 0x34, 0xbf, 0xf7, 0xef, + 0xb9, 0x0e, 0x36, 0xe0, 0x39, 0x7f, 0xf3, 0xeb, 0x68, 0xdf, 0xba, 0x9b, + 0x91, 0xcb, 0xfe, 0xdb, 0xf7, 0x99, 0x67, 0xbe, 0x85, 0x10, 0x9d, 0x3f, + 0xaf, 0xa8, 0xfa, 0x78, 0x53, 0x5f, 0xfe, 0xfa, 0xc7, 0x97, 0xdc, 0xda, + 0xdd, 0xd6, 0x68, 0x9d, 0x17, 0xf9, 0x1f, 0x71, 0x27, 0xe2, 0x72, 0xfd, + 0x34, 0x4d, 0x1a, 0x39, 0x7f, 0x37, 0x89, 0xc7, 0x04, 0xe5, 0x21, 0xeb, + 0xe8, 0xa6, 0xf2, 0x76, 0x0e, 0x7d, 0x34, 0x37, 0xff, 0x7f, 0xaf, 0x47, + 0x3f, 0x7f, 0x99, 0x18, 0x72, 0x98, 0x7f, 0x1d, 0x2d, 0xbf, 0xf3, 0xcb, + 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x4e, 0xeb, 0xf7, 0xbf, 0x76, 0x21, 0x4b, + 0xff, 0x0c, 0x7b, 0x35, 0x99, 0xcc, 0x8e, 0x50, 0x53, 0xf6, 0xc8, 0xc8, + 0xd8, 0x44, 0xe9, 0x9e, 0x28, 0xbf, 0xe0, 0xc4, 0xa3, 0xeb, 0x7a, 0x01, + 0xcb, 0xfa, 0x3e, 0x80, 0x70, 0x27, 0x2b, 0xea, 0x2e, 0x71, 0x3c, 0x4f, + 0x2f, 0xff, 0x7d, 0x63, 0xcb, 0xee, 0x6d, 0x6e, 0xeb, 0x34, 0x50, 0xab, + 0xff, 0xe7, 0xf4, 0xb0, 0x50, 0x3f, 0x75, 0x3c, 0x6c, 0xe5, 0xff, 0xff, + 0xee, 0xfe, 0xc6, 0x3c, 0xbe, 0xaf, 0xbf, 0xfa, 0x07, 0x27, 0x57, 0xf8, + 0x98, 0xe5, 0xfb, 0xfe, 0x7c, 0x8b, 0x39, 0x7e, 0xc0, 0x63, 0x89, 0xcb, + 0xed, 0x23, 0x7e, 0x39, 0x7a, 0x01, 0xf6, 0x73, 0xf2, 0x12, 0xaf, 0x12, + 0xd2, 0x26, 0x68, 0x30, 0xf2, 0xbf, 0xfd, 0xf5, 0x8f, 0x2f, 0xb9, 0xb5, + 0xbb, 0xac, 0xd1, 0x49, 0x2f, 0xff, 0xf6, 0x6b, 0xea, 0x99, 0x37, 0x5d, + 0x9e, 0xec, 0x7b, 0xf6, 0x1c, 0xa8, 0x64, 0xd0, 0xcf, 0x19, 0xd4, 0xa1, + 0xb8, 0xb8, 0xd8, 0xf6, 0x52, 0xc9, 0x61, 0x20, 0x30, 0x15, 0xaf, 0x47, + 0x0b, 0xf9, 0x3b, 0x45, 0xab, 0xfd, 0xf7, 0x36, 0xb7, 0x75, 0x9a, 0x22, + 0x45, 0xff, 0xef, 0xac, 0x79, 0x7d, 0xcd, 0xad, 0xdd, 0x66, 0x89, 0x79, + 0x79, 0xa8, 0x60, 0x0e, 0x5f, 0x6f, 0xff, 0x68, 0xe5, 0xfb, 0x60, 0x62, + 0x68, 0xe5, 0xe8, 0x1e, 0x4e, 0x5f, 0xbc, 0xa3, 0x06, 0x0e, 0x59, 0x3a, + 0x78, 0x82, 0x39, 0x7f, 0xfb, 0xbc, 0x60, 0x40, 0xd7, 0x81, 0xcd, 0xf2, + 0x72, 0xe8, 0xf1, 0xcb, 0xfe, 0x79, 0xf7, 0x1c, 0xc9, 0x18, 0x72, 0xff, + 0xf7, 0xe1, 0x4d, 0xa9, 0x37, 0x07, 0xee, 0x33, 0x1c, 0xa9, 0x26, 0x2e, + 0x84, 0xc0, 0x4f, 0x11, 0x6d, 0x1d, 0x5f, 0xc0, 0xec, 0x6d, 0x18, 0x72, + 0xff, 0xd3, 0x6a, 0x38, 0xbf, 0x63, 0x99, 0x8e, 0x54, 0x1f, 0x83, 0x96, + 0xdf, 0xb2, 0x7c, 0xd3, 0x0e, 0x5f, 0xcf, 0x3b, 0xe9, 0xc0, 0x72, 0xff, + 0xe9, 0xbe, 0x28, 0x31, 0xc5, 0xf8, 0xc4, 0xc7, 0x28, 0xe5, 0xfa, 0x4f, + 0xe7, 0xe2, 0x72, 0xfc, 0xfa, 0x8e, 0x38, 0x72, 0xa6, 0x3d, 0x1e, 0x25, + 0x35, 0x08, 0xcd, 0xc4, 0xc7, 0x5c, 0xbb, 0x70, 0x72, 0x82, 0xaf, 0x95, + 0x09, 0x26, 0x8e, 0x0f, 0x70, 0xb9, 0x12, 0x0f, 0x14, 0x71, 0x87, 0xd7, + 0x01, 0x6d, 0xd8, 0x27, 0x2f, 0xef, 0x9a, 0xee, 0x27, 0x8e, 0x50, 0x4f, + 0x11, 0x05, 0x6e, 0x0f, 0x27, 0x2f, 0xe1, 0xff, 0xd3, 0x42, 0xa7, 0x2f, + 0x70, 0xe9, 0xb3, 0x96, 0x47, 0x3d, 0x1f, 0xcc, 0x2f, 0xc3, 0x93, 0xa9, + 0xc4, 0xe5, 0xf6, 0x4e, 0xa7, 0x13, 0x97, 0xe0, 0xc7, 0x21, 0x7f, 0x87, + 0xa2, 0x25, 0x77, 0xff, 0xc9, 0xbf, 0x9d, 0x84, 0xf6, 0xbf, 0x5f, 0xf0, + 0x72, 0xf9, 0x27, 0x03, 0x59, 0xcb, 0xe5, 0xbb, 0xac, 0xd1, 0x4b, 0xaf, + 0x87, 0xd1, 0xb3, 0x97, 0xfd, 0x9b, 0x6b, 0xc0, 0xe6, 0xf9, 0x39, 0x48, + 0x7b, 0xbc, 0x48, 0x6a, 0x49, 0xb3, 0xaa, 0x81, 0x32, 0x9e, 0xc9, 0xbb, + 0x08, 0xbb, 0xf8, 0x3c, 0xc6, 0xd3, 0x93, 0x97, 0xde, 0x9f, 0x1b, 0x39, + 0x48, 0x7a, 0x62, 0x5f, 0x7e, 0x45, 0x77, 0x9a, 0x39, 0x7f, 0xe8, 0x18, + 0xef, 0xcf, 0xc7, 0xf5, 0x9c, 0xbd, 0xfb, 0xe8, 0xe5, 0xf4, 0xdf, 0xbc, + 0xc7, 0x2f, 0xd0, 0x07, 0xe7, 0x47, 0x2f, 0x0a, 0x00, 0xe5, 0xec, 0xf6, + 0x8e, 0x54, 0x1b, 0x7d, 0x0d, 0xd4, 0x93, 0x2a, 0x09, 0x44, 0xc8, 0x3d, + 0x1d, 0x01, 0x2f, 0x97, 0xef, 0xcd, 0x6e, 0x21, 0xe0, 0x39, 0x74, 0x72, + 0x72, 0xff, 0x81, 0xad, 0xc7, 0x32, 0x46, 0x1c, 0xbd, 0xe7, 0xe2, 0x72, + 0xfd, 0x3f, 0xf3, 0x43, 0x59, 0xcb, 0xef, 0xe6, 0x86, 0xb3, 0x97, 0x3c, + 0xff, 0x0f, 0x56, 0x72, 0xea, 0x84, 0x6f, 0x39, 0xd7, 0xee, 0x77, 0xfc, + 0x9a, 0x99, 0x07, 0xd0, 0x03, 0x97, 0xff, 0x0f, 0xb8, 0xc6, 0xf4, 0xe3, + 0x0d, 0x67, 0x2a, 0x48, 0xae, 0x61, 0x7e, 0x8e, 0x2f, 0xf4, 0x35, 0xea, + 0x18, 0xfe, 0x39, 0x73, 0x89, 0xcb, 0xfe, 0x80, 0x7c, 0xec, 0x31, 0xc4, + 0xe5, 0x72, 0x79, 0xdc, 0x45, 0x6a, 0x48, 0xa8, 0xdc, 0x20, 0xef, 0xe8, + 0x6d, 0x3b, 0xfb, 0x59, 0xcb, 0xfb, 0x99, 0x69, 0xc7, 0x93, 0x95, 0x0a, + 0xcc, 0x64, 0x5b, 0x91, 0xd1, 0xa4, 0x36, 0x36, 0x50, 0xa1, 0x95, 0xed, + 0xc3, 0x0e, 0x5f, 0xd0, 0x33, 0x79, 0x15, 0x39, 0x7f, 0xd2, 0xcd, 0xcd, + 0x83, 0x0c, 0x39, 0x7e, 0x04, 0x2f, 0x18, 0x72, 0xff, 0x64, 0xfa, 0x89, + 0xbf, 0xd9, 0xca, 0x44, 0x4a, 0xec, 0xe0, 0x49, 0xee, 0x96, 0x1c, 0xbe, + 0xd8, 0xc3, 0x0e, 0x5e, 0x80, 0x68, 0xe5, 0x42, 0x20, 0x42, 0x5d, 0x82, + 0xcd, 0x90, 0xdf, 0x3f, 0x5e, 0x73, 0x97, 0xee, 0xfe, 0xae, 0x09, 0xcb, + 0xfc, 0xd8, 0xbf, 0xa4, 0xe1, 0x39, 0x7f, 0xd1, 0xdd, 0x3f, 0xa3, 0x7c, + 0x07, 0x2f, 0xfc, 0xc7, 0x0a, 0x93, 0x4a, 0x07, 0x93, 0x94, 0x13, 0xfc, + 0x43, 0xbb, 0xed, 0x81, 0x4e, 0x27, 0x2f, 0x23, 0x7e, 0x39, 0x5d, 0x3c, + 0x3d, 0x13, 0x54, 0xe9, 0xc0, 0x04, 0x8b, 0x92, 0x9e, 0xc2, 0xbf, 0xcc, + 0x97, 0xf8, 0x7d, 0x9a, 0x47, 0xe9, 0xcb, 0xfe, 0x02, 0x77, 0x36, 0xf3, + 0x68, 0xe5, 0xff, 0xfa, 0x24, 0x31, 0x3a, 0x93, 0x6b, 0xb9, 0xc1, 0xb0, + 0x1c, 0xbf, 0xbe, 0x33, 0x3c, 0xfe, 0x39, 0x65, 0x9c, 0xbb, 0x9d, 0x61, + 0xe0, 0x39, 0x7d, 0xe8, 0x40, 0x9c, 0xa8, 0x4d, 0x37, 0x93, 0x16, 0x1c, + 0xbc, 0x26, 0xf4, 0x5b, 0x7f, 0xb1, 0xb9, 0x26, 0xbf, 0x61, 0xcb, 0xb8, + 0xe8, 0xe5, 0xfd, 0xfe, 0xa2, 0x6f, 0xf6, 0x72, 0xfd, 0x93, 0xe7, 0x74, + 0x72, 0xa0, 0xfc, 0xba, 0x32, 0x26, 0x37, 0xb3, 0x7a, 0x39, 0x4b, 0x3c, + 0x9e, 0x25, 0xb7, 0xfc, 0x08, 0x02, 0x9c, 0x60, 0x78, 0x0e, 0x54, 0x26, + 0xa5, 0x90, 0xf0, 0x42, 0x4b, 0xff, 0xff, 0xbb, 0x1b, 0xe5, 0x69, 0xcf, + 0xc5, 0x5f, 0xe6, 0xba, 0xeb, 0x81, 0x09, 0xcb, 0xe4, 0x55, 0xa6, 0x1c, + 0xbf, 0x94, 0xf4, 0x4e, 0x3c, 0x9c, 0xbc, 0x28, 0xc3, 0x95, 0xb3, 0xef, + 0x01, 0x27, 0x8c, 0x2f, 0xf0, 0xc3, 0x8f, 0xb0, 0x4e, 0x5f, 0xe8, 0xe7, + 0x4d, 0x71, 0xb5, 0x4e, 0x5f, 0xee, 0xbc, 0xc9, 0xb8, 0x9c, 0xe5, 0xd8, + 0xc3, 0x94, 0x14, 0xf1, 0xf2, 0x1c, 0xec, 0x2f, 0xe9, 0x7b, 0x9c, 0x71, + 0x34, 0xbf, 0x70, 0x23, 0x23, 0x47, 0x2f, 0xcf, 0xc7, 0x37, 0xa3, 0x94, + 0x13, 0xd3, 0x61, 0x55, 0xfb, 0xae, 0x28, 0xc3, 0x97, 0xca, 0xcd, 0xa8, + 0x39, 0x7f, 0x03, 0x90, 0x66, 0xf0, 0xe5, 0xfc, 0xb8, 0x4f, 0x24, 0x8e, + 0x5f, 0xce, 0x06, 0x46, 0x78, 0xe5, 0x42, 0x21, 0xb0, 0xb9, 0x0b, 0x2f, + 0xf3, 0x83, 0x51, 0xd8, 0xd1, 0xcb, 0xf7, 0x3e, 0xd6, 0x4e, 0x72, 0xec, + 0x9c, 0xe5, 0x39, 0xe0, 0x89, 0x55, 0x42, 0x76, 0x58, 0x44, 0x84, 0xdd, + 0x85, 0x50, 0x96, 0xe9, 0xce, 0xe0, 0x2c, 0xe5, 0xb4, 0x72, 0xe4, 0x57, + 0x46, 0xa3, 0xf1, 0x7b, 0xc0, 0x75, 0x9c, 0xbe, 0x6e, 0x6d, 0x41, 0xcb, + 0xfb, 0x42, 0xf3, 0xc7, 0x8e, 0x5f, 0xa7, 0x7d, 0x64, 0x8e, 0x5f, 0xff, + 0x07, 0x38, 0xbe, 0xe6, 0x52, 0x4f, 0xe7, 0x61, 0xca, 0x83, 0xfb, 0x42, + 0x8b, 0xf9, 0xf9, 0x03, 0x13, 0x47, 0x2a, 0x13, 0x36, 0xe4, 0x72, 0x62, + 0x4d, 0xc2, 0xa3, 0xa4, 0x17, 0xfb, 0xc8, 0xdb, 0xcd, 0x0c, 0x39, 0x6f, + 0xad, 0x5b, 0x74, 0x71, 0x13, 0x80, 0xf3, 0xc3, 0x2e, 0x44, 0x21, 0x69, + 0xc8, 0xf7, 0xf9, 0x85, 0x2a, 0x46, 0x95, 0x34, 0xb8, 0xad, 0xb1, 0x30, + 0x73, 0xb1, 0xa2, 0x3c, 0x77, 0x80, 0x8e, 0x7c, 0x63, 0xa1, 0xd4, 0x7f, + 0x5e, 0x94, 0xc4, 0xd2, 0x10, 0x2a, 0x46, 0xc9, 0xc0, 0xa3, 0x7f, 0xbe, + 0xe6, 0xd6, 0xee, 0xb3, 0x45, 0x38, 0xbf, 0xcc, 0x86, 0x67, 0x04, 0x78, + 0xe5, 0xff, 0x93, 0x6f, 0xae, 0xe6, 0x0a, 0xce, 0x5f, 0x99, 0xbd, 0xe6, + 0x8e, 0x5f, 0xff, 0xbb, 0xff, 0xb7, 0x1e, 0xd6, 0x2f, 0x51, 0xb5, 0x9c, + 0xbf, 0xed, 0x22, 0xb9, 0x28, 0x06, 0x8e, 0x5f, 0xff, 0xde, 0xc9, 0x85, + 0x35, 0xe8, 0x51, 0x37, 0x34, 0x74, 0xe5, 0xfe, 0x46, 0x06, 0x35, 0xf8, + 0x9c, 0xbf, 0x9f, 0x9d, 0x7c, 0xd2, 0x87, 0x2f, 0xec, 0xf7, 0x32, 0x86, + 0xce, 0x5f, 0xf9, 0x39, 0xd0, 0xe0, 0x7a, 0xed, 0x9c, 0xbf, 0xfe, 0xc9, + 0xf3, 0x9f, 0x69, 0x06, 0x00, 0xec, 0x39, 0x4a, 0xa2, 0x3b, 0x47, 0xf7, + 0xfe, 0xce, 0xc6, 0xf3, 0xeb, 0x6d, 0xb6, 0x52, 0xe4, 0x6c, 0xe5, 0xd3, + 0xfd, 0x85, 0x64, 0xa1, 0x35, 0xc3, 0xc5, 0x94, 0x72, 0xae, 0x87, 0x3d, + 0x5c, 0x01, 0x98, 0x99, 0x7a, 0x17, 0xad, 0x09, 0x38, 0x10, 0xef, 0xdb, + 0x5b, 0xba, 0xcd, 0x15, 0xe2, 0xff, 0xfe, 0xc0, 0xf6, 0x14, 0xfb, 0xe1, + 0x70, 0x6b, 0x50, 0x02, 0x96, 0xfb, 0x88, 0x91, 0x68, 0x69, 0x7f, 0xf7, + 0xd7, 0x97, 0xdc, 0xda, 0xdd, 0xd6, 0x68, 0x91, 0xd7, 0x97, 0x8c, 0x39, + 0x79, 0x01, 0x07, 0x2f, 0x2f, 0x18, 0x53, 0xe9, 0x77, 0x7e, 0xda, 0xdd, + 0xd6, 0x68, 0x92, 0x17, 0xff, 0xf4, 0x26, 0xd3, 0x82, 0x06, 0x78, 0xf2, + 0x75, 0xe7, 0x39, 0x7f, 0xf8, 0x70, 0x0d, 0x33, 0x71, 0x3b, 0xed, 0x67, + 0x2e, 0x97, 0xd8, 0x4c, 0x23, 0x0b, 0x7a, 0x69, 0xe5, 0xcb, 0xf6, 0x77, + 0xee, 0x30, 0xe5, 0xbe, 0xc2, 0x76, 0x4f, 0x19, 0xff, 0x92, 0xaf, 0xfe, + 0xfa, 0xf2, 0xfb, 0x9b, 0x5b, 0xba, 0xcd, 0x12, 0x52, 0xfd, 0xb5, 0xbb, + 0xac, 0xd1, 0x78, 0xaf, 0xfa, 0x5f, 0x73, 0x6b, 0x77, 0x59, 0xa2, 0x4d, + 0x5b, 0xee, 0x1f, 0xdb, 0x9a, 0x5f, 0xd1, 0xa4, 0x64, 0x4c, 0x72, 0xdd, + 0x39, 0x4c, 0x37, 0xcd, 0x96, 0xdf, 0x90, 0x1a, 0xc1, 0x39, 0x7f, 0xf2, + 0x7e, 0xbd, 0x69, 0xf7, 0xe8, 0x54, 0xe5, 0xf4, 0xbf, 0x8e, 0x4e, 0x5f, + 0xff, 0x7e, 0xfc, 0xe6, 0x2a, 0xab, 0xcb, 0x39, 0xf1, 0xca, 0x92, 0x38, + 0xc2, 0x4d, 0x32, 0x36, 0x89, 0x2f, 0xfc, 0x90, 0xce, 0xe0, 0x42, 0x9c, + 0x9c, 0xbd, 0x2e, 0x55, 0x39, 0x7f, 0xf3, 0x81, 0x7d, 0x4d, 0x8a, 0x7b, + 0x47, 0x2e, 0x19, 0xce, 0x50, 0x4f, 0xe5, 0xc7, 0xd4, 0x43, 0xbb, 0x7e, + 0x39, 0x7e, 0xf2, 0x76, 0x38, 0x9c, 0xb8, 0x67, 0x39, 0x50, 0x78, 0x13, + 0x14, 0xdc, 0xeb, 0x39, 0x7f, 0x2c, 0x3f, 0xce, 0xa3, 0x0e, 0x54, 0x1e, + 0x46, 0x0b, 0x58, 0x4e, 0x5c, 0xa2, 0x87, 0x28, 0x06, 0xa5, 0x41, 0x0b, + 0x9a, 0x7d, 0x85, 0x6a, 0xb9, 0x18, 0x2e, 0xcf, 0xbb, 0x0b, 0x77, 0x2f, + 0xd2, 0xbf, 0x9a, 0x94, 0x49, 0xa8, 0x75, 0x10, 0x93, 0xa0, 0xca, 0xba, + 0x92, 0x0c, 0x6f, 0x09, 0x2d, 0x9a, 0x68, 0xd3, 0x98, 0x59, 0xd9, 0x40, + 0xde, 0x3d, 0xfe, 0x19, 0xea, 0x4b, 0xbb, 0xa8, 0x9d, 0x48, 0x9d, 0x9e, + 0x58, 0x64, 0xa7, 0x9a, 0x03, 0x3c, 0xc9, 0x98, 0xb7, 0xab, 0x56, 0x7f, + 0x39, 0x77, 0xd8, 0xb3, 0xcd, 0x71, 0x20, 0x94, 0xcb, 0x86, 0xb9, 0x47, + 0xb3, 0x5b, 0xf0, 0xad, 0xda, 0xea, 0x86, 0x67, 0xc9, 0x8b, 0xda, 0x6e, + 0xfb, 0xde, 0x0c, 0x30, 0x29, 0x51, 0xbc, 0x3c, 0xbd, 0xc1, 0xae, 0x71, + 0xb5, 0x5f, 0x70, 0xfa, 0xfb, 0x10, 0x7f, 0xbc, 0x1f, 0x6e, 0x34, 0xe2, + 0x06, 0xe7, 0xf4, 0x9a, 0x4e, 0x2e, 0x29, 0x49, 0xed, 0xe0, 0xb5, 0x28, + 0x14, }; -static const unsigned kPreloadedHSTSBits = 338397; +static const unsigned kPreloadedHSTSBits = 352806; -static const unsigned kHSTSRootPosition = 337778; +static const unsigned kHSTSRootPosition = 352187; #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 54c044e..a9990d3 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -208,7 +208,7 @@ // Dummy entries to test certificate pinning and expect-CT. { "name": "pinningtest.appspot.com", "include_subdomains": true, "pins": "test" }, { "name": "pinning-test.badssl.com", "include_subdomains": true, "pins": "test" }, - { "name": "expect-ct-test.badssl.com", "expect_ct": true, "expect_ct_report_uri": "https://expect-ct-test.badssl.com/report" }, + { "name": "preloaded-expect-ct.badssl.com", "expect_ct": true, "expect_ct_report_uri": "https://report.badssl.com/expect-ct" }, // (*.)google.com, iff using SSL, must use an acceptable certificate. { "name": "google.com", "include_subdomains": true, "pins": "google" }, @@ -4834,7 +4834,211 @@ { "name": "thundr.eu", "include_subdomains": true, "mode": "force-https" }, { "name": "cloudflare.com", "include_subdomains": false, "mode": "force-https" }, { "name": "www.cloudflare.com", "include_subdomains": false, "mode": "force-https" }, - { "name": "api.cloudflare.com", "include_subdomains": false, "mode": "force-https" } + { "name": "api.cloudflare.com", "include_subdomains": false, "mode": "force-https" }, + { "name": "6969.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "aaeblog.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "advancis.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ahxxm.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "anitube-nocookie.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "anitube.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "appartementhaus-badria.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "appson.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "arjandejong.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "aunali1.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avantmfg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "b3orion.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bandrcrafts.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "beaglewatch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bermeitinger.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "bettween.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bike-shack.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bildermachr.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitok.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bizcms.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "blmiller.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "boxintense.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brightstarkids.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "brightstarkids.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "brightstarkids.sg", "include_subdomains": true, "mode": "force-https" }, + { "name": "bsklabels.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "btsoft.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "budgetalk.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "burningflipside.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "casperpanel.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cfa.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "chic-leather.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chijiokeindustries.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "chun.pro", "include_subdomains": true, "mode": "force-https" }, + { "name": "cip.md", "include_subdomains": true, "mode": "force-https" }, + { "name": "citiagent.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "cmdline.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "cojo.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "concord-group.co.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "count.sh", "include_subdomains": true, "mode": "force-https" }, + { "name": "culinae.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "cvjm-memmingen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "david-schiffmann.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "decafu.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "dergeilstestammderwelt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "detteflies.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dibiphp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "disruptivelabs.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "disruptivelabs.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "divingwithnic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "doktorsitesi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dovetailnow.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dukun.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "elpo.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "englishbulgaria.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ethicalexploiting.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eurostrategy.vn.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "eveseat.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "exekutori.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "familieholme.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fastcomcorp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "felisslovakia.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ff-bad-hoehenstadt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fhcdn.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "filoo.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "flajshans.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "flat.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "florian-schlachter.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fortress.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "freeutopia.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "gosuland.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "guguke.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "hacker.one", "include_subdomains": true, "mode": "force-https" }, + { "name": "haucke.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "hdm.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "hds-lan.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "henriksen.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "hiddenmail.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "hohm.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "holifestival-freyung.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hostelinsplit.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "huaxueba.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ideadozz.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "idealsvdr.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ikvts.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "interaffairs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "isitamor.pm", "include_subdomains": true, "mode": "force-https" }, + { "name": "jamesconroyfinn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jameshost.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "johngallias.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kanna.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "kcolford.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kilobyte22.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "komoju.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kotarac.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "kotonehoko.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "kreen.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "kropkait.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "kryx.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "laserfuchs.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "lawformt.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "levinus.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "lightme.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "limeyeti.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "logopaediereinhard.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "lottosonline.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "macleod.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "masa-yoga.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mathhire.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mattwb65.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mavenclinic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "meditek-dv.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "micro-dv.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "mind-moves.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forum.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forum.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forum.gq", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forum.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forums.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forums.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraft-forums.gq", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraftforum.ovh", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraftforums.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraftforums.gq", "include_subdomains": true, "mode": "force-https" }, + { "name": "minecraftforums.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "misterl.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "mittelunsachlich.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "multigeist.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "narfation.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ne-on.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "nettefoundation.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "network-notes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "neveta.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "niftiestsoftware.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nullpoint.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "open-bs.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "oxygaming.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "oxymc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paulproell.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "peerherrmann.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "pixelcode.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "planet-work.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "posobota.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "ppmoon.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pretix.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "privacyrup.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "pt-server.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "purplemoon.mobi", "include_subdomains": true, "mode": "force-https" }, + { "name": "purplestar.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "purplestar.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "purplestar.mobi", "include_subdomains": true, "mode": "force-https" }, + { "name": "pushapp.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "pyplo.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "rentcarassist.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rmstudio.tw", "include_subdomains": true, "mode": "force-https" }, + { "name": "roave.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rotzonline.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "samaritansnet.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sandbagexpress.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "schelberts.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "selfici.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "simply-premium.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "slovakiana.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sniep.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "solsystems.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "soondy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "spacefish.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "stjohnmiami.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "streampanel.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "stuartbell.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "suche.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sveneckelmann.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "texy.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "the-construct.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thebrotherswarde.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thelocals.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "thomas-grobelny.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "tifan.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tobiassattler.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tomcort.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tonburi.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "totch.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "untoldstory.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "unun.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "valmagus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vanitas.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "vansieleghem.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vfdworld.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "viperdns.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vitalorange.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "w.wiki", "include_subdomains": true, "mode": "force-https" }, + { "name": "wevolver.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wf-hosting.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "wfh.ovh", "include_subdomains": true, "mode": "force-https" }, + { "name": "wfh.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "wiseloan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wje-online.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "wxcafe.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "xellos.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "xett.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "yecl.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "yolobert.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ys-shop.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "zooparadies.eu", "include_subdomains": true, "mode": "force-https" } ], // |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc index dd038ae6..75c7c75 100644 --- a/net/http/transport_security_state_unittest.cc +++ b/net/http/transport_security_state_unittest.cc
@@ -1553,13 +1553,13 @@ // Tests that static (preloaded) expect CT state is read correctly. TEST_F(TransportSecurityStateTest, PreloadedExpectCT) { - const char kHostname[] = "expect-ct-test.badssl.com"; + const char kHostname[] = "preloaded-expect-ct.badssl.com"; TransportSecurityState state; TransportSecurityStateTest::EnableStaticExpectCT(&state); TransportSecurityState::ExpectCTState expect_ct_state; EXPECT_TRUE(state.GetStaticExpectCTState(kHostname, &expect_ct_state)); EXPECT_EQ(kHostname, expect_ct_state.domain); - EXPECT_EQ(GURL("https://expect-ct-test.badssl.com/report"), + EXPECT_EQ(GURL("https://report.badssl.com/expect-ct"), expect_ct_state.report_uri); EXPECT_FALSE(state.GetStaticExpectCTState("pinning-test.badssl.com", &expect_ct_state));
diff --git a/net/net.gyp b/net/net.gyp index 429931e..f9d69bc 100644 --- a/net/net.gyp +++ b/net/net.gyp
@@ -358,11 +358,12 @@ 'test_data_files': [ 'data/certificate_policies_unittest/', 'data/name_constraints_unittest/', + 'data/parse_certificate_unittest/', 'data/ssl/certificates/', 'data/test.html', 'data/url_request_unittest/', + 'data/verify_certificate_chain_unittest/', 'data/verify_name_match_unittest/names/', - 'data/parse_certificate_unittest/', ], 'test_data_prefix': 'net', }, @@ -836,8 +837,8 @@ 'tools/quic/quic_simple_server_packet_writer.h', 'tools/quic/quic_spdy_client_stream.cc', 'tools/quic/quic_spdy_client_stream.h', - 'tools/quic/quic_spdy_server_stream.cc', - 'tools/quic/quic_spdy_server_stream.h', + 'tools/quic/quic_simple_server_stream.cc', + 'tools/quic/quic_simple_server_stream.h', 'tools/quic/quic_time_wait_list_manager.cc', 'tools/quic/quic_time_wait_list_manager.h', 'tools/quic/synchronous_host_resolver.cc',
diff --git a/net/net.gypi b/net/net.gypi index b8d4ce0..1606798 100644 --- a/net/net.gypi +++ b/net/net.gypi
@@ -105,6 +105,8 @@ 'cert/internal/verify_name_match.h', 'cert/internal/verify_signed_data.cc', 'cert/internal/verify_signed_data.h', + 'cert/internal/verify_certificate_chain.cc', + 'cert/internal/verify_certificate_chain.h', 'cert/pem_tokenizer.cc', 'cert/pem_tokenizer.h', 'cert/sha256_legacy_support_win.cc', @@ -1337,6 +1339,7 @@ 'cert/internal/signature_algorithm_unittest.cc', 'cert/internal/test_helpers.cc', 'cert/internal/test_helpers.h', + 'cert/internal/verify_certificate_chain_unittest.cc', 'cert/internal/verify_name_match_unittest.cc', 'cert/internal/verify_signed_data_unittest.cc', 'cert/jwk_serializer_unittest.cc', @@ -1798,7 +1801,7 @@ 'tools/quic/quic_server_test.cc', 'tools/quic/quic_simple_server_test.cc', 'tools/quic/quic_spdy_client_stream_test.cc', - 'tools/quic/quic_spdy_server_stream_test.cc', + 'tools/quic/quic_simple_server_stream_test.cc', 'tools/quic/quic_time_wait_list_manager_test.cc', 'tools/quic/spdy_balsa_utils_test.cc', 'tools/quic/test_tools/http_message.cc',
diff --git a/net/quic/congestion_control/tcp_cubic_bytes_sender.cc b/net/quic/congestion_control/tcp_cubic_bytes_sender.cc index e2d9519..078e3d4 100644 --- a/net/quic/congestion_control/tcp_cubic_bytes_sender.cc +++ b/net/quic/congestion_control/tcp_cubic_bytes_sender.cc
@@ -218,6 +218,7 @@ QuicByteCount bytes_in_flight, HasRetransmittableData has_retransmittable_data) const { if (has_retransmittable_data == NO_RETRANSMITTABLE_DATA) { + DCHECK(!FLAGS_quic_respect_send_alarm2); // For TCP we can always send an ACK immediately. return QuicTime::Delta::Zero(); }
diff --git a/net/quic/congestion_control/tcp_cubic_sender.cc b/net/quic/congestion_control/tcp_cubic_sender.cc index 4d6111f2..7563936 100644 --- a/net/quic/congestion_control/tcp_cubic_sender.cc +++ b/net/quic/congestion_control/tcp_cubic_sender.cc
@@ -231,6 +231,7 @@ QuicByteCount bytes_in_flight, HasRetransmittableData has_retransmittable_data) const { if (has_retransmittable_data == NO_RETRANSMITTABLE_DATA) { + DCHECK(!FLAGS_quic_respect_send_alarm2); // For TCP we can always send an ACK immediately. return QuicTime::Delta::Zero(); }
diff --git a/net/quic/crypto/aead_base_encrypter_nss.cc b/net/quic/crypto/aead_base_encrypter_nss.cc index 37a5c89..7b67e41a 100644 --- a/net/quic/crypto/aead_base_encrypter_nss.cc +++ b/net/quic/crypto/aead_base_encrypter_nss.cc
@@ -13,6 +13,14 @@ namespace net { +namespace { + +// The maximum size in bytes of the nonce, including 8 bytes of sequence number. +// ChaCha20 uses only the 8 byte sequence number and AES-GCM uses 12 bytes. +const size_t kMaxNonceSize = 12; + +} // namespace + AeadBaseEncrypter::AeadBaseEncrypter(CK_MECHANISM_TYPE aead_mechanism, size_t key_size, size_t auth_tag_size, @@ -23,6 +31,7 @@ nonce_prefix_size_(nonce_prefix_size) { DCHECK_LE(key_size_, sizeof(key_)); DCHECK_LE(nonce_prefix_size_, sizeof(nonce_prefix_)); + DCHECK_GE(kMaxNonceSize, nonce_prefix_size_); } AeadBaseEncrypter::~AeadBaseEncrypter() {} @@ -83,10 +92,18 @@ param.data = reinterpret_cast<unsigned char*>(&aead_params.data); param.len = aead_params.len; + if (plaintext.size() > kMaxPacketSize) { + DLOG(FATAL) << "Plaintext too large"; + return false; + } + // NSS doesn't support inplace encryption, so copy plaintext to a temporary + // buffer. + unsigned char temp_plaintext[kMaxPacketSize]; + memcpy(temp_plaintext, plaintext.data(), plaintext.size()); + unsigned int output_len; if (PK11_Encrypt(aead_key.get(), aead_mechanism_, ¶m, output, &output_len, - ciphertext_size, - reinterpret_cast<const unsigned char*>(plaintext.data()), + ciphertext_size, temp_plaintext, plaintext.size()) != SECSuccess) { DVLOG(1) << "PK11_Encrypt failed"; return false; @@ -113,10 +130,12 @@ // TODO(ianswett): Introduce a check to ensure that we don't encrypt with the // same packet number twice. const size_t nonce_size = nonce_prefix_size_ + sizeof(packet_number); - memcpy(output, nonce_prefix_, nonce_prefix_size_); - memcpy(output + nonce_prefix_size_, &packet_number, sizeof(packet_number)); - if (!Encrypt(StringPiece(output, nonce_size), associated_data, plaintext, - reinterpret_cast<unsigned char*>(output))) { + ALIGNAS(4) char nonce_buffer[kMaxNonceSize]; + memcpy(nonce_buffer, nonce_prefix_, nonce_prefix_size_); + memcpy(nonce_buffer + nonce_prefix_size_, &packet_number, + sizeof(packet_number)); + if (!Encrypt(StringPiece(nonce_buffer, nonce_size), associated_data, + plaintext, reinterpret_cast<unsigned char*>(output))) { return false; } *output_length = ciphertext_size;
diff --git a/net/quic/crypto/aead_base_encrypter_openssl.cc b/net/quic/crypto/aead_base_encrypter_openssl.cc index 91906cc2..963f8ca 100644 --- a/net/quic/crypto/aead_base_encrypter_openssl.cc +++ b/net/quic/crypto/aead_base_encrypter_openssl.cc
@@ -16,6 +16,10 @@ namespace { +// The maximum size in bytes of the nonce, including 8 bytes of sequence number. +// ChaCha20 uses only the 8 byte sequence number and AES-GCM uses 12 bytes. +const size_t kMaxNonceSize = 12; + // In debug builds only, log OpenSSL error stack. Then clear OpenSSL error // stack. void DLogOpenSslErrors() { @@ -42,6 +46,7 @@ nonce_prefix_size_(nonce_prefix_size) { DCHECK_LE(key_size_, sizeof(key_)); DCHECK_LE(nonce_prefix_size_, sizeof(nonce_prefix_)); + DCHECK_GE(kMaxNonceSize, nonce_prefix_size_); } AeadBaseEncrypter::~AeadBaseEncrypter() {} @@ -109,10 +114,12 @@ // TODO(ianswett): Introduce a check to ensure that we don't encrypt with the // same packet number twice. const size_t nonce_size = nonce_prefix_size_ + sizeof(packet_number); - memcpy(output, nonce_prefix_, nonce_prefix_size_); - memcpy(output + nonce_prefix_size_, &packet_number, sizeof(packet_number)); - if (!Encrypt(StringPiece(output, nonce_size), associated_data, plaintext, - reinterpret_cast<unsigned char*>(output))) { + ALIGNAS(4) char nonce_buffer[kMaxNonceSize]; + memcpy(nonce_buffer, nonce_prefix_, nonce_prefix_size_); + memcpy(nonce_buffer + nonce_prefix_size_, &packet_number, + sizeof(packet_number)); + if (!Encrypt(StringPiece(nonce_buffer, nonce_size), associated_data, + plaintext, reinterpret_cast<unsigned char*>(output))) { return false; } *output_length = ciphertext_size;
diff --git a/net/quic/crypto/null_encrypter.cc b/net/quic/crypto/null_encrypter.cc index 5606c99..2f70409 100644 --- a/net/quic/crypto/null_encrypter.cc +++ b/net/quic/crypto/null_encrypter.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "net/quic/crypto/null_encrypter.h" + #include "net/quic/quic_data_writer.h" #include "net/quic/quic_utils.h" @@ -34,9 +35,11 @@ uint128 hash = QuicUtils::FNV1a_128_Hash_Two( associated_data.data(), associated_data.size(), plaintext.data(), plaintext.size()); + // TODO(ianswett): memmove required for in place encryption. Placing the + // hash at the end would allow use of memcpy, doing nothing for in place. + memmove(output + GetHashLength(), plaintext.data(), plaintext.length()); QuicUtils::SerializeUint128Short(hash, reinterpret_cast<unsigned char*>(output)); - memcpy(output + GetHashLength(), plaintext.data(), plaintext.length()); *output_length = len; return true; }
diff --git a/net/quic/crypto/quic_encrypter.h b/net/quic/crypto/quic_encrypter.h index ed68233..bc127782 100644 --- a/net/quic/crypto/quic_encrypter.h +++ b/net/quic/crypto/quic_encrypter.h
@@ -39,10 +39,13 @@ // packet number, even when retransmitting a lost packet. virtual bool SetNoncePrefix(base::StringPiece nonce_prefix) = 0; - // Returns a newly created QuicData object containing the encrypted - // |plaintext| as well as a MAC over both |plaintext| and |associated_data|, - // or nullptr if there is an error. |packet_number| is appended to the - // |nonce_prefix| value provided in SetNoncePrefix() to form the nonce. + // Writes encrypted |plaintext| and a MAC over |plaintext| and + // |associated_data| into output. Sets |output_length| to the number of + // bytes written. Returns true on success or false if there was an error. + // |packet_number| is appended to the |nonce_prefix| value provided in + // SetNoncePrefix() to form the nonce. |output| must not overlap with + // |associated_data|. If |output| overlaps with |plaintext| then + // |plaintext| must be <= |output|. virtual bool EncryptPacket(QuicPacketNumber packet_number, base::StringPiece associated_data, base::StringPiece plaintext,
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc index c4a542a..5e38744 100644 --- a/net/quic/quic_connection.cc +++ b/net/quic/quic_connection.cc
@@ -710,7 +710,7 @@ return false; } - if (FLAGS_quic_respect_send_alarm && send_alarm_->IsSet()) { + if (FLAGS_quic_respect_send_alarm2 && send_alarm_->IsSet()) { send_alarm_->Cancel(); } ProcessAckFrame(incoming_ack); @@ -781,17 +781,17 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { if (incoming_ack.largest_observed > packet_generator_.packet_number()) { - DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" - << incoming_ack.largest_observed << " vs " - << packet_generator_.packet_number(); + LOG(WARNING) << ENDPOINT << "Peer's observed unsent packet:" + << incoming_ack.largest_observed << " vs " + << packet_generator_.packet_number(); // We got an error for data we have not sent. Error out. return false; } if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) { - DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" - << incoming_ack.largest_observed << " vs " - << sent_packet_manager_.largest_observed(); + LOG(WARNING) << ENDPOINT << "Peer's largest_observed packet decreased:" + << incoming_ack.largest_observed << " vs " + << sent_packet_manager_.largest_observed(); // A new ack has a diminished largest_observed value. Error out. // If this was an old packet, we wouldn't even have checked. return false; @@ -799,36 +799,35 @@ if (!incoming_ack.missing_packets.Empty() && incoming_ack.missing_packets.Max() > incoming_ack.largest_observed) { - DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " - << incoming_ack.missing_packets.Max() - << " which is greater than largest observed: " - << incoming_ack.largest_observed; + LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " + << incoming_ack.missing_packets.Max() + << " which is greater than largest observed: " + << incoming_ack.largest_observed; return false; } if (!incoming_ack.missing_packets.Empty() && incoming_ack.missing_packets.Min() < sent_packet_manager_.least_packet_awaited_by_peer()) { - DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " - << incoming_ack.missing_packets.Min() - << " which is smaller than least_packet_awaited_by_peer_: " - << sent_packet_manager_.least_packet_awaited_by_peer(); + LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " + << incoming_ack.missing_packets.Min() + << " which is smaller than least_packet_awaited_by_peer_: " + << sent_packet_manager_.least_packet_awaited_by_peer(); return false; } - if (!sent_entropy_manager_.IsValidEntropy( - incoming_ack.largest_observed, - incoming_ack.missing_packets, - incoming_ack.entropy_hash)) { - DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; + if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, + incoming_ack.missing_packets, + incoming_ack.entropy_hash)) { + LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."; return false; } if (incoming_ack.latest_revived_packet != 0 && !incoming_ack.missing_packets.Contains( incoming_ack.latest_revived_packet)) { - DLOG(ERROR) << ENDPOINT - << "Peer specified revived packet which was not missing."; + LOG(WARNING) << ENDPOINT + << "Peer specified revived packet which was not missing."; return false; } return true; @@ -1512,9 +1511,17 @@ return false; } - // If the send alarm is set, wait for it to fire. - if (FLAGS_quic_respect_send_alarm && send_alarm_->IsSet()) { - return false; + if (FLAGS_quic_respect_send_alarm2) { + // Allow acks to be sent immediately. + // TODO(ianswett): Remove retransmittable from + // SendAlgorithmInterface::TimeUntilSend. + if (retransmittable == NO_RETRANSMITTABLE_DATA) { + return true; + } + // If the send alarm is set, wait for it to fire. + if (send_alarm_->IsSet()) { + return false; + } } QuicTime now = clock_->Now(); @@ -1532,7 +1539,7 @@ << "ms"; return false; } - if (!FLAGS_quic_respect_send_alarm) { + if (!FLAGS_quic_respect_send_alarm2) { send_alarm_->Cancel(); } return true; @@ -1721,19 +1728,18 @@ CloseConnection(QUIC_PACKET_WRITE_ERROR, false); } -void QuicConnection::OnSerializedPacket( - const SerializedPacket& serialized_packet) { - if (serialized_packet.packet == nullptr) { +void QuicConnection::OnSerializedPacket(SerializedPacket* serialized_packet) { + if (serialized_packet->packet == nullptr) { // We failed to serialize the packet, so close the connection. // CloseConnection does not send close packet, so no infinite loop here. CloseConnection(QUIC_ENCRYPTION_FAILURE, false); return; } - if (serialized_packet.is_fec_packet && fec_alarm_->IsSet()) { + if (serialized_packet->is_fec_packet && fec_alarm_->IsSet()) { // If an FEC packet is serialized with the FEC alarm set, cancel the alarm. fec_alarm_->Cancel(); } - SendOrQueuePacket(QueuedPacket(serialized_packet)); + SendOrQueuePacket(QueuedPacket(*serialized_packet)); } void QuicConnection::OnResetFecGroup() { @@ -2268,7 +2274,8 @@ connection_->ack_alarm_->IsSet() || connection_->stop_waiting_count_ > 1; if (send_ack == SEND_ACK || (send_ack == BUNDLE_PENDING_ACK && ack_pending)) { DVLOG(1) << "Bundling ack with outgoing packet."; - DCHECK(send_ack == SEND_ACK || connection_->ack_frame_updated()); + DCHECK(send_ack == SEND_ACK || connection_->ack_frame_updated() || + connection_->stop_waiting_count_ > 1); connection_->SendAck(); } }
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h index c0a21b8..f59ed554 100644 --- a/net/quic/quic_connection.h +++ b/net/quic/quic_connection.h
@@ -434,7 +434,9 @@ IsHandshake handshake) override; void PopulateAckFrame(QuicAckFrame* ack) override; void PopulateStopWaitingFrame(QuicStopWaitingFrame* stop_waiting) override; - void OnSerializedPacket(const SerializedPacket& packet) override; + + // QuicPacketCreator::DelegateInterface + void OnSerializedPacket(SerializedPacket* packet) override; void OnResetFecGroup() override; // QuicSentPacketManager::NetworkChangeVisitor @@ -575,7 +577,7 @@ // as densely as possible into packets. In addition, this bundler // can be configured to ensure that an ACK frame is included in the // first packet created, if there's new ack information to be sent. - class ScopedPacketBundler { + class NET_EXPORT_PRIVATE ScopedPacketBundler { public: // In addition to all outgoing frames being bundled when the // bundler is in scope, setting |include_ack| to true ensures that
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc index cf8d3a2..ffe4f38 100644 --- a/net/quic/quic_connection_test.cc +++ b/net/quic/quic_connection_test.cc
@@ -93,7 +93,7 @@ if (max_output_length < len) { return false; } - memcpy(output, plaintext.data(), plaintext.size()); + memmove(output, plaintext.data(), plaintext.size()); output += plaintext.size(); memset(output, tag_, kTagSize); *output_length = len; @@ -460,10 +460,11 @@ QuicConnectionPeer::GetFramer(this)->EncryptPayload( ENCRYPTION_NONE, packet_number, *packet, buffer, kMaxPacketSize); delete packet; - OnSerializedPacket(SerializedPacket( + SerializedPacket serialized_packet( packet_number, PACKET_6BYTE_PACKET_NUMBER, buffer, encrypted_length, false, entropy_hash, retransmittable_frames, has_ack, - has_pending_frames, ENCRYPTION_NONE)); + has_pending_frames, ENCRYPTION_NONE); + OnSerializedPacket(&serialized_packet); } QuicConsumedData SendStreamDataWithString( @@ -1382,9 +1383,10 @@ ProcessPacket(1); // Delay sending, then queue up an ack. - EXPECT_CALL(*send_algorithm_, - TimeUntilSend(_, _, _)).WillOnce( - testing::Return(QuicTime::Delta::FromMicroseconds(1))); + if (!FLAGS_quic_respect_send_alarm2) { + EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) + .WillOnce(testing::Return(QuicTime::Delta::FromMicroseconds(1))); + } QuicConnectionPeer::SendAck(&connection_); // Process an ack with a least unacked of the received ack. @@ -2218,19 +2220,14 @@ } TEST_P(QuicConnectionTest, FramePacking) { - CongestionBlockWrites(); - // Send an ack and two stream frames in 1 packet by queueing them. - connection_.SendAck(); - EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( - IgnoreResult(InvokeWithoutArgs(&connection_, - &TestConnection::SendStreamData3)), - IgnoreResult(InvokeWithoutArgs(&connection_, - &TestConnection::SendStreamData5)))); - - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); - CongestionUnblockWrites(); - connection_.GetSendAlarm()->Fire(); + { + QuicConnection::ScopedPacketBundler bundler(&connection_, + QuicConnection::SEND_ACK); + connection_.SendStreamData3(); + connection_.SendStreamData5(); + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); + } EXPECT_EQ(0u, connection_.NumQueuedPackets()); EXPECT_FALSE(connection_.HasQueuedData()); @@ -2245,20 +2242,15 @@ } TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) { - CongestionBlockWrites(); - // Send an ack and two stream frames (one non-crypto, then one crypto) in 2 // packets by queueing them. - connection_.SendAck(); - EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( - IgnoreResult(InvokeWithoutArgs(&connection_, - &TestConnection::SendStreamData3)), - IgnoreResult(InvokeWithoutArgs(&connection_, - &TestConnection::SendCryptoStreamData)))); - - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); - CongestionUnblockWrites(); - connection_.GetSendAlarm()->Fire(); + { + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); + QuicConnection::ScopedPacketBundler bundler(&connection_, + QuicConnection::SEND_ACK); + connection_.SendStreamData3(); + connection_.SendCryptoStreamData(); + } EXPECT_EQ(0u, connection_.NumQueuedPackets()); EXPECT_FALSE(connection_.HasQueuedData()); @@ -2269,20 +2261,15 @@ } TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { - CongestionBlockWrites(); - // Send an ack and two stream frames (one crypto, then one non-crypto) in 2 // packets by queueing them. - connection_.SendAck(); - EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( - IgnoreResult(InvokeWithoutArgs(&connection_, - &TestConnection::SendCryptoStreamData)), - IgnoreResult(InvokeWithoutArgs(&connection_, - &TestConnection::SendStreamData3)))); - - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); - CongestionUnblockWrites(); - connection_.GetSendAlarm()->Fire(); + { + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); + QuicConnection::ScopedPacketBundler bundler(&connection_, + QuicConnection::SEND_ACK); + connection_.SendCryptoStreamData(); + connection_.SendStreamData3(); + } EXPECT_EQ(0u, connection_.NumQueuedPackets()); EXPECT_FALSE(connection_.HasQueuedData()); @@ -2295,20 +2282,15 @@ TEST_P(QuicConnectionTest, FramePackingFEC) { EXPECT_TRUE(QuicPacketCreatorPeer::IsFecEnabled(creator_)); - CongestionBlockWrites(); - // Queue an ack and two stream frames. Ack gets flushed when FEC is turned on // for sending protected data; two stream frames are packed in 1 packet. - EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( - IgnoreResult(InvokeWithoutArgs( - &connection_, &TestConnection::SendStreamData3WithFec)), - IgnoreResult(InvokeWithoutArgs( - &connection_, &TestConnection::SendStreamData5WithFec)))); - connection_.SendAck(); - - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); - CongestionUnblockWrites(); - connection_.GetSendAlarm()->Fire(); + { + QuicConnection::ScopedPacketBundler bundler(&connection_, + QuicConnection::SEND_ACK); + connection_.SendStreamData3WithFec(); + connection_.SendStreamData5WithFec(); + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); + } EXPECT_EQ(0u, connection_.NumQueuedPackets()); EXPECT_FALSE(connection_.HasQueuedData()); @@ -5477,7 +5459,7 @@ } TEST_P(QuicConnectionTest, ReevaluateTimeUntilSendOnAck) { - ValueRestore<bool> old_flag(&FLAGS_quic_respect_send_alarm, true); + ValueRestore<bool> old_flag(&FLAGS_quic_respect_send_alarm2, true); EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, nullptr); @@ -5510,6 +5492,12 @@ writer_->Reset(); } +TEST_P(QuicConnectionTest, SendAcksImmediately) { + FLAGS_quic_respect_send_alarm2 = true; + CongestionBlockWrites(); + SendAckPacketToPeer(); +} + TEST_P(QuicConnectionTest, SendingUnencryptedStreamDataFails) { FLAGS_quic_never_write_unencrypted_data = true; EXPECT_CALL(visitor_,
diff --git a/net/quic/quic_flags.cc b/net/quic/quic_flags.cc index 6b32eb09..39296bbd 100644 --- a/net/quic/quic_flags.cc +++ b/net/quic/quic_flags.cc
@@ -72,9 +72,6 @@ // TcpLossAlgorithm or TimeLossAlgorithm. bool FLAGS_quic_general_loss_algorithm = true; -// If true, use the unrolled prefetch path in QuicPacketCreator::CopyToBuffer. -bool FLAGS_quic_packet_creator_prefetch = false; - // If true, only migrate QUIC connections when client address changes are // considered to be caused by NATs. bool FLAGS_quic_disable_non_nat_address_migration = true; @@ -88,7 +85,7 @@ bool FLAGS_quic_use_stream_sequencer_buffer = true; // If true, don't send QUIC packets if the send alarm is set. -bool FLAGS_quic_respect_send_alarm = true; +bool FLAGS_quic_respect_send_alarm2 = true; // If ture, sets callback pointer to nullptr after calling Cancel() in // QuicCryptoServerStream::CancelOutstandingCallbacks. @@ -130,3 +127,6 @@ // If true, use the new write blocked list for QUIC. bool FLAGS_quic_new_blocked_list = true; + +// If true, use inplace encryption for QUIC. +bool FLAGS_quic_inplace_encryption = true;
diff --git a/net/quic/quic_flags.h b/net/quic/quic_flags.h index 39dd46d..be172a18 100644 --- a/net/quic/quic_flags.h +++ b/net/quic/quic_flags.h
@@ -24,11 +24,10 @@ NET_EXPORT_PRIVATE extern bool FLAGS_quic_measure_headers_hol_blocking_time; NET_EXPORT_PRIVATE extern bool FLAGS_quic_disable_pacing; NET_EXPORT_PRIVATE extern bool FLAGS_quic_general_loss_algorithm; -NET_EXPORT_PRIVATE extern bool FLAGS_quic_packet_creator_prefetch; NET_EXPORT_PRIVATE extern bool FLAGS_quic_disable_non_nat_address_migration; NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_new_idle_timeout; NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_stream_sequencer_buffer; -NET_EXPORT_PRIVATE extern bool FLAGS_quic_respect_send_alarm; +NET_EXPORT_PRIVATE extern bool FLAGS_quic_respect_send_alarm2; NET_EXPORT_PRIVATE extern bool FLAGS_quic_set_client_hello_cb_nullptr; NET_EXPORT_PRIVATE extern bool FLAGS_quic_track_single_retransmission; NET_EXPORT_PRIVATE extern bool FLAGS_quic_batch_writes; @@ -40,4 +39,5 @@ NET_EXPORT_PRIVATE extern bool FLAGS_quic_distinguish_incoming_outgoing_streams; NET_EXPORT_PRIVATE extern bool FLAGS_quic_validate_stk_without_scid; NET_EXPORT_PRIVATE extern bool FLAGS_quic_new_blocked_list; +NET_EXPORT_PRIVATE extern bool FLAGS_quic_inplace_encryption; #endif // NET_QUIC_QUIC_FLAGS_H_
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index bbb11668..fa5503a 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc
@@ -114,7 +114,7 @@ factory->AddSocketDataProvider(socket_data_.get()); } - void CompleteRead() { socket_data_->CompleteRead(); } + void Resume() { socket_data_->Resume(); } private: std::vector<QuicEncryptedPacket*> packets_; @@ -501,7 +501,7 @@ mock_quic_data.AddRead( ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); - mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read + mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -570,7 +570,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -607,7 +607,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); + mock_quic_data.AddRead(ASYNC, 0); mock_quic_data.AddSocketDataToFactory(&socket_factory_); scoped_refptr<X509Certificate> cert( @@ -701,7 +701,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -736,7 +736,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -798,7 +798,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -832,7 +832,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -866,7 +866,6 @@ mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -883,7 +882,7 @@ SendRequestAndExpectHttpResponse("hello world"); SendRequestAndExpectQuicResponse("hello!"); - mock_quic_data.CompleteRead(); + mock_quic_data.Resume(); EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( alternative_service)); @@ -911,7 +910,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1022,7 +1021,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1059,7 +1058,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1096,7 +1095,6 @@ mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1116,7 +1114,7 @@ SendRequestAndExpectHttpResponse("hello world"); SendRequestAndExpectQuicResponse("hello!"); - mock_quic_data.CompleteRead(); + mock_quic_data.Resume(); EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( alternative_service)); @@ -1144,7 +1142,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1226,7 +1224,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1262,7 +1260,7 @@ mock_quic_data.AddRead( ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); - mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); + mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data.AddSocketDataToFactory(&socket_factory_); scoped_refptr<X509Certificate> cert( @@ -1345,11 +1343,9 @@ socket_factory.AddSSLSocketDataProvider(&ssl_data_); // The QUIC transaction will not be allowed to complete. - MockWrite quic_writes[] = { - MockWrite(ASYNC, ERR_IO_PENDING, 0) - }; + MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 0)}; MockRead quic_reads[] = { - MockRead(ASYNC, ERR_IO_PENDING, 1), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1), }; DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes, arraysize(quic_writes)); @@ -1392,7 +1388,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -1417,7 +1413,7 @@ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read - mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF + mock_quic_data.AddRead(ASYNC, 0); // EOF mock_quic_data.AddSocketDataToFactory(&socket_factory_); // In order for a new QUIC session to be established via alternate-protocol @@ -1490,7 +1486,7 @@ mock_quic_data.AddRead( ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); - mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read + mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read mock_quic_data.AddSocketDataToFactory(&socket_factory_); // The non-alternate protocol job needs to hang in order to guarantee that @@ -1767,7 +1763,7 @@ TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) { // Alternate-protocol job MockRead quic_reads[] = { - MockRead(ASYNC, ERR_IO_PENDING), + MockRead(SYNCHRONOUS, ERR_IO_PENDING), }; StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr, 0);
diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc index 7c1cade..6c2dd3e 100644 --- a/net/quic/quic_packet_creator.cc +++ b/net/quic/quic_packet_creator.cc
@@ -266,9 +266,17 @@ MaybeStartFecProtection(); } CreateStreamFrame(id, iov, iov_offset, offset, fin, frame); - bool success = AddFrame(*frame, - /*save_retransmittable_frames=*/true, needs_padding); + bool success = AddFrame(*frame, /*save_retransmittable_frames=*/true); + if (needs_padding) { + needs_padding_ = true; + } DCHECK(success); + if (fec_protection == MUST_FEC_PROTECT && + iov_offset + frame->stream_frame->frame_length == iov.total_length) { + // Turn off FEC protection when we're done writing protected data. + DVLOG(1) << "Turning FEC protection OFF"; + should_fec_protect_next_packet_ = false; + } return true; } @@ -347,54 +355,43 @@ } DCHECK_LE(iovnum, iov.iov_count); DCHECK_LE(iov_offset, iov.iov[iovnum].iov_len); - if (FLAGS_quic_packet_creator_prefetch) { - if (iovnum >= iov.iov_count || length == 0) { - return; - } + if (iovnum >= iov.iov_count || length == 0) { + return; + } - // Unroll the first iteration that handles iov_offset. - const size_t iov_available = iov.iov[iovnum].iov_len - iov_offset; - size_t copy_len = min(length, iov_available); + // Unroll the first iteration that handles iov_offset. + const size_t iov_available = iov.iov[iovnum].iov_len - iov_offset; + size_t copy_len = min(length, iov_available); - // Try to prefetch the next iov if there is at least one more after the - // current. Otherwise, it looks like an irregular access that the hardware - // prefetcher won't speculatively prefetch. Only prefetch one iov because - // generally, the iov_offset is not 0, input iov consists of 2K buffers and - // the output buffer is ~1.4K. - if (copy_len == iov_available && iovnum + 1 < iov.iov_count) { - // TODO(ckrasic) - this is unused without prefetch() - // char* next_base = static_cast<char*>(iov.iov[iovnum + 1].iov_base); - // Prefetch 2 cachelines worth of data to get the prefetcher started; - // leave it to the hardware prefetcher after that. + // Try to prefetch the next iov if there is at least one more after the + // current. Otherwise, it looks like an irregular access that the hardware + // prefetcher won't speculatively prefetch. Only prefetch one iov because + // generally, the iov_offset is not 0, input iov consists of 2K buffers and + // the output buffer is ~1.4K. + if (copy_len == iov_available && iovnum + 1 < iov.iov_count) { + // TODO(ckrasic) - this is unused without prefetch() + // char* next_base = static_cast<char*>(iov.iov[iovnum + 1].iov_base); + // char* next_base = static_cast<char*>(iov.iov[iovnum + 1].iov_base); + // Prefetch 2 cachelines worth of data to get the prefetcher started; leave + // it to the hardware prefetcher after that. + // TODO(ckrasic) - investigate what to do about prefetch directives. + // prefetch(next_base, PREFETCH_HINT_T0); + if (iov.iov[iovnum + 1].iov_len >= 64) { // TODO(ckrasic) - investigate what to do about prefetch directives. - // prefetch(next_base, PREFETCH_HINT_T0); - if (iov.iov[iovnum + 1].iov_len >= 64) { - // TODO(ckrasic) - investigate what to do about prefetch directives. - // prefetch(next_base + CACHELINE_SIZE, PREFETCH_HINT_T0); - } + // prefetch(next_base + CACHELINE_SIZE, PREFETCH_HINT_T0); } + } - const char* src = static_cast<char*>(iov.iov[iovnum].iov_base) + iov_offset; - while (true) { - memcpy(buffer, src, copy_len); - length -= copy_len; - buffer += copy_len; - if (length == 0 || ++iovnum >= iov.iov_count) { - break; - } - src = static_cast<char*>(iov.iov[iovnum].iov_base); - copy_len = min(length, iov.iov[iovnum].iov_len); + const char* src = static_cast<char*>(iov.iov[iovnum].iov_base) + iov_offset; + while (true) { + memcpy(buffer, src, copy_len); + length -= copy_len; + buffer += copy_len; + if (length == 0 || ++iovnum >= iov.iov_count) { + break; } - } else { - while (iovnum < iov.iov_count && length > 0) { - const size_t copy_len = min(length, iov.iov[iovnum].iov_len - iov_offset); - memcpy(buffer, static_cast<char*>(iov.iov[iovnum].iov_base) + iov_offset, - copy_len); - iov_offset = 0; - length -= copy_len; - buffer += copy_len; - ++iovnum; - } + src = static_cast<char*>(iov.iov[iovnum].iov_base); + copy_len = min(length, iov.iov[iovnum].iov_len); } LOG_IF(DFATAL, length > 0) << "Failed to copy entire length to buffer."; } @@ -444,7 +441,7 @@ LOG_IF(DFATAL, frames.empty()) << "Attempt to serialize empty packet"; for (const QuicFrame& frame : frames) { - bool success = AddFrame(frame, false, false); + bool success = AddFrame(frame, false); DCHECK(success); } SerializedPacket packet = SerializePacket(buffer, buffer_len); @@ -462,7 +459,29 @@ ALIGNAS(64) char seralized_packet_buffer[kMaxPacketSize]; SerializedPacket serialized_packet = SerializePacket(seralized_packet_buffer, kMaxPacketSize); - delegate_->OnSerializedPacket(&serialized_packet); + OnSerializedPacket(&serialized_packet); +} + +void QuicPacketCreator::OnSerializedPacket(SerializedPacket* packet) { + if (packet->packet == nullptr) { + LOG(DFATAL) << "Failed to SerializePacket. fec_policy:" << fec_send_policy() + << " should_fec_protect_:" << should_fec_protect_next_packet_; + delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false); + return; + } + // There may be AckListeners interested in this packet. + packet->listeners.swap(ack_listeners_); + DCHECK(ack_listeners_.empty()); + delegate_->OnSerializedPacket(packet); + has_ack_ = false; + has_stop_waiting_ = false; + MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/false, + /*is_fec_timeout=*/false); + // Maximum packet size may be only enacted while no packet is currently being + // constructed, so here we have a good opportunity to actually change it. + if (CanSetMaxPacketLength()) { + SetMaxPacketLength(max_packet_length_); + } } bool QuicPacketCreator::HasPendingFrames() const { @@ -507,15 +526,21 @@ } bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { - return AddFrame(frame, - /*save_retransmittable_frames=*/true, - /*needs_padding=*/false); + return AddFrame(frame, /*save_retransmittable_frames=*/true); } bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { - return AddFrame(frame, - /*save_retransmittable_frames=*/true, - /*needs_padding=*/true); + if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { + needs_padding_ = true; + return true; + } + return false; +} + +void QuicPacketCreator::AddAckListener(QuicAckListenerInterface* listener, + QuicPacketLength length) { + DCHECK(!queued_frames_.empty()); + ack_listeners_.push_back(AckListenerWrapper(listener, length)); } SerializedPacket QuicPacketCreator::SerializePacket( @@ -542,40 +567,71 @@ bool possibly_truncated_by_length = packet_size_ == max_plaintext_size_ && queued_frames_.size() == 1 && queued_frames_.back().type == ACK_FRAME; - // The optimized encryption algorithm implementations run faster when - // operating on aligned memory. - // TODO(rtenneti): Change the default 64 alignas value (used the default - // value from CACHELINE_SIZE). - ALIGNAS(64) char buffer[kMaxPacketSize]; // Use the packet_size_ instead of the buffer size to ensure smaller // packet sizes are properly used. - size_t length = - framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_); - if (length == 0) { - LOG(DFATAL) << "Failed to serialize " << queued_frames_.size() - << " frames."; - return NoPacket(); - } + size_t encrypted_length = 0u; + if (FLAGS_quic_inplace_encryption) { + size_t length = framer_->BuildDataPacket(header, queued_frames_, + encrypted_buffer, packet_size_); + if (length == 0) { + LOG(DFATAL) << "Failed to serialize " << queued_frames_.size() + << " frames."; + return NoPacket(); + } - // TODO(ianswett) Consider replacing QuicPacket with something else, - // since it's only used to provide convenience methods to FEC and encryption. - QuicPacket packet(buffer, length, - /* owns_buffer */ false, - header.public_header.connection_id_length, - header.public_header.version_flag, - header.public_header.packet_number_length); - OnBuiltFecProtectedPayload(header, packet.FecProtectedData()); + // TODO(ianswett) Consider replacing QuicPacket with something else, since + // it's only used to provide convenience methods to FEC and encryption. + QuicPacket packet(encrypted_buffer, length, + /* owns_buffer */ false, + header.public_header.connection_id_length, + header.public_header.version_flag, + header.public_header.packet_number_length); + OnBuiltFecProtectedPayload(header, packet.FecProtectedData()); - // Because of possible truncation, we can't be confident that our - // packet size calculation worked correctly. - if (!possibly_truncated_by_length) { - DCHECK_EQ(packet_size_, length); + // Because of possible truncation, we can't be confident that our + // packet size calculation worked correctly. + if (!possibly_truncated_by_length) { + DCHECK_EQ(packet_size_, length); + } + // Immediately encrypt the packet, to ensure we don't encrypt the same + // packet number multiple times. + encrypted_length = + framer_->EncryptPayload(encryption_level_, packet_number_, packet, + encrypted_buffer, encrypted_buffer_len); + } else { + // The optimized encryption algorithm implementations run faster when + // operating on aligned memory. + // TODO(rtenneti): Change the default 64 alignas value (used the default + // value from CACHELINE_SIZE). + ALIGNAS(64) char buffer[kMaxPacketSize]; + size_t length = + framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_); + if (length == 0) { + LOG(DFATAL) << "Failed to serialize " << queued_frames_.size() + << " frames."; + return NoPacket(); + } + + // TODO(ianswett) Consider replacing QuicPacket with something else, since + // it's only used to provide convenience methods to FEC and encryption. + QuicPacket packet(buffer, length, + /* owns_buffer */ false, + header.public_header.connection_id_length, + header.public_header.version_flag, + header.public_header.packet_number_length); + OnBuiltFecProtectedPayload(header, packet.FecProtectedData()); + + // Because of possible truncation, we can't be confident that our + // packet size calculation worked correctly. + if (!possibly_truncated_by_length) { + DCHECK_EQ(packet_size_, length); + } + // Immediately encrypt the packet, to ensure we don't encrypt the same + // packet number multiple times. + encrypted_length = + framer_->EncryptPayload(encryption_level_, packet_number_, packet, + encrypted_buffer, encrypted_buffer_len); } - // Immediately encrypt the packet, to ensure we don't encrypt the same packet - // packet number multiple times. - size_t encrypted_length = - framer_->EncryptPayload(encryption_level_, packet_number_, packet, - encrypted_buffer, encrypted_buffer_len); if (encrypted_length == 0) { LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_; return NoPacket(); @@ -589,10 +645,6 @@ queued_retransmittable_frames_->set_needs_padding(needs_padding_); } - const bool has_ack = has_ack_; - const bool has_stop_waiting = has_stop_waiting_; - has_ack_ = false; - has_stop_waiting_ = false; packet_size_ = 0; queued_frames_.clear(); needs_padding_ = false; @@ -600,7 +652,7 @@ header.packet_number, header.public_header.packet_number_length, encrypted_buffer, encrypted_length, /* owns_buffer*/ false, QuicFramer::GetPacketEntropyHash(header), - queued_retransmittable_frames_.release(), has_ack, has_stop_waiting, + queued_retransmittable_frames_.release(), has_ack_, has_stop_waiting_, encryption_level_); } @@ -683,8 +735,7 @@ } bool QuicPacketCreator::AddFrame(const QuicFrame& frame, - bool save_retransmittable_frames, - bool needs_padding) { + bool save_retransmittable_frames) { DVLOG(1) << "Adding frame: " << frame; InFecGroup is_in_fec_group = MaybeUpdateLengthsAndStartFec(); @@ -714,9 +765,6 @@ if (frame.type == STOP_WAITING_FRAME) { has_stop_waiting_ = true; } - if (needs_padding) { - needs_padding_ = true; - } if (debug_delegate_ != nullptr) { debug_delegate_->OnFrameAddedToPacket(frame); } @@ -734,7 +782,7 @@ return; } - bool success = AddFrame(QuicFrame(QuicPaddingFrame()), false, false); + bool success = AddFrame(QuicFrame(QuicPaddingFrame()), false); DCHECK(success); } @@ -764,7 +812,7 @@ ALIGNAS(64) char seralized_fec_buffer[kMaxPacketSize]; SerializedPacket serialized_fec = SerializeFec(seralized_fec_buffer, kMaxPacketSize); - delegate_->OnSerializedPacket(&serialized_fec); + OnSerializedPacket(&serialized_fec); } }
diff --git a/net/quic/quic_packet_creator.h b/net/quic/quic_packet_creator.h index f06e55a6e..9d23338 100644 --- a/net/quic/quic_packet_creator.h +++ b/net/quic/quic_packet_creator.h
@@ -38,8 +38,11 @@ public: virtual ~DelegateInterface() {} // Called when a packet is serialized. Delegate does not take the ownership - // of |serialized_packet|. + // of |serialized_packet|, but may take ownership of |packet.packet| + // and |packet.retransmittable_frames|. If it does so, they must be set + // to nullptr. virtual void OnSerializedPacket(SerializedPacket* serialized_packet) = 0; + virtual void CloseConnection(QuicErrorCode error, bool from_peer) = 0; // Called when current FEC group is reset (closed). virtual void OnResetFecGroup() = 0; }; @@ -177,6 +180,12 @@ // Identical to AddSavedFrame, but allows the frame to be padded. bool AddPaddedSavedFrame(const QuicFrame& frame); + // Adds |listener| to the next serialized packet and notifies the + // std::listener + // with |length| as the number of acked bytes. + void AddAckListener(QuicAckListenerInterface* listener, + QuicPacketLength length); + // Creates a version negotiation packet which supports |supported_versions|. // Caller owns the created packet. Also, sets the entropy hash of the // serialized packet to a random bool and returns that value as a member of @@ -260,14 +269,6 @@ rtt_multiplier_for_fec_timeout_ = rtt_multiplier_for_fec_timeout; } - bool should_fec_protect_next_packet() { - return should_fec_protect_next_packet_; - } - - void set_should_fec_protect_next_packet(bool should_fec_protect_next_packet) { - should_fec_protect_next_packet_ = should_fec_protect_next_packet; - } - void set_debug_delegate(DebugDelegate* debug_delegate) { debug_delegate_ = debug_delegate; } @@ -311,13 +312,10 @@ bool fec_flag, QuicPacketHeader* header); - // Allows a frame to be added without creating retransmittable frames. - // Particularly useful for retransmits using SerializeAllFrames(). - // If current open packet cannot accommodate |frame|, returns false and - // flushes all pending frames. - bool AddFrame(const QuicFrame& frame, - bool save_retransmittable_frames, - bool needs_padding); + // Adds a |frame| if there is space and returns false and flushes all pending + // frames if there isn't room. If |save_retransmittable_frames| is true, + // saves the |frame| in the next SerializedPacket. + bool AddFrame(const QuicFrame& frame, bool save_retransmittable_frames); // Adds a padding frame to the current packet only if the current packet // contains a handshake message, and there is sufficient room to fit a @@ -334,6 +332,10 @@ // Fails if |buffer_len| isn't long enough for the encrypted packet. SerializedPacket SerializePacket(char* encrypted_buffer, size_t buffer_len); + // Called after a new SerialiedPacket is created to call the delegate's + // OnSerializedPacket, reset state, and potentially flush FEC groups. + void OnSerializedPacket(SerializedPacket* packet); + // Turn on FEC protection for subsequent packets. If no FEC group is currently // open, this method flushes current open packet and then turns FEC on. void MaybeStartFecProtection(); @@ -412,6 +414,9 @@ scoped_ptr<RetransmittableFrames> queued_retransmittable_frames_; // If true, the packet will be padded up to |max_packet_length_|. bool needs_padding_; + // Stores ack std::listeners that should be attached to the next packet. + std::list<AckListenerWrapper> ack_listeners_; + // FEC policy that specifies when to send FEC packet. FecSendPolicy fec_send_policy_; // Timeout used for FEC alarm. Can be set to zero initially or if the SRTT has
diff --git a/net/quic/quic_packet_creator_test.cc b/net/quic/quic_packet_creator_test.cc index f5a490d..fa4117f 100644 --- a/net/quic/quic_packet_creator_test.cc +++ b/net/quic/quic_packet_creator_test.cc
@@ -38,25 +38,21 @@ struct TestParams { TestParams(QuicVersion version, bool version_serialization, - QuicConnectionIdLength length, - bool copy_use_prefetch) + QuicConnectionIdLength length) : version(version), connection_id_length(length), - version_serialization(version_serialization), - copy_use_prefetch(copy_use_prefetch) {} + version_serialization(version_serialization) {} friend ostream& operator<<(ostream& os, const TestParams& p) { os << "{ client_version: " << QuicVersionToString(p.version) << " connection id length: " << p.connection_id_length - << " include version: " << p.version_serialization - << " copy use prefetch: " << p.copy_use_prefetch << " }"; + << " include version: " << p.version_serialization << " }"; return os; } QuicVersion version; QuicConnectionIdLength connection_id_length; bool version_serialization; - bool copy_use_prefetch; }; // Constructs various test permutations. @@ -65,16 +61,16 @@ QuicConnectionIdLength max = PACKET_8BYTE_CONNECTION_ID; QuicVersionVector all_supported_versions = QuicSupportedVersions(); for (size_t i = 0; i < all_supported_versions.size(); ++i) { - params.push_back(TestParams(all_supported_versions[i], true, max, false)); - params.push_back(TestParams(all_supported_versions[i], false, max, false)); + params.push_back(TestParams(all_supported_versions[i], true, max)); + params.push_back(TestParams(all_supported_versions[i], false, max)); } - params.push_back(TestParams(all_supported_versions[0], true, - PACKET_0BYTE_CONNECTION_ID, false)); - params.push_back(TestParams(all_supported_versions[0], true, - PACKET_1BYTE_CONNECTION_ID, false)); - params.push_back(TestParams(all_supported_versions[0], true, - PACKET_4BYTE_CONNECTION_ID, false)); - params.push_back(TestParams(all_supported_versions[0], true, max, true)); + params.push_back( + TestParams(all_supported_versions[0], true, PACKET_0BYTE_CONNECTION_ID)); + params.push_back( + TestParams(all_supported_versions[0], true, PACKET_1BYTE_CONNECTION_ID)); + params.push_back( + TestParams(all_supported_versions[0], true, PACKET_4BYTE_CONNECTION_ID)); + params.push_back(TestParams(all_supported_versions[0], true, max)); return params; } @@ -85,6 +81,7 @@ MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); MOCK_METHOD0(OnResetFecGroup, void()); + MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); private: DISALLOW_COPY_AND_ASSIGN(MockDelegate); @@ -130,7 +127,6 @@ client_framer_.set_visitor(&framer_visitor_); client_framer_.set_received_entropy_calculator(&entropy_calculator_); server_framer_.set_visitor(&framer_visitor_); - FLAGS_quic_packet_creator_prefetch = GetParam().copy_use_prefetch; } ~QuicPacketCreatorTest() override {} @@ -503,7 +499,6 @@ EXPECT_CALL(delegate_, OnSerializedPacket(_)) .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); // Turn off FEC protection. - creator_.set_should_fec_protect_next_packet(false); creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, /*is_fec_timeout=*/false); EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, @@ -708,7 +703,6 @@ EXPECT_CALL(delegate_, OnSerializedPacket(_)) .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); // Turn off FEC protection. - creator_.set_should_fec_protect_next_packet(false); creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, /*is_fec_timeout=*/false); EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); @@ -834,11 +828,11 @@ size_t bytes_free = delta > 0 ? 0 : 0 - delta; QuicFrame frame; QuicIOVector io_vector(MakeIOVector(data)); - size_t bytes_consumed = QuicPacketCreatorPeer::CreateStreamFrame( - &creator_, kClientDataStreamId1, io_vector, 0u, kOffset, false, &frame); - EXPECT_EQ(capacity - bytes_free, bytes_consumed); + ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, + kOffset, false, false, &frame, + MAY_FEC_PROTECT)); + ASSERT_TRUE(frame.stream_frame); - ASSERT_TRUE(creator_.AddSavedFrame(frame)); // BytesFree() returns bytes available for the next frame, which will // be two bytes smaller since the stream frame would need to be grown. EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); @@ -861,6 +855,7 @@ ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, MUST_FEC_PROTECT)); EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); + // Serialize the packet. EXPECT_CALL(delegate_, OnSerializedPacket(_)) .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); @@ -876,19 +871,27 @@ size_t bytes_free = delta > 0 ? 0 : 0 - delta; QuicFrame frame; QuicIOVector io_vector(MakeIOVector(data)); - size_t bytes_consumed = QuicPacketCreatorPeer::CreateStreamFrame( - &creator_, kClientDataStreamId1, io_vector, 0u, kOffset, false, &frame); - EXPECT_EQ(capacity - bytes_free, bytes_consumed); - - ASSERT_TRUE(creator_.AddSavedFrame(frame)); + ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, + kOffset, false, false, &frame, + MUST_FEC_PROTECT)); + ASSERT_TRUE(frame.stream_frame); // BytesFree() returns bytes available for the next frame. Since stream // frame does not grow for FEC protected packets, this should be the same // as bytes_free (bound by 0). EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; - EXPECT_CALL(delegate_, OnSerializedPacket(_)) - .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); + { + InSequence s; + EXPECT_CALL(delegate_, OnSerializedPacket(_)) + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); + // Every 6th packet will generate an extra FEC packet. + if (delta == -1 || delta == 5) { + EXPECT_CALL(delegate_, OnSerializedPacket(_)) + .WillOnce( + Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); + } + } creator_.Flush(); ASSERT_TRUE(serialized_packet_.packet); ClearSerializedPacket(&serialized_packet_); @@ -1280,10 +1283,9 @@ // not fire. EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); creator_.set_fec_send_policy(FEC_ALARM_TRIGGER); - creator_.set_should_fec_protect_next_packet(true); creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, /*is_fec_timeout=*/false); - EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); + EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); EXPECT_FALSE(creator_.IsFecGroupOpen()); // We do not have enough packets in the FEC group to trigger an FEC packet. EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); @@ -1319,7 +1321,6 @@ creator_.set_fec_send_policy(FEC_ANY_TRIGGER); EXPECT_CALL(delegate_, OnSerializedPacket(_)) .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); - creator_.set_should_fec_protect_next_packet(false); creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, /*is_fec_timeout=*/false); ASSERT_EQ(3u, serialized_packet_.packet_number); @@ -1350,7 +1351,6 @@ // not fire. EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); creator_.set_fec_send_policy(FEC_ALARM_TRIGGER); - creator_.set_should_fec_protect_next_packet(true); creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, /*is_fec_timeout=*/false); EXPECT_FALSE(creator_.IsFecGroupOpen()); @@ -1452,7 +1452,7 @@ EXPECT_EQ(0u, creator_.packet_number()); EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); - EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); + EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); // Change current path back. creator_.SetCurrentPath(kDefaultPathId, 3, 2);
diff --git a/net/quic/quic_packet_generator.cc b/net/quic/quic_packet_generator.cc index c5d5f4a..094355f 100644 --- a/net/quic/quic_packet_generator.cc +++ b/net/quic/quic_packet_generator.cc
@@ -21,7 +21,7 @@ QuicRandom* random_generator, DelegateInterface* delegate) : delegate_(delegate), - packet_creator_(connection_id, framer, random_generator, this), + packet_creator_(connection_id, framer, random_generator, delegate), batch_mode_(false), should_send_ack_(false), should_send_stop_waiting_(false), @@ -132,11 +132,9 @@ // A stream frame is created and added. size_t bytes_consumed = frame.stream_frame->frame_length; - if (listener != nullptr) { - ack_listeners_.push_back(AckListenerWrapper(listener, bytes_consumed)); + packet_creator_.AddAckListener(listener, bytes_consumed); } - total_bytes_consumed += bytes_consumed; fin_consumed = fin && total_bytes_consumed == iov.total_length; DCHECK(total_bytes_consumed == iov.total_length || @@ -153,11 +151,6 @@ // We're done writing the data. Exit the loop. // We don't make this a precondition because we could have 0 bytes of data // if we're simply writing a fin. - if (fec_protection == MUST_FEC_PROTECT) { - // Turn off FEC protection when we're done writing protected data. - DVLOG(1) << "Turning FEC protection OFF"; - packet_creator_.set_should_fec_protect_next_packet(false); - } break; } } @@ -192,7 +185,7 @@ SetMaxPacketLength(target_mtu, /*force=*/true); const bool success = packet_creator_.AddPaddedSavedFrame(frame); if (listener != nullptr) { - ack_listeners_.push_back(AckListenerWrapper(listener, 0)); + packet_creator_.AddAckListener(listener, 0); } packet_creator_.Flush(); // The only reason AddFrame can fail is that the packet is too full to fit in @@ -376,35 +369,6 @@ packet_creator_.SetEncrypter(level, encrypter); } -void QuicPacketGenerator::OnSerializedPacket( - SerializedPacket* serialized_packet) { - if (serialized_packet->packet == nullptr) { - LOG(DFATAL) << "Failed to SerializePacket. fec_policy:" << fec_send_policy() - << " should_fec_protect_:" - << packet_creator_.should_fec_protect_next_packet(); - delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false); - return; - } - - // There may be AckListeners interested in this packet. - serialized_packet->listeners.swap(ack_listeners_); - ack_listeners_.clear(); - - delegate_->OnSerializedPacket(*serialized_packet); - packet_creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/false, - /*is_fec_timeout=*/false); - - // Maximum packet size may be only enacted while no packet is currently being - // constructed, so here we have a good opportunity to actually change it. - if (packet_creator_.CanSetMaxPacketLength()) { - packet_creator_.SetMaxPacketLength(max_packet_length_); - } -} - -void QuicPacketGenerator::OnResetFecGroup() { - delegate_->OnResetFecGroup(); -} - void QuicPacketGenerator::SetCurrentPath( QuicPathId path_id, QuicPacketNumber least_packet_awaited_by_peer,
diff --git a/net/quic/quic_packet_generator.h b/net/quic/quic_packet_generator.h index 9f12da2..cf6c961 100644 --- a/net/quic/quic_packet_generator.h +++ b/net/quic/quic_packet_generator.h
@@ -65,23 +65,18 @@ class QuicPacketGeneratorPeer; } // namespace test -class NET_EXPORT_PRIVATE QuicPacketGenerator - : public QuicPacketCreator::DelegateInterface { +class NET_EXPORT_PRIVATE QuicPacketGenerator { public: - class NET_EXPORT_PRIVATE DelegateInterface { + class NET_EXPORT_PRIVATE DelegateInterface + : public QuicPacketCreator::DelegateInterface { public: - virtual ~DelegateInterface() {} + ~DelegateInterface() override {} // Consults delegate whether a packet should be generated. virtual bool ShouldGeneratePacket(HasRetransmittableData retransmittable, IsHandshake handshake) = 0; virtual void PopulateAckFrame(QuicAckFrame* ack) = 0; virtual void PopulateStopWaitingFrame( QuicStopWaitingFrame* stop_waiting) = 0; - // Takes ownership of |packet.packet| and |packet.retransmittable_frames|. - virtual void OnSerializedPacket(const SerializedPacket& packet) = 0; - virtual void CloseConnection(QuicErrorCode error, bool from_peer) = 0; - // Called when a FEC Group is reset (closed). - virtual void OnResetFecGroup() = 0; }; QuicPacketGenerator(QuicConnectionId connection_id, @@ -89,7 +84,7 @@ QuicRandom* random_generator, DelegateInterface* delegate); - ~QuicPacketGenerator() override; + ~QuicPacketGenerator(); // Called by the connection in the event of the congestion window changing. void OnCongestionWindowChange(QuicPacketCount max_packets_in_flight); @@ -176,10 +171,6 @@ // Sets the encrypter to use for the encryption level. void SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter); - // QuicPacketCreator::DelegateInterface. - void OnSerializedPacket(SerializedPacket* serialized_packet) override; - void OnResetFecGroup() override; - // Sets the encryption level that will be applied to new packets. void set_encryption_level(EncryptionLevel level); @@ -248,9 +239,6 @@ QuicAckFrame pending_ack_frame_; QuicStopWaitingFrame pending_stop_waiting_frame_; - // Stores ack listeners that should be attached to the next packet. - std::list<AckListenerWrapper> ack_listeners_; - // Stores the maximum packet size we are allowed to send. This might not be // the maximum size we are actually using now, if we are in the middle of the // packet.
diff --git a/net/quic/quic_packet_generator_test.cc b/net/quic/quic_packet_generator_test.cc index 7b3ee58..f61cae80 100644 --- a/net/quic/quic_packet_generator_test.cc +++ b/net/quic/quic_packet_generator_test.cc
@@ -49,7 +49,7 @@ IsHandshake handshake)); MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); - MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); + MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); MOCK_METHOD0(OnResetFecGroup, void()); @@ -125,9 +125,9 @@ } } - void SavePacket(const SerializedPacket& packet) { - packets_.push_back(packet); - ASSERT_FALSE(packet.packet->owns_buffer()); + void SavePacket(SerializedPacket* packet) { + packets_.push_back(*packet); + ASSERT_FALSE(packet->packet->owns_buffer()); scoped_ptr<QuicEncryptedPacket> encrypted_deleter(packets_.back().packet); packets_.back().packet = packets_.back().packet->Clone(); }
diff --git a/net/quic/quic_session.h b/net/quic/quic_session.h index 2e7de4d8..200dd38 100644 --- a/net/quic/quic_session.h +++ b/net/quic/quic_session.h
@@ -225,7 +225,8 @@ // Return the reserved crypto stream. virtual QuicCryptoStream* GetCryptoStream() = 0; - // Adds 'stream' to the active stream map. + // Adds |stream| to the dynamic stream map. + // Takes ownership of |stream|. virtual void ActivateStream(ReliableQuicStream* stream); // Returns the stream ID for a new outgoing stream, and increments the @@ -331,7 +332,7 @@ // that create these streams. StreamMap static_stream_map_; - // Map from StreamId to pointers to streams that are owned by the caller. + // Map from StreamId to pointers to streams. Owns the streams. StreamMap dynamic_stream_map_; // The ID to use for the next outgoing stream.
diff --git a/net/quic/quic_spdy_stream.h b/net/quic/quic_spdy_stream.h index c8d2843..cae7b31 100644 --- a/net/quic/quic_spdy_stream.h +++ b/net/quic/quic_spdy_stream.h
@@ -99,8 +99,8 @@ // Writes the trailers contained in |trailer_block| to the dedicated // headers stream. Trailers will always have the FIN set. - size_t WriteTrailers(SpdyHeaderBlock trailer_block, - QuicAckListenerInterface* ack_notifier_delegate); + virtual size_t WriteTrailers(SpdyHeaderBlock trailer_block, + QuicAckListenerInterface* ack_notifier_delegate); // Marks |bytes_consumed| of the headers data as consumed. void MarkHeadersConsumed(size_t bytes_consumed);
diff --git a/net/quic/quic_write_blocked_list.h b/net/quic/quic_write_blocked_list.h index 53d3e353..869782e 100644 --- a/net/quic/quic_write_blocked_list.h +++ b/net/quic/quic_write_blocked_list.h
@@ -125,7 +125,7 @@ // If a batch write stream was set, it should only be preempted by the // crypto or headers streams. Any higher priority data stream would // *become* the new batch write stream. - if (FLAGS_quic_respect_send_alarm && FLAGS_quic_batch_writes) { + if (FLAGS_quic_respect_send_alarm2 && FLAGS_quic_batch_writes) { DCHECK(stream_id == kCryptoStreamId || stream_id == kHeadersStreamId || batch_write_stream_id_[last_priority_popped_] == 0 || bytes == 0);
diff --git a/net/quic/reliable_quic_stream_test.cc b/net/quic/reliable_quic_stream_test.cc index 57baf71d..6f722813 100644 --- a/net/quic/reliable_quic_stream_test.cc +++ b/net/quic/reliable_quic_stream_test.cc
@@ -738,7 +738,7 @@ // Receive data for the request. QuicStreamFrame frame1(stream_->id(), false, 0, StringPiece("Start")); stream_->OnStreamFrame(frame1); - // When QuicSpdyServerStream sends the response, it calls + // When QuicSimpleServerStream sends the response, it calls // ReliableQuicStream::CloseReadSide() first. ReliableQuicStreamPeer::CloseReadSide(stream_); // Send data and FIN for the response.
diff --git a/net/quic/test_tools/mock_random.cc b/net/quic/test_tools/mock_random.cc index ab71d16..ddda948e 100644 --- a/net/quic/test_tools/mock_random.cc +++ b/net/quic/test_tools/mock_random.cc
@@ -5,6 +5,7 @@ #include "net/quic/test_tools/mock_random.h" namespace net { +namespace test { MockRandom::MockRandom() : base_(0xDEADBEEF), @@ -31,4 +32,5 @@ increment_++; } +} // namespace test } // namespace net
diff --git a/net/quic/test_tools/mock_random.h b/net/quic/test_tools/mock_random.h index 44f9426..7c26ed49 100644 --- a/net/quic/test_tools/mock_random.h +++ b/net/quic/test_tools/mock_random.h
@@ -9,6 +9,7 @@ #include "net/quic/crypto/quic_random.h" namespace net { +namespace test { class MockRandom : public QuicRandom { public: @@ -35,6 +36,7 @@ DISALLOW_COPY_AND_ASSIGN(MockRandom); }; +} // namespace test } // namespace net #endif // NET_QUIC_TEST_TOOLS_MOCK_RANDOM_H_
diff --git a/net/socket/sequenced_socket_data_unittest.cc b/net/socket/sequenced_socket_data_unittest.cc index 41e7b91..e8df554 100644 --- a/net/socket/sequenced_socket_data_unittest.cc +++ b/net/socket/sequenced_socket_data_unittest.cc
@@ -194,7 +194,10 @@ void AssertSyncWriteEquals(const char* data, int len); void AssertAsyncWriteEquals(const char* data, int len); void AssertWriteReturns(const char* data, int len, int rv); - void CompleteRead(); + + bool IsPaused() const; + void Resume(); + void RunUntilPaused(); // When a given test completes, data_.at_eof() is expected to // match the value specified here. Most test should consume all @@ -314,8 +317,16 @@ ASSERT_EQ(len, write_callback_.WaitForResult()); } -void SequencedSocketDataTest::CompleteRead() { - data_->CompleteRead(); +bool SequencedSocketDataTest::IsPaused() const { + return data_->IsPaused(); +} + +void SequencedSocketDataTest::Resume() { + data_->Resume(); +} + +void SequencedSocketDataTest::RunUntilPaused() { + data_->RunUntilPaused(); } void SequencedSocketDataTest::AssertWriteReturns(const char* data, @@ -592,7 +603,7 @@ TEST_F(SequencedSocketDataTest, HangingRead) { MockRead reads[] = { - MockRead(ASYNC, ERR_IO_PENDING, 0), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0), }; Initialize(reads, arraysize(reads), nullptr, 0); @@ -608,28 +619,6 @@ ASSERT_FALSE(read_callback_.have_result()); } -TEST_F(SequencedSocketDataTest, CompleteRead) { - MockRead reads[] = { - MockRead(ASYNC, ERR_IO_PENDING, 0), MockRead(ASYNC, kMsg1, kLen1, 1), - }; - - Initialize(reads, arraysize(reads), nullptr, 0); - - AssertReadReturns(kLen1, ERR_IO_PENDING); - ASSERT_FALSE(read_callback_.have_result()); - - // Even though the read is scheduled to complete at sequence number 0, - // verify that the read callback in not called, until CompleteRead() is. - base::MessageLoop::current()->RunUntilIdle(); - ASSERT_FALSE(read_callback_.have_result()); - - CompleteRead(); - - ASSERT_TRUE(read_callback_.have_result()); - ASSERT_EQ(kLen1, read_callback_.WaitForResult()); - AssertReadBufferEquals(kMsg1, kLen1); -} - // ----------- Write TEST_F(SequencedSocketDataTest, SingleSyncWriteTooEarly) { @@ -1128,6 +1117,134 @@ base::MessageLoop::current()->RunUntilIdle(); } +// Test the basic case where a read is paused. +TEST_F(SequencedSocketDataTest, PauseAndResume_PauseRead) { + MockRead reads[] = { + MockRead(ASYNC, ERR_IO_PENDING, 0), MockRead(ASYNC, kMsg1, kLen1, 1), + }; + + Initialize(reads, arraysize(reads), nullptr, 0); + + AssertReadReturns(kLen1, ERR_IO_PENDING); + ASSERT_FALSE(read_callback_.have_result()); + + RunUntilPaused(); + ASSERT_TRUE(IsPaused()); + + // Spinning the message loop should do nothing. + base::MessageLoop::current()->RunUntilIdle(); + ASSERT_FALSE(read_callback_.have_result()); + ASSERT_TRUE(IsPaused()); + + Resume(); + ASSERT_FALSE(IsPaused()); + ASSERT_TRUE(read_callback_.have_result()); + ASSERT_EQ(kLen1, read_callback_.WaitForResult()); + AssertReadBufferEquals(kMsg1, kLen1); +} + +// Test the case where a read that will be paused is started before write that +// completes before the pause. +TEST_F(SequencedSocketDataTest, PauseAndResume_WritePauseRead) { + MockWrite writes[] = { + MockWrite(SYNCHRONOUS, kMsg1, kLen1, 0), + }; + + MockRead reads[] = { + MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, kMsg2, kLen2, 2), + }; + + Initialize(reads, arraysize(reads), writes, arraysize(writes)); + + AssertReadReturns(kLen2, ERR_IO_PENDING); + ASSERT_FALSE(read_callback_.have_result()); + + // Nothing should happen until the write starts. + base::MessageLoop::current()->RunUntilIdle(); + ASSERT_FALSE(read_callback_.have_result()); + ASSERT_FALSE(IsPaused()); + + AssertSyncWriteEquals(kMsg1, kLen1); + + RunUntilPaused(); + ASSERT_FALSE(read_callback_.have_result()); + ASSERT_TRUE(IsPaused()); + + // Spinning the message loop should do nothing. + base::MessageLoop::current()->RunUntilIdle(); + ASSERT_FALSE(read_callback_.have_result()); + ASSERT_TRUE(IsPaused()); + + Resume(); + ASSERT_FALSE(IsPaused()); + ASSERT_TRUE(read_callback_.have_result()); + ASSERT_EQ(kLen2, read_callback_.WaitForResult()); + AssertReadBufferEquals(kMsg2, kLen2); +} + +// Test the basic case where a write is paused. +TEST_F(SequencedSocketDataTest, PauseAndResume_PauseWrite) { + MockWrite writes[] = { + MockWrite(ASYNC, ERR_IO_PENDING, 0), MockWrite(ASYNC, kMsg1, kLen1, 1), + }; + + Initialize(nullptr, 0, writes, arraysize(writes)); + + AssertWriteReturns(kMsg1, kLen1, ERR_IO_PENDING); + ASSERT_FALSE(write_callback_.have_result()); + + RunUntilPaused(); + ASSERT_TRUE(IsPaused()); + + // Spinning the message loop should do nothing. + base::MessageLoop::current()->RunUntilIdle(); + ASSERT_FALSE(write_callback_.have_result()); + ASSERT_TRUE(IsPaused()); + + Resume(); + ASSERT_FALSE(IsPaused()); + ASSERT_TRUE(write_callback_.have_result()); + ASSERT_EQ(kLen1, write_callback_.WaitForResult()); +} + +// Test the case where a write that will be paused is started before read that +// completes before the pause. +TEST_F(SequencedSocketDataTest, PauseAndResume_ReadPauseWrite) { + MockWrite writes[] = { + MockWrite(ASYNC, ERR_IO_PENDING, 1), MockWrite(ASYNC, kMsg2, kLen2, 2), + }; + + MockRead reads[] = { + MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), + }; + + Initialize(reads, arraysize(reads), writes, arraysize(writes)); + + AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); + ASSERT_FALSE(write_callback_.have_result()); + + // Nothing should happen until the write starts. + base::MessageLoop::current()->RunUntilIdle(); + ASSERT_FALSE(write_callback_.have_result()); + ASSERT_FALSE(IsPaused()); + + AssertSyncReadEquals(kMsg1, kLen1); + + RunUntilPaused(); + ASSERT_FALSE(write_callback_.have_result()); + ASSERT_TRUE(IsPaused()); + + // Spinning the message loop should do nothing. + base::MessageLoop::current()->RunUntilIdle(); + ASSERT_FALSE(write_callback_.have_result()); + ASSERT_TRUE(IsPaused()); + + Resume(); + ASSERT_FALSE(IsPaused()); + ASSERT_TRUE(write_callback_.have_result()); + ASSERT_EQ(kLen2, write_callback_.WaitForResult()); +} + } // namespace } // namespace net
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 5b8c7519..9d8bee3a 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -319,15 +319,48 @@ size_t next_read = 0; size_t next_write = 0; int next_sequence_number = 0; + bool last_event_was_pause = false; while (next_read < reads_count || next_write < writes_count) { if (next_read < reads_count && reads[next_read].sequence_number == next_sequence_number) { + // Check if this is a pause. + if (reads[next_read].mode == ASYNC && + reads[next_read].result == ERR_IO_PENDING) { + CHECK(!last_event_was_pause) << "Two pauses in a row are not allowed: " + << next_sequence_number; + last_event_was_pause = true; + } else if (last_event_was_pause) { + CHECK_EQ(ASYNC, reads[next_read].mode) + << "A sync event after a pause makes no sense: " + << next_sequence_number; + CHECK_NE(ERR_IO_PENDING, reads[next_read].result) + << "A pause event after a pause makes no sense: " + << next_sequence_number; + last_event_was_pause = false; + } + ++next_read; ++next_sequence_number; continue; } if (next_write < writes_count && writes[next_write].sequence_number == next_sequence_number) { + // Check if this is a pause. + if (writes[next_write].mode == ASYNC && + writes[next_write].result == ERR_IO_PENDING) { + CHECK(!last_event_was_pause) << "Two pauses in a row are not allowed: " + << next_sequence_number; + last_event_was_pause = true; + } else if (last_event_was_pause) { + CHECK_EQ(ASYNC, writes[next_write].mode) + << "A sync event after a pause makes no sense: " + << next_sequence_number; + CHECK_NE(ERR_IO_PENDING, writes[next_write].result) + << "A pause event after a pause makes no sense: " + << next_sequence_number; + last_event_was_pause = false; + } + ++next_write; ++next_sequence_number; continue; @@ -336,6 +369,12 @@ << next_sequence_number; return; } + + // Last event must not be a pause. For the final event to indicate the + // operation never completes, it should be SYNCHRONOUS and return + // ERR_IO_PENDING. + CHECK(!last_event_was_pause); + CHECK_EQ(next_read, reads_count); CHECK_EQ(next_write, writes_count); } @@ -368,13 +407,12 @@ return next_read; } - // If the result is ERR_IO_PENDING, then advance to the next state - // and pause reads. + // If the result is ERR_IO_PENDING, then pause. if (next_read.result == ERR_IO_PENDING) { - NET_TRACE(1, " *** ") << "Pausing at: " << sequence_number_; - ++sequence_number_; - helper_.AdvanceRead(); + NET_TRACE(1, " *** ") << "Pausing read at: " << sequence_number_; read_state_ = PAUSED; + if (run_until_paused_run_loop_) + run_until_paused_run_loop_->Quit(); return MockRead(SYNCHRONOUS, ERR_IO_PENDING); } base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -418,6 +456,15 @@ return MockWriteResult(SYNCHRONOUS, rv); } + // If the result is ERR_IO_PENDING, then pause. + if (next_write.result == ERR_IO_PENDING) { + NET_TRACE(1, " *** ") << "Pausing write at: " << sequence_number_; + write_state_ = PAUSED; + if (run_until_paused_run_loop_) + run_until_paused_run_loop_->Quit(); + return MockWriteResult(SYNCHRONOUS, ERR_IO_PENDING); + } + NET_TRACE(1, " *** ") << "Posting task to complete write"; base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&SequencedSocketData::OnWriteComplete, @@ -457,19 +504,60 @@ return true; } -bool SequencedSocketData::IsReadPaused() { - return read_state_ == PAUSED; +bool SequencedSocketData::IsPaused() const { + // Both states should not be paused. + DCHECK(read_state_ != PAUSED || write_state_ != PAUSED); + return write_state_ == PAUSED || read_state_ == PAUSED; } -void SequencedSocketData::CompleteRead() { - if (read_state_ != PAUSED) { - ADD_FAILURE() << "Unable to CompleteRead when not paused."; +void SequencedSocketData::Resume() { + if (!IsPaused()) { + ADD_FAILURE() << "Unable to Resume when not paused."; return; } + + sequence_number_++; + if (read_state_ == PAUSED) { + read_state_ = PENDING; + helper_.AdvanceRead(); + } else { // write_state_ == PAUSED + write_state_ = PENDING; + helper_.AdvanceWrite(); + } + + if (!helper_.AllWriteDataConsumed() && + helper_.PeekWrite().sequence_number == sequence_number_) { + // The next event hasn't even started yet. Pausing isn't really needed in + // that case, but may as well support it. + if (write_state_ != PENDING) + return; + write_state_ = COMPLETING; + OnWriteComplete(); + return; + } + + CHECK(!helper_.AllReadDataConsumed()); + + // The next event hasn't even started yet. Pausing isn't really needed in + // that case, but may as well support it. + if (read_state_ != PENDING) + return; read_state_ = COMPLETING; OnReadComplete(); } +void SequencedSocketData::RunUntilPaused() { + CHECK(!run_until_paused_run_loop_); + + if (IsPaused()) + return; + + run_until_paused_run_loop_.reset(new base::RunLoop()); + run_until_paused_run_loop_->Run(); + run_until_paused_run_loop_.reset(); + DCHECK(IsPaused()); +} + void SequencedSocketData::MaybePostReadCompleteTask() { NET_TRACE(1, " ****** ") << " current: " << sequence_number_; // Only trigger the next read to complete if there is already a read pending @@ -479,13 +567,12 @@ return; } - // If the result is ERR_IO_PENDING, then advance to the next state - // and pause reads. + // If the result is ERR_IO_PENDING, then pause. if (helper_.PeekRead().result == ERR_IO_PENDING) { NET_TRACE(1, " *** ") << "Pausing read at: " << sequence_number_; - ++sequence_number_; - helper_.AdvanceRead(); read_state_ = PAUSED; + if (run_until_paused_run_loop_) + run_until_paused_run_loop_->Quit(); return; } @@ -507,6 +594,15 @@ return; } + // If the result is ERR_IO_PENDING, then pause. + if (helper_.PeekWrite().result == ERR_IO_PENDING) { + NET_TRACE(1, " *** ") << "Pausing write at: " << sequence_number_; + write_state_ = PAUSED; + if (run_until_paused_run_loop_) + run_until_paused_run_loop_->Quit(); + return; + } + NET_TRACE(1, " ****** ") << "Posting task to complete write: " << sequence_number_; base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index 13f7b397..6a77195 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -39,6 +39,10 @@ #include "net/udp/datagram_client_socket.h" #include "testing/gtest/include/gtest/gtest.h" +namespace base { +class RunLoop; +} + namespace net { enum { @@ -384,8 +388,20 @@ bool AllWriteDataConsumed() const override; bool IsIdle() const override; - bool IsReadPaused(); - void CompleteRead(); + // An ASYNC read event with a return value of ERR_IO_PENDING will cause the + // socket data to pause at that event, and advance no further, until Resume is + // invoked. At that point, the socket will continue at the next event in the + // sequence. + // + // If a request just wants to simulate a connection that stays open and never + // receives any more data, instead of pausing and then resuming a request, it + // should use a SYNCHRONOUS event with a return value of ERR_IO_PENDING + // instead. + bool IsPaused() const; + // Resumes events once |this| is in the paused state. The next even will + // occur synchronously with the call if it can. + void Resume(); + void RunUntilPaused(); // When true, IsConnectedAndIdle() will return false if the next event in the // sequence is a synchronous. Otherwise, the socket claims to be idle as @@ -404,7 +420,7 @@ PENDING, // An async operation in waiting for another opteration to // complete. COMPLETING, // A task has been posted to complet an async operation. - PAUSED, // IO is paused until CompleteRead() is called. + PAUSED, // IO is paused until Resume() is called. }; // From SocketDataProvider: @@ -423,6 +439,9 @@ bool busy_before_sync_reads_; + // Used by RunUntilPaused. NULL at all other times. + scoped_ptr<base::RunLoop> run_until_paused_run_loop_; + base::WeakPtrFactory<SequencedSocketData> weak_factory_; DISALLOW_COPY_AND_ASSIGN(SequencedSocketData);
diff --git a/net/spdy/spdy_http_stream_unittest.cc b/net/spdy/spdy_http_stream_unittest.cc index 3e869737..9aff81b 100644 --- a/net/spdy/spdy_http_stream_unittest.cc +++ b/net/spdy/spdy_http_stream_unittest.cc
@@ -844,7 +844,7 @@ http_stream->stream()->send_window_size()); // Read rest of data. - sequenced_data_->CompleteRead(); + sequenced_data_->Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()),
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index dc2b96b8..dde63d7 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -2358,9 +2358,12 @@ helper.session(), GURL(GetDefaultUrl()))); ASSERT_EQ(ERR_IO_PENDING, rv); // This forces an err_IO_pending, which sets the callback. - data.CompleteRead(); + data.Resume(); + data.RunUntilPaused(); + // This finishes the read. - data.CompleteRead(); + data.Resume(); + base::RunLoop().RunUntilIdle(); helper.VerifyDataConsumed(); } @@ -2405,7 +2408,7 @@ base::Bind(&SpdyNetworkTransactionTest::DeleteSessionCallback, base::Unretained(&helper))); ASSERT_EQ(ERR_IO_PENDING, rv); - data.CompleteRead(); + data.Resume(); // Finish running rest of tasks. base::RunLoop().RunUntilIdle(); @@ -3714,7 +3717,7 @@ scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); if (rv == ERR_IO_PENDING) { - data.CompleteRead(); + data.Resume(); rv = read_callback.WaitForResult(); } if (rv > 0) { @@ -3806,7 +3809,7 @@ scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); if (rv == ERR_IO_PENDING) { - data.CompleteRead(); + data.Resume(); rv = read_callback.WaitForResult(); } if (rv > 0) { @@ -3983,7 +3986,7 @@ scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); if (rv == ERR_IO_PENDING) { - data.CompleteRead(); + data.Resume(); rv = read_callback.WaitForResult(); } if (rv > 0) { @@ -4062,7 +4065,8 @@ ASSERT_EQ(ERR_IO_PENDING, rv) << "Unexpected read: " << rv; // Complete the read now, which causes buffering to start. - data.CompleteRead(); + data.Resume(); + base::RunLoop().RunUntilIdle(); // Destroy the transaction, causing the stream to get cancelled // and orphaning the buffered IO task. helper.ResetTrans(); @@ -4845,7 +4849,7 @@ } // Now schedule the ERR_CONNECTION_RESET. - data1.CompleteRead(); + data1.Resume(); } rv = callback.WaitForResult(); EXPECT_EQ(OK, rv); @@ -5968,8 +5972,9 @@ CreateMockRead(*body_frames.back(), writes.size() + reads.size())); remaining -= frame_size; } + // Yield. reads.push_back( - MockRead(ASYNC, ERR_IO_PENDING, writes.size() + reads.size())); // Yield. + MockRead(SYNCHRONOUS, ERR_IO_PENDING, writes.size() + reads.size())); writes.push_back( CreateMockWrite(*session_window_update, writes.size() + reads.size())); @@ -6207,7 +6212,7 @@ // since we're send-stalled. EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); - data.CompleteRead(); // Read in WINDOW_UPDATE frame. + data.Resume(); // Read in WINDOW_UPDATE frame. rv = callback.WaitForResult(); helper.VerifyDataConsumed(); }
diff --git a/net/spdy/spdy_proxy_client_socket_unittest.cc b/net/spdy/spdy_proxy_client_socket_unittest.cc index 67fbf3a..227d9c3 100644 --- a/net/spdy/spdy_proxy_client_socket_unittest.cc +++ b/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -108,8 +108,6 @@ void AssertAsyncWriteSucceeds(const char* data, int len); void AssertWriteReturns(const char* data, int len, int rv); void AssertWriteLength(int len); - void AssertAsyncWriteWithReadsSucceeds(const char* data, int len, - int num_reads); void AddAuthToCache() { const base::string16 kFoo(base::ASCIIToUTF16("foo")); @@ -203,9 +201,9 @@ } void SpdyProxyClientSocketTest::Initialize(MockRead* reads, - size_t reads_count, - MockWrite* writes, - size_t writes_count) { + size_t reads_count, + MockWrite* writes, + size_t writes_count) { data_.reset(new DeterministicSocketData(reads, reads_count, writes, writes_count)); data_->set_connect_data(connect_data_); @@ -270,7 +268,7 @@ } void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, - int len) { + int len) { data_->StopAfter(1); // Issue the read, which will be completed asynchronously scoped_refptr<IOBuffer> buf(new IOBuffer(len)); @@ -286,8 +284,7 @@ ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); } -void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, - int len) { +void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { data_->StopAfter(1); // Issue the read, which will be completed asynchronously read_buf_ = new IOBuffer(len); @@ -296,8 +293,7 @@ EXPECT_TRUE(sock_->IsConnected()); } -void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, - int len) { +void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { EXPECT_TRUE(sock_->IsConnected()); // Now the read will return @@ -313,8 +309,8 @@ } void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, - int len, - int rv) { + int len, + int rv) { scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); EXPECT_EQ(rv, sock_->Write(buf.get(), buf->size(), write_callback_.callback())); @@ -324,21 +320,6 @@ EXPECT_EQ(len, write_callback_.WaitForResult()); } -void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( - const char* data, int len, int num_reads) { - scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); - - EXPECT_EQ(ERR_IO_PENDING, - sock_->Write(buf.get(), buf->size(), write_callback_.callback())); - - for (int i = 0; i < num_reads; i++) { - Run(1); - AssertSyncReadEquals(kMsg2, kLen2); - } - - write_callback_.WaitForResult(); -} - void SpdyProxyClientSocketTest::PopulateConnectRequestIR( SpdyHeaderBlock* block) { spdy_util_.MaybeAddVersionHeader(block);
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc index 6c5dcfc..f6021c6f 100644 --- a/net/spdy/spdy_session_unittest.cc +++ b/net/spdy/spdy_session_unittest.cc
@@ -403,7 +403,7 @@ EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); // Read and process the GOAWAY frame. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); @@ -419,7 +419,7 @@ EXPECT_FALSE(spdy_stream1); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -471,7 +471,7 @@ // Read and process the GOAWAY frame before the second stream could be // activated. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); @@ -539,7 +539,7 @@ EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); // Read and process the first GOAWAY frame. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); @@ -551,7 +551,7 @@ // Read and process the second GOAWAY frame, which should close the // session. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -612,7 +612,7 @@ EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); // Read and process the GOAWAY frame. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); @@ -625,7 +625,7 @@ session_->CloseSessionOnError(ERR_ABORTED, "Aborting session"); EXPECT_FALSE(spdy_stream1); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -734,7 +734,7 @@ EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); // Read and process the GOAWAY frame. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); @@ -747,7 +747,7 @@ EXPECT_EQ(ERR_FAILED, rv); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -797,7 +797,7 @@ EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); // Read and process the GOAWAY frame. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); @@ -805,7 +805,7 @@ // Read and process the SYN_STREAM frame, the subsequent RST_STREAM, // and EOF. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -868,7 +868,7 @@ #endif EXPECT_FALSE(spdy_stream); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -916,7 +916,7 @@ EXPECT_FALSE(session_->check_ping_status_pending()); EXPECT_GE(session_->last_activity_time(), before_ping_time); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); @@ -1002,7 +1002,7 @@ base::RunLoop().RunUntilIdle(); session_->CloseSessionOnError(ERR_ABORTED, "Aborting"); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -1116,7 +1116,7 @@ EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); // Read responses on remaining active streams. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(OK, delegate1.WaitForClose()); EXPECT_EQ(kUploadData, delegate1.TakeReceivedData()); @@ -1253,7 +1253,7 @@ // Shift time to expire the push stream. Read the second SYN_STREAM, // and verify a RST_STREAM was written. g_time_delta = base::TimeDelta::FromSeconds(301); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); // Verify that the second pushed stream evicted the first pushed stream. @@ -1272,7 +1272,7 @@ // Read and process EOF. EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -1382,7 +1382,7 @@ EXPECT_EQ(OK, stream_releaser.WaitForResult()); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); @@ -1462,7 +1462,7 @@ EXPECT_EQ(kInitialMaxConcurrentStreams + 1, session_->max_concurrent_streams()); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -1775,7 +1775,7 @@ // Read and process EOF. EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -2112,7 +2112,7 @@ EXPECT_TRUE(delegate2.StreamIsClosed()); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -2188,7 +2188,7 @@ EXPECT_TRUE(delegate2.StreamIsClosed()); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -2483,7 +2483,7 @@ EXPECT_EQ(0u, session_->num_created_streams()); EXPECT_EQ(0u, session_->pending_create_stream_queue_size(LOWEST)); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); } @@ -2634,7 +2634,7 @@ // Read all the data and verify SpdySession::DoReadLoop has not // posted a task. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream1); @@ -2731,7 +2731,7 @@ MockRead reads[] = { CreateMockRead(*resp1, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), - CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS), + CreateMockRead(*partial_data_frame, 3, ASYNC), CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS), CreateMockRead(*finish_data_frame, 6, SYNCHRONOUS), @@ -2763,7 +2763,7 @@ EXPECT_EQ(1u, delegate1.stream_id()); // Read all the data and verify SpdySession::DoReadLoop has posted a task. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ("foo foo foo bar", delegate1.TakeReceivedData()); EXPECT_FALSE(spdy_stream1); @@ -2848,7 +2848,7 @@ EXPECT_EQ(0u, observer.executed_count()); // Read all the data and verify SpdySession::DoReadLoop has posted a task. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream1); @@ -2957,7 +2957,7 @@ // Read all the data and verify SpdySession::DoReadLoop has posted a // task. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream1); @@ -3019,7 +3019,7 @@ EXPECT_EQ(1u, spdy_stream1->stream_id()); // Run until GoAway. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream1); EXPECT_TRUE(data.AllWriteDataConsumed()); @@ -3371,7 +3371,7 @@ // Cause the stream to be reset, which should cause another stream // to be created. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream); @@ -3379,7 +3379,7 @@ EXPECT_EQ(0u, session_->num_active_streams()); EXPECT_EQ(1u, session_->num_created_streams()); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3437,7 +3437,7 @@ EXPECT_FALSE(spdy_stream2); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3494,7 +3494,7 @@ EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3561,7 +3561,7 @@ EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3602,7 +3602,7 @@ EXPECT_EQ(kUploadDataSize + padding_length, session_->session_unacked_recv_window_bytes_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3659,12 +3659,12 @@ EXPECT_EQ(1u, spdy_stream->stream_id()); // Too large data frame causes flow control error, should close stream. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream); EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3728,7 +3728,7 @@ EXPECT_EQ(SpdySession::STATE_AVAILABLE, session_->availability_state_); // Second data frame overflows receiving window, causes session to close. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(SpdySession::STATE_DRAINING, session_->availability_state_); } @@ -3801,7 +3801,7 @@ EXPECT_EQ(stream_max_recv_window_size, spdy_stream->recv_window_size()); // First data frame. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(spdy_stream->IsLocallyClosed()); EXPECT_EQ(stream_max_recv_window_size - first_data_frame_size, @@ -3813,13 +3813,13 @@ EXPECT_EQ(stream_max_recv_window_size, spdy_stream->recv_window_size()); // Second data frame overflows receiving window, causes the stream to close. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(spdy_stream.get()); // RST_STREAM EXPECT_TRUE(session_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3841,14 +3841,13 @@ // data. The receive window should still increase to its original // value, i.e. we shouldn't "leak" receive window bytes. TEST_P(SpdySessionTest, SessionFlowControlNoReceiveLeaks) { - const int32 msg_data_size = 100; - const std::string msg_data(msg_data_size, 'a'); + const int32 kMsgDataSize = 100; + const std::string msg_data(kMsgDataSize, 'a'); scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( - kDefaultURL, 1, msg_data_size, MEDIUM, nullptr, 0)); - scoped_ptr<SpdyFrame> msg( - spdy_util_.ConstructSpdyBodyFrame( - 1, msg_data.data(), msg_data_size, false)); + kDefaultURL, 1, kMsgDataSize, MEDIUM, nullptr, 0)); + scoped_ptr<SpdyFrame> msg(spdy_util_.ConstructSpdyBodyFrame( + 1, msg_data.data(), kMsgDataSize, false)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*msg, 2), @@ -3856,12 +3855,10 @@ scoped_ptr<SpdyFrame> resp( spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); - scoped_ptr<SpdyFrame> echo( - spdy_util_.ConstructSpdyBodyFrame( - 1, msg_data.data(), msg_data_size, false)); - scoped_ptr<SpdyFrame> window_update( - spdy_util_.ConstructSpdyWindowUpdate( - kSessionFlowControlStreamId, msg_data_size)); + scoped_ptr<SpdyFrame> echo(spdy_util_.ConstructSpdyBodyFrame( + 1, msg_data.data(), kMsgDataSize, false)); + scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate( + kSessionFlowControlStreamId, kMsgDataSize)); MockRead reads[] = { CreateMockRead(*resp, 1), CreateMockRead(*echo, 3), @@ -3886,7 +3883,7 @@ stream->SetDelegate(&delegate); scoped_ptr<SpdyHeaderBlock> headers( - spdy_util_.ConstructPostHeaderBlock(kDefaultURL, msg_data_size)); + spdy_util_.ConstructPostHeaderBlock(kDefaultURL, kMsgDataSize)); EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); EXPECT_TRUE(stream->HasUrlFromHeaders()); @@ -3899,7 +3896,7 @@ base::RunLoop().RunUntilIdle(); EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); - EXPECT_EQ(msg_data_size, session_->session_unacked_recv_window_bytes_); + EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); stream->Close(); EXPECT_FALSE(stream); @@ -3907,9 +3904,9 @@ EXPECT_EQ(OK, delegate.WaitForClose()); EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); - EXPECT_EQ(msg_data_size, session_->session_unacked_recv_window_bytes_); + EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -3918,11 +3915,11 @@ // can be written to the socket. The send window should then increase // to its original value, i.e. we shouldn't "leak" send window bytes. TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { - const int32 msg_data_size = 100; - const std::string msg_data(msg_data_size, 'a'); + const int32 kMsgDataSize = 100; + const std::string msg_data(kMsgDataSize, 'a'); scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( - kDefaultURL, 1, msg_data_size, MEDIUM, nullptr, 0)); + kDefaultURL, 1, kMsgDataSize, MEDIUM, nullptr, 0)); MockWrite writes[] = { CreateMockWrite(*req, 0), }; @@ -3952,7 +3949,7 @@ stream->SetDelegate(&delegate); scoped_ptr<SpdyHeaderBlock> headers( - spdy_util_.ConstructPostHeaderBlock(kDefaultURL, msg_data_size)); + spdy_util_.ConstructPostHeaderBlock(kDefaultURL, kMsgDataSize)); EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); EXPECT_TRUE(stream->HasUrlFromHeaders()); @@ -3968,9 +3965,9 @@ // Read response, but do not run the message loop, so that the body is not // written to the socket. - data.CompleteRead(); + data.Resume(); - EXPECT_EQ(initial_window_size - msg_data_size, + EXPECT_EQ(initial_window_size - kMsgDataSize, session_->session_send_window_size_); // Closing the stream should increase the session's send window. @@ -3991,14 +3988,13 @@ // Send data back and forth; the send and receive windows should // change appropriately. TEST_P(SpdySessionTest, SessionFlowControlEndToEnd) { - const int32 msg_data_size = 100; - const std::string msg_data(msg_data_size, 'a'); + const int32 kMsgDataSize = 100; + const std::string msg_data(kMsgDataSize, 'a'); scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( - kDefaultURL, 1, msg_data_size, MEDIUM, nullptr, 0)); - scoped_ptr<SpdyFrame> msg( - spdy_util_.ConstructSpdyBodyFrame( - 1, msg_data.data(), msg_data_size, false)); + kDefaultURL, 1, kMsgDataSize, MEDIUM, nullptr, 0)); + scoped_ptr<SpdyFrame> msg(spdy_util_.ConstructSpdyBodyFrame( + 1, msg_data.data(), kMsgDataSize, false)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*msg, 2), @@ -4006,12 +4002,10 @@ scoped_ptr<SpdyFrame> resp( spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); - scoped_ptr<SpdyFrame> echo( - spdy_util_.ConstructSpdyBodyFrame( - 1, msg_data.data(), msg_data_size, false)); - scoped_ptr<SpdyFrame> window_update( - spdy_util_.ConstructSpdyWindowUpdate( - kSessionFlowControlStreamId, msg_data_size)); + scoped_ptr<SpdyFrame> echo(spdy_util_.ConstructSpdyBodyFrame( + 1, msg_data.data(), kMsgDataSize, false)); + scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate( + kSessionFlowControlStreamId, kMsgDataSize)); MockRead reads[] = { CreateMockRead(*resp, 1), MockRead(ASYNC, ERR_IO_PENDING, 3), @@ -4039,7 +4033,7 @@ stream->SetDelegate(&delegate); scoped_ptr<SpdyHeaderBlock> headers( - spdy_util_.ConstructPostHeaderBlock(kDefaultURL, msg_data_size)); + spdy_util_.ConstructPostHeaderBlock(kDefaultURL, kMsgDataSize)); EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); EXPECT_TRUE(stream->HasUrlFromHeaders()); @@ -4053,27 +4047,27 @@ // Send request and message. base::RunLoop().RunUntilIdle(); - EXPECT_EQ(initial_window_size - msg_data_size, + EXPECT_EQ(initial_window_size - kMsgDataSize, session_->session_send_window_size_); EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); // Read echo. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(initial_window_size - msg_data_size, + EXPECT_EQ(initial_window_size - kMsgDataSize, session_->session_send_window_size_); - EXPECT_EQ(initial_window_size - msg_data_size, + EXPECT_EQ(initial_window_size - kMsgDataSize, session_->session_recv_window_size_); EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); // Read window update. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(initial_window_size, session_->session_send_window_size_); - EXPECT_EQ(initial_window_size - msg_data_size, + EXPECT_EQ(initial_window_size - kMsgDataSize, session_->session_recv_window_size_); EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); @@ -4083,7 +4077,7 @@ // receive window. EXPECT_EQ(initial_window_size, session_->session_send_window_size_); EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); - EXPECT_EQ(msg_data_size, session_->session_unacked_recv_window_bytes_); + EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); stream->Close(); EXPECT_FALSE(stream); @@ -4092,9 +4086,9 @@ EXPECT_EQ(initial_window_size, session_->session_send_window_size_); EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); - EXPECT_EQ(msg_data_size, session_->session_unacked_recv_window_bytes_); + EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -4491,7 +4485,7 @@ EXPECT_TRUE(session_->IsStreamActive(stream_id2)); EXPECT_FALSE(session_->IsStreamActive(stream_id3)); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(stream2); EXPECT_FALSE(session_); @@ -4595,7 +4589,7 @@ // Close the session (since we can't do it from within the delegate // method, since it's in the stream's loop). session_->CloseSessionOnError(ERR_CONNECTION_CLOSED, "Closing session"); - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); @@ -4657,7 +4651,7 @@ // Read response headers & body. Body overflows the session window, and a // goaway is written. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(ERR_SPDY_FLOW_CONTROL_ERROR, delegate.WaitForClose()); @@ -4747,7 +4741,7 @@ EXPECT_EQ(0u, session_->num_active_pushed_streams()); // Run until pushed stream is created. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -4766,7 +4760,7 @@ EXPECT_EQ(1u, session_->num_active_pushed_streams()); // Read EOF. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -4827,7 +4821,7 @@ EXPECT_EQ(0u, session_->num_active_pushed_streams()); // Run until pushed stream is created. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -4835,7 +4829,7 @@ EXPECT_EQ(1u, session_->num_active_pushed_streams()); // Reset incoming pushed stream. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -4843,7 +4837,7 @@ EXPECT_EQ(1u, session_->num_active_pushed_streams()); // Read EOF. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -4915,7 +4909,7 @@ EXPECT_EQ(0u, session_->num_active_pushed_streams()); // Run until pushed stream is created. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -4923,7 +4917,7 @@ EXPECT_EQ(1u, session_->num_active_pushed_streams()); // Accept promised stream. It should not count towards pushed stream limit. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(3u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -4932,7 +4926,7 @@ // Reset last pushed stream upon headers reception as it is going to be 2nd, // while we accept only one. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -4940,7 +4934,7 @@ EXPECT_EQ(1u, session_->num_active_pushed_streams()); // Read EOF. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session_); } @@ -5007,7 +5001,7 @@ EXPECT_EQ(0u, session_->num_active_pushed_streams()); // Run until pushed stream is created. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -5024,7 +5018,7 @@ // Receive headers for pushed stream. Delegate will cancel the stream, ensure // that all our counters are in consistent state. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, session_->num_active_streams()); EXPECT_EQ(0u, session_->num_created_streams()); @@ -5032,7 +5026,7 @@ EXPECT_EQ(0u, session_->num_active_pushed_streams()); // Read EOF. - data.CompleteRead(); + data.Resume(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(data.AllWriteDataConsumed()); EXPECT_TRUE(data.AllReadDataConsumed());
diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc index a75d88e..d59a64a3 100644 --- a/net/spdy/spdy_stream_unittest.cc +++ b/net/spdy/spdy_stream_unittest.cc
@@ -11,6 +11,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/run_loop.h" #include "base/strings/string_piece.h" #include "net/base/completion_callback.h" #include "net/base/request_priority.h" @@ -67,6 +68,7 @@ SpdyStreamTest() : spdy_util_(GetProtocol(), GetDependenciesFromPriority()), session_deps_(GetProtocol()), + session_(SpdySessionDependencies::SpdyCreateSession(&session_deps_)), offset_(0) { SpdySession::SetPriorityDependencyDefaultForTesting( GetDependenciesFromPriority()); @@ -113,6 +115,14 @@ reads_.push_back(MockRead(ASYNC, 0, offset_++)); } + void AddWritePause() { + writes_.push_back(MockWrite(ASYNC, ERR_IO_PENDING, offset_++)); + } + + void AddReadPause() { + reads_.push_back(MockRead(ASYNC, ERR_IO_PENDING, offset_++)); + } + MockRead* GetReads() { return reads_.data(); } size_t GetNumReads() const { @@ -145,9 +155,6 @@ TEST_P(SpdyStreamTest, SendDataAfterOpen) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); @@ -167,12 +174,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), GetWrites(), - GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -193,7 +200,6 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(GetNumReads() + GetNumWrites()); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); EXPECT_TRUE(delegate.send_headers_completed()); @@ -226,9 +232,6 @@ TEST_P(SpdyStreamTest, Trailers) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); AddWrite(*req); @@ -251,12 +254,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), GetWrites(), - GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -276,7 +279,6 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(GetNumReads() + GetNumWrites()); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); EXPECT_TRUE(delegate.send_headers_completed()); @@ -290,17 +292,14 @@ } TEST_P(SpdyStreamTest, PushedStream) { - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), GetWrites(), - GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> spdy_session(CreateDefaultSpdySession()); @@ -336,7 +335,7 @@ StreamDelegateDoNothing delegate(stream.GetWeakPtr()); stream.SetDelegate(&delegate); - data.RunFor(GetNumReads() + GetNumWrites()); + base::RunLoop().RunUntilIdle(); EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); EXPECT_EQ("beta", delegate.GetResponseHeaderValue("alpha")); @@ -347,9 +346,6 @@ TEST_P(SpdyStreamTest, StreamError) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); @@ -371,12 +367,12 @@ BoundTestNetLog log; - DeterministicSocketData data(GetReads(), GetNumReads(), GetWrites(), - GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -397,7 +393,6 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(GetNumReads() + GetNumWrites()); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); const SpdyStreamId stream_id = delegate.stream_id(); @@ -428,9 +423,6 @@ TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); @@ -453,12 +445,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), GetWrites(), - GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -480,7 +472,6 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(GetNumReads() + GetNumWrites()); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); EXPECT_TRUE(delegate.send_headers_completed()); @@ -495,9 +486,6 @@ TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); @@ -516,12 +504,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), GetWrites(), - GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -543,7 +531,6 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(GetNumReads() + GetNumWrites()); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); EXPECT_TRUE(delegate.send_headers_completed()); @@ -557,9 +544,6 @@ TEST_P(SpdyStreamTest, UpperCaseHeaders) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> syn( spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); AddWrite(*syn); @@ -575,12 +559,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -601,8 +585,6 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(4); - EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); } @@ -611,9 +593,6 @@ TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> syn( spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); AddWrite(*syn); @@ -631,14 +610,16 @@ spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); AddWrite(*rst); + AddReadPause(); + AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -659,13 +640,13 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(4); + data.RunUntilPaused(); base::WeakPtr<SpdyStream> push_stream; EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); EXPECT_FALSE(push_stream); - data.RunFor(1); + data.Resume(); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); } @@ -675,9 +656,6 @@ TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> syn( spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); AddWrite(*syn); @@ -690,6 +668,8 @@ push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); AddRead(*push); + AddReadPause(); + scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); (*late_headers)["X-UpperCase"] = "yes"; scoped_ptr<SpdyFrame> headers_frame( @@ -702,18 +682,20 @@ 0)); AddRead(*headers_frame); + AddWritePause(); + scoped_ptr<SpdyFrame> rst( spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); AddWrite(*rst); AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -734,18 +716,19 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(3); + data.RunUntilPaused(); base::WeakPtr<SpdyStream> push_stream; EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); EXPECT_TRUE(push_stream); - data.RunFor(1); + data.Resume(); + data.RunUntilPaused(); EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); EXPECT_FALSE(push_stream); - data.RunFor(2); + data.Resume(); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); } @@ -755,9 +738,6 @@ TEST_P(SpdyStreamTest, DuplicateHeaders) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> syn( spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); AddWrite(*syn); @@ -770,6 +750,8 @@ push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); AddRead(*push); + AddReadPause(); + scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); (*late_headers)[spdy_util_.GetStatusKey()] = "500 Server Error"; scoped_ptr<SpdyFrame> headers_frame( @@ -782,18 +764,20 @@ 0)); AddRead(*headers_frame); + AddReadPause(); + scoped_ptr<SpdyFrame> rst( spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); AddWrite(*rst); AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -814,36 +798,34 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(3); + data.RunUntilPaused(); base::WeakPtr<SpdyStream> push_stream; EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); EXPECT_TRUE(push_stream); - data.RunFor(1); + data.Resume(); + data.RunUntilPaused(); EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); EXPECT_FALSE(push_stream); - data.RunFor(2); + data.Resume(); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); } -// The tests below are only for SPDY/3 and above. - // Call IncreaseSendWindowSize on a stream with a large enough delta // to overflow an int32_t. The SpdyStream should handle that case // gracefully. TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); AddWrite(*req); + AddReadPause(); + // Triggered by the overflowing call to IncreaseSendWindowSize // below. scoped_ptr<SpdyFrame> rst( @@ -854,12 +836,12 @@ BoundTestNetLog log; - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); GURL url(kStreamUrl); @@ -878,7 +860,7 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(1); + data.RunUntilPaused(); int32_t old_send_window_size = stream->send_window_size(); ASSERT_GT(old_send_window_size, 0); @@ -887,7 +869,8 @@ stream->IncreaseSendWindowSize(delta_window_size); EXPECT_EQ(NULL, stream.get()); - data.RunFor(2); + data.Resume(); + base::RunLoop().RunUntilIdle(); EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); } @@ -929,9 +912,6 @@ const UnstallFunction& unstall_function) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); @@ -946,12 +926,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -975,7 +955,7 @@ StallStream(stream); - data.RunFor(1); + base::RunLoop().RunUntilIdle(); EXPECT_TRUE(stream->send_stalled_by_flow_control()); @@ -983,8 +963,6 @@ EXPECT_FALSE(stream->send_stalled_by_flow_control()); - data.RunFor(3); - EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); EXPECT_TRUE(delegate.send_headers_completed()); @@ -1010,14 +988,13 @@ const UnstallFunction& unstall_function) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> req( spdy_util_.ConstructSpdyPost( kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); AddWrite(*req); + AddReadPause(); + scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); AddRead(*resp); @@ -1031,12 +1008,12 @@ AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -1057,13 +1034,14 @@ EXPECT_TRUE(stream->HasUrlFromHeaders()); EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); - data.RunFor(1); + data.RunUntilPaused(); EXPECT_FALSE(stream->send_stalled_by_flow_control()); StallStream(stream); - data.RunFor(1); + data.Resume(); + base::RunLoop().RunUntilIdle(); EXPECT_TRUE(stream->send_stalled_by_flow_control()); @@ -1071,8 +1049,6 @@ EXPECT_FALSE(stream->send_stalled_by_flow_control()); - data.RunFor(3); - EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); EXPECT_TRUE(delegate.send_headers_completed()); @@ -1096,29 +1072,32 @@ TEST_P(SpdyStreamTest, ReceivedBytes) { GURL url(kStreamUrl); - session_ = - SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); - scoped_ptr<SpdyFrame> syn( spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); AddWrite(*syn); + AddReadPause(); + scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); AddRead(*reply); + AddReadPause(); + scoped_ptr<SpdyFrame> msg( spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); AddRead(*msg); + AddReadPause(); + AddReadEOF(); - DeterministicSocketData data(GetReads(), GetNumReads(), - GetWrites(), GetNumWrites()); + SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), + GetNumWrites()); MockConnect connect_data(SYNCHRONOUS, OK); data.set_connect_data(connect_data); - session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); + session_deps_.socket_factory->AddSocketDataProvider(&data); base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); @@ -1146,14 +1125,23 @@ int64_t response_len = reply_frame_len + data_frame_len; EXPECT_EQ(0, stream->raw_received_bytes()); - data.RunFor(1); // SYN - EXPECT_EQ(0, stream->raw_received_bytes()); - data.RunFor(1); // REPLY - EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); - data.RunFor(1); // DATA - EXPECT_EQ(response_len, stream->raw_received_bytes()); - data.RunFor(1); // FIN + // SYN + data.RunUntilPaused(); + EXPECT_EQ(0, stream->raw_received_bytes()); + + // REPLY + data.Resume(); + data.RunUntilPaused(); + EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); + + // DATA + data.Resume(); + data.RunUntilPaused(); + EXPECT_EQ(response_len, stream->raw_received_bytes()); + + // FIN + data.Resume(); EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); }
diff --git a/net/tools/epoll_server/epoll_server.cc b/net/tools/epoll_server/epoll_server.cc index 78511c2..1933b99 100644 --- a/net/tools/epoll_server/epoll_server.cc +++ b/net/tools/epoll_server/epoll_server.cc
@@ -9,10 +9,10 @@ #include <errno.h> // for errno and strerror_r #include <algorithm> #include <utility> -#include <vector> #include "base/auto_reset.h" #include "base/logging.h" +#include "base/stl_util.h" #include "base/time/time.h" // Design notes: An efficient implementation of ready list has the following @@ -442,7 +442,7 @@ void EpollServer::RegisterAlarm(int64 timeout_time_in_us, AlarmCB* ac) { CHECK(ac); - if (ContainsAlarm(ac)) { + if (ContainsKey(all_alarms_, ac)) { LOG(FATAL) << "Alarm already exists " << ac; } VLOG(4) << "RegisteringAlarm at : " << timeout_time_in_us;
diff --git a/net/tools/epoll_server/epoll_server.h b/net/tools/epoll_server/epoll_server.h index b241861..4293362 100644 --- a/net/tools/epoll_server/epoll_server.h +++ b/net/tools/epoll_server/epoll_server.h
@@ -8,9 +8,7 @@ #include <fcntl.h> #include <sys/queue.h> #include <map> -#include <set> #include <string> -#include <utility> #include <vector> // #define EPOLL_SERVER_EVENT_TRACING 1 @@ -475,10 +473,6 @@ // Returns true when the EpollServer() is being destroyed. bool in_shutdown() const { return in_shutdown_; } - bool ContainsAlarm(EpollAlarmCallbackInterface* alarm) const { - return all_alarms_.find(alarm) != all_alarms_.end(); - } - // Summary: // A function for implementing the ready list. It invokes OnEvent for each // of the fd in the ready list, and takes care of adding them back to the
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc index d1a3038..4fcc582c 100644 --- a/net/tools/quic/end_to_end_test.cc +++ b/net/tools/quic/end_to_end_test.cc
@@ -23,6 +23,7 @@ #include "net/quic/quic_packet_creator.h" #include "net/quic/quic_protocol.h" #include "net/quic/quic_server_id.h" +#include "net/quic/quic_session.h" #include "net/quic/quic_utils.h" #include "net/quic/test_tools/crypto_test_utils.h" #include "net/quic/test_tools/quic_connection_peer.h" @@ -38,9 +39,9 @@ #include "net/tools/quic/quic_in_memory_cache.h" #include "net/tools/quic/quic_packet_writer_wrapper.h" #include "net/tools/quic/quic_server.h" +#include "net/tools/quic/quic_simple_server_stream.h" #include "net/tools/quic/quic_socket_utils.h" #include "net/tools/quic/quic_spdy_client_stream.h" -#include "net/tools/quic/quic_spdy_server_stream.h" #include "net/tools/quic/test_tools/http_message.h" #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" #include "net/tools/quic/test_tools/quic_client_peer.h" @@ -672,7 +673,8 @@ // This should be detected as stream fin without complete request, // triggering an error response. client_->SendCustomSynchronousRequest(request); - EXPECT_EQ(QuicSpdyServerStream::kErrorResponseBody, client_->response_body()); + EXPECT_EQ(QuicSimpleServerStream::kErrorResponseBody, + client_->response_body()); EXPECT_EQ(500u, client_->response_headers()->parsed_response_code()); } @@ -1976,12 +1978,12 @@ } // A test stream that gives |response_body_| as an error response body. -class ServerStreamWithErrorResponseBody : public QuicSpdyServerStream { +class ServerStreamWithErrorResponseBody : public QuicSimpleServerStream { public: ServerStreamWithErrorResponseBody(QuicStreamId id, QuicSpdySession* session, string response_body) - : QuicSpdyServerStream(id, session), response_body_(response_body) {} + : QuicSimpleServerStream(id, session), response_body_(response_body) {} ~ServerStreamWithErrorResponseBody() override {} @@ -2007,8 +2009,8 @@ ~StreamWithErrorFactory() override {} - QuicSpdyServerStream* CreateStream(QuicStreamId id, - QuicSpdySession* session) override { + QuicSimpleServerStream* CreateStream(QuicStreamId id, + QuicSpdySession* session) override { return new ServerStreamWithErrorResponseBody(id, session, response_body_); } @@ -2146,13 +2148,12 @@ SetReorderPercentage(30); // Add a response with headers, body, and trailers. - const int kBodySize = 64 * 1024; // 1 MB; + const string kBody = "body content"; + SpdyHeaderBlock headers; headers[":status"] = "200"; headers[":version"] = "HTTP/1.1"; - headers["content-length"] = IntToString(kBodySize); - - const string kBody = string(kBodySize, 'x'); + headers["content-length"] = IntToString(kBody.size()); SpdyHeaderBlock trailers; trailers["some-trailing-header"] = "trailing-header-value";
diff --git a/net/tools/quic/quic_client_bin.cc b/net/tools/quic/quic_client_bin.cc index 84ec757..f8526ad2 100644 --- a/net/tools/quic/quic_client_bin.cc +++ b/net/tools/quic/quic_client_bin.cc
@@ -55,6 +55,7 @@ #include "net/http/transport_security_state.h" #include "net/log/net_log.h" #include "net/quic/crypto/proof_verifier_chromium.h" +#include "net/quic/quic_flags.h" #include "net/quic/quic_protocol.h" #include "net/quic/quic_server_id.h" #include "net/quic/quic_utils.h" @@ -83,6 +84,9 @@ int32 FLAGS_port = 0; // If set, send a POST with this body. string FLAGS_body = ""; +// If set, contents are converted from hex to ascii, before sending as body of +// a POST. e.g. --body_hex=\"68656c6c6f\" +string FLAGS_body_hex = ""; // A semicolon separated list of key:value pairs to add to request headers. string FLAGS_headers = ""; // Set to true for a quieter output experience. @@ -117,6 +121,18 @@ bool SupportsOCSPStapling() override { return false; } }; +static bool DecodeHexString(const base::StringPiece& hex, std::string* bytes) { + bytes->clear(); + if (hex.empty()) + return true; + std::vector<uint8> v; + if (!base::HexStringToBytes(hex.as_string(), &v)) + return false; + if (!v.empty()) + bytes->assign(reinterpret_cast<const char*>(&v[0]), v.size()); + return true; +}; + int main(int argc, char *argv[]) { base::CommandLine::Init(argc, argv); base::CommandLine* line = base::CommandLine::ForCurrentProcess(); @@ -126,6 +142,8 @@ settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; CHECK(logging::InitLogging(settings)); + FLAGS_quic_supports_trailers = true; + if (line->HasSwitch("h") || line->HasSwitch("help") || urls.empty()) { const char* help_str = "Usage: quic_client [options] <url>\n" @@ -137,6 +155,7 @@ "connect to\n" "--port=<port> specify the port to connect to\n" "--body=<body> specify the body to post\n" + "--body_hex=<body_hex> specify the body_hex to be printed out\n" "--headers=<headers> specify a semicolon separated list of " "key:value pairs to add to request headers\n" "--quiet specify for a quieter output experience\n" @@ -163,6 +182,9 @@ if (line->HasSwitch("body")) { FLAGS_body = line->GetSwitchValueASCII("body"); } + if (line->HasSwitch("body_hex")) { + FLAGS_body_hex = line->GetSwitchValueASCII("body_hex"); + } if (line->HasSwitch("headers")) { FLAGS_headers = line->GetSwitchValueASCII("headers"); } @@ -270,10 +292,17 @@ } cout << "Connected to " << host_port << endl; + // Construct the string body from flags, if provided. + string body = FLAGS_body; + if (!FLAGS_body_hex.empty()) { + DCHECK(FLAGS_body.empty()) << "Only set one of --body and --body_hex."; + DecodeHexString(FLAGS_body_hex, &body); + } + // Construct a GET or POST request for supplied URL. net::BalsaHeaders headers; - headers.SetRequestFirstlineFromStringPieces( - FLAGS_body.empty() ? "GET" : "POST", url.spec(), "HTTP/1.1"); + headers.SetRequestFirstlineFromStringPieces(body.empty() ? "GET" : "POST", + url.spec(), "HTTP/1.1"); // Append any additional headers supplied on the command line. for (const std::string& header : @@ -300,13 +329,13 @@ // Send the request. net::SpdyHeaderBlock header_block = net::tools::SpdyBalsaUtils::RequestHeadersToSpdyHeaders(headers); - client.SendRequestAndWaitForResponse(headers, FLAGS_body, /*fin=*/true); + client.SendRequestAndWaitForResponse(headers, body, /*fin=*/true); // Print request and response details. if (!FLAGS_quiet) { cout << "Request:" << endl; cout << "headers:" << header_block.DebugString(); - cout << "body: " << FLAGS_body << endl; + cout << "body: " << body << endl; cout << endl; cout << "Response:" << endl; cout << "headers: " << client.latest_response_headers() << endl;
diff --git a/net/tools/quic/quic_server_session.cc b/net/tools/quic/quic_server_session.cc index 68e228d..2c39919c 100644 --- a/net/tools/quic/quic_server_session.cc +++ b/net/tools/quic/quic_server_session.cc
@@ -10,7 +10,7 @@ #include "net/quic/quic_flags.h" #include "net/quic/quic_spdy_session.h" #include "net/quic/reliable_quic_stream.h" -#include "net/tools/quic/quic_spdy_server_stream.h" +#include "net/tools/quic/quic_simple_server_stream.h" namespace net { namespace tools { @@ -202,7 +202,7 @@ return nullptr; } - return new QuicSpdyServerStream(id, this); + return new QuicSimpleServerStream(id, this); } bool QuicServerSession::ShouldCreateOutgoingDynamicStream() { @@ -229,7 +229,7 @@ } QuicSpdyStream* stream = - new QuicSpdyServerStream(GetNextOutgoingStreamId(), this); + new QuicSimpleServerStream(GetNextOutgoingStreamId(), this); stream->SetPriority(priority); ActivateStream(stream); return stream;
diff --git a/net/tools/quic/quic_server_session_test.cc b/net/tools/quic/quic_server_session_test.cc index 625e51e0..33c8a640 100644 --- a/net/tools/quic/quic_server_session_test.cc +++ b/net/tools/quic/quic_server_session_test.cc
@@ -9,7 +9,6 @@ #include "net/quic/proto/cached_network_parameters.pb.h" #include "net/quic/quic_connection.h" #include "net/quic/quic_crypto_server_stream.h" -#include "net/quic/quic_flags.h" #include "net/quic/quic_utils.h" #include "net/quic/test_tools/crypto_test_utils.h" #include "net/quic/test_tools/quic_config_peer.h" @@ -21,7 +20,7 @@ #include "net/quic/test_tools/quic_sustained_bandwidth_recorder_peer.h" #include "net/quic/test_tools/quic_test_utils.h" #include "net/test/gtest_util.h" -#include "net/tools/quic/quic_spdy_server_stream.h" +#include "net/tools/quic/quic_simple_server_stream.h" #include "net/tools/quic/test_tools/mock_quic_server_session_visitor.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/net/tools/quic/quic_simple_client_bin.cc b/net/tools/quic/quic_simple_client_bin.cc index 742f0f6..0217fa5 100644 --- a/net/tools/quic/quic_simple_client_bin.cc +++ b/net/tools/quic/quic_simple_client_bin.cc
@@ -84,6 +84,9 @@ int32 FLAGS_port = 0; // If set, send a POST with this body. string FLAGS_body = ""; +// If set, contents are converted from hex to ascii, before sending as body of +// a POST. e.g. --body_hex=\"68656c6c6f\" +string FLAGS_body_hex = ""; // A semicolon separated list of key:value pairs to add to request headers. string FLAGS_headers = ""; // Set to true for a quieter output experience. @@ -118,6 +121,18 @@ bool SupportsOCSPStapling() override { return false; } }; +static bool DecodeHexString(const base::StringPiece& hex, std::string* bytes) { + bytes->clear(); + if (hex.empty()) + return true; + std::vector<uint8> v; + if (!base::HexStringToBytes(hex.as_string(), &v)) + return false; + if (!v.empty()) + bytes->assign(reinterpret_cast<const char*>(&v[0]), v.size()); + return true; +}; + int main(int argc, char *argv[]) { base::CommandLine::Init(argc, argv); base::CommandLine* line = base::CommandLine::ForCurrentProcess(); @@ -127,6 +142,8 @@ settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; CHECK(logging::InitLogging(settings)); + FLAGS_quic_supports_trailers = true; + if (line->HasSwitch("h") || line->HasSwitch("help") || urls.empty()) { const char* help_str = "Usage: quic_client [options] <url>\n" @@ -138,6 +155,7 @@ "connect to\n" "--port=<port> specify the port to connect to\n" "--body=<body> specify the body to post\n" + "--body_hex=<body_hex> specify the body_hex to be printed out\n" "--headers=<headers> specify a semicolon separated list of " "key:value pairs to add to request headers\n" "--quiet specify for a quieter output experience\n" @@ -164,6 +182,9 @@ if (line->HasSwitch("body")) { FLAGS_body = line->GetSwitchValueASCII("body"); } + if (line->HasSwitch("body_hex")) { + FLAGS_body_hex = line->GetSwitchValueASCII("body_hex"); + } if (line->HasSwitch("headers")) { FLAGS_headers = line->GetSwitchValueASCII("headers"); } @@ -271,9 +292,16 @@ } cout << "Connected to " << host_port << endl; + // Construct the string body from flags, if provided. + string body = FLAGS_body; + if (!FLAGS_body_hex.empty()) { + DCHECK(FLAGS_body.empty()) << "Only set one of --body and --body_hex."; + DecodeHexString(FLAGS_body_hex, &body); + } + // Construct a GET or POST request for supplied URL. net::HttpRequestInfo request; - request.method = FLAGS_body.empty() ? "GET" : "POST"; + request.method = body.empty() ? "GET" : "POST"; request.url = url; // Append any additional headers supplied on the command line. @@ -303,13 +331,13 @@ net::CreateSpdyHeadersFromHttpRequest(request, request.extra_headers, net::HTTP2, /*direct=*/true, &header_block); - client.SendRequestAndWaitForResponse(request, FLAGS_body, /*fin=*/true); + client.SendRequestAndWaitForResponse(request, body, /*fin=*/true); // Print request and response details. if (!FLAGS_quiet) { cout << "Request:" << endl; cout << "headers:" << header_block.DebugString(); - cout << "body: " << FLAGS_body << endl; + cout << "body: " << body << endl; cout << endl; cout << "Response:" << endl; cout << "headers: " << client.latest_response_headers() << endl;
diff --git a/net/tools/quic/quic_spdy_server_stream.cc b/net/tools/quic/quic_simple_server_stream.cc similarity index 88% rename from net/tools/quic/quic_spdy_server_stream.cc rename to net/tools/quic/quic_simple_server_stream.cc index ca243f01..61dae23 100644 --- a/net/tools/quic/quic_spdy_server_stream.cc +++ b/net/tools/quic/quic_simple_server_stream.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 "net/tools/quic/quic_spdy_server_stream.h" +#include "net/tools/quic/quic_simple_server_stream.h" #include "base/logging.h" #include "base/stl_util.h" @@ -23,15 +23,14 @@ namespace net { namespace tools { -QuicSpdyServerStream::QuicSpdyServerStream(QuicStreamId id, - QuicSpdySession* session) +QuicSimpleServerStream::QuicSimpleServerStream(QuicStreamId id, + QuicSpdySession* session) : QuicSpdyStream(id, session), content_length_(-1) {} -QuicSpdyServerStream::~QuicSpdyServerStream() { -} +QuicSimpleServerStream::~QuicSimpleServerStream() {} -void QuicSpdyServerStream::OnInitialHeadersComplete(bool fin, - size_t frame_len) { +void QuicSimpleServerStream::OnInitialHeadersComplete(bool fin, + size_t frame_len) { QuicSpdyStream::OnInitialHeadersComplete(fin, frame_len); if (!SpdyUtils::ParseHeaders(decompressed_headers().data(), decompressed_headers().length(), @@ -42,13 +41,13 @@ MarkHeadersConsumed(decompressed_headers().length()); } -void QuicSpdyServerStream::OnTrailingHeadersComplete(bool fin, - size_t frame_len) { +void QuicSimpleServerStream::OnTrailingHeadersComplete(bool fin, + size_t frame_len) { LOG(DFATAL) << "Server does not support receiving Trailers."; SendErrorResponse(); } -void QuicSpdyServerStream::OnDataAvailable() { +void QuicSimpleServerStream::OnDataAvailable() { while (HasBytesToRead()) { struct iovec iov; if (GetReadableRegions(&iov, 1) == 0) { @@ -97,7 +96,7 @@ SendResponse(); } -void QuicSpdyServerStream::SendResponse() { +void QuicSimpleServerStream::SendResponse() { if (!ContainsKey(request_headers_, ":authority") || !ContainsKey(request_headers_, ":path")) { DVLOG(1) << "Request headers do not contain :authority or :path."; @@ -158,7 +157,7 @@ response->trailers()); } -void QuicSpdyServerStream::SendErrorResponse() { +void QuicSimpleServerStream::SendErrorResponse() { DVLOG(1) << "Sending error response for stream " << id(); SpdyHeaderBlock headers; headers[":status"] = "500"; @@ -166,13 +165,13 @@ SendHeadersAndBody(headers, kErrorResponseBody); } -void QuicSpdyServerStream::SendHeadersAndBody( +void QuicSimpleServerStream::SendHeadersAndBody( const SpdyHeaderBlock& response_headers, StringPiece body) { SendHeadersAndBodyAndTrailers(response_headers, body, SpdyHeaderBlock()); } -void QuicSpdyServerStream::SendHeadersAndBodyAndTrailers( +void QuicSimpleServerStream::SendHeadersAndBodyAndTrailers( const SpdyHeaderBlock& response_headers, StringPiece body, const SpdyHeaderBlock& response_trailers) { @@ -208,7 +207,7 @@ WriteTrailers(response_trailers, nullptr); } -const char* const QuicSpdyServerStream::kErrorResponseBody = "bad"; +const char* const QuicSimpleServerStream::kErrorResponseBody = "bad"; } // namespace tools } // namespace net
diff --git a/net/tools/quic/quic_spdy_server_stream.h b/net/tools/quic/quic_simple_server_stream.h similarity index 75% rename from net/tools/quic/quic_spdy_server_stream.h rename to net/tools/quic/quic_simple_server_stream.h index 3951187..8e6c94f 100644 --- a/net/tools/quic/quic_spdy_server_stream.h +++ b/net/tools/quic/quic_simple_server_stream.h
@@ -1,9 +1,9 @@ // Copyright (c) 2012 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. +// // Use of this source code is governed by a BSD-style license that can be +// // found in the LICENSE file. -#ifndef NET_TOOLS_QUIC_QUIC_SPDY_SERVER_STREAM_H_ -#define NET_TOOLS_QUIC_QUIC_SPDY_SERVER_STREAM_H_ +#ifndef NET_TOOLS_QUIC_QUIC_SIMPLE_SERVER_STREAM_H_ +#define NET_TOOLS_QUIC_QUIC_SIMPLE_SERVER_STREAM_H_ #include <string> @@ -19,15 +19,15 @@ namespace tools { namespace test { -class QuicSpdyServerStreamPeer; +class QuicSimpleServerStreamPeer; } // namespace test // All this does right now is aggregate data, and on fin, send an HTTP // response. -class QuicSpdyServerStream : public QuicSpdyStream { +class QuicSimpleServerStream : public QuicSpdyStream { public: - QuicSpdyServerStream(QuicStreamId id, QuicSpdySession* session); - ~QuicSpdyServerStream() override; + QuicSimpleServerStream(QuicStreamId id, QuicSpdySession* session); + ~QuicSimpleServerStream() override; // QuicSpdyStream void OnInitialHeadersComplete(bool fin, size_t frame_len) override; @@ -60,17 +60,17 @@ const std::string& body() { return body_; } private: - friend class test::QuicSpdyServerStreamPeer; + friend class test::QuicSimpleServerStreamPeer; // The parsed headers received from the client. SpdyHeaderBlock request_headers_; int content_length_; std::string body_; - DISALLOW_COPY_AND_ASSIGN(QuicSpdyServerStream); + DISALLOW_COPY_AND_ASSIGN(QuicSimpleServerStream); }; } // namespace tools } // namespace net -#endif // NET_TOOLS_QUIC_QUIC_SPDY_SERVER_STREAM_H_ +#endif // NET_TOOLS_QUIC_QUIC_SIMPLE_SERVER_STREAM_H_
diff --git a/net/tools/quic/quic_spdy_server_stream_test.cc b/net/tools/quic/quic_simple_server_stream_test.cc similarity index 77% rename from net/tools/quic/quic_spdy_server_stream_test.cc rename to net/tools/quic/quic_simple_server_stream_test.cc index 98c31ab..fce9ec1 100644 --- a/net/tools/quic/quic_spdy_server_stream_test.cc +++ b/net/tools/quic/quic_simple_server_stream_test.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 "net/tools/quic/quic_spdy_server_stream.h" +#include "net/tools/quic/quic_simple_server_stream.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" @@ -42,44 +42,43 @@ namespace tools { namespace test { -class QuicSpdyServerStreamPeer : public QuicSpdyServerStream { +class QuicSimpleServerStreamPeer : public QuicSimpleServerStream { public: - QuicSpdyServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session) - : QuicSpdyServerStream(stream_id, session) {} + QuicSimpleServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session) + : QuicSimpleServerStream(stream_id, session) {} - using QuicSpdyServerStream::SendResponse; - using QuicSpdyServerStream::SendErrorResponse; + using QuicSimpleServerStream::SendResponse; + using QuicSimpleServerStream::SendErrorResponse; - SpdyHeaderBlock* mutable_headers() { - return &request_headers_; - } + SpdyHeaderBlock* mutable_headers() { return &request_headers_; } - static void SendResponse(QuicSpdyServerStream* stream) { + static void SendResponse(QuicSimpleServerStream* stream) { stream->SendResponse(); } - static void SendErrorResponse(QuicSpdyServerStream* stream) { + static void SendErrorResponse(QuicSimpleServerStream* stream) { stream->SendErrorResponse(); } - static const string& body(QuicSpdyServerStream* stream) { + static const string& body(QuicSimpleServerStream* stream) { return stream->body_; } - static const int content_length(QuicSpdyServerStream* stream) { + static const int content_length(QuicSimpleServerStream* stream) { return stream->content_length_; } - static const SpdyHeaderBlock& headers(QuicSpdyServerStream* stream) { + static const SpdyHeaderBlock& headers(QuicSimpleServerStream* stream) { return stream->request_headers_; } }; namespace { -class QuicSpdyServerStreamTest : public ::testing::TestWithParam<QuicVersion> { +class QuicSimpleServerStreamTest + : public ::testing::TestWithParam<QuicVersion> { public: - QuicSpdyServerStreamTest() + QuicSimpleServerStreamTest() : connection_( new StrictMock<MockConnection>(&helper_, Perspective::IS_SERVER, @@ -103,19 +102,21 @@ kInitialStreamFlowControlWindowForTest); session_.config()->SetInitialSessionFlowControlWindowToSend( kInitialSessionFlowControlWindowForTest); - stream_ = new QuicSpdyServerStreamPeer(::net::test::kClientDataStreamId1, - &session_); + stream_ = new QuicSimpleServerStreamPeer(::net::test::kClientDataStreamId1, + &session_); // Register stream_ in dynamic_stream_map_ and pass ownership to session_. session_.ActivateStream(stream_); QuicInMemoryCachePeer::ResetForTests(); } - ~QuicSpdyServerStreamTest() override { + ~QuicSimpleServerStreamTest() override { QuicInMemoryCachePeer::ResetForTests(); } - const string& StreamBody() { return QuicSpdyServerStreamPeer::body(stream_); } + const string& StreamBody() { + return QuicSimpleServerStreamPeer::body(stream_); + } StringPiece StreamHeadersValue(const string& key) { return (*stream_->mutable_headers())[key]; @@ -125,16 +126,16 @@ MockConnectionHelper helper_; StrictMock<MockConnection>* connection_; StrictMock<MockQuicSpdySession> session_; - QuicSpdyServerStreamPeer* stream_; // Owned by session_. + QuicSimpleServerStreamPeer* stream_; // Owned by session_. string headers_string_; string body_; }; INSTANTIATE_TEST_CASE_P(Tests, - QuicSpdyServerStreamTest, + QuicSimpleServerStreamTest, ::testing::ValuesIn(QuicSupportedVersions())); -TEST_P(QuicSpdyServerStreamTest, TestFraming) { +TEST_P(QuicSimpleServerStreamTest, TestFraming) { EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) .Times(AnyNumber()) .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); @@ -148,7 +149,7 @@ EXPECT_EQ(body_, StreamBody()); } -TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { +TEST_P(QuicSimpleServerStreamTest, TestFramingOnePacket) { EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) .Times(AnyNumber()) .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); @@ -163,7 +164,7 @@ EXPECT_EQ(body_, StreamBody()); } -TEST_P(QuicSpdyServerStreamTest, SendQuicRstStreamNoErrorInStopReading) { +TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorInStopReading) { EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) .Times(AnyNumber()) .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); @@ -182,7 +183,7 @@ stream_->StopReading(); } -TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { +TEST_P(QuicSimpleServerStreamTest, TestFramingExtraData) { string large_body = "hello world!!!!!!"; // We'll automatically write out an error (headers + body) @@ -204,7 +205,7 @@ EXPECT_EQ("POST", StreamHeadersValue(":method")); } -TEST_P(QuicSpdyServerStreamTest, SendResponseWithIllegalResponseStatus) { +TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus) { // Send a illegal response with response status not supported by HTTP/2. SpdyHeaderBlock* request_headers = stream_->mutable_headers(); (*request_headers)[":path"] = "/bar"; @@ -227,18 +228,18 @@ EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) .Times(1) .WillOnce(Return(QuicConsumedData( - strlen(QuicSpdyServerStream::kErrorResponseBody), true))); + strlen(QuicSimpleServerStream::kErrorResponseBody), true))); - QuicSpdyServerStreamPeer::SendResponse(stream_); + QuicSimpleServerStreamPeer::SendResponse(stream_); EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); EXPECT_TRUE(stream_->reading_stopped()); EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, SendPushResponseWith404Response) { +TEST_P(QuicSimpleServerStreamTest, SendPushResponseWith404Response) { // Create a new promised stream with even id(). - QuicSpdyServerStreamPeer* promised_stream = - new QuicSpdyServerStreamPeer(2, &session_); + QuicSimpleServerStreamPeer* promised_stream = + new QuicSimpleServerStreamPeer(2, &session_); session_.ActivateStream(promised_stream); // Send a push response with response status 404, which will be regarded as @@ -260,10 +261,10 @@ EXPECT_CALL(session_, SendRstStream(promised_stream->id(), QUIC_STREAM_CANCELLED, 0)); - QuicSpdyServerStreamPeer::SendResponse(promised_stream); + QuicSimpleServerStreamPeer::SendResponse(promised_stream); } -TEST_P(QuicSpdyServerStreamTest, SendResponseWithValidHeaders) { +TEST_P(QuicSimpleServerStreamTest, SendResponseWithValidHeaders) { // Add a request and response with valid headers. SpdyHeaderBlock* request_headers = stream_->mutable_headers(); (*request_headers)[":path"] = "/bar"; @@ -285,13 +286,13 @@ .Times(1) .WillOnce(Return(QuicConsumedData(body.length(), true))); - QuicSpdyServerStreamPeer::SendResponse(stream_); + QuicSimpleServerStreamPeer::SendResponse(stream_); EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); EXPECT_TRUE(stream_->reading_stopped()); EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { +TEST_P(QuicSimpleServerStreamTest, TestSendErrorResponse) { EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); response_headers_[":version"] = "HTTP/1.1"; @@ -301,16 +302,17 @@ InSequence s; EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); - EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). - WillOnce(Return(QuicConsumedData(3, true))); + EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) + .Times(1) + .WillOnce(Return(QuicConsumedData(3, true))); - QuicSpdyServerStreamPeer::SendErrorResponse(stream_); + QuicSimpleServerStreamPeer::SendErrorResponse(stream_); EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); EXPECT_TRUE(stream_->reading_stopped()); EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, InvalidMultipleContentLength) { +TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); SpdyHeaderBlock request_headers; @@ -331,7 +333,7 @@ EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, InvalidLeadingNullContentLength) { +TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); SpdyHeaderBlock request_headers; @@ -352,7 +354,7 @@ EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, ValidMultipleContentLength) { +TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) { SpdyHeaderBlock request_headers; // \000 is a way to write the null byte when followed by a literal digit. request_headers["content-length"] = StringPiece("11\00011", 5); @@ -362,13 +364,13 @@ stream_->OnStreamHeaders(headers_string_); stream_->OnStreamHeadersComplete(false, headers_string_.size()); - EXPECT_EQ(11, QuicSpdyServerStreamPeer::content_length(stream_)); + EXPECT_EQ(11, QuicSimpleServerStreamPeer::content_length(stream_)); EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); EXPECT_FALSE(stream_->reading_stopped()); EXPECT_FALSE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { +TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { response_headers_[":version"] = "HTTP/1.1"; response_headers_[":status"] = "500 Server Error"; response_headers_["content-length"] = "3"; @@ -384,12 +386,13 @@ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); } EXPECT_FALSE(stream_->fin_received()); - QuicSpdyServerStreamPeer::SendErrorResponse(stream_); + QuicSimpleServerStreamPeer::SendErrorResponse(stream_); EXPECT_TRUE(stream_->reading_stopped()); EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, DoNotSendQuicRstStreamNoErrorWithRstReceived) { +TEST_P(QuicSimpleServerStreamTest, + DoNotSendQuicRstStreamNoErrorWithRstReceived) { response_headers_[":version"] = "HTTP/1.1"; response_headers_[":status"] = "500 Server Error"; response_headers_["content-length"] = "3"; @@ -406,29 +409,29 @@ EXPECT_TRUE(stream_->write_side_closed()); } -TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { +TEST_P(QuicSimpleServerStreamTest, InvalidHeadersWithFin) { char arr[] = { - 0x3a, 0x68, 0x6f, 0x73, // :hos - 0x74, 0x00, 0x00, 0x00, // t... - 0x00, 0x00, 0x00, 0x00, // .... - 0x07, 0x3a, 0x6d, 0x65, // .:me - 0x74, 0x68, 0x6f, 0x64, // thod - 0x00, 0x00, 0x00, 0x03, // .... - 0x47, 0x45, 0x54, 0x00, // GET. - 0x00, 0x00, 0x05, 0x3a, // ...: - 0x70, 0x61, 0x74, 0x68, // path - 0x00, 0x00, 0x00, 0x04, // .... - 0x2f, 0x66, 0x6f, 0x6f, // /foo - 0x00, 0x00, 0x00, 0x07, // .... - 0x3a, 0x73, 0x63, 0x68, // :sch - 0x65, 0x6d, 0x65, 0x00, // eme. - 0x00, 0x00, 0x00, 0x00, // .... - 0x00, 0x00, 0x08, 0x3a, // ...: - 0x76, 0x65, 0x72, 0x73, // vers - '\x96', 0x6f, 0x6e, 0x00, // <i(69)>on. - 0x00, 0x00, 0x08, 0x48, // ...H - 0x54, 0x54, 0x50, 0x2f, // TTP/ - 0x31, 0x2e, 0x31, // 1.1 + 0x3a, 0x68, 0x6f, 0x73, // :hos + 0x74, 0x00, 0x00, 0x00, // t... + 0x00, 0x00, 0x00, 0x00, // .... + 0x07, 0x3a, 0x6d, 0x65, // .:me + 0x74, 0x68, 0x6f, 0x64, // thod + 0x00, 0x00, 0x00, 0x03, // .... + 0x47, 0x45, 0x54, 0x00, // GET. + 0x00, 0x00, 0x05, 0x3a, // ...: + 0x70, 0x61, 0x74, 0x68, // path + 0x00, 0x00, 0x00, 0x04, // .... + 0x2f, 0x66, 0x6f, 0x6f, // /foo + 0x00, 0x00, 0x00, 0x07, // .... + 0x3a, 0x73, 0x63, 0x68, // :sch + 0x65, 0x6d, 0x65, 0x00, // eme. + 0x00, 0x00, 0x00, 0x00, // .... + 0x00, 0x00, 0x08, 0x3a, // ...: + 0x76, 0x65, 0x72, 0x73, // vers + '\x96', 0x6f, 0x6e, 0x00, // <i(69)>on. + 0x00, 0x00, 0x08, 0x48, // ...H + 0x54, 0x54, 0x50, 0x2f, // TTP/ + 0x31, 0x2e, 0x31, // 1.1 }; StringPiece data(arr, arraysize(arr)); QuicStreamFrame frame(stream_->id(), true, 0, data);
diff --git a/net/tools/quic/test_tools/quic_test_server.cc b/net/tools/quic/test_tools/quic_test_server.cc index 95530f2..417d2a6 100644 --- a/net/tools/quic/test_tools/quic_test_server.cc +++ b/net/tools/quic/test_tools/quic_test_server.cc
@@ -21,7 +21,7 @@ #include "net/tools/quic/quic_dispatcher.h" #include "net/tools/quic/quic_epoll_connection_helper.h" #include "net/tools/quic/quic_server_session.h" -#include "net/tools/quic/quic_spdy_server_stream.h" +#include "net/tools/quic/quic_simple_server_stream.h" namespace net { namespace tools {
diff --git a/net/tools/quic/test_tools/quic_test_server.h b/net/tools/quic/test_tools/quic_test_server.h index da97ccdb..9e460e8d 100644 --- a/net/tools/quic/test_tools/quic_test_server.h +++ b/net/tools/quic/test_tools/quic_test_server.h
@@ -13,7 +13,7 @@ #include "net/quic/quic_session.h" #include "net/tools/quic/quic_dispatcher.h" #include "net/tools/quic/quic_server.h" -#include "net/tools/quic/quic_spdy_server_stream.h" +#include "net/tools/quic/quic_simple_server_stream.h" namespace net { @@ -39,14 +39,14 @@ const QuicCryptoServerConfig* crypto_config) = 0; }; - // Factory for creating QuicServerStreams. + // Factory for creating QuicSimpleServerStreams. class StreamFactory { public: virtual ~StreamFactory() {} // Returns a new stream owned by the caller. - virtual QuicSpdyServerStream* CreateStream(QuicStreamId id, - QuicSpdySession* session) = 0; + virtual QuicSimpleServerStream* CreateStream(QuicStreamId id, + QuicSpdySession* session) = 0; }; class CryptoStreamFactory {
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc index 6cd44b0..ef5a4137 100644 --- a/net/url_request/url_request.cc +++ b/net/url_request/url_request.cc
@@ -493,10 +493,14 @@ } void URLRequest::set_delegate(Delegate* delegate) { + DCHECK(!delegate_); + DCHECK(delegate); delegate_ = delegate; } void URLRequest::Start() { + DCHECK(delegate_); + // TODO(pkasting): Remove ScopedTracker below once crbug.com/456327 is fixed. tracked_objects::ScopedTracker tracking_profile( FROM_HERE_WITH_EXPLICIT_FUNCTION("456327 URLRequest::Start")); @@ -792,7 +796,7 @@ this, network_delegate_, redirect_info.new_url); if (job) { RestartWithJob(job); - } else if (delegate_) { + } else { OnCallToDelegate(); delegate_->OnReceivedRedirect(this, redirect_info, defer_redirect); // |this| may be have been destroyed here. @@ -800,7 +804,7 @@ } void URLRequest::NotifyBeforeNetworkStart(bool* defer) { - if (delegate_ && !notified_before_network_start_) { + if (!notified_before_network_start_) { OnCallToDelegate(); delegate_->OnBeforeNetworkStart(this, defer); if (!*defer) @@ -830,23 +834,21 @@ if (job) { RestartWithJob(job); } else { - if (delegate_) { - // In some cases (e.g. an event was canceled), we might have sent the - // completion event and receive a NotifyResponseStarted() later. - if (!has_notified_completion_ && status_.is_success()) { - if (network_delegate_) - network_delegate_->NotifyResponseStarted(this); - } - - // Notify in case the entire URL Request has been finished. - if (!has_notified_completion_ && !status_.is_success()) - NotifyRequestCompleted(); - - OnCallToDelegate(); - delegate_->OnResponseStarted(this); - // Nothing may appear below this line as OnResponseStarted may delete - // |this|. + // In some cases (e.g. an event was canceled), we might have sent the + // completion event and receive a NotifyResponseStarted() later. + if (!has_notified_completion_ && status_.is_success()) { + if (network_delegate_) + network_delegate_->NotifyResponseStarted(this); } + + // Notify in case the entire URL Request has been finished. + if (!has_notified_completion_ && !status_.is_success()) + NotifyRequestCompleted(); + + OnCallToDelegate(); + delegate_->OnResponseStarted(this); + // Nothing may appear below this line as OnResponseStarted may delete + // |this|. } } @@ -1088,8 +1090,7 @@ case NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION: // Defer to the URLRequest::Delegate, since the NetworkDelegate // didn't take an action. - if (delegate_) - delegate_->OnAuthRequired(this, auth_info.get()); + delegate_->OnAuthRequired(this, auth_info.get()); break; case NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH: @@ -1108,14 +1109,12 @@ void URLRequest::NotifyCertificateRequested( SSLCertRequestInfo* cert_request_info) { - if (delegate_) - delegate_->OnCertificateRequested(this, cert_request_info); + delegate_->OnCertificateRequested(this, cert_request_info); } void URLRequest::NotifySSLCertificateError(const SSLInfo& ssl_info, bool fatal) { - if (delegate_) - delegate_->OnSSLCertificateError(this, ssl_info, fatal); + delegate_->OnSSLCertificateError(this, ssl_info, fatal); } bool URLRequest::CanGetCookies(const CookieList& cookie_list) const { @@ -1156,8 +1155,7 @@ if (bytes_read > 0 && !was_cached()) NetworkChangeNotifier::NotifyDataReceived(*this, bytes_read); - if (delegate_) - delegate_->OnReadCompleted(this, bytes_read); + delegate_->OnReadCompleted(this, bytes_read); // Nothing below this line as OnReadCompleted may delete |this|. }
diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h index f1d90ed..e4085fc 100644 --- a/net/url_request/url_request.h +++ b/net/url_request/url_request.h
@@ -303,8 +303,9 @@ ReferrerPolicy referrer_policy() const { return referrer_policy_; } void set_referrer_policy(ReferrerPolicy referrer_policy); - // Sets the delegate of the request. This value may be changed at any time, - // and it is permissible for it to be null. + // Sets the delegate of the request. This is only to allow creating a request + // before creating its delegate. |delegate| must be non-NULL and the request + // must not yet have a Delegate set. void set_delegate(Delegate* delegate); // Indicates that the request body should be sent using chunked transfer @@ -523,7 +524,8 @@ uint64 identifier() const { return identifier_; } // This method is called to start the request. The delegate will receive - // a OnResponseStarted callback when the request is started. + // a OnResponseStarted callback when the request is started. The request + // must have a delegate set before this method is called. void Start(); // This method may be called at any time after Start() has been called to @@ -621,9 +623,6 @@ // due to HSTS. If so, |redirect_url| is rewritten to the new HTTPS URL. bool GetHSTSRedirect(GURL* redirect_url) const; - // TODO(willchan): Undo this. Only temporarily public. - bool has_delegate() const { return delegate_ != NULL; } - // NOTE(willchan): This is just temporary for debugging // http://crbug.com/90971. // Allows to setting debug info into the URLRequest. @@ -726,9 +725,8 @@ // occurs. void NotifyResponseStarted(); - // These functions delegate to |delegate_| and may only be used if - // |delegate_| is not NULL. See URLRequest::Delegate for the meaning - // of these functions. + // These functions delegate to |delegate_|. See URLRequest::Delegate for the + // meaning of these functions. void NotifyAuthRequired(AuthChallengeInfo* auth_info); void NotifyAuthRequiredComplete(NetworkDelegate::AuthRequiredResponse result); void NotifyCertificateRequested(SSLCertRequestInfo* cert_request_info);
diff --git a/net/url_request/url_request_context.cc b/net/url_request/url_request_context.cc index b83cf023..e9ab617 100644 --- a/net/url_request/url_request_context.cc +++ b/net/url_request/url_request_context.cc
@@ -94,14 +94,12 @@ char url_buf[128]; const URLRequest* request = *url_requests_->begin(); base::strlcpy(url_buf, request->url().spec().c_str(), arraysize(url_buf)); - bool has_delegate = request->has_delegate(); int load_flags = request->load_flags(); base::debug::StackTrace stack_trace(NULL, 0); if (request->stack_trace()) stack_trace = *request->stack_trace(); base::debug::Alias(url_buf); base::debug::Alias(&num_requests); - base::debug::Alias(&has_delegate); base::debug::Alias(&load_flags); base::debug::Alias(&stack_trace); CHECK(false) << "Leaked " << num_requests << " URLRequest(s). First URL: "
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc index 80170d5..2a90ce0 100644 --- a/net/url_request/url_request_job.cc +++ b/net/url_request/url_request_job.cc
@@ -379,9 +379,6 @@ } void URLRequestJob::NotifyHeadersComplete() { - if (!request_->has_delegate()) - return; // The request was destroyed, so there is no more work to do. - if (has_handled_response_) return; @@ -420,10 +417,8 @@ // Ensure that the request wasn't detached, destroyed, or canceled in // NotifyReceivedRedirect. - if (!weak_this || !request_->has_delegate() || - !request_->status().is_success()) { + if (!weak_this || !request_->status().is_success()) return; - } if (defer_redirect) { deferred_redirect_info_ = redirect_info; @@ -482,9 +477,6 @@ FROM_HERE_WITH_EXPLICIT_FUNCTION( "475755 URLRequestJob::RawReadCompleted")); - if (!request_->has_delegate()) - return; // The request was destroyed, so there is no more work to do. - // TODO(darin): Bug 1004233. Re-enable this test once all of the chrome // unit_tests have been fixed to not trip this. #if 0 @@ -614,7 +606,7 @@ void URLRequestJob::CompleteNotifyDone() { // Check if we should notify the delegate that we're done because of an error. - if (!request_->status().is_success() && request_->has_delegate()) { + if (!request_->status().is_success()) { // We report the error differently depending on whether we've called // OnResponseStarted yet. if (has_handled_response_) {
diff --git a/ppapi/shared_impl/BUILD.gn b/ppapi/shared_impl/BUILD.gn index d959831..ff9b01ac 100644 --- a/ppapi/shared_impl/BUILD.gn +++ b/ppapi/shared_impl/BUILD.gn
@@ -139,17 +139,15 @@ ] } - # TODO(GYP) this isn't correct. This should only be specifically for the - # nacl_win64 build (cross-compiled for a 32-bit Chrome), rather than the - # native 64-bit Chrome build. + # This condition is catching the build of nacl64.exe, which is built + # in the 64-bit toolchain when the overall build is 32-bit. # See also //ppapi/thunk - if (is_win && current_cpu == "x64" && current_toolchain != default_toolchain) { + if (is_win && target_cpu == "x86" && current_cpu == "x64") { sources -= [ "ppb_audio_shared.cc", "ppb_graphics_3d_shared.cc", "ppb_opengles2_shared.cc", "private/net_address_private_impl.cc", - "private/ppb_host_resolver_shared.cc", ] }
diff --git a/ppapi/thunk/BUILD.gn b/ppapi/thunk/BUILD.gn index 766dc4a..d872f52 100644 --- a/ppapi/thunk/BUILD.gn +++ b/ppapi/thunk/BUILD.gn
@@ -172,14 +172,12 @@ ] } - # We exclude a few more things for nacl_win64, to avoid pulling in more - # dependencies. - # TODO(GYP) this isn't correct. This should only be specifically for the - # nacl_win64 build (cross-compiled for a 32-bit Chrome), rather than all - # 64-bit builds. + # This condition is catching the build of nacl64.exe, which is built in + # the 64-bit toolchain when the overall build is 32-bit. We exclude a + # few more things, to avoid pulling in more dependencies. # See also //ppapi/shared_impl - if (is_win && current_cpu == "x64" && current_toolchain != default_toolchain) { - sources += [ + if (is_win && target_cpu == "x86" && current_cpu == "x64") { + sources -= [ "ppb_graphics_3d_thunk.cc", "ppb_host_resolver_private_thunk.cc", "ppb_tcp_server_socket_private_thunk.cc",
diff --git a/remoting/android/OWNERS b/remoting/android/OWNERS index c730b84..56ae063 100644 --- a/remoting/android/OWNERS +++ b/remoting/android/OWNERS
@@ -1,6 +1,6 @@ -garykac@chromium.org +# If you modify this, please also update +# remoting/client/jni/OWNERS +joedow@chromium.org kelvinp@chromium.org lambroslambrou@chromium.org sergeyu@chromium.org -solb@chromium.org -wez@chromium.org
diff --git a/remoting/client/jni/OWNERS b/remoting/client/jni/OWNERS index c730b84..0aa784e 100644 --- a/remoting/client/jni/OWNERS +++ b/remoting/client/jni/OWNERS
@@ -1,6 +1,6 @@ -garykac@chromium.org +# If you modify this, please also update +# remoting/android/OWNERS +joedow@chromium.org kelvinp@chromium.org lambroslambrou@chromium.org sergeyu@chromium.org -solb@chromium.org -wez@chromium.org
diff --git a/remoting/host/basic_desktop_environment.cc b/remoting/host/basic_desktop_environment.cc index 6d9cc3c..f895162 100644 --- a/remoting/host/basic_desktop_environment.cc +++ b/remoting/host/basic_desktop_environment.cc
@@ -8,10 +8,6 @@ #include "base/logging.h" #include "base/single_thread_task_runner.h" #include "remoting/host/audio_capturer.h" -#if defined(OS_CHROMEOS) -#include "remoting/host/chromeos/aura_desktop_capturer.h" -#include "remoting/host/chromeos/mouse_cursor_monitor_aura.h" -#endif #include "remoting/host/client_session_control.h" #include "remoting/host/gnubby_auth_handler.h" #include "remoting/host/input_injector.h" @@ -21,6 +17,14 @@ #include "third_party/webrtc/modules/desktop_capture/mouse_cursor_monitor.h" #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" +#if defined(OS_CHROMEOS) +#include "remoting/host/chromeos/aura_desktop_capturer.h" +#include "remoting/host/chromeos/mouse_cursor_monitor_aura.h" +#endif +#if defined(USE_X11) +#include "remoting/host/linux/x11_util.h" +#endif + namespace remoting { BasicDesktopEnvironment::~BasicDesktopEnvironment() { @@ -97,6 +101,9 @@ webrtc::DesktopCaptureOptions::CreateDefault())), supports_touch_events_(supports_touch_events) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); +#if defined(USE_X11) + IgnoreXServerGrabs(desktop_capture_options_->x_display()->display(), true); +#endif } BasicDesktopEnvironmentFactory::BasicDesktopEnvironmentFactory(
diff --git a/remoting/host/input_injector_x11.cc b/remoting/host/input_injector_x11.cc index fc0c712..1a93c20 100644 --- a/remoting/host/input_injector_x11.cc +++ b/remoting/host/input_injector_x11.cc
@@ -24,6 +24,7 @@ #endif #include "remoting/host/clipboard.h" #include "remoting/host/linux/unicode_to_keysym.h" +#include "remoting/host/linux/x11_util.h" #include "remoting/proto/internal.pb.h" #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" #include "ui/events/keycodes/dom/dom_code.h" @@ -180,9 +181,6 @@ Display* display_; Window root_window_; - int test_event_base_; - int test_error_base_; - // Number of buttons we support. // Left, Right, Middle, VScroll Up/Down, HScroll Left/Right. static const int kNumPointerButtons = 7; @@ -266,11 +264,7 @@ return false; } - // TODO(ajwong): Do we want to check the major/minor version at all for XTest? - int major = 0; - int minor = 0; - if (!XTestQueryExtension(display_, &test_event_base_, &test_error_base_, - &major, &minor)) { + if (!IgnoreXServerGrabs(display_, true)) { LOG(ERROR) << "Server does not support XTest."; return false; }
diff --git a/remoting/host/linux/x11_util.cc b/remoting/host/linux/x11_util.cc index 8857a6a..1e88ba7 100644 --- a/remoting/host/linux/x11_util.cc +++ b/remoting/host/linux/x11_util.cc
@@ -4,6 +4,8 @@ #include "remoting/host/linux/x11_util.h" +#include <X11/extensions/XTest.h> + #include "base/bind.h" namespace remoting { @@ -54,4 +56,19 @@ XFlush(display_); } + +bool IgnoreXServerGrabs(Display* display, bool ignore) { + int test_event_base = 0; + int test_error_base = 0; + int major = 0; + int minor = 0; + if (!XTestQueryExtension(display, &test_event_base, &test_error_base, + &major, &minor)) { + return false; + } + + XTestGrabControl(display, ignore); + return true; +} + } // namespace remoting
diff --git a/remoting/host/linux/x11_util.h b/remoting/host/linux/x11_util.h index 03d38214..7b3e898 100644 --- a/remoting/host/linux/x11_util.h +++ b/remoting/host/linux/x11_util.h
@@ -58,6 +58,11 @@ DISALLOW_COPY_AND_ASSIGN(ScopedXGrabServer); }; + +// Make a connection to the X Server impervious to X Server grabs. Returns +// true if successful or false if the required XTEST extension is not present. +bool IgnoreXServerGrabs(Display* display, bool ignore); + } // namespace remoting #endif // REMOTING_HOST_LINUX_X11_UTIL_H_
diff --git a/remoting/protocol/BUILD.gn b/remoting/protocol/BUILD.gn index fa66df1..eb93652 100644 --- a/remoting/protocol/BUILD.gn +++ b/remoting/protocol/BUILD.gn
@@ -98,8 +98,8 @@ "clipboard_filter_unittest.cc", "connection_tester.cc", "connection_tester.h", + "connection_unittest.cc", "content_description_unittest.cc", - "ice_connection_to_client_unittest.cc", "ice_transport_unittest.cc", "input_event_tracker_unittest.cc", "input_filter_unittest.cc",
diff --git a/remoting/protocol/channel_multiplexer_unittest.cc b/remoting/protocol/channel_multiplexer_unittest.cc index afc4458..72e6495 100644 --- a/remoting/protocol/channel_multiplexer_unittest.cc +++ b/remoting/protocol/channel_multiplexer_unittest.cc
@@ -12,7 +12,7 @@ #include "net/socket/stream_socket.h" #include "remoting/base/constants.h" #include "remoting/protocol/connection_tester.h" -#include "remoting/protocol/fake_session.h" +#include "remoting/protocol/fake_stream_socket.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -71,30 +71,16 @@ protected: void SetUp() override { + host_channel_factory_.PairWith(&client_channel_factory_); + // Create pair of multiplexers and connect them to each other. - host_mux_.reset(new ChannelMultiplexer( - host_session_.GetTransport()->GetStreamChannelFactory(), - kMuxChannelName)); - client_mux_.reset(new ChannelMultiplexer( - client_session_.GetTransport()->GetStreamChannelFactory(), - kMuxChannelName)); - } + host_mux_.reset( + new ChannelMultiplexer(&host_channel_factory_, kMuxChannelName)); + client_mux_.reset( + new ChannelMultiplexer(&client_channel_factory_, kMuxChannelName)); - // Connect sockets to each other. Must be called after we've created at least - // one channel with each multiplexer. - void ConnectSockets() { - FakeStreamSocket* host_socket = - host_session_.GetTransport() - ->GetStreamChannelFactory() - ->GetFakeChannel(ChannelMultiplexer::kMuxChannelName); - FakeStreamSocket* client_socket = - client_session_.GetTransport() - ->GetStreamChannelFactory() - ->GetFakeChannel(ChannelMultiplexer::kMuxChannelName); - host_socket->PairWith(client_socket); - - // Make writes asynchronous in one direction. - host_socket->set_async_write(true); + // Make writes asynchronous in one direction + host_channel_factory_.set_async_write(true); } void CreateChannel(const std::string& name, @@ -136,8 +122,8 @@ base::MessageLoop message_loop_; - FakeSession host_session_; - FakeSession client_session_; + FakeStreamChannelFactory host_channel_factory_; + FakeStreamChannelFactory client_channel_factory_; scoped_ptr<ChannelMultiplexer> host_mux_; scoped_ptr<ChannelMultiplexer> client_mux_; @@ -155,8 +141,6 @@ ASSERT_NO_FATAL_FAILURE( CreateChannel(kTestChannelName, &host_socket, &client_socket)); - ConnectSockets(); - StreamConnectionTester tester(host_socket.get(), client_socket.get(), kMessageSize, kMessages); tester.Start(); @@ -175,8 +159,6 @@ ASSERT_NO_FATAL_FAILURE( CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); - ConnectSockets(); - StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(), kMessageSize, kMessages); StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(), @@ -212,8 +194,6 @@ ASSERT_NO_FATAL_FAILURE( CreateChannel("ch4", &host_socket4, &client_socket4)); - ConnectSockets(); - StreamConnectionTester tester1(host_socket1_.get(), client_socket1_.get(), kMessageSize, kMessages); StreamConnectionTester tester2(host_socket2_.get(), client_socket2_.get(), @@ -247,11 +227,8 @@ ASSERT_NO_FATAL_FAILURE( CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); - ConnectSockets(); - FakeStreamSocket* socket = - host_session_.GetTransport()->GetStreamChannelFactory()->GetFakeChannel( - kMuxChannelName); + host_channel_factory_.GetFakeChannel(kMuxChannelName); socket->set_next_write_error(net::ERR_FAILED); socket->set_async_write(false); @@ -283,11 +260,8 @@ ASSERT_NO_FATAL_FAILURE( CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); - ConnectSockets(); - FakeStreamSocket* socket = - host_session_.GetTransport()->GetStreamChannelFactory()->GetFakeChannel( - kMuxChannelName); + host_channel_factory_.GetFakeChannel(kMuxChannelName); socket->set_next_write_error(net::ERR_FAILED); socket->set_async_write(true); @@ -318,11 +292,8 @@ ASSERT_NO_FATAL_FAILURE( CreateChannel(kTestChannelName2, &host_socket2_, &client_socket2_)); - ConnectSockets(); - FakeStreamSocket* socket = - host_session_.GetTransport()->GetStreamChannelFactory()->GetFakeChannel( - kMuxChannelName); + host_channel_factory_.GetFakeChannel(kMuxChannelName); socket->set_next_write_error(net::ERR_FAILED); socket->set_async_write(true); @@ -356,10 +327,8 @@ } TEST_F(ChannelMultiplexerTest, SessionFail) { - host_session_.GetTransport()->GetStreamChannelFactory() - ->set_asynchronous_create(true); - host_session_.GetTransport()->GetStreamChannelFactory() - ->set_fail_create(true); + host_channel_factory_.set_asynchronous_create(true); + host_channel_factory_.set_fail_create(true); MockConnectCallback cb1; MockConnectCallback cb2;
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc new file mode 100644 index 0000000..219b82e4 --- /dev/null +++ b/remoting/protocol/connection_unittest.cc
@@ -0,0 +1,185 @@ +// 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/message_loop/message_loop.h" +#include "base/run_loop.h" +#include "remoting/base/constants.h" +#include "remoting/protocol/connection_to_host_impl.h" +#include "remoting/protocol/fake_session.h" +#include "remoting/protocol/ice_connection_to_client.h" +#include "remoting/protocol/protocol_mock_objects.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::InvokeWithoutArgs; +using ::testing::NotNull; +using ::testing::StrictMock; + +namespace remoting { +namespace protocol { + +namespace { + +MATCHER_P(EqualsCapabilitiesMessage, message, "") { + return arg.capabilities() == message.capabilities(); +} + +MATCHER_P(EqualsKeyEvent, event, "") { + return arg.usb_keycode() == event.usb_keycode() && + arg.pressed() == event.pressed(); +} + +class MockConnectionToHostEventCallback + : public ConnectionToHost::HostEventCallback { + public: + MockConnectionToHostEventCallback() {} + ~MockConnectionToHostEventCallback() override {} + + MOCK_METHOD2(OnConnectionState, + void(ConnectionToHost::State state, ErrorCode error)); + MOCK_METHOD1(OnConnectionReady, void(bool ready)); + MOCK_METHOD2(OnRouteChanged, + void(const std::string& channel_name, + const TransportRoute& route)); +}; + +} // namespace + +class ConnectionTest : public testing::Test { + public: + ConnectionTest() {} + + protected: + void SetUp() override { + // Setup host side. + host_session_ = new FakeSession(); + host_connection_.reset(new IceConnectionToClient( + make_scoped_ptr(host_session_), message_loop_.task_runner())); + host_connection_->SetEventHandler(&host_event_handler_); + host_connection_->set_clipboard_stub(&host_clipboard_stub_); + host_connection_->set_host_stub(&host_stub_); + host_connection_->set_input_stub(&host_input_stub_); + + // Setup client side. + owned_client_session_.reset(new FakeSession()); + client_session_ = owned_client_session_.get(); + client_connection_.reset(new ConnectionToHostImpl()); + client_connection_->set_client_stub(&client_stub_); + client_connection_->set_clipboard_stub(&client_clipboard_stub_); + client_connection_->set_video_stub(&client_video_stub_); + } + + void Connect() { + { + testing::InSequence sequence; + EXPECT_CALL(host_event_handler_, + OnConnectionAuthenticating(host_connection_.get())); + EXPECT_CALL(host_event_handler_, + OnConnectionAuthenticated(host_connection_.get())); + } + EXPECT_CALL(host_event_handler_, + OnConnectionChannelsConnected(host_connection_.get())); + + { + testing::InSequence sequence; + EXPECT_CALL(client_event_handler_, + OnConnectionState(ConnectionToHost::CONNECTING, OK)); + EXPECT_CALL(client_event_handler_, + OnConnectionState(ConnectionToHost::AUTHENTICATED, OK)); + EXPECT_CALL(client_event_handler_, + OnConnectionState(ConnectionToHost::CONNECTED, OK)); + } + + client_connection_->Connect(owned_client_session_.Pass(), + &client_event_handler_); + client_session_->SimulateConnection(host_session_); + base::RunLoop().RunUntilIdle(); + } + + void TearDown() override { + client_connection_.reset(); + host_connection_.reset(); + base::RunLoop().RunUntilIdle(); + } + + base::MessageLoop message_loop_; + + MockConnectionToClientEventHandler host_event_handler_; + MockClipboardStub host_clipboard_stub_; + MockHostStub host_stub_; + MockInputStub host_input_stub_; + scoped_ptr<ConnectionToClient> host_connection_; + FakeSession* host_session_; // Owned by |host_connection_|. + + MockConnectionToHostEventCallback client_event_handler_; + MockClientStub client_stub_; + MockClipboardStub client_clipboard_stub_; + MockVideoStub client_video_stub_; + scoped_ptr<ConnectionToHost> client_connection_; + FakeSession* client_session_; // Owned by |client_connection_|. + scoped_ptr<FakeSession> owned_client_session_; + + private: + DISALLOW_COPY_AND_ASSIGN(ConnectionTest); +}; + +TEST_F(ConnectionTest, RejectConnection) { + EXPECT_CALL(client_event_handler_, + OnConnectionState(ConnectionToHost::CONNECTING, OK)); + EXPECT_CALL(client_event_handler_, + OnConnectionState(ConnectionToHost::CLOSED, OK)); + + client_connection_->Connect(owned_client_session_.Pass(), + &client_event_handler_); + client_session_->event_handler()->OnSessionStateChange(Session::CLOSED); +} + +TEST_F(ConnectionTest, Disconnect) { + Connect(); + + EXPECT_CALL(client_event_handler_, + OnConnectionState(ConnectionToHost::CLOSED, OK)); + EXPECT_CALL(host_event_handler_, + OnConnectionClosed(host_connection_.get(), OK)); + + client_session_->Close(OK); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(ConnectionTest, Control) { + Connect(); + + Capabilities capabilities_msg; + capabilities_msg.set_capabilities("test_capability"); + + EXPECT_CALL(client_stub_, + SetCapabilities(EqualsCapabilitiesMessage(capabilities_msg))); + + // Send capabilities from the host. + host_connection_->client_stub()->SetCapabilities(capabilities_msg); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(ConnectionTest, Events) { + Connect(); + + KeyEvent event; + event.set_usb_keycode(3); + event.set_pressed(true); + + EXPECT_CALL(host_event_handler_, + OnInputEventReceived(host_connection_.get(), _)); + EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsKeyEvent(event))); + + // Send capabilities from the client. + client_connection_->input_stub()->InjectKeyEvent(event); + + base::RunLoop().RunUntilIdle(); +} + +} // namespace protocol +} // namespace remoting
diff --git a/remoting/protocol/fake_datagram_socket.cc b/remoting/protocol/fake_datagram_socket.cc index 010cb36..0e52d7c3 100644 --- a/remoting/protocol/fake_datagram_socket.cc +++ b/remoting/protocol/fake_datagram_socket.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/location.h" #include "base/single_thread_task_runner.h" #include "base/thread_task_runner_handle.h" #include "net/base/address_list.h"
diff --git a/remoting/protocol/fake_session.cc b/remoting/protocol/fake_session.cc index 6b299b0..46edfe9 100644 --- a/remoting/protocol/fake_session.cc +++ b/remoting/protocol/fake_session.cc
@@ -32,14 +32,31 @@ } FakeSession::FakeSession() - : event_handler_(nullptr), - config_(SessionConfig::ForTest()), - jid_(kTestJid), - error_(OK), - closed_(false) {} + : config_(SessionConfig::ForTest()), jid_(kTestJid), weak_factory_(this) {} FakeSession::~FakeSession() {} +void FakeSession::SimulateConnection(FakeSession* peer) { + peer_ = peer->weak_factory_.GetWeakPtr(); + peer->peer_ = weak_factory_.GetWeakPtr(); + + transport_.GetStreamChannelFactory()->PairWith( + peer->transport_.GetStreamChannelFactory()); + transport_.GetMultiplexedChannelFactory()->PairWith( + peer->transport_.GetMultiplexedChannelFactory()); + + event_handler_->OnSessionStateChange(CONNECTING); + peer->event_handler_->OnSessionStateChange(ACCEPTING); + peer->event_handler_->OnSessionStateChange(ACCEPTED); + event_handler_->OnSessionStateChange(ACCEPTED); + event_handler_->OnSessionStateChange(AUTHENTICATING); + peer->event_handler_->OnSessionStateChange(AUTHENTICATING); + event_handler_->OnSessionStateChange(AUTHENTICATED); + peer->event_handler_->OnSessionStateChange(AUTHENTICATED); + event_handler_->OnSessionStateChange(CONNECTED); + peer->event_handler_->OnSessionStateChange(CONNECTED); +} + void FakeSession::SetEventHandler(EventHandler* event_handler) { event_handler_ = event_handler; } @@ -63,6 +80,14 @@ void FakeSession::Close(ErrorCode error) { closed_ = true; error_ = error; + event_handler_->OnSessionStateChange(CLOSED); + + FakeSession* peer = peer_.get(); + if (peer) { + peer->peer_.reset(); + peer_.reset(); + peer->Close(error); + } } } // namespace protocol
diff --git a/remoting/protocol/fake_session.h b/remoting/protocol/fake_session.h index 658dc194..7301840f 100644 --- a/remoting/protocol/fake_session.h +++ b/remoting/protocol/fake_session.h
@@ -10,6 +10,7 @@ #include <vector> #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "remoting/protocol/fake_stream_socket.h" #include "remoting/protocol/session.h" #include "remoting/protocol/transport.h" @@ -42,10 +43,10 @@ FakeSession(); ~FakeSession() override; + void SimulateConnection(FakeSession* peer); + EventHandler* event_handler() { return event_handler_; } - void set_error(ErrorCode error) { error_ = error; } - bool is_closed() const { return closed_; } // Session interface. @@ -56,16 +57,20 @@ FakeTransport* GetTransport() override; void Close(ErrorCode error) override; - public: - EventHandler* event_handler_; + private: + EventHandler* event_handler_ = nullptr; scoped_ptr<SessionConfig> config_; std::string jid_; FakeTransport transport_; - ErrorCode error_; - bool closed_; + ErrorCode error_ = OK; + bool closed_ = false; + + base::WeakPtr<FakeSession> peer_; + + base::WeakPtrFactory<FakeSession> weak_factory_; DISALLOW_COPY_AND_ASSIGN(FakeSession); };
diff --git a/remoting/protocol/fake_stream_socket.cc b/remoting/protocol/fake_stream_socket.cc index b857ca1a1..1c84ee5 100644 --- a/remoting/protocol/fake_stream_socket.cc +++ b/remoting/protocol/fake_stream_socket.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/location.h" #include "base/single_thread_task_runner.h" #include "base/thread_task_runner_handle.h" #include "net/base/address_list.h" @@ -18,16 +19,7 @@ namespace protocol { FakeStreamSocket::FakeStreamSocket() - : async_write_(false), - write_pending_(false), - write_limit_(0), - next_write_error_(net::OK), - next_read_error_(net::OK), - read_buffer_size_(0), - input_pos_(0), - task_runner_(base::ThreadTaskRunnerHandle::Get()), - weak_factory_(this) { -} + : task_runner_(base::ThreadTaskRunnerHandle::Get()), weak_factory_(this) {} FakeStreamSocket::~FakeStreamSocket() { EXPECT_TRUE(task_runner_->BelongsToCurrentThread()); @@ -157,8 +149,6 @@ FakeStreamChannelFactory::FakeStreamChannelFactory() : task_runner_(base::ThreadTaskRunnerHandle::Get()), - asynchronous_create_(false), - fail_create_(false), weak_factory_(this) { } @@ -169,11 +159,24 @@ return channels_[name].get(); } +void FakeStreamChannelFactory::PairWith( + FakeStreamChannelFactory* peer_factory) { + peer_factory_ = peer_factory->weak_factory_.GetWeakPtr(); + peer_factory->peer_factory_ = weak_factory_.GetWeakPtr(); +} + void FakeStreamChannelFactory::CreateChannel( const std::string& name, const ChannelCreatedCallback& callback) { scoped_ptr<FakeStreamSocket> channel(new FakeStreamSocket()); channels_[name] = channel->GetWeakPtr(); + channel->set_async_write(async_write_); + + if (peer_factory_) { + FakeStreamSocket* peer_channel = peer_factory_->GetFakeChannel(name); + if (peer_channel) + channel->PairWith(peer_channel); + } if (fail_create_) channel.reset();
diff --git a/remoting/protocol/fake_stream_socket.h b/remoting/protocol/fake_stream_socket.h index c234f33..bfa3fc9 100644 --- a/remoting/protocol/fake_stream_socket.h +++ b/remoting/protocol/fake_stream_socket.h
@@ -79,20 +79,20 @@ const net::CompletionCallback& callback); void DoWrite(const scoped_refptr<net::IOBuffer>& buf, int buf_len); - bool async_write_; - bool write_pending_; - int write_limit_; - int next_write_error_; + bool async_write_ = false; + bool write_pending_ = false; + int write_limit_ = 0; + int next_write_error_ = 0; - int next_read_error_; + int next_read_error_ = 0; scoped_refptr<net::IOBuffer> read_buffer_; - int read_buffer_size_; + int read_buffer_size_ = 0; net::CompletionCallback read_callback_; base::WeakPtr<FakeStreamSocket> peer_socket_; std::string written_data_; std::string input_data_; - int input_pos_; + int input_pos_ = 0; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; base::WeakPtrFactory<FakeStreamSocket> weak_factory_; @@ -112,8 +112,15 @@ void set_fail_create(bool fail_create) { fail_create_ = fail_create; } + // Enables asynchronous Write() on created channels. + void set_async_write(bool async_write) { async_write_ = async_write; } + FakeStreamSocket* GetFakeChannel(const std::string& name); + // Pairs the socket with |peer_socket|. Deleting either of the paired sockets + // unpairs them. + void PairWith(FakeStreamChannelFactory* peer_factory); + // ChannelFactory interface. void CreateChannel(const std::string& name, const ChannelCreatedCallback& callback) override; @@ -125,11 +132,14 @@ const ChannelCreatedCallback& callback); scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - bool asynchronous_create_; - std::map<std::string, base::WeakPtr<FakeStreamSocket> > channels_; + bool asynchronous_create_ = false; + std::map<std::string, base::WeakPtr<FakeStreamSocket>> channels_; - bool fail_create_; + bool fail_create_ = false; + bool async_write_ = false; + + base::WeakPtr<FakeStreamChannelFactory> peer_factory_; base::WeakPtrFactory<FakeStreamChannelFactory> weak_factory_; DISALLOW_COPY_AND_ASSIGN(FakeStreamChannelFactory);
diff --git a/remoting/protocol/ice_connection_to_client.cc b/remoting/protocol/ice_connection_to_client.cc index e794987..88e08b3b 100644 --- a/remoting/protocol/ice_connection_to_client.cc +++ b/remoting/protocol/ice_connection_to_client.cc
@@ -47,7 +47,10 @@ scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner) : event_handler_(nullptr), session_(session.Pass()), - video_encode_task_runner_(video_encode_task_runner) { + video_encode_task_runner_(video_encode_task_runner), + control_dispatcher_(new HostControlDispatcher()), + event_dispatcher_(new HostEventDispatcher()), + video_dispatcher_(new HostVideoDispatcher()) { session_->SetEventHandler(this); } @@ -139,18 +142,15 @@ break; case Session::AUTHENTICATED: // Initialize channels. - control_dispatcher_.reset(new HostControlDispatcher()); control_dispatcher_->Init(session_.get(), session_->config().control_config(), this); - event_dispatcher_.reset(new HostEventDispatcher()); event_dispatcher_->Init(session_.get(), session_->config().event_config(), this); event_dispatcher_->set_on_input_event_callback( base::Bind(&IceConnectionToClient::OnInputEventReceived, base::Unretained(this))); - video_dispatcher_.reset(new HostVideoDispatcher()); video_dispatcher_->Init(session_.get(), session_->config().video_config(), this);
diff --git a/remoting/protocol/ice_connection_to_client_unittest.cc b/remoting/protocol/ice_connection_to_client_unittest.cc deleted file mode 100644 index b6a860b3..0000000 --- a/remoting/protocol/ice_connection_to_client_unittest.cc +++ /dev/null
@@ -1,113 +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 "remoting/protocol/ice_connection_to_client.h" - -#include "base/bind.h" -#include "base/message_loop/message_loop.h" -#include "base/run_loop.h" -#include "remoting/base/constants.h" -#include "remoting/protocol/fake_session.h" -#include "remoting/protocol/protocol_mock_objects.h" -#include "testing/gmock/include/gmock/gmock.h" - -using ::testing::_; -using ::testing::InvokeWithoutArgs; -using ::testing::NotNull; -using ::testing::StrictMock; - -namespace remoting { -namespace protocol { - -class IpcConnectionToClientTest : public testing::Test { - public: - IpcConnectionToClientTest() {} - - protected: - void SetUp() override { - session_ = new FakeSession(); - - // Allocate a ClientConnection object with the mock objects. - viewer_.reset(new IceConnectionToClient(make_scoped_ptr(session_), - message_loop_.task_runner())); - viewer_->SetEventHandler(&handler_); - EXPECT_CALL(handler_, OnConnectionAuthenticated(viewer_.get())) - .WillOnce( - InvokeWithoutArgs(this, &IpcConnectionToClientTest::ConnectStubs)); - EXPECT_CALL(handler_, OnConnectionChannelsConnected(viewer_.get())); - session_->event_handler()->OnSessionStateChange(Session::ACCEPTED); - session_->event_handler()->OnSessionStateChange(Session::AUTHENTICATED); - base::RunLoop().RunUntilIdle(); - } - - void TearDown() override { - viewer_.reset(); - base::RunLoop().RunUntilIdle(); - } - - void ConnectStubs() { - viewer_->set_clipboard_stub(&clipboard_stub_); - viewer_->set_host_stub(&host_stub_); - viewer_->set_input_stub(&input_stub_); - } - - base::MessageLoop message_loop_; - MockConnectionToClientEventHandler handler_; - MockClipboardStub clipboard_stub_; - MockHostStub host_stub_; - MockInputStub input_stub_; - scoped_ptr<ConnectionToClient> viewer_; - - FakeSession* session_; - - private: - DISALLOW_COPY_AND_ASSIGN(IpcConnectionToClientTest); -}; - -TEST_F(IpcConnectionToClientTest, SendUpdateStream) { - Capabilities capabilities; - viewer_->client_stub()->SetCapabilities(capabilities); - - base::RunLoop().RunUntilIdle(); - - // Verify that something has been written. - // TODO(sergeyu): Verify that the correct data has been written. - FakeStreamSocket* channel = - session_->GetTransport()->GetStreamChannelFactory()->GetFakeChannel( - kControlChannelName); - ASSERT_TRUE(channel); - EXPECT_FALSE(channel->written_data().empty()); - - // And then close the connection to ConnectionToClient. - viewer_->Disconnect(protocol::OK); - - base::RunLoop().RunUntilIdle(); -} - -TEST_F(IpcConnectionToClientTest, NoWriteAfterDisconnect) { - Capabilities capabilities; - viewer_->client_stub()->SetCapabilities(capabilities); - - // And then close the connection to ConnectionToClient. - viewer_->Disconnect(protocol::OK); - - // The test will crash if data writer tries to write data to the - // channel socket. - // TODO(sergeyu): Use MockSession to verify that no data is written? - base::RunLoop().RunUntilIdle(); -} - -TEST_F(IpcConnectionToClientTest, StateChange) { - EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), OK)); - session_->event_handler()->OnSessionStateChange(Session::CLOSED); - base::RunLoop().RunUntilIdle(); - - EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), SESSION_REJECTED)); - session_->set_error(SESSION_REJECTED); - session_->event_handler()->OnSessionStateChange(Session::FAILED); - base::RunLoop().RunUntilIdle(); -} - -} // namespace protocol -} // namespace remoting
diff --git a/remoting/remoting_test.gypi b/remoting/remoting_test.gypi index 4ce76d7..a32b843 100644 --- a/remoting/remoting_test.gypi +++ b/remoting/remoting_test.gypi
@@ -312,8 +312,8 @@ 'protocol/clipboard_filter_unittest.cc', 'protocol/connection_tester.cc', 'protocol/connection_tester.h', + 'protocol/connection_unittest.cc', 'protocol/content_description_unittest.cc', - 'protocol/ice_connection_to_client_unittest.cc', 'protocol/ice_transport_unittest.cc', 'protocol/input_event_tracker_unittest.cc', 'protocol/input_filter_unittest.cc',
diff --git a/sandbox/win/BUILD.gn b/sandbox/win/BUILD.gn index 4d1dd58..327396b 100644 --- a/sandbox/win/BUILD.gn +++ b/sandbox/win/BUILD.gn
@@ -4,7 +4,11 @@ import("//testing/test.gni") -source_set("sandbox") { +# This needs to be a static library rather than a sources set because small +# portions of this are used in some contexts (like chrome_elf), and it +# doesnn't seem to dead-code strip very well. This saves 12K on chrome_elf.dll, +# over a source set, for example. +static_library("sandbox") { sources = [ "src/acl.cc", "src/acl.h",
diff --git a/sandbox/win/src/target_process.cc b/sandbox/win/src/target_process.cc index 69dce20..8645e75 100644 --- a/sandbox/win/src/target_process.cc +++ b/sandbox/win/src/target_process.cc
@@ -284,7 +284,7 @@ return ::GetLastError(); } - DWORD access = FILE_MAP_READ | FILE_MAP_WRITE; + DWORD access = FILE_MAP_READ | FILE_MAP_WRITE | SECTION_QUERY; HANDLE target_shared_section; if (!::DuplicateHandle(::GetCurrentProcess(), shared_section_.Get(), sandbox_process_info_.process_handle(),
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index e78e287..62a250b 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -206,6 +206,10 @@ // // Remove these as we update our sites. // +#ifndef SK_SUPPORT_LEGACY_PRESCALE_SEMANTICS +# define SK_SUPPORT_LEGACY_PRESCALE_SEMANTICS +#endif + #ifndef SK_SUPPORT_LEGACY_GETTOPDEVICE # define SK_SUPPORT_LEGACY_GETTOPDEVICE #endif @@ -234,6 +238,10 @@ # define SK_SUPPORT_LEGACY_BITMAP_SAMPLER_BIAS #endif +#ifndef SK_SUPPORT_LEGACY_SAVELAYERPARAMS +# define SK_SUPPORT_LEGACY_SAVELAYERPARAMS +#endif + ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/sql/connection.cc b/sql/connection.cc index 825d3192..1213a77f 100644 --- a/sql/connection.cc +++ b/sql/connection.cc
@@ -24,6 +24,7 @@ #include "base/synchronization/lock.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/process_memory_dump.h" +#include "sql/meta_table.h" #include "sql/statement.h" #include "third_party/sqlite/sqlite3.h" @@ -458,6 +459,7 @@ base::HistogramBase::kUmaTargetedHistogramFlag); if (histogram) histogram->Add(sample); + UMA_HISTOGRAM_COUNTS("Sqlite.SizeKB", sample); } } @@ -883,54 +885,43 @@ size_t Connection::GetAppropriateMmapSize() { AssertIOAllowed(); - // TODO(shess): Using sql::MetaTable seems indicated, but mixing - // sql::MetaTable and direct access seems error-prone. It might make sense to - // simply integrate sql::MetaTable functionality into sql::Connection. - #if defined(OS_IOS) // iOS SQLite does not support memory mapping. return 0; #endif - // If the database doesn't have a place to track progress, assume the worst. - // This will happen when new databases are created. - if (!DoesTableExist("meta")) { + // How much to map if no errors are found. 50MB encompasses the 99th + // percentile of Chrome databases in the wild, so this should be good. + const size_t kMmapEverything = 256 * 1024 * 1024; + + // If the database doesn't have a place to track progress, assume the best. + // This will happen when new databases are created, or if a database doesn't + // use a meta table. sql::MetaTable::Init() will preload kMmapSuccess. + // TODO(shess): Databases not using meta include: + // DOMStorageDatabase (localstorage) + // ActivityDatabase (extensions activity log) + // PredictorDatabase (prefetch and autocomplete predictor data) + // SyncDirectory (sync metadata storage) + // For now, these all have mmap disabled to allow other databases to get the + // default-enable path. sqlite-diag could be an alternative for all but + // DOMStorageDatabase, which creates many small databases. + // http://crbug.com/537742 + if (!MetaTable::DoesTableExist(this)) { RecordOneEvent(EVENT_MMAP_META_MISSING); - return 0; + return kMmapEverything; } - // Key into meta table to get status from a previous run. The value - // represents how much data in bytes has successfully been read from the - // database. |kMmapFailure| indicates that there was a read error and the - // database should not be memory-mapped, while |kMmapSuccess| indicates that - // the entire file was read at some point and can be memory-mapped without - // constraint. - const char* kMmapStatusKey = "mmap_status"; - static const sqlite3_int64 kMmapFailure = -2; - static const sqlite3_int64 kMmapSuccess = -1; - - // Start reading from 0 unless status is found in meta table. - sqlite3_int64 mmap_ofs = 0; - - // Retrieve the current status. It is fine for the status to be missing - // entirely, but any error prevents memory-mapping. - { - const char* kMmapStatusSql = "SELECT value FROM meta WHERE key = ?"; - Statement s(GetUniqueStatement(kMmapStatusSql)); - s.BindString(0, kMmapStatusKey); - if (s.Step()) { - mmap_ofs = s.ColumnInt64(0); - } else if (!s.Succeeded()) { - RecordOneEvent(EVENT_MMAP_META_FAILURE_READ); - return 0; - } + int64_t mmap_ofs = 0; + if (!MetaTable::GetMmapStatus(this, &mmap_ofs)) { + RecordOneEvent(EVENT_MMAP_META_FAILURE_READ); + return 0; } // Database read failed in the past, don't memory map. - if (mmap_ofs == kMmapFailure) { + if (mmap_ofs == MetaTable::kMmapFailure) { RecordOneEvent(EVENT_MMAP_FAILED); return 0; - } else if (mmap_ofs != kMmapSuccess) { + } else if (mmap_ofs != MetaTable::kMmapSuccess) { // Continue reading from previous offset. DCHECK_GE(mmap_ofs, 0); @@ -981,7 +972,7 @@ break; } else { // TODO(shess): Consider calling OnSqliteError(). - mmap_ofs = kMmapFailure; + mmap_ofs = MetaTable::kMmapFailure; break; } } @@ -989,20 +980,16 @@ // Log these events after update to distinguish meta update failure. Events event; if (mmap_ofs >= db_size) { - mmap_ofs = kMmapSuccess; + mmap_ofs = MetaTable::kMmapSuccess; event = EVENT_MMAP_SUCCESS_NEW; } else if (mmap_ofs > 0) { event = EVENT_MMAP_SUCCESS_PARTIAL; } else { - DCHECK_EQ(kMmapFailure, mmap_ofs); + DCHECK_EQ(MetaTable::kMmapFailure, mmap_ofs); event = EVENT_MMAP_FAILED_NEW; } - const char* kMmapUpdateStatusSql = "REPLACE INTO meta VALUES (?, ?)"; - Statement s(GetUniqueStatement(kMmapUpdateStatusSql)); - s.BindString(0, kMmapStatusKey); - s.BindInt64(1, mmap_ofs); - if (!s.Run()) { + if (!MetaTable::SetMmapStatus(this, mmap_ofs)) { RecordOneEvent(EVENT_MMAP_META_FAILURE_UPDATE); return 0; } @@ -1011,10 +998,10 @@ } } - if (mmap_ofs == kMmapFailure) + if (mmap_ofs == MetaTable::kMmapFailure) return 0; - if (mmap_ofs == kMmapSuccess) - return 256 * 1024 * 1024; + if (mmap_ofs == MetaTable::kMmapSuccess) + return kMmapEverything; return mmap_ofs; }
diff --git a/sql/connection.h b/sql/connection.h index 18b2cb7..7a80077 100644 --- a/sql/connection.h +++ b/sql/connection.h
@@ -509,6 +509,7 @@ friend class test::ScopedMockTimeSource; FRIEND_TEST_ALL_PREFIXES(SQLConnectionTest, CollectDiagnosticInfo); + FRIEND_TEST_ALL_PREFIXES(SQLConnectionTest, GetAppropriateMmapSize); FRIEND_TEST_ALL_PREFIXES(SQLConnectionTest, RegisterIntentToUpload); // Internal initialize function used by both Init and InitInMemory. The file
diff --git a/sql/connection_unittest.cc b/sql/connection_unittest.cc index 7e9d41e..219da7f 100644 --- a/sql/connection_unittest.cc +++ b/sql/connection_unittest.cc
@@ -4,12 +4,10 @@ #include "base/bind.h" #include "base/files/file_util.h" -#include "base/files/memory_mapped_file.h" #include "base/files/scoped_file.h" #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/metrics/statistics_recorder.h" -#include "base/strings/stringprintf.h" #include "base/test/histogram_tester.h" #include "base/trace_event/process_memory_dump.h" #include "sql/connection.h" @@ -1302,84 +1300,6 @@ EXPECT_EQ(0, samples->sum()); } -// Make sure that OS file writes to a mmap'ed file are reflected in the memory -// mapping of a memory-mapped file. Normally SQLite writes to memory-mapped -// files using memcpy(), which should stay consistent. Our SQLite is slightly -// patched to mmap read only, then write using OS file writes. If the -// memory-mapped version doesn't reflect the OS file writes, SQLite's -// memory-mapped I/O should be disabled on this platform. -#if !defined(MOJO_APPTEST_IMPL) -TEST_F(SQLConnectionTest, MmapTest) { - // Skip the test for platforms which don't enable memory-mapped I/O in SQLite, - // or which don't even support the pragma. The former seems to apply to iOS, - // the latter to older iOS. - // TODO(shess): Disable test on iOS? Disable on USE_SYSTEM_SQLITE? - { - sql::Statement s(db().GetUniqueStatement("PRAGMA mmap_size")); - if (!s.Step() || !s.ColumnInt64(0)) - return; - } - - // The test re-uses the database file to make sure it's representative of a - // SQLite file, but will be storing incompatible data. - db().Close(); - - const uint32 kFlags = - base::File::FLAG_OPEN|base::File::FLAG_READ|base::File::FLAG_WRITE; - char buf[4096]; - - // Create a file with a block of '0', a block of '1', and a block of '2'. - { - base::File f(db_path(), kFlags); - ASSERT_TRUE(f.IsValid()); - memset(buf, '0', sizeof(buf)); - ASSERT_EQ(f.Write(0*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); - - memset(buf, '1', sizeof(buf)); - ASSERT_EQ(f.Write(1*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); - - memset(buf, '2', sizeof(buf)); - ASSERT_EQ(f.Write(2*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); - } - - // mmap the file and verify that everything looks right. - { - base::MemoryMappedFile m; - ASSERT_TRUE(m.Initialize(db_path())); - - memset(buf, '0', sizeof(buf)); - ASSERT_EQ(0, memcmp(buf, m.data() + 0*sizeof(buf), sizeof(buf))); - - memset(buf, '1', sizeof(buf)); - ASSERT_EQ(0, memcmp(buf, m.data() + 1*sizeof(buf), sizeof(buf))); - - memset(buf, '2', sizeof(buf)); - ASSERT_EQ(0, memcmp(buf, m.data() + 2*sizeof(buf), sizeof(buf))); - - // Scribble some '3' into the first page of the file, and verify that it - // looks the same in the memory mapping. - { - base::File f(db_path(), kFlags); - ASSERT_TRUE(f.IsValid()); - memset(buf, '3', sizeof(buf)); - ASSERT_EQ(f.Write(0*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); - } - ASSERT_EQ(0, memcmp(buf, m.data() + 0*sizeof(buf), sizeof(buf))); - - // Repeat with a single '4' in case page-sized blocks are different. - const size_t kOffset = 1*sizeof(buf) + 123; - ASSERT_NE('4', m.data()[kOffset]); - { - base::File f(db_path(), kFlags); - ASSERT_TRUE(f.IsValid()); - buf[0] = '4'; - ASSERT_EQ(f.Write(kOffset, buf, 1), 1); - } - ASSERT_EQ('4', m.data()[kOffset]); - } -} -#endif - TEST_F(SQLConnectionTest, OnMemoryDump) { base::trace_event::ProcessMemoryDump pmd(nullptr); base::trace_event::MemoryDumpArgs args = { @@ -1461,4 +1381,91 @@ } #endif // !defined(MOJO_APPTEST_IMPL) +// Test that a fresh database has mmap enabled by default, if mmap'ed I/O is +// enabled by SQLite. +TEST_F(SQLConnectionTest, MmapInitiallyEnabled) { + { + sql::Statement s(db().GetUniqueStatement("PRAGMA mmap_size")); + + // SQLite doesn't have mmap support (perhaps an early iOS release). + if (!s.Step()) + return; + + // If mmap I/O is not on, attempt to turn it on. If that succeeds, then + // Open() should have turned it on. If mmap support is disabled, 0 is + // returned. If the VFS does not understand SQLITE_FCNTL_MMAP_SIZE (for + // instance MojoVFS), -1 is returned. + if (s.ColumnInt(0) <= 0) { + ASSERT_TRUE(db().Execute("PRAGMA mmap_size = 1048576")); + s.Reset(true); + ASSERT_TRUE(s.Step()); + EXPECT_LE(s.ColumnInt(0), 0); + } + } + + // Test that explicit disable prevents mmap'ed I/O. + db().Close(); + sql::Connection::Delete(db_path()); + db().set_mmap_disabled(); + ASSERT_TRUE(db().Open(db_path())); + { + sql::Statement s(db().GetUniqueStatement("PRAGMA mmap_size")); + ASSERT_TRUE(s.Step()); + EXPECT_LE(s.ColumnInt(0), 0); + } +} + +// Test specific operation of the GetAppropriateMmapSize() helper. +#if defined(OS_IOS) +TEST_F(SQLConnectionTest, GetAppropriateMmapSize) { + ASSERT_EQ(0UL, db().GetAppropriateMmapSize()); +} +#else +TEST_F(SQLConnectionTest, GetAppropriateMmapSize) { + const size_t kMmapAlot = 25 * 1024 * 1024; + + // If there is no meta table (as for a fresh database), assume that everything + // should be mapped. + ASSERT_TRUE(!db().DoesTableExist("meta")); + ASSERT_GT(db().GetAppropriateMmapSize(), kMmapAlot); + + // Getting the status fails if there is an error. GetAppropriateMmapSize() + // should not call GetMmapStatus() if the table does not exist, but this is an + // easy error to setup for testing. + int64_t mmap_status; + { + sql::ScopedErrorIgnorer ignore_errors; + ignore_errors.IgnoreError(SQLITE_ERROR); + ASSERT_FALSE(MetaTable::GetMmapStatus(&db(), &mmap_status)); + ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); + } + + // When the meta table is first created, it sets up to map everything. + MetaTable().Init(&db(), 1, 1); + ASSERT_TRUE(db().DoesTableExist("meta")); + ASSERT_GT(db().GetAppropriateMmapSize(), kMmapAlot); + ASSERT_TRUE(MetaTable::GetMmapStatus(&db(), &mmap_status)); + ASSERT_EQ(MetaTable::kMmapSuccess, mmap_status); + + // Failure status maps nothing. + ASSERT_TRUE(db().Execute("REPLACE INTO meta VALUES ('mmap_status', -2)")); + ASSERT_EQ(0UL, db().GetAppropriateMmapSize()); + + // Re-initializing the meta table does not re-create the key if the table + // already exists. + ASSERT_TRUE(db().Execute("DELETE FROM meta WHERE key = 'mmap_status'")); + MetaTable().Init(&db(), 1, 1); + ASSERT_EQ(MetaTable::kMmapSuccess, mmap_status); + ASSERT_TRUE(MetaTable::GetMmapStatus(&db(), &mmap_status)); + ASSERT_EQ(0, mmap_status); + + // With no key, map everything and create the key. + // TODO(shess): This really should be "maps everything after validating it", + // but that is more complicated to structure. + ASSERT_GT(db().GetAppropriateMmapSize(), kMmapAlot); + ASSERT_TRUE(MetaTable::GetMmapStatus(&db(), &mmap_status)); + ASSERT_EQ(MetaTable::kMmapSuccess, mmap_status); +} +#endif + } // namespace sql
diff --git a/sql/meta_table.cc b/sql/meta_table.cc index 319f73d..011fe18 100644 --- a/sql/meta_table.cc +++ b/sql/meta_table.cc
@@ -13,9 +13,10 @@ namespace { -// Key used in our meta table for version numbers. +// Keys understood directly by sql:MetaTable. const char kVersionKey[] = "version"; const char kCompatibleVersionKey[] = "last_compatible_version"; +const char kMmapStatusKey[] = "mmap_status"; // Used to track success/failure of deprecation checks. enum DeprecationEventType { @@ -59,12 +60,41 @@ } // static +int64_t MetaTable::kMmapFailure = -2; +int64_t MetaTable::kMmapSuccess = -1; + +// static bool MetaTable::DoesTableExist(sql::Connection* db) { DCHECK(db); return db->DoesTableExist("meta"); } // static +bool MetaTable::GetMmapStatus(Connection* db, int64_t* status) { + const char* kMmapStatusSql = "SELECT value FROM meta WHERE key = ?"; + Statement s(db->GetUniqueStatement(kMmapStatusSql)); + if (!s.is_valid()) + return false; + + // It is fine for the status to be missing entirely, but any error prevents + // memory-mapping. + s.BindString(0, kMmapStatusKey); + *status = s.Step() ? s.ColumnInt64(0) : 0; + return s.Succeeded(); +} + +// static +bool MetaTable::SetMmapStatus(Connection* db, int64_t status) { + DCHECK(status == kMmapFailure || status == kMmapSuccess || status >= 0); + + const char* kMmapUpdateStatusSql = "REPLACE INTO meta VALUES (?, ?)"; + Statement s(db->GetUniqueStatement(kMmapUpdateStatusSql)); + s.BindString(0, kMmapStatusKey); + s.BindInt64(1, status); + return s.Run(); +} + +// static void MetaTable::RazeIfDeprecated(Connection* db, int deprecated_version) { DCHECK_GT(deprecated_version, 0); DCHECK_EQ(0, db->transaction_nesting()); @@ -131,6 +161,10 @@ "(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR)")) return false; + // Newly-created databases start out with mmap'ed I/O, but have no place to + // store the setting. Set here so that later opens don't need to validate. + SetMmapStatus(db_, kMmapSuccess); + // Note: there is no index over the meta table. We currently only have a // couple of keys, so it doesn't matter. If we start storing more stuff in // there, we should create an index.
diff --git a/sql/meta_table.h b/sql/meta_table.h index 0ae76bd..85c0c82 100644 --- a/sql/meta_table.h +++ b/sql/meta_table.h
@@ -21,6 +21,13 @@ MetaTable(); ~MetaTable(); + // Values for Get/SetMmapStatus(). |kMmapFailure| indicates that there was at + // some point a read error and the database should not be memory-mapped, while + // |kMmapSuccess| indicates that the entire file was read at some point and + // can be memory-mapped without constraint. + static int64_t kMmapFailure; + static int64_t kMmapSuccess; + // Returns true if the 'meta' table exists. static bool DoesTableExist(Connection* db); @@ -38,10 +45,18 @@ // transaction. static void RazeIfDeprecated(Connection* db, int deprecated_version); + // Used to tuck some data into the meta table about mmap status. The value + // represents how much data in bytes has successfully been read from the + // database, or |kMmapFailure| or |kMmapSuccess|. + static bool GetMmapStatus(Connection* db, int64_t* status); + static bool SetMmapStatus(Connection* db, int64_t status); + // Initializes the MetaTableHelper, creating the meta table if necessary. For // new tables, it will initialize the version number to |version| and the // compatible version number to |compatible_version|. Versions must be // greater than 0 to distinguish missing versions (see GetVersionNumber()). + // If there was no meta table (proxy for a fresh database), mmap status is set + // to |kMmapSuccess|. bool Init(Connection* db, int version, int compatible_version); // Resets this MetaTable object, making another call to Init() possible.
diff --git a/sql/sqlite_features_unittest.cc b/sql/sqlite_features_unittest.cc index 20e002d..db60072 100644 --- a/sql/sqlite_features_unittest.cc +++ b/sql/sqlite_features_unittest.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/files/file_util.h" +#include "base/files/memory_mapped_file.h" #include "base/files/scoped_temp_dir.h" #include "sql/connection.h" #include "sql/statement.h" @@ -143,4 +144,107 @@ EXPECT_EQ(0u, rows); } +#if defined(MOJO_APPTEST_IMPL) || defined(OS_IOS) +// If the platform cannot support SQLite mmap'ed I/O, make sure SQLite isn't +// offering to support it. +TEST_F(SQLiteFeaturesTest, NoMmap) { + // For recent versions of SQLite, SQLITE_MAX_MMAP_SIZE=0 can be used to + // disable mmap support. Alternately, sqlite3_config() could be used. In + // that case, the pragma will run successfully, but the size will always be 0. + // + // The SQLite embedded in older iOS releases predates the addition of mmap + // support. In that case the pragma will run without error, but no results + // are returned when querying the value. + // + // MojoVFS implements a no-op for xFileControl(). PRAGMA mmap_size is + // implemented in terms of SQLITE_FCNTL_MMAP_SIZE. In that case, the pragma + // will succeed but with no effect. + ignore_result(db().Execute("PRAGMA mmap_size = 1048576")); + sql::Statement s(db().GetUniqueStatement("PRAGMA mmap_size")); + ASSERT_TRUE(!s.Step() || !s.ColumnInt64(0)); +} +#else +// Verify that OS file writes are reflected in the memory mapping of a +// memory-mapped file. Normally SQLite writes to memory-mapped files using +// memcpy(), which should stay consistent. Our SQLite is slightly patched to +// mmap read only, then write using OS file writes. If the memory-mapped +// version doesn't reflect the OS file writes, SQLite's memory-mapped I/O should +// be disabled on this platform using SQLITE_MAX_MMAP_SIZE=0. +TEST_F(SQLiteFeaturesTest, Mmap) { + // Try to turn on mmap'ed I/O. + ignore_result(db().Execute("PRAGMA mmap_size = 1048576")); + { + sql::Statement s(db().GetUniqueStatement("PRAGMA mmap_size")); + +#if !defined(USE_SYSTEM_SQLITE) + // With Chromium's version of SQLite, the setting should always be non-zero. + ASSERT_TRUE(s.Step()); + ASSERT_GT(s.ColumnInt64(0), 0); +#else + // With the system SQLite, don't verify underlying mmap functionality if the + // SQLite is too old to support mmap, or if mmap is disabled (see NoMmap + // test). USE_SYSTEM_SQLITE is not bundled into the NoMmap case because + // whether mmap is enabled or not is outside of Chromium's control. + if (!s.Step() || !s.ColumnInt64(0)) + return; +#endif + } + db().Close(); + + const uint32 kFlags = + base::File::FLAG_OPEN|base::File::FLAG_READ|base::File::FLAG_WRITE; + char buf[4096]; + + // Create a file with a block of '0', a block of '1', and a block of '2'. + { + base::File f(db_path(), kFlags); + ASSERT_TRUE(f.IsValid()); + memset(buf, '0', sizeof(buf)); + ASSERT_EQ(f.Write(0*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); + + memset(buf, '1', sizeof(buf)); + ASSERT_EQ(f.Write(1*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); + + memset(buf, '2', sizeof(buf)); + ASSERT_EQ(f.Write(2*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); + } + + // mmap the file and verify that everything looks right. + { + base::MemoryMappedFile m; + ASSERT_TRUE(m.Initialize(db_path())); + + memset(buf, '0', sizeof(buf)); + ASSERT_EQ(0, memcmp(buf, m.data() + 0*sizeof(buf), sizeof(buf))); + + memset(buf, '1', sizeof(buf)); + ASSERT_EQ(0, memcmp(buf, m.data() + 1*sizeof(buf), sizeof(buf))); + + memset(buf, '2', sizeof(buf)); + ASSERT_EQ(0, memcmp(buf, m.data() + 2*sizeof(buf), sizeof(buf))); + + // Scribble some '3' into the first page of the file, and verify that it + // looks the same in the memory mapping. + { + base::File f(db_path(), kFlags); + ASSERT_TRUE(f.IsValid()); + memset(buf, '3', sizeof(buf)); + ASSERT_EQ(f.Write(0*sizeof(buf), buf, sizeof(buf)), (int)sizeof(buf)); + } + ASSERT_EQ(0, memcmp(buf, m.data() + 0*sizeof(buf), sizeof(buf))); + + // Repeat with a single '4' in case page-sized blocks are different. + const size_t kOffset = 1*sizeof(buf) + 123; + ASSERT_NE('4', m.data()[kOffset]); + { + base::File f(db_path(), kFlags); + ASSERT_TRUE(f.IsValid()); + buf[0] = '4'; + ASSERT_EQ(f.Write(kOffset, buf, 1), 1); + } + ASSERT_EQ('4', m.data()[kOffset]); + } +} +#endif + } // namespace
diff --git a/storage/browser/fileapi/file_writer_delegate.cc b/storage/browser/fileapi/file_writer_delegate.cc index ab264d3..b401e020 100644 --- a/storage/browser/fileapi/file_writer_delegate.cc +++ b/storage/browser/fileapi/file_writer_delegate.cc
@@ -44,11 +44,8 @@ } void FileWriterDelegate::Cancel() { - if (request_) { - // This halts any callbacks on this delegate. - request_->set_delegate(NULL); - request_->Cancel(); - } + // Destroy the request to prevent it from invoking any callbacks. + request_.reset(); const int status = file_stream_writer_->Cancel( base::Bind(&FileWriterDelegate::OnWriteCancelled, @@ -172,10 +169,8 @@ } void FileWriterDelegate::OnError(base::File::Error error) { - if (request_) { - request_->set_delegate(NULL); - request_->Cancel(); - } + // Destroy the request to prevent it from invoking any callbacks. + request_.reset(); if (writing_started_) MaybeFlushForCompletion(error, 0, ERROR_WRITE_STARTED);
diff --git a/sync/syncable/directory_backing_store.cc b/sync/syncable/directory_backing_store.cc index 55c99d3..fa1b9477 100644 --- a/sync/syncable/directory_backing_store.cc +++ b/sync/syncable/directory_backing_store.cc
@@ -1728,9 +1728,10 @@ db_->set_cache_size(32); db_->set_page_size(database_page_size_); - // TODO(shess): Sync corruption tests interact poorly with mmap, disable for - // now. http://crbug.com/533682 + // TODO(shess): The current mitigation for http://crbug.com/537742 stores + // state in the meta table, which this database does not use. db_->set_mmap_disabled(); + if (!catastrophic_error_handler_.is_null()) SetCatastrophicErrorHandler(catastrophic_error_handler_); }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index f23fe31..63a83199d 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -5689,15 +5689,39 @@ "gtest_tests": [ { "args": [ + "--site-per-process" + ], + "test": "app_shell_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "blimp_unittests" + }, + { + "args": [ "--site-per-process", - "--gtest_filter=-BrowserTest.InterstitialCancelsGuestViewDialogs:BrowserTest.OtherRedirectsDontForkProcess:BrowserTest.WindowOpenClose:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:ErrorPageTest.*:ExtensionApiTest.Tabs2:ExtensionApiTest.TabsOnUpdated:ExtensionOptionsApiTest.ExtensionCanEmbedOwnOptions:IsolatedAppTest.*:MimeHandlerViewTest.*:*PDFExtensionTest.*:PhishingDOMFeatureExtractorTest.SubFrames:PrerenderBrowserTest.*:ProcessManagementTest.*:RedirectTest.ClientEmptyReferer:ReferrerPolicyTest.HttpsRedirect:SSLUITest.TestGoodFrameNavigation:SSLUITest.TestMarkNonSecureAs:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebViewDPITest.*:WebViewPluginTest.*:WebViewTest.AcceptTouchEvents:WebViewTest.IndexedDBIsolation:WebViewTest.ScreenCoordinates:WebViewTest.ContextMenusAPI_PreventDefault:WebViewTest.TestContextMenu:WebViewTest.NestedGuestContainerBounds:WebViewFocusTest.*:WebViewNewWindowTest.*:WebViewVisibilityTest.*:*.NavigateFromNTPToOptionsInSameTab:*.TabMove:*.WhitelistedExtension:*.NewTabPageURL:*.HomepageLocation:RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.RunTest*:PhishingClassifierDelegateTest.*:WebUIWebViewBrowserTest*:WebRtcBrowserTest.RunsAudioVideoWebRTCCallInTwoTabs:SingleProcessTracingBrowserTest.TestMemoryInfra" + "--gtest_filter=-AllUrlsApiTest.WhitelistedExtension:BrowserNavigatorTest.NavigateFromNTPToOptionsInSameTab:BrowserTest.OtherRedirectsDontForkProcess:BrowserTest.WindowOpenClose:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:ErrorPageTest.*:ExtensionApiTest.Tabs2:ExtensionApiTest.TabMove:ExtensionApiTest.TabsOnUpdated:ExtensionURLRewriteBrowserTest.NewTabPageURL:IsolatedAppTest.*:PhishingClassifierDelegateTest.*:PhishingDOMFeatureExtractorTest.SubFrames:PolicyTest.HomepageLocation:PrerenderBrowserTest.*:ProcessManagementTest.*:RedirectTest.ClientEmptyReferer:ReferrerPolicyTest.HttpsRedirect:RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.RunTest*:SSLUITest.TestGoodFrameNavigation:SSLUITest.TestMarkNonSecureAs:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebRtcBrowserTest.RunsAudioVideoWebRTCCallInTwoTabs" ], "test": "browser_tests" }, { "args": [ + "--site-per-process" + ], + "test": "components_browsertests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "components_unittests" + }, + { + "args": [ "--site-per-process", - "--gtest_filter=-*.PopupPendingAndBackToSameSiteInstance:SessionHistoryTest.CrossFrameFormBackForward:SessionHistoryTest.FrameBackForward:DevToolsProtocolTest.NavigationPreservesMessages:NavigationControllerBrowserTest.ReloadOriginalRequest:*.RestoreSubframeFileAccessForHistoryNavigation" + "--gtest_filter=-SessionHistoryTest.FrameBackForward:NavigationControllerBrowserTest.ReloadOriginalRequest:*.RestoreSubframeFileAccessForHistoryNavigation" ], "test": "content_browsertests" }, @@ -5709,8 +5733,37 @@ }, { "args": [ - "--site-per-process", - "--gtest_filter=-CaptivePortalTabHelperTest.HttpsSubframe*" + "--site-per-process" + ], + "test": "extensions_browsertests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "extensions_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "interactive_ui_tests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "nacl_loader_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "sync_integration_tests" + }, + { + "args": [ + "--site-per-process" ], "test": "unit_tests" } @@ -5720,15 +5773,39 @@ "gtest_tests": [ { "args": [ + "--site-per-process" + ], + "test": "app_shell_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "ash_unittests" + }, + { + "args": [ "--site-per-process", - "--gtest_filter=-BrowserTest.InterstitialCancelsGuestViewDialogs:BrowserTest.OtherRedirectsDontForkProcess:BrowserTest.WindowOpenClose:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:ErrorPageTest.*:ExtensionApiTest.Tabs2:ExtensionApiTest.TabsOnUpdated:ExtensionOptionsApiTest.ExtensionCanEmbedOwnOptions:IsolatedAppTest.*:MimeHandlerViewTest.*:*PDFExtensionTest.*:PhishingDOMFeatureExtractorTest.SubFrames:PrerenderBrowserTest.*:ProcessManagementTest.*:RedirectTest.ClientEmptyReferer:ReferrerPolicyTest.HttpsRedirect:SSLUITest.TestGoodFrameNavigation:SSLUITest.TestMarkNonSecureAs:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebViewDPITest.*:WebViewPluginTest.*:WebViewTest.AcceptTouchEvents:WebViewTest.IndexedDBIsolation:WebViewTest.ScreenCoordinates:WebViewTest.ContextMenusAPI_PreventDefault:WebViewTest.TestContextMenu:WebViewTest.NestedGuestContainerBounds:WebViewFocusTest.*:WebViewNewWindowTest.*:WebViewVisibilityTest.*:*.NavigateFromNTPToOptionsInSameTab:*.TabMove:*.WhitelistedExtension:*.NewTabPageURL:*.HomepageLocation:RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.RunTest*:PhishingClassifierDelegateTest.*:WebUIWebViewBrowserTest*:WebRtcBrowserTest.RunsAudioVideoWebRTCCallInTwoTabs:SingleProcessTracingBrowserTest.TestMemoryInfra" + "--gtest_filter=-AllUrlsApiTest.WhitelistedExtension:BrowserNavigatorTest.NavigateFromNTPToOptionsInSameTab:BrowserTest.OtherRedirectsDontForkProcess:BrowserTest.WindowOpenClose:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:ErrorPageTest.*:ExtensionApiTest.Tabs2:ExtensionApiTest.TabMove:ExtensionApiTest.TabsOnUpdated:ExtensionURLRewriteBrowserTest.NewTabPageURL:IsolatedAppTest.*:PhishingClassifierDelegateTest.*:PhishingDOMFeatureExtractorTest.SubFrames:PolicyTest.HomepageLocation:PrerenderBrowserTest.*:ProcessManagementTest.*:RedirectTest.ClientEmptyReferer:ReferrerPolicyTest.HttpsRedirect:RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.RunTest*:SSLUITest.TestGoodFrameNavigation:SSLUITest.TestMarkNonSecureAs:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebRtcBrowserTest.RunsAudioVideoWebRTCCallInTwoTabs" ], "test": "browser_tests" }, { "args": [ + "--site-per-process" + ], + "test": "components_browsertests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "components_unittests" + }, + { + "args": [ "--site-per-process", - "--gtest_filter=-*.PopupPendingAndBackToSameSiteInstance:SessionHistoryTest.CrossFrameFormBackForward:SessionHistoryTest.FrameBackForward:DevToolsProtocolTest.NavigationPreservesMessages:NavigationControllerBrowserTest.ReloadOriginalRequest:*.RestoreSubframeFileAccessForHistoryNavigation" + "--gtest_filter=-SessionHistoryTest.FrameBackForward:NavigationControllerBrowserTest.ReloadOriginalRequest:*.RestoreSubframeFileAccessForHistoryNavigation" ], "test": "content_browsertests" }, @@ -5740,8 +5817,43 @@ }, { "args": [ - "--site-per-process", - "--gtest_filter=-CaptivePortalTabHelperTest.HttpsSubframe*" + "--site-per-process" + ], + "test": "extensions_browsertests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "extensions_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "installer_util_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "interactive_ui_tests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "nacl_loader_unittests" + }, + { + "args": [ + "--site-per-process" + ], + "test": "sync_integration_tests" + }, + { + "args": [ + "--site-per-process" ], "test": "unit_tests" }
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 40e4a884..c6b142d 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -154,13 +154,6 @@ ], "name": "gpu_perftests", "script": "gtest_perf_test.py" - }, - { - "args": [ - "cc_perftests" - ], - "name": "cc_perftests", - "script": "gtest_perf_test.py" } ] },
diff --git a/third_party/WebKit/LayoutTests/ASANExpectations b/third_party/WebKit/LayoutTests/ASANExpectations index 909a712e..77d97973 100644 --- a/third_party/WebKit/LayoutTests/ASANExpectations +++ b/third_party/WebKit/LayoutTests/ASANExpectations
@@ -96,7 +96,6 @@ # Flakily timeout on Linux ASAN bots. crbug.com/243871 [ Linux ] virtual/threaded/fast/scroll-behavior/ [ Skip ] -crbug.com/243871 [ Linux ] virtual/threaded_animation_timelines/fast/scroll-behavior/ [ Skip ] # Reliably timeout on Linux ASAN bots. crbug.com/248938 [ Linux ] virtual/threaded/animations/transition-and-animation-2.html [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/MSANExpectations b/third_party/WebKit/LayoutTests/MSANExpectations index cf3b0b6..827307c 100644 --- a/third_party/WebKit/LayoutTests/MSANExpectations +++ b/third_party/WebKit/LayoutTests/MSANExpectations
@@ -28,7 +28,6 @@ # Flaky under MSan (hang forever). crbug.com/422982 [ Linux ] virtual/threaded [ Skip ] -crbug.com/487880 [ Linux ] virtual/threaded_animation_timelines/fast/scroll-behavior/overflow-scroll-animates.html [ Skip ] crbug.com/450639 [ Linux ] inspector/tracing/animations.html [ Timeout ] crbug.com/450639 [ Linux ] virtual/deferred/inspector/tracing/animations.html [ Timeout ] @@ -63,7 +62,6 @@ # Flaky under MSAN (hang forever) crbug.com/456525 [ Linux ] inspector/sources/debugger [ Skip ] -crbug.com/243871 [ Linux ] virtual/threaded_animation_timelines/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Timeout Pass ] crbug.com/517704 [ Linux ] imported/web-platform-tests/encoding/api-invalid-label.html [ Timeout Pass ] # Times out on MSAN
diff --git a/third_party/WebKit/LayoutTests/OilpanExpectations b/third_party/WebKit/LayoutTests/OilpanExpectations index 1dc78174..58b5c13 100644 --- a/third_party/WebKit/LayoutTests/OilpanExpectations +++ b/third_party/WebKit/LayoutTests/OilpanExpectations
@@ -27,7 +27,6 @@ crbug.com/377567 [ Debug ] editing/selection/extend-selection-character.html [ Timeout Pass ] crbug.com/377567 [ Debug ] editing/selection/programmatic-selection-on-mac-is-directionless.html [ Timeout Pass ] crbug.com/377567 [ Debug ] fast/css/large-list-of-rules-crash.html [ Timeout Pass ] -crbug.com/243871 [ Win Debug ] virtual/threaded_animation_timelines/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Timeout Pass ] # Times out on the Mac Debug Oilpan bot. crbug.com/389648 [ Mac Debug ] fast/text-autosizing/table-inflation-crash.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests index 2478861..ab49849 100644 --- a/third_party/WebKit/LayoutTests/SlowTests +++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -128,7 +128,6 @@ crbug.com/311482 virtual/threaded/animations/interpolation/filter-interpolation.html [ Slow ] crbug.com/311482 virtual/threaded/animations/keyframes-unprefixed-03.html [ Slow ] crbug.com/243871 virtual/threaded/fast/scroll-behavior/ [ Slow ] -crbug.com/243871 virtual/threaded_animation_timelines/fast/scroll-behavior/ [ Slow ] crbug.com/258896 animations/animation-direction-reverse-fill-mode.html [ Slow ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index f103479..10c0c76 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -148,12 +148,6 @@ crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/scrollstate-distribute-to-scroll-chain-descendant.html [ Pass Failure ] crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/touch-scroll-customization.html [ Pass Failure ] -crbug.com/410974 virtual/threaded_animation_timelines/fast/scroll-behavior/scroll-customization/scrollstate-basic.html [ Pass Failure ] -crbug.com/410974 virtual/threaded_animation_timelines/fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas.html [ Pass Failure ] -crbug.com/410974 virtual/threaded_animation_timelines/fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas-throw.html [ Pass Failure ] -crbug.com/410974 virtual/threaded_animation_timelines/fast/scroll-behavior/scroll-customization/scrollstate-distribute-to-scroll-chain-descendant.html [ Pass Failure ] -crbug.com/410974 virtual/threaded_animation_timelines/fast/scroll-behavior/scroll-customization/touch-scroll-customization.html [ Pass Failure ] - crbug.com/518972 [ Linux XP ] http/tests/navigation/navigation-redirect-schedule-crash.html [ Failure Pass ] crbug.com/381730 http/tests/navigation/pending-location-change-assert.html [ Failure Pass ] crbug.com/518974 http/tests/navigatorconnect/postmessage.html [ Failure Pass Timeout ] @@ -218,7 +212,6 @@ crbug.com/248938 virtual/threaded/transitions/transition-end-event-nested.html [ Pass Failure ] crbug.com/503874 http/tests/inspector/sources/debugger/worker-debugging-script-mapping.html [ Pass Failure ] crbug.com/513143 virtual/threaded/fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure Pass ] -crbug.com/513143 virtual/threaded_animation_timelines/fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure Pass ] crbug.com/248938 virtual/threaded/animations/display-none-terminates-animation.html [ Pass Failure ] crbug.com/421283 fast/html/marquee-scrollamount.html [ Pass Failure ] crbug.com/248938 [ Win Debug ] virtual/threaded/animations/delay-start-event.html [ Pass Failure ] @@ -696,8 +689,6 @@ crbug.com/484370 [ Win Debug ] svg/custom/gradient-userSpaceOnUse-with-percentage.svg [ Failure ] -crbug.com/484930 imported/web-platform-tests/dom/nodes/Node-baseURI.html [ Failure ] - # Printing Layout broken in these tests. crbug.com/377696 printing/setPrinting.html [ Skip ] crbug.com/377696 printing/width-overflow.html [ Skip ] @@ -842,11 +833,9 @@ crbug.com/364614 [ Mac ] fast/scroll-behavior/overflow-scroll-animates.html [ Skip ] crbug.com/364614 [ Mac ] virtual/threaded/fast/scroll-behavior/overflow-scroll-animates.html [ Skip ] crbug.com/364614 [ Mac ] virtual/scroll_customization/fast/scroll-behavior/overflow-scroll-animates.html [ Skip ] -crbug.com/364614 [ Mac ] virtual/threaded_animation_timelines/fast/scroll-behavior/overflow-scroll-animates.html [ Skip ] crbug.com/364614 [ Mac ] fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Skip ] crbug.com/364614 [ Mac ] virtual/threaded/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Skip ] crbug.com/364614 [ Mac ] virtual/scroll_customization/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Skip ] -crbug.com/364614 [ Mac ] virtual/threaded_animation_timelines/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Skip ] crbug.com/524596 paint/invalidation/composited-non-stacking-context-descendant-change-color.html [ Failure ] crbug.com/524596 paint/invalidation/composited-non-stacking-context-descendant-move.html [ Failure ] @@ -920,6 +909,7 @@ crbug.com/467127 [ Mac Win ] imported/csswg-test/css-flexbox-1/ttwf-reftest-flex-wrap-reverse.html [ Failure ] crbug.com/467127 [ Mac Win ] imported/csswg-test/css-flexbox-1/ttwf-reftest-flex-wrap.html [ Failure ] +crbug.com/570894 [ Win ] imported/csswg-test/css-flexbox-1/flexbox_flex-natural-mixed-basis-auto.html [ Failure Pass ] crbug.com/471066 [ Mac10.6 ] fast/text/apply-start-width-after-skipped-text.html [ Failure ] crbug.com/471066 [ Mac10.6 ] fast/text/bidi-explicit-embedding-past-end.html [ Failure ] @@ -1348,3 +1338,5 @@ crbug.com/570002 [ XP Linux ] virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in.html [ NeedsRebaseline ] crbug.com/570002 [ XP ] virtual/gpu/fast/canvas/canvas-incremental-repaint.html [ NeedsRebaseline ] crbug.com/570002 [ XP ] virtual/gpu/fast/canvas/canvas-shadow-source-in.html [ NeedsRebaseline ] + +crbug.com/570893 [ Win10 Mac10.8 ] css3/flexbox/repaint.html [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites index 00cab07..f571e2a 100644 --- a/third_party/WebKit/LayoutTests/VirtualTestSuites +++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -58,13 +58,6 @@ "--enable-prefer-compositing-to-lcd-text"] }, { - "prefix": "threaded_animation_timelines", - "base": "fast/scroll-behavior", - "args": ["--enable-threaded-compositing", - "--enable-prefer-compositing-to-lcd-text", - "--enable-compositor-animation-timelines"] - }, - { "prefix": "stable", "base": "webexposed", "args": ["--stable-release-mode"]
diff --git a/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03-expected.txt b/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03-expected.txt deleted file mode 100644 index d44fa0f..0000000 --- a/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodegetbaseuri03 -Status Success
diff --git a/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03.js b/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03.js deleted file mode 100644 index af696173..0000000 --- a/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03.js +++ /dev/null
@@ -1,102 +0,0 @@ -/* -Copyright © 2001-2004 World Wide Web Consortium, -(Massachusetts Institute of Technology, European Research Consortium -for Informatics and Mathematics, Keio University). All -Rights Reserved. This work is distributed under the W3C® Software License [1] in the -hope that it will be useful, but WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 -*/ - - /** - * Gets URI that identifies the test. - * @return uri identifier of test - */ -function getTargetURI() { - return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodegetbaseuri03"; - } - -var docsLoaded = -1000000; -var builder = null; - -// -// This function is called by the testing framework before -// running the test suite. -// -// If there are no configuration exceptions, asynchronous -// document loading is started. Otherwise, the status -// is set to complete and the exception is immediately -// raised when entering the body of the test. -// -function setUpPage() { - setUpPageStatus = 'running'; - try { - // - // creates test document builder, may throw exception - // - builder = createConfiguredBuilder(); - - docsLoaded = 0; - - var docRef = null; - if (typeof(this.doc) != 'undefined') { - docRef = this.doc; - } - docsLoaded += preload(docRef, "doc", "barfoo"); - - if (docsLoaded == 1) { - setUpPageStatus = 'complete'; - } - } catch(ex) { - catchInitializationError(builder, ex); - setUpPageStatus = 'complete'; - } -} - -// -// This method is called on the completion of -// each asychronous load started in setUpTests. -// -// When every synchronous loaded document has completed, -// the page status is changed which allows the -// body of the test to be executed. -function loadComplete() { - if (++docsLoaded == 1) { - setUpPageStatus = 'complete'; - } -} - -/** -* -Check that Node.baseURI is null for a DocumentType as defined in the Infoset Mapping (Appendix C). - -* @author IBM -* @author Neil Delima -* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Node3-baseURI -* @see http://www.w3.org/Bugs/Public/show_bug.cgi?id=419 -* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/infoset-mapping#Infoset2DocumentType -*/ -function nodegetbaseuri03() { - var success; - if(checkInitialization(builder, "nodegetbaseuri03") != null) return; - var doc; - var docType; - var baseURI; - - var docRef = null; - if (typeof(this.doc) != 'undefined') { - docRef = this.doc; - } - doc = load(docRef, "doc", "barfoo"); - docType = doc.doctype; - - baseURI = docType.baseURI; - - assertNull("nodegetbaseuri03",baseURI); - -} - -function runTest() { - nodegetbaseuri03(); -}
diff --git a/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03.xhtml b/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03.xhtml deleted file mode 100644 index 4400c148..0000000 --- a/third_party/WebKit/LayoutTests/dom/xhtml/level3/core/nodegetbaseuri03.xhtml +++ /dev/null
@@ -1,25 +0,0 @@ -<!DOCTYPE html [ -<!ENTITY ent1 'foo'> -<!ENTITY ent2 'foo<br/>'> -<!ELEMENT html (head, body)> -<!ATTLIST html xmlns CDATA #IMPLIED> -<!ELEMENT head (title,script*)> -<!ELEMENT script (#PCDATA)> -<!ATTLIST script - src CDATA #IMPLIED - type CDATA #IMPLIED - charset CDATA #IMPLIED> -<!ELEMENT title (#PCDATA)> -<!ELEMENT body (p)> -<!ATTLIST body onload CDATA #IMPLIED> -<!ELEMENT p (#PCDATA|br)*> -<!ELEMENT br EMPTY> -]> -<html xmlns='http://www.w3.org/1999/xhtml'> -<head> -<title>replaceWholeText sample</title> -<script type='text/javascript' src='selfxhtml.js'></script><script charset='UTF-8' type='text/javascript' src='nodegetbaseuri03.js'></script><script type='text/javascript'>function loadComplete() { startTest(); }</script></head> -<body onload="loadComplete()"> -<p>bar</p> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js index 02d4a8ac..dea9b97 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js
@@ -282,9 +282,9 @@ callback = InspectorTest.safeWrap(callback); InspectorTest.selectNodeAndWaitForStyles(idValue, onSidebarRendered); - function onSidebarRendered() + function onSidebarRendered(node) { - InspectorTest.computedStyleWidget().doUpdate().then(callback); + InspectorTest.computedStyleWidget().doUpdate().then(callback.bind(null, node)); } }
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js index 277f41b1..f23b3e65 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js
@@ -80,7 +80,7 @@ callback(); } panel._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStarted, onRecordingStarted, this) - panel._enableJSSamplingSetting.set(false); + panel._captureJSProfileSetting.set(false); panel._toggleRecording(); };
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html index 6c38b6d..30ead3f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-failure-no-manifest-in-service-worker.html
@@ -31,7 +31,8 @@ assert_equals(event.data.command, 'subscribe'); assert_false(event.data.success, 'subscribe is not expected to succeed.'); - assert_regexp_match(event.data.errorMessage, /no sender id provided/); + assert_regexp_match(event.data.errorMessage, + /gcm_sender_id not found in manifest/); test.done(); });
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-1/edit-value-url-with-color.html b/third_party/WebKit/LayoutTests/inspector/elements/styles-1/edit-value-url-with-color.html index ac0c547..83edf69e 100644 --- a/third_party/WebKit/LayoutTests/inspector/elements/styles-1/edit-value-url-with-color.html +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-1/edit-value-url-with-color.html
@@ -9,7 +9,7 @@ var maxIndex = 11; var idIndex = 1; - WebInspector.ColorSwatchPopoverIcon._colorFormat = function() { + WebInspector.Color.detectColorFormat = function() { return WebInspector.Color.Format.RGB; };
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-2/lazy-computed-style-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-2/lazy-computed-style-expected.txt index 35b8e8e..52c74d4 100644 --- a/third_party/WebKit/LayoutTests/inspector/elements/styles-2/lazy-computed-style-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-2/lazy-computed-style-expected.txt
@@ -38,7 +38,7 @@ background-clip: border-box initial - #inspected lazy-computed-style.html:15 -> lazy-computed-style.html:15:1 background-color: rgb(128, 128, 128) - grey - #inspected lazy-computed-style.html:15 -> lazy-computed-style.html:15:1 + gray - #inspected lazy-computed-style.html:15 -> lazy-computed-style.html:15:1 OVERLOADED black - #inspected lazy-computed-style.html:10 -> lazy-computed-style.html:10:1 OVERLOADED green - #inspected lazy-computed-style.html:5 -> lazy-computed-style.html:5:1 background-image: none
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-computed-trace-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-computed-trace-expected.txt index f991e87..46d0c5c7 100644 --- a/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-computed-trace-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-computed-trace-expected.txt
@@ -6,7 +6,7 @@ background-clip: border-box initial - #id1 styles-computed-trace.html:23 -> styles-computed-trace.html:23:1 background-color: rgb(128, 128, 128) - grey - #id1 styles-computed-trace.html:23 -> styles-computed-trace.html:23:1 + gray - #id1 styles-computed-trace.html:23 -> styles-computed-trace.html:23:1 OVERLOADED black - #id1 styles-computed-trace.html:18 -> styles-computed-trace.html:18:1 OVERLOADED green - #id1 styles-computed-trace.html:13 -> styles-computed-trace.html:13:1 background-image: none
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-variables-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-variables-expected.txt new file mode 100644 index 0000000..4de87824 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-variables-expected.txt
@@ -0,0 +1,21 @@ +Tests that computed styles expand and allow tracing to style rules. + +==== Computed style for ID1 ==== +--b: 44px + 44px - #id1 styles-variables.html:8 -> styles-variables.html:8:1 +display: block + block - div user agent stylesheet +[expanded] +element.style { () + +value of --a: red +==== Computed style for ID2 ==== +--a: green + green - #id2 styles-variables.html:12 -> styles-variables.html:12:1 +display: block + block - div user agent stylesheet +[expanded] +element.style { () + +value of --b: 44px +
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-variables.html b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-variables.html new file mode 100644 index 0000000..9fd1b1c --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/styles-variables.html
@@ -0,0 +1,61 @@ +<html> +<head> +<style> +body { + --a: red; +} + +#id1 { + --b: 44px; +} + +#id2 { + --a: green; +} + +</style> +<script src="../../../http/tests/inspector/inspector-test.js"></script> +<script src="../../../http/tests/inspector/elements-test.js"></script> +<script> + +function test() +{ + InspectorTest.selectNodeAndWaitForStylesWithComputed("id1", step1); + function step1(node) + { + InspectorTest.addResult("==== Computed style for ID1 ===="); + InspectorTest.dumpSelectedElementStyles(false, true); + InspectorTest.cssModel.computedStylePromise(node.id).then( + function(style) { + InspectorTest.addResult("value of --a: " + style.get("--a")); + InspectorTest.selectNodeAndWaitForStylesWithComputed("id2", step2); + }); + } + + function step2(node) + { + InspectorTest.addResult("==== Computed style for ID2 ===="); + InspectorTest.dumpSelectedElementStyles(false, true); + InspectorTest.cssModel.computedStylePromise(node.id).then( + function(style) { + InspectorTest.addResult("value of --b: " + style.get("--b")); + InspectorTest.completeTest(); + }); + } + +} +</script> +</head> + +<body onload="runTest()"> +<p> +Tests that computed styles expand and allow tracing to style rules. +</p> + +<div id="id1"> +<div id="id2"> +</div> +</div> + +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/syntax-highlight-css-expected.txt b/third_party/WebKit/LayoutTests/inspector/syntax-highlight-css-expected.txt index 426d7a8..4ac8729 100644 --- a/third_party/WebKit/LayoutTests/inspector/syntax-highlight-css-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/syntax-highlight-css-expected.txt
@@ -2,8 +2,8 @@ a[href='/']: cm-css-tag, *, cm-css-tag, *, cm-css-string, * #content > a:hover: cm-css-builtin, *, cm-css-tag, *, cm-css-variable-3 -@import url(style.css);: cm-css-def, *, cm-css-tag, *, cm-css-string, * -@import url("style.css") projection, tv;: cm-css-def, *, cm-css-tag, *, cm-css-string, *, cm-css-tag, *, cm-css-tag, * +@import url(style.css);: cm-css-def, *, cm-css-atom, *, cm-css-string, * +@import url("style.css") projection, tv;: cm-css-def, *, cm-css-atom, *, cm-css-string, *, cm-css-attribute, *, cm-css-attribute, * @import "/css/fireball_unicode.css"; html {}: cm-css-def, *, cm-css-string, *, cm-css-tag, * @media screen { body { color: red; } }: cm-css-def, *, cm-css-attribute, *, cm-css-tag, *, cm-css-property, *, cm-css-keyword, * @font-face { font-family: "MyHelvetica"; }: cm-css-def, *, cm-css-property, *, cm-css-string, *
diff --git a/third_party/WebKit/LayoutTests/virtual/threaded_animation_timelines/fast/scroll-behavior/README.txt b/third_party/WebKit/LayoutTests/virtual/threaded_animation_timelines/fast/scroll-behavior/README.txt deleted file mode 100644 index b14d733..0000000 --- a/third_party/WebKit/LayoutTests/virtual/threaded_animation_timelines/fast/scroll-behavior/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in fast/scroll-behavior with -# --enable-threaded-compositing --enable-prefer-compositing-to-lcd-text -# --enable-compositor-animation-timelines
diff --git a/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp b/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp index d4cca18..a6e2fbc1 100644 --- a/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp +++ b/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
@@ -535,6 +535,11 @@ return ComputedStyleCSSValueMapping::get(customPropertyName, *computeComputedStyle()); } +const HashMap<AtomicString, RefPtr<CSSVariableData>>* CSSComputedStyleDeclaration::getVariables() const +{ + return ComputedStyleCSSValueMapping::getVariables(*computeComputedStyle()); +} + PassRefPtrWillBeRawPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropertyID propertyID) const { Node* styledNode = this->styledNode();
diff --git a/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.h b/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.h index 4418494..55f312a 100644 --- a/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.h +++ b/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.h
@@ -34,6 +34,7 @@ class CSSPrimitiveValue; class CSSValueList; +class CSSVariableData; class ExceptionState; class MutableStylePropertySet; class Node; @@ -64,6 +65,7 @@ PassRefPtrWillBeRawPtr<CSSValue> getPropertyCSSValue(CSSPropertyID) const; PassRefPtrWillBeRawPtr<CSSValue> getPropertyCSSValue(AtomicString customPropertyName) const; + const HashMap<AtomicString, RefPtr<CSSVariableData>>* getVariables() const; PassRefPtrWillBeRawPtr<CSSValue> getFontSizeCSSValuePreferringKeyword() const; bool isMonospaceFont() const;
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp index 4f41f9a..ef53f27 100644 --- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp +++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -1357,13 +1357,25 @@ PassRefPtrWillBeRawPtr<CSSValue> ComputedStyleCSSValueMapping::get(const AtomicString customPropertyName, const ComputedStyle& style) { - CSSVariableData* data = style.variables()->getVariable(customPropertyName); + StyleVariableData* variables = style.variables(); + if (!variables) + return nullptr; + + CSSVariableData* data = variables->getVariable(customPropertyName); if (!data) return nullptr; return CSSCustomPropertyDeclaration::create(customPropertyName, data); } +const HashMap<AtomicString, RefPtr<CSSVariableData>>* ComputedStyleCSSValueMapping::getVariables(const ComputedStyle& style) +{ + StyleVariableData* variables = style.variables(); + if (variables) + return variables->getVariables(); + return nullptr; +} + PassRefPtrWillBeRawPtr<CSSValue> ComputedStyleCSSValueMapping::get(CSSPropertyID propertyID, const ComputedStyle& style, const LayoutObject* layoutObject, Node* styledNode, bool allowVisitedStyle) { const SVGComputedStyle& svgStyle = style.svgStyle();
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.h b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.h index eb483562..65266563 100644 --- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.h +++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.h
@@ -18,6 +18,7 @@ class ShadowList; class StyleColor; class Node; +class CSSVariableData; class ComputedStyleCSSValueMapping { STATIC_ONLY(ComputedStyleCSSValueMapping); @@ -25,6 +26,7 @@ // FIXME: Resolve computed auto alignment in applyProperty/ComputedStyle and remove this non-const styledNode parameter. static PassRefPtrWillBeRawPtr<CSSValue> get(CSSPropertyID, const ComputedStyle&, const LayoutObject* = nullptr, Node* styledNode = nullptr, bool allowVisitedStyle = false); static PassRefPtrWillBeRawPtr<CSSValue> get(const AtomicString customPropertyName, const ComputedStyle&); + static const HashMap<AtomicString, RefPtr<CSSVariableData>>* getVariables(const ComputedStyle&); private: static PassRefPtrWillBeRawPtr<CSSValue> currentColorOrValidColor(const ComputedStyle&, const StyleColor&); static PassRefPtrWillBeRawPtr<CSSValue> valueForShadowData(const ShadowData&, const ComputedStyle&, bool useSpread);
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index 5753950..e049249 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -1127,11 +1127,6 @@ m_xmlStandalone = standalone ? Standalone : NotStandalone; } -KURL Document::baseURI() const -{ - return m_baseURL; -} - void Document::setContent(const String& content) { open();
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h index 494e1688..f6a453a 100644 --- a/third_party/WebKit/Source/core/dom/Document.h +++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -328,8 +328,6 @@ void setXMLStandalone(bool, ExceptionState&); void setHasXMLDeclaration(bool hasXMLDeclaration) { m_hasXMLDeclaration = hasXMLDeclaration ? 1 : 0; } - KURL baseURI() const final; - String origin() const { return securityOrigin()->toString(); } String suborigin() const { return securityOrigin()->suboriginName(); }
diff --git a/third_party/WebKit/Source/core/dom/DocumentType.cpp b/third_party/WebKit/Source/core/dom/DocumentType.cpp index 78c5c4e..e01cc922 100644 --- a/third_party/WebKit/Source/core/dom/DocumentType.cpp +++ b/third_party/WebKit/Source/core/dom/DocumentType.cpp
@@ -36,11 +36,6 @@ { } -KURL DocumentType::baseURI() const -{ - return KURL(); -} - String DocumentType::nodeName() const { return name();
diff --git a/third_party/WebKit/Source/core/dom/DocumentType.h b/third_party/WebKit/Source/core/dom/DocumentType.h index 86549b2..f4b7c15 100644 --- a/third_party/WebKit/Source/core/dom/DocumentType.h +++ b/third_party/WebKit/Source/core/dom/DocumentType.h
@@ -43,7 +43,6 @@ private: DocumentType(Document*, const String& name, const String& publicId, const String& systemId); - KURL baseURI() const override; String nodeName() const override; NodeType nodeType() const override; PassRefPtrWillBeRawPtr<Node> cloneNode(bool deep) override;
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp index 173abe1..ca95f774 100644 --- a/third_party/WebKit/Source/core/dom/Node.cpp +++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -1061,9 +1061,9 @@ return doc == this ? nullptr : doc; } -KURL Node::baseURI() const +const KURL& Node::baseURI() const { - return parentNode() ? parentNode()->baseURI() : KURL(); + return document().baseURL(); } bool Node::isEqualNode(Node* other) const
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h index db272ce..d5b87bc 100644 --- a/third_party/WebKit/Source/core/dom/Node.h +++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -221,7 +221,7 @@ Node* pseudoAwareFirstChild() const; Node* pseudoAwareLastChild() const; - virtual KURL baseURI() const; + const KURL& baseURI() const; PassRefPtrWillBeRawPtr<Node> insertBefore(PassRefPtrWillBeRawPtr<Node> newChild, Node* refChild, ExceptionState& = ASSERT_NO_EXCEPTION); PassRefPtrWillBeRawPtr<Node> replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& = ASSERT_NO_EXCEPTION);
diff --git a/third_party/WebKit/Source/core/frame/FrameViewTest.cpp b/third_party/WebKit/Source/core/frame/FrameViewTest.cpp index 63c972c..95d33110 100644 --- a/third_party/WebKit/Source/core/frame/FrameViewTest.cpp +++ b/third_party/WebKit/Source/core/frame/FrameViewTest.cpp
@@ -136,6 +136,9 @@ document().getElementById("a")->layoutObject()->setShouldDoFullPaintInvalidation(); EXPECT_TRUE(chromeClient().m_hasScheduledAnimation); chromeClient().m_hasScheduledAnimation = false; + document().getElementById("a")->layoutObject()->setShouldDoFullPaintInvalidation(); + EXPECT_TRUE(chromeClient().m_hasScheduledAnimation); + chromeClient().m_hasScheduledAnimation = false; document().view()->updateAllLifecyclePhases(); EXPECT_FALSE(chromeClient().m_hasScheduledAnimation); }
diff --git a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp index 82ea6b5..3d99435 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp
@@ -988,6 +988,20 @@ RefPtrWillBeRawPtr<CSSComputedStyleDeclaration> computedStyleInfo = CSSComputedStyleDeclaration::create(node, true); RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(computedStyleInfo, nullptr, nullptr); style = inspectorStyle->buildArrayForComputedStyle(); + + if (!RuntimeEnabledFeatures::cssVariablesEnabled()) + return; + + const HashMap<AtomicString, RefPtr<CSSVariableData>>* variables = computedStyleInfo->getVariables(); + + if (variables && !variables->isEmpty()) { + for (const auto& it : *variables) { + RefPtr<TypeBuilder::CSS::CSSComputedStyleProperty> entry = TypeBuilder::CSS::CSSComputedStyleProperty::create() + .setName(it.key) + .setValue(it.value->tokenRange().serialize()); + style->addItem(entry); + } + } } void InspectorCSSAgent::collectPlatformFontsForLayoutObject(LayoutObject* layoutObject, HashCountedSet<String>* fontStats)
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp index 9f80ca5..570dca06 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -3273,18 +3273,15 @@ bool isUpgradingDelayedFullToFull = m_bitfields.fullPaintInvalidationReason() == PaintInvalidationDelayedFull && reason != PaintInvalidationDelayedFull; - if (m_bitfields.fullPaintInvalidationReason() != PaintInvalidationNone && !isUpgradingDelayedFullToFull) - return; - - if (reason == PaintInvalidationFull) - reason = documentLifecycleBasedPaintInvalidationReason(document().lifecycle()); - m_bitfields.setFullPaintInvalidationReason(reason); - - if (!isUpgradingDelayedFullToFull) { - ASSERT(document().lifecycle().state() != DocumentLifecycle::InPaintInvalidation); - markContainerChainForPaintInvalidation(); - frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); + if (m_bitfields.fullPaintInvalidationReason() == PaintInvalidationNone || isUpgradingDelayedFullToFull) { + if (reason == PaintInvalidationFull) + reason = documentLifecycleBasedPaintInvalidationReason(document().lifecycle()); + m_bitfields.setFullPaintInvalidationReason(reason); + if (!isUpgradingDelayedFullToFull) + markContainerChainForPaintInvalidation(); } + + frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); } void LayoutObject::setMayNeedPaintInvalidation()
diff --git a/third_party/WebKit/Source/core/layout/LayoutView.cpp b/third_party/WebKit/Source/core/layout/LayoutView.cpp index 2e190aba..c443b77 100644 --- a/third_party/WebKit/Source/core/layout/LayoutView.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutView.cpp
@@ -977,6 +977,10 @@ void LayoutView::willBeDestroyed() { + // TODO(wangxianzhu): This is a workaround of crbug.com/570706. + // Should find and fix the root cause. + if (PaintLayer* layer = this->layer()) + layer->setNeedsRepaint(); LayoutBlockFlow::willBeDestroyed(); m_compositor.clear(); }
diff --git a/third_party/WebKit/Source/core/page/PageAnimator.cpp b/third_party/WebKit/Source/core/page/PageAnimator.cpp index 6df72c8..d5c787a 100644 --- a/third_party/WebKit/Source/core/page/PageAnimator.cpp +++ b/third_party/WebKit/Source/core/page/PageAnimator.cpp
@@ -79,13 +79,6 @@ m_page->chromeClient().scheduleAnimation(frame->view()); } -void PageAnimator::updateLifecycleToCompositingCleanPlusScrolling(LocalFrame& rootFrame) -{ - RefPtrWillBeRawPtr<FrameView> view = rootFrame.view(); - TemporaryChange<bool> servicing(m_updatingLayoutAndStyleForPainting, true); - view->updateLifecycleToCompositingCleanPlusScrolling(); -} - void PageAnimator::updateAllLifecyclePhases(LocalFrame& rootFrame) { RefPtrWillBeRawPtr<FrameView> view = rootFrame.view();
diff --git a/third_party/WebKit/Source/core/page/PageAnimator.h b/third_party/WebKit/Source/core/page/PageAnimator.h index be653815e..8ffcba6 100644 --- a/third_party/WebKit/Source/core/page/PageAnimator.h +++ b/third_party/WebKit/Source/core/page/PageAnimator.h
@@ -24,7 +24,6 @@ bool isServicingAnimations() const { return m_servicingAnimations; } // See documents of methods with the same names in FrameView class. - void updateLifecycleToCompositingCleanPlusScrolling(LocalFrame& rootFrame); void updateAllLifecyclePhases(LocalFrame& rootFrame); AnimationClock& clock() { return m_animationClock; }
diff --git a/third_party/WebKit/Source/core/style/StyleVariableData.h b/third_party/WebKit/Source/core/style/StyleVariableData.h index e9e3e4c3..e570b1da 100644 --- a/third_party/WebKit/Source/core/style/StyleVariableData.h +++ b/third_party/WebKit/Source/core/style/StyleVariableData.h
@@ -24,6 +24,8 @@ void setVariable(const AtomicString& name, PassRefPtr<CSSVariableData> value) { m_data.set(name, value); } CSSVariableData* getVariable(const AtomicString& name) const { return m_data.get(name); } void removeVariable(const AtomicString& name) { return m_data.remove(name); } + + const HashMap<AtomicString, RefPtr<CSSVariableData>>* getVariables() const { return &m_data; } private: StyleVariableData() = default; StyleVariableData(const StyleVariableData& other) : RefCounted<StyleVariableData>(), m_data(other.m_data) { }
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes index 0f3bbf2e..7368460 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes +++ b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
@@ -2,7 +2,7 @@ "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28", "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45", "settingsListRemove.svg": "ce9e7c5c5cdaef28e6ee51d9478d5485", - "toolbarButtonGlyphs.svg": "c497b79c6f651c337029cd115b42840b", + "toolbarButtonGlyphs.svg": "87c9b93462ddd0f20795f49178680357", "breakpoint.svg": "69cd92d807259c022791112809b97799", "responsiveDesign.svg": "1d6e963f88e5e448a7cff85f75a0e6b0" } \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes index 0f3bbf2e..7368460 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes +++ b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
@@ -2,7 +2,7 @@ "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28", "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45", "settingsListRemove.svg": "ce9e7c5c5cdaef28e6ee51d9478d5485", - "toolbarButtonGlyphs.svg": "c497b79c6f651c337029cd115b42840b", + "toolbarButtonGlyphs.svg": "87c9b93462ddd0f20795f49178680357", "breakpoint.svg": "69cd92d807259c022791112809b97799", "responsiveDesign.svg": "1d6e963f88e5e448a7cff85f75a0e6b0" } \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg index cb3d845..4b2e613 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg +++ b/third_party/WebKit/Source/devtools/front_end/Images/src/toolbarButtonGlyphs.svg
@@ -22,8 +22,8 @@ showgrid="true" id="namedview3397" inkscape:zoom="4" - inkscape:cx="207.75144" - inkscape:cy="84.559849" + inkscape:cx="219.35293" + inkscape:cy="83.683783" inkscape:window-width="1920" inkscape:window-height="1122" inkscape:window-x="0" @@ -964,10 +964,6 @@ id="inspect_element" sketch:type="MSShapeGroup" sodipodi:nodetypes="cssssssccccccccccccccc" /><path - inkscape:connector-curvature="0" - d="M 178.71429,5.0064 172.28571,5 C 171.57857,5 171,5.572727 171,6.272727 l 0,11.454546 c 0,0.7 0.57857,1.272727 1.28571,1.272727 l 6.42858,0 C 179.42143,19 180,18.427273 180,17.727273 l 0,-11.454546 c 0,-0.7 -0.57857,-1.266363 -1.28571,-1.266363 l 0,0 z m 0,11.448182 -6.42858,0 0,-8.909091 6.42858,0 0,8.909091 0,0 z" - id="device-mode" - sketch:type="MSShapeGroup" /><path d="m 23,157 -2,0 0,2 2,0 z" id="path3288" /><path d="m 23,161 -2,0 0,2 c 1,0 2,-1 2,-2 z" @@ -1046,29 +1042,42 @@ d="m 119.56171,198.24443 -5.5,14 h 2.25 l 1.12,-3 h 6.25 l 1.12,3 h 2.25 l -5.49,-14 h -2 z m -1.38,9 2.38,-6.33 2.38,6.33 h -4.76 z" inkscape:connector-curvature="0" /></g><path inkscape:connector-curvature="0" - d="m 181.72728,149 h -11.45456 c -0.7,0 -1.27272,0.63 -1.27272,1.4 v 8.4 c 0,0.77 0.57272,1.4 1.27272,1.4 h 4.45456 v 1.4 h -1.27273 v 1.4 h 5.0909 v -1.4 h -1.27273 v -1.4 h 4.45456 c 0.7,0 1.27272,-0.63 1.27272,-1.4 v -8.4 c 0,-0.77 -0.57272,-1.4 -1.27272,-1.4 z m 0,9.8 h -11.45456 v -8.4 h 11.45456 v 8.4 z" - id="path6-2" /><path - inkscape:connector-curvature="0" - d="m 211.37405,148.89 c 2.46276,1.1625 4.2251,3.53999 4.49624,6.36001 H 217 C 216.61589,150.63 212.73724,147 208,147 l -0.49707,0.0225 2.86945,2.8575 1.00167,-0.99 z m -4.70711,-0.5775 c -0.44434,-0.44249 -1.15983,-0.44249 -1.59664,0 l -4.78997,4.77 c -0.44434,0.4425 -0.44434,1.155 0,1.59 l 9.05272,9.015 c 0.44435,0.44249 1.15984,0.44249 1.59665,0 l 4.78996,-4.76999 c 0.44435,-0.44251 0.44435,-1.15501 0,-1.59001 l -9.05272,-9.015 z m 3.46444,14.58 -9.05272,-9.01499 4.78996,-4.77001 9.05272,9.01499 -4.78996,4.77001 z m -5.50545,0.2175 c -2.46275,-1.155 -4.22509,-3.53999 -4.49622,-6.36001 H 199 C 199.38411,161.37 203.26276,165 208,165 l 0.49706,-0.0225 -2.86945,-2.8575 -1.00168,0.99 z" + d="m 210.99916,149.68 c 2.18912,1.03333 3.75564,3.14666 3.99665,5.65334 H 216 C 215.65857,151.22667 212.21088,148 208,148 l -0.44184,0.02 2.55062,2.54 0.89038,-0.88 z m -4.1841,-0.51333 c -0.39497,-0.39333 -1.03096,-0.39333 -1.41924,0 l -4.25775,4.24 c -0.39497,0.39333 -0.39497,1.02666 0,1.41333 l 8.04686,8.01333 c 0.39498,0.39333 1.03097,0.39333 1.41925,0 l 4.25774,-4.23999 c 0.39498,-0.39334 0.39498,-1.02667 0,-1.41334 l -8.04686,-8.01333 z m 3.0795,12.96 -8.04686,-8.01333 4.25774,-4.24001 8.04686,8.01333 -4.25774,4.24001 z m -4.89373,0.19333 c -2.18911,-1.02667 -3.75564,-3.14666 -3.99664,-5.65334 H 200 c 0.34143,4.10667 3.78912,7.33334 8,7.33334 l 0.44183,-0.02 -2.55062,-2.54 -0.89038,0.88 z" id="path6" /><path inkscape:connector-curvature="0" - d="m 235,151 0,10 10,0 0,-10 z m 1,1 8,0 0,8 -8,0 z" - id="path3055" /><path - inkscape:connector-curvature="0" - d="m 237,153 0,3 1,0 0,-1.27999 3.28,3.27999 -1.28,0 0,1 3,0 0,-3 -1,0 0,1.31 -3.30999,-3.31 1.30999,0 0,-1 z" - id="path3057" /><path - inkscape:connector-curvature="0" - d="m 278.72728,148 -13.45456,0 c -0.7,0 -1.27272,0.63 -1.27272,1.4 l 0,10.4 c 0,0.77 0.57272,1.2 1.27272,1.2 l 4.72739,0 0,2 -1.99977,0 -4.6e-4,2 8.00012,0 0,-2 -2,0 0,-2 4.72728,0 c 0.7,0 1.27272,-0.43 1.27272,-1.2 l 0,-10.4 c 0,-0.77 -0.57272,-1.4 -1.27272,-1.4 z M 278,159 l -12,0 0,-9 12,0 z" - id="path6-2-6" - sodipodi:nodetypes="sssssccccccccssssccccc" /><path - inkscape:connector-curvature="0" - d="M 307.42857,148.007 299.57143,148 C 298.70715,148 298,148.65455 298,149.45455 l 0,13.09091 c 0,0.8 0.70715,1.45454 1.57143,1.45454 l 7.85714,0 C 308.29285,164 309,163.34546 309,162.54546 l 0,-13.09091 c 0,-0.8 -0.70715,-1.44728 -1.57143,-1.44728 l 0,0 z M 307,160.99968 l -7,0 0,-10 7,0 z" - id="device-mode-4" - sketch:type="MSShapeGroup" - sodipodi:nodetypes="ccsssssscccccccc" /><path - inkscape:connector-curvature="0" d="m 267,110 h -2 v 5 h 5 v -2 h -3 v -3 z m -2,-4 h 2 v -3 h 3 v -2 h -5 v 5 z m 12,7 h -3 v 2 h 5 v -5 h -2 v 3 z m -3,-12 v 2 h 3 v 3 h 2 v -5 h -5 z" id="path6-6" /><path + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" + d="m 295,100 0,0.5 0,4.5 c 0,2.66667 4.44151,-1.67145 4.44151,0.99522 1.29167,0 -0.73318,7.00478 0.55849,7.00478 l 9,0 c 1.33333,0 -0.58161,-5.21491 0.75173,-5.21491 0,-2.16667 3.24827,1.38158 3.24827,-0.78509 l 0,-6.5 0,-0.5 -0.5,0 -17,0 z m 1,1 16,0 0,6 -2.76214,0.27122 L 309,112 l -9,0 -0.15511,-6.8501 L 296,105 z" + id="rect3641-2" inkscape:connector-curvature="0" - d="m 297,112 h 3 v 3 h 2 v -5 h -5 v 2 z m 3,-8 h -3 v 2 h 5 v -5 h -2 v 3 z m 6,11 h 2 v -3 h 3 v -2 h -5 v 5 z m 2,-11 v -3 h -2 v 5 h 5 v -2 h -3 z" - id="path6-65" /></svg> \ No newline at end of file + sodipodi:nodetypes="cccccccccccccccccccccc" /><path + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" + d="m 293,105 0,0.5 0,10 0,0.5 0.5,0 6,0 0.5,0 0,-0.5 0,-10 0,-0.5 -0.5,0 -6,0 z m 1,1 5,0 0,8 -5,0 z" + id="rect3641-2-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccc" /><path + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" + d="m 309,107 0,0.5 0,8 0,0.5 0.5,0 5,0 0.5,0 0,-0.5 0,-8 0,-0.5 -0.5,0 -5,0 z m 1,1 4,0 0,6 -4,0 z" + id="rect3641-2-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccc" /><path + d="m 305,116 -2,0 0,-3 2,0 0,3 z" + id="path3517-0" + inkscape:connector-curvature="0" + style="opacity:0.2" /><rect + height="6" + width="1" + x="-116" + y="301" + id="rect3645-1" + transform="matrix(0,-1,1,0,0,0)" /><path + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" + d="m 299,149 0,0.46875 0,13.0625 0,0.46875 0.4375,0 8.125,0 0.4375,0 0,-0.46875 0,-13.0625 0,-0.46875 -0.4375,0 -8.125,0 z m 1,2 7,0 0,9 -7,0 z m 2,10 3,0 0,1 -3,0 z" + id="rect3641-2-5-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccccccccc" /><path + style="opacity:0.2" + inkscape:connector-curvature="0" + id="path4070" + d="m 307.37415,162.12363 -7.84375,0 0,-11.625 7.84375,0 0,11.625 z" /></svg> \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png b/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png index 89cc4bb..37ac78a 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png +++ b/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs.png Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png index 2c61ece0..c06f0e9 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png +++ b/third_party/WebKit/Source/devtools/front_end/Images/toolbarButtonGlyphs_2x.png Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/cm/css.js b/third_party/WebKit/Source/devtools/front_end/cm/css.js index 2678c57..2673074 100644 --- a/third_party/WebKit/Source/devtools/front_end/cm/css.js +++ b/third_party/WebKit/Source/devtools/front_end/cm/css.js
@@ -12,18 +12,23 @@ "use strict"; CodeMirror.defineMode("css", function(config, parserConfig) { + var inline = parserConfig.inline if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); var indentUnit = config.indentUnit, tokenHooks = parserConfig.tokenHooks, + documentTypes = parserConfig.documentTypes || {}, mediaTypes = parserConfig.mediaTypes || {}, mediaFeatures = parserConfig.mediaFeatures || {}, + mediaValueKeywords = parserConfig.mediaValueKeywords || {}, propertyKeywords = parserConfig.propertyKeywords || {}, nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, + fontProperties = parserConfig.fontProperties || {}, + counterDescriptors = parserConfig.counterDescriptors || {}, colorKeywords = parserConfig.colorKeywords || {}, valueKeywords = parserConfig.valueKeywords || {}, - fontProperties = parserConfig.fontProperties || {}, - allowNested = parserConfig.allowNested; + allowNested = parserConfig.allowNested, + supportsAtComponent = parserConfig.supportsAtComponent === true; var type, override; function ret(style, tp) { type = tp; return style; } @@ -57,6 +62,11 @@ if (/[\d.]/.test(stream.peek())) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); + } else if (stream.match(/^-[\w\\\-]+/)) { + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ret("variable-2", "variable-definition"); + return ret("variable-2", "variable"); } else if (stream.match(/^\w+-/)) { return ret("meta", "meta"); } @@ -66,7 +76,9 @@ return ret("qualifier", "qualifier"); } else if (/[:;{}\[\]\(\)]/.test(ch)) { return ret(null, ch); - } else if (ch == "u" && stream.match("rl(")) { + } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) || + (ch == "d" && stream.match("omain(")) || + (ch == "r" && stream.match("egexp("))) { stream.backUp(1); state.tokenize = tokenParenthesized; return ret("property", "word"); @@ -110,13 +122,14 @@ this.prev = prev; } - function pushContext(state, stream, type) { - state.context = new Context(type, stream.indentation() + indentUnit, state.context); + function pushContext(state, stream, type, indent) { + state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); return type; } function popContext(state) { - state.context = state.context.prev; + if (state.context.prev) + state.context = state.context.prev; return state.context.type; } @@ -148,10 +161,15 @@ return pushContext(state, stream, "block"); } else if (type == "}" && state.context.prev) { return popContext(state); - } else if (type == "@media") { - return pushContext(state, stream, "media"); - } else if (type == "@font-face") { - return "font_face_before"; + } else if (supportsAtComponent && /@component/.test(type)) { + return pushContext(state, stream, "atComponentBlock"); + } else if (/^@(-moz-)?document$/.test(type)) { + return pushContext(state, stream, "documentTypes"); + } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) { + return pushContext(state, stream, "atBlock"); + } else if (/^@(font-face|counter-style)/.test(type)) { + state.stateArg = type; + return "restricted_atBlock_before"; } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { return "keyframes"; } else if (type && type.charAt(0) == "@") { @@ -182,7 +200,7 @@ override = "string-2"; return "maybeprop"; } else if (allowNested) { - override = stream.match(/^\s*:/, false) ? "property" : "tag"; + override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; return "block"; } else { override += " error"; @@ -209,7 +227,7 @@ if (type == "}" || type == "{") return popAndPass(type, stream, state); if (type == "(") return pushContext(state, stream, "parens"); - if (type == "hash" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) { + if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { override += " error"; } else if (type == "word") { wordAsValue(stream); @@ -229,6 +247,7 @@ if (type == "{" || type == "}") return popAndPass(type, stream, state); if (type == ")") return popContext(state); if (type == "(") return pushContext(state, stream, "parens"); + if (type == "interpolation") return pushContext(state, stream, "interpolation"); if (type == "word") wordAsValue(stream); return "parens"; }; @@ -241,47 +260,86 @@ return pass(type, stream, state); }; - states.media = function(type, stream, state) { - if (type == "(") return pushContext(state, stream, "media_parens"); - if (type == "}") return popAndPass(type, stream, state); + states.documentTypes = function(type, stream, state) { + if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { + override = "tag"; + return state.context.type; + } else { + return states.atBlock(type, stream, state); + } + }; + + states.atBlock = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "atBlock_parens"); + if (type == "}" || type == ";") return popAndPass(type, stream, state); if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + if (type == "word") { var word = stream.current().toLowerCase(); - if (word == "only" || word == "not" || word == "and") + if (word == "only" || word == "not" || word == "and" || word == "or") override = "keyword"; else if (mediaTypes.hasOwnProperty(word)) override = "attribute"; else if (mediaFeatures.hasOwnProperty(word)) override = "property"; + else if (mediaValueKeywords.hasOwnProperty(word)) + override = "keyword"; + else if (propertyKeywords.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords.hasOwnProperty(word)) + override = "string-2"; + else if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; else override = "error"; } return state.context.type; }; - states.media_parens = function(type, stream, state) { - if (type == ")") return popContext(state); - if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); - return states.media(type, stream, state); + states.atComponentBlock = function(type, stream, state) { + if (type == "}") + return popAndPass(type, stream, state); + if (type == "{") + return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); + if (type == "word") + override = "error"; + return state.context.type; }; - states.font_face_before = function(type, stream, state) { + states.atBlock_parens = function(type, stream, state) { + if (type == ")") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); + return states.atBlock(type, stream, state); + }; + + states.restricted_atBlock_before = function(type, stream, state) { if (type == "{") - return pushContext(state, stream, "font_face"); + return pushContext(state, stream, "restricted_atBlock"); + if (type == "word" && state.stateArg == "@counter-style") { + override = "variable"; + return "restricted_atBlock_before"; + } return pass(type, stream, state); }; - states.font_face = function(type, stream, state) { - if (type == "}") return popContext(state); + states.restricted_atBlock = function(type, stream, state) { + if (type == "}") { + state.stateArg = null; + return popContext(state); + } if (type == "word") { - if (!fontProperties.hasOwnProperty(stream.current().toLowerCase())) + if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || + (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) override = "error"; else override = "property"; return "maybeprop"; } - return "font_face"; + return "restricted_atBlock"; }; states.keyframes = function(type, stream, state) { @@ -301,15 +359,17 @@ states.interpolation = function(type, stream, state) { if (type == "}") return popContext(state); if (type == "{" || type == ";") return popAndPass(type, stream, state); - if (type != "variable") override = "error"; + if (type == "word") override = "variable"; + else if (type != "variable" && type != "(" && type != ")") override = "error"; return "interpolation"; }; return { startState: function(base) { return {tokenize: null, - state: "top", - context: new Context("top", base || 0, null)}; + state: inline ? "block" : "top", + stateArg: null, + context: new Context(inline ? "block" : "top", base || 0, null)}; }, token: function(stream, state) { @@ -328,12 +388,18 @@ var cx = state.context, ch = textAfter && textAfter.charAt(0); var indent = cx.indent; if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; - if (cx.prev && - (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "font_face") || - ch == ")" && (cx.type == "parens" || cx.type == "media_parens") || - ch == "{" && (cx.type == "at" || cx.type == "media"))) { - indent = cx.indent - indentUnit; - cx = cx.prev; + if (cx.prev) { + if (ch == "}" && (cx.type == "block" || cx.type == "top" || + cx.type == "interpolation" || cx.type == "restricted_atBlock")) { + // Resume indentation from parent context. + cx = cx.prev; + indent = cx.indent; + } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || + ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { + // Dedent relative to current context. + indent = Math.max(0, cx.indent - indentUnit); + cx = cx.prev; + } } return indent; }, @@ -353,6 +419,10 @@ return keys; } + var documentTypes_ = [ + "domain", "regexp", "url", "url-prefix" + ], documentTypes = keySet(documentTypes_); + var mediaTypes_ = [ "all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed" @@ -366,9 +436,16 @@ "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", - "min-resolution", "max-resolution", "scan", "grid" + "min-resolution", "max-resolution", "scan", "grid", "orientation", + "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", + "pointer", "any-pointer", "hover", "any-hover" ], mediaFeatures = keySet(mediaFeatures_); + var mediaValueKeywords_ = [ + "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", + "interlace", "progressive" + ], mediaValueKeywords = keySet(mediaValueKeywords_); + var propertyKeywords_ = [ "align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", @@ -461,13 +538,23 @@ "glyph-orientation-vertical", "text-anchor", "writing-mode" ], propertyKeywords = keySet(propertyKeywords_); - var nonStandardPropertyKeywords = [ + var nonStandardPropertyKeywords_ = [ "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom" - ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords); + ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); + + var fontProperties_ = [ + "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", + "font-stretch", "font-weight", "font-style" + ], fontProperties = keySet(fontProperties_); + + var counterDescriptors_ = [ + "additive-symbols", "fallback", "negative", "pad", "prefix", "range", + "speak-as", "suffix", "symbols", "system" + ], counterDescriptors = keySet(counterDescriptors_); var colorKeywords_ = [ "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", @@ -499,46 +586,49 @@ ], colorKeywords = keySet(colorKeywords_); var valueKeywords_ = [ - "above", "absolute", "activeborder", "activecaption", "afar", - "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate", + "above", "absolute", "activeborder", "additive", "activecaption", "afar", + "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", - "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page", + "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", - "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel", - "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", + "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", + "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", - "cell", "center", "checkbox", "circle", "cjk-earthly-branch", + "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", - "col-resize", "collapse", "column", "compact", "condensed", "contain", "content", - "content-box", "context-menu", "continuous", "copy", "cover", "crop", - "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", + "col-resize", "collapse", "column", "column-reverse", "compact", "condensed", "contain", "content", + "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", + "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", - "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted", - "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", + "disc", "discard", "disclosure-closed", "disclosure-open", "document", + "dot-dash", "dot-dot-dash", + "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", - "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", - "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed", - "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes", + "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", + "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed", + "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", - "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", - "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", + "inline-block", "inline-flex", "inline-table", "inset", "inside", "intrinsic", "invert", + "italic", "japanese-formal", "japanese-informal", "justify", "kannada", + "katakana", "katakana-iroha", "keep-all", "khmer", + "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", "landscape", "lao", "large", "larger", "left", "level", "lighter", - "line-through", "linear", "lines", "list-item", "listbox", "listitem", + "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", - "lower-roman", "lowercase", "ltr", "malayalam", "match", + "lower-roman", "lowercase", "ltr", "malayalam", "match", "matrix", "matrix3d", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", @@ -550,46 +640,50 @@ "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", - "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", + "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", - "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer", - "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", - "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", - "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", - "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", - "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield", + "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", + "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", + "progress", "push-button", "radial-gradient", "radio", "read-only", + "read-write", "read-write-plaintext-only", "rectangle", "region", + "relative", "repeat", "repeating-linear-gradient", + "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", + "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", + "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", + "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", + "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", - "single", "skip-white-space", "slide", "slider-horizontal", + "simp-chinese-formal", "simp-chinese-informal", "single", + "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", - "source-atop", "source-in", "source-out", "source-over", "space", "square", - "square-button", "start", "static", "status-bar", "stretch", "stroke", - "sub", "subpixel-antialiased", "super", "sw-resize", "table", + "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square", + "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", + "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", + "tamil", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", + "trad-chinese-formal", "trad-chinese-informal", + "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", - "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", + "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", - "window", "windowframe", "windowtext", "x-large", "x-small", "xor", + "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small" ], valueKeywords = keySet(valueKeywords_); - var fontProperties_ = [ - "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", - "font-stretch", "font-weight", "font-style" - ], fontProperties = keySet(fontProperties_); - - var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_) - .concat(nonStandardPropertyKeywords).concat(colorKeywords_).concat(valueKeywords_); + var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) + .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) + .concat(valueKeywords_); CodeMirror.registerHelper("hintWords", "css", allWords); function tokenCComment(stream, state) { @@ -604,30 +698,18 @@ return ["comment", "comment"]; } - function tokenSGMLComment(stream, state) { - if (stream.skipTo("-->")) { - stream.match("-->"); - state.tokenize = null; - } else { - stream.skipToEnd(); - } - return ["comment", "comment"]; - } - CodeMirror.defineMIME("text/css", { + documentTypes: documentTypes, mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, colorKeywords: colorKeywords, valueKeywords: valueKeywords, - fontProperties: fontProperties, tokenHooks: { - "<": function(stream, state) { - if (!stream.match("!--")) return false; - state.tokenize = tokenSGMLComment; - return tokenSGMLComment(stream, state); - }, "/": function(stream, state) { if (!stream.eat("*")) return false; state.tokenize = tokenCComment; @@ -640,6 +722,7 @@ CodeMirror.defineMIME("text/x-scss", { mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, colorKeywords: colorKeywords, @@ -681,6 +764,7 @@ CodeMirror.defineMIME("text/x-less", { mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, colorKeywords: colorKeywords, @@ -700,6 +784,7 @@ } }, "@": function(stream) { + if (stream.eat("{")) return [null, "interpolation"]; if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false; stream.eatWhile(/[\w\\\-]/); if (stream.match(/^\s*:/, false)) @@ -714,4 +799,26 @@ helperType: "less" }); + CodeMirror.defineMIME("text/x-gss", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + supportsAtComponent: true, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css", + helperType: "gss" + }); + });
diff --git a/third_party/WebKit/Source/devtools/front_end/common/Color.js b/third_party/WebKit/Source/devtools/front_end/common/Color.js index 2dc04c33..9f8d9c4 100644 --- a/third_party/WebKit/Source/devtools/front_end/common/Color.js +++ b/third_party/WebKit/Source/devtools/front_end/common/Color.js
@@ -797,3 +797,26 @@ Shape: WebInspector.Color.fromRGBA([96, 82, 177, 0.8]), ShapeMargin: WebInspector.Color.fromRGBA([96, 82, 127, .6]) } + +/** + * @param {!WebInspector.Color} color + * @return {!WebInspector.Color.Format} + */ +WebInspector.Color.detectColorFormat = function(color) +{ + const cf = WebInspector.Color.Format; + var format; + var formatSetting = WebInspector.moduleSetting("colorFormat").get(); + if (formatSetting === cf.Original) + format = cf.Original; + else if (formatSetting === cf.RGB) + format = (color.hasAlpha() ? cf.RGBA : cf.RGB); + else if (formatSetting === cf.HSL) + format = (color.hasAlpha() ? cf.HSLA : cf.HSL); + else if (!color.hasAlpha()) + format = (color.canBeShortHex() ? cf.ShortHEX : cf.HEX); + else + format = cf.RGBA; + + return format; +} \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js b/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js index d89d240..1bdf59b 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js +++ b/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js
@@ -118,6 +118,7 @@ return createTextNode(text); var swatch = WebInspector.ColorSwatch.create(); swatch.setColorText(text); + swatch.setFormat(WebInspector.Color.detectColorFormat(color)); return swatch; },
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/StylesPopoverHelper.js b/third_party/WebKit/Source/devtools/front_end/elements/StylesPopoverHelper.js index e90bda2..e8839a06 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/StylesPopoverHelper.js +++ b/third_party/WebKit/Source/devtools/front_end/elements/StylesPopoverHelper.js
@@ -237,7 +237,7 @@ this._swatch = WebInspector.ColorSwatch.create(); this._swatch.setColorText(colorText); - this._swatch.setFormat(WebInspector.ColorSwatchPopoverIcon._colorFormat(this._swatch.color())); + this._swatch.setFormat(WebInspector.Color.detectColorFormat(this._swatch.color())); var shiftClickMessage = WebInspector.UIString("Shift + Click to change color format."); this._swatch.iconElement().title = WebInspector.UIString("Open color picker. %s", shiftClickMessage); this._swatch.iconElement().addEventListener("click", this._iconClick.bind(this)); @@ -257,29 +257,6 @@ return treeElement[WebInspector.ColorSwatchPopoverIcon._treeElementSymbol] || null; } -/** - * @param {!WebInspector.Color} color - * @return {!WebInspector.Color.Format} - */ -WebInspector.ColorSwatchPopoverIcon._colorFormat = function(color) -{ - const cf = WebInspector.Color.Format; - var format; - var formatSetting = WebInspector.moduleSetting("colorFormat").get(); - if (formatSetting === cf.Original) - format = cf.Original; - else if (formatSetting === cf.RGB) - format = (color.hasAlpha() ? cf.RGBA : cf.RGB); - else if (formatSetting === cf.HSL) - format = (color.hasAlpha() ? cf.HSLA : cf.HSL); - else if (!color.hasAlpha()) - format = (color.canBeShortHex() ? cf.ShortHEX : cf.HEX); - else - format = cf.RGBA; - - return format; -} - WebInspector.ColorSwatchPopoverIcon.prototype = { /** * @return {!Element}
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js index e0b6c3b..9ef2f6c 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js +++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
@@ -285,23 +285,22 @@ this._lastMode = new Map(); /** @type {?WebInspector.EmulatedDevice} */ this._lastDevice = null; - /** @type {!Array<!Element>} */ - this._appliedWidthInputs = []; - /** @type {!Array<!Element>} */ - this._appliedHeightInputs = []; + /** @type {!Array<!WebInspector.ToolbarTextGlyphItem>} */ + this._appliedSizeItems = []; /** @type {?Element} */ this._visibleToolbar = null; this._element = createElementWithClass("div", "device-mode-toolbar"); - var leftToolbar = new WebInspector.Toolbar("", this._element); - this._noneItem = new WebInspector.ToolbarToggle(WebInspector.UIString("Full"), "desktop-toolbar-item"); + var leftContainer = this._element.createChild("div", "device-mode-toolbar-left"); + var leftToolbar = new WebInspector.Toolbar("", leftContainer); + this._noneItem = new WebInspector.ToolbarToggle(WebInspector.UIString("Full"), "enter-fullscreen-toolbar-item"); leftToolbar.appendToolbarItem(this._noneItem); this._noneItem.addEventListener("click", this._noneButtonClick, this); - this._responsiveItem = new WebInspector.ToolbarToggle(WebInspector.UIString("Responsive"), "enter-fullscreen-toolbar-item"); + this._responsiveItem = new WebInspector.ToolbarToggle(WebInspector.UIString("Responsive"), "responsive-toolbar-item"); leftToolbar.appendToolbarItem(this._responsiveItem); this._responsiveItem.addEventListener("click", this._responsiveButtonClick, this); - this._deviceItem = new WebInspector.ToolbarToggle(WebInspector.UIString("Device"), "emulation-toolbar-item"); + this._deviceItem = new WebInspector.ToolbarToggle(WebInspector.UIString("Device"), "phone-toolbar-item"); leftToolbar.appendToolbarItem(this._deviceItem); this._deviceItem.addEventListener("click", this._deviceButtonClick, this); leftToolbar.appendSeparator(); @@ -311,10 +310,16 @@ this._responsiveToolbar = this._wrapMiddleToolbar(middle, this._createResponsiveToolbar()); this._deviceToolbar = this._wrapMiddleToolbar(middle, this._createDeviceToolbar()); - var rightToolbar = new WebInspector.Toolbar("", this._element); - rightToolbar.appendSeparator(); - this._scaleItem = new WebInspector.ToolbarTextGlyphItem(); + var rightContainer = this._element.createChild("div", "device-mode-toolbar-right"); + rightContainer.createChild("div", "device-mode-toolbar-spacer"); + var rightToolbar = new WebInspector.Toolbar("", rightContainer); + rightToolbar.makeWrappable(true); + this._scaleItem = new WebInspector.ToolbarMenuButton(this._appendScaleMenuItems.bind(this)); + this._scaleItem.setTitle(WebInspector.UIString("Click to change zoom")); + this._scaleItem.setGlyph(""); + this._scaleItem.setBold(false); rightToolbar.appendToolbarItem(this._scaleItem); + rightToolbar.appendSeparator(); var moreOptionsButton = new WebInspector.ToolbarMenuButton(this._appendMenuItems.bind(this)); moreOptionsButton.setTitle(WebInspector.UIString("More options")); rightToolbar.appendToolbarItem(moreOptionsButton); @@ -392,7 +397,6 @@ toolbar.appendSeparator(); this._appendAppliedSizeItems(toolbar); - toolbar.appendSeparator(); return toolbar; }, @@ -402,34 +406,19 @@ */ _appendAppliedSizeItems: function(toolbar) { - var widthInput = createElementWithClass("input", "device-mode-size-input"); - widthInput.title = WebInspector.UIString("Width"); - widthInput.disabled = true; - this._appliedWidthInputs.push(widthInput); - toolbar.appendToolbarItem(this._wrapToolbarItem(widthInput)); - - var xElement = createElementWithClass("div", "device-mode-x"); - xElement.textContent = "\u00D7"; - toolbar.appendToolbarItem(this._wrapToolbarItem(xElement)); - - var heightInput = createElementWithClass("input", "device-mode-size-input"); - heightInput.title = WebInspector.UIString("Height"); - heightInput.disabled = true; - this._appliedHeightInputs.push(heightInput); - toolbar.appendToolbarItem(this._wrapToolbarItem(heightInput)); + var item = new WebInspector.ToolbarTextGlyphItem(); + this._appliedSizeItems.push(item); + toolbar.appendToolbarItem(item); }, - /** * @param {!WebInspector.ContextMenu} contextMenu */ - _appendMenuItems: function(contextMenu) + _appendScaleMenuItems: function(contextMenu) { - var zoomDisabled = this._model.type() === WebInspector.DeviceModeModel.Type.None; - var zoomSubmenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Zoom"), false); var scaleSetting = this._model.scaleSetting(); appendScaleItem(WebInspector.UIString("Fit"), 0); - zoomSubmenu.appendSeparator(); + contextMenu.appendSeparator(); appendScaleItem(WebInspector.UIString("25%"), 0.25); appendScaleItem(WebInspector.UIString("50%"), 0.5); appendScaleItem(WebInspector.UIString("100%"), 1); @@ -442,9 +431,15 @@ */ function appendScaleItem(title, value) { - zoomSubmenu.appendCheckboxItem(title, scaleSetting.set.bind(scaleSetting, value), scaleSetting.get() === value, zoomDisabled); + contextMenu.appendCheckboxItem(title, scaleSetting.set.bind(scaleSetting, value), scaleSetting.get() === value, false); } + }, + /** + * @param {!WebInspector.ContextMenu} contextMenu + */ + _appendMenuItems: function(contextMenu) + { var uaDisabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; var uaSetting = this._model.uaSetting(); var uaSubmenu = contextMenu.appendSubMenuItem(WebInspector.UIString("User agent type"), false); @@ -687,6 +682,7 @@ this._noneItem.setToggled(this._model.type() === WebInspector.DeviceModeModel.Type.None); this._responsiveItem.setToggled(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive); this._deviceItem.setToggled(this._model.type() === WebInspector.DeviceModeModel.Type.Device); + this._scaleItem.setVisible(this._model.type() !== WebInspector.DeviceModeModel.Type.None); var toolbar = null; if (this._model.type() === WebInspector.DeviceModeModel.Type.None) @@ -714,26 +710,16 @@ if (this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive) { var size = this._model.appliedDeviceSize(); if (!size.isEqual(this._cachedSize)) { - for (var widthInput of this._appliedWidthInputs) - widthInput.value = size.width; - for (var heightInput of this._appliedHeightInputs) - heightInput.value = size.height; + for (var item of this._appliedSizeItems) + item.setText(WebInspector.UIString("%d \u00D7 %d", size.width, size.height)); this._cachedSize = size; } } - var showScale = this._model.scale() !== 1; - if (showScale !== this._cachedShowScale) { - this._scaleItem.setVisible(showScale); - this._cachedShowScale = showScale; - } - - if (showScale) { - var scale = this._model.scale(); - if (scale !== this._cachedScale) { - this._scaleItem.setText(WebInspector.UIString("Zoom: %.2f", scale)); - this._cachedScale = scale; - } + if (this._model.scale() !== this._cachedScale) { + this._scaleItem.setText(WebInspector.UIString("Zoom: %.0f%%", this._model.scale() * 100)); + this._scaleItem.setDimmed(this._model.scale() === 1); + this._cachedScale = this._model.scale(); } if (this._model.device() !== this._cachedModelDevice) {
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/deviceModeView.css b/third_party/WebKit/Source/devtools/front_end/emulation/deviceModeView.css index 490c0fd..ed853301 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/deviceModeView.css +++ b/third_party/WebKit/Source/devtools/front_end/emulation/deviceModeView.css
@@ -21,13 +21,25 @@ padding: 0 4px; } -.device-mode-toolbar > .toolbar { +.device-mode-toolbar .toolbar { padding: 0; overflow: hidden; + flex: auto; +} + +.device-mode-toolbar-left { + flex: 0 1000 115px; + min-width: 93px; +} + +.device-mode-toolbar-right { + flex: 0 1000 115px; + min-width: 40px; + display: flex; } .device-mode-toolbar-middle-container { - flex: auto; + flex: 1 1 120px; position: relative; } @@ -38,7 +50,7 @@ } .device-mode-toolbar-middle .toolbar { - flex-shrink: 1; + flex: 0 1 auto; } .device-mode-toolbar-spacer { @@ -53,6 +65,7 @@ .device-mode-media-container { flex: none; overflow: hidden; + box-shadow: inset 0 -1px #ccc; } .device-mode-content-area {
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 002ef3f6..0d8926e 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -126,9 +126,10 @@ Runtime.experiments.register("securityPanel", "Security panel"); Runtime.experiments.register("showPrimaryLoadWaterfallInNetworkTimeline", "Show primary load waterfall in Network timeline", true); Runtime.experiments.register("stepIntoAsync", "Step into async"); - Runtime.experiments.register("timelineInvalidationTracking", "Timeline invalidation tracking", true); - Runtime.experiments.register("timelineTracingJSProfile", "Timeline tracing based JS profiler", true); Runtime.experiments.register("timelineFlowEvents", "Timeline flow events", true); + Runtime.experiments.register("timelineInvalidationTracking", "Timeline invalidation tracking", true); + Runtime.experiments.register("timelineRecordingPerspectives", "Timeline recording perspectives UI"); + Runtime.experiments.register("timelineTracingJSProfile", "Timeline tracing based JS profiler", true); Runtime.experiments.cleanUpStaleExperiments();
diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastApp.js b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastApp.js index 38b74f6..f9571bc 100644 --- a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastApp.js +++ b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastApp.js
@@ -10,7 +10,7 @@ WebInspector.ScreencastApp = function() { this._enabledSetting = WebInspector.settings.createSetting("screencastEnabled", true); - this._toggleButton = new WebInspector.ToolbarToggle(WebInspector.UIString("Toggle screencast"), "screencast-toolbar-item"); + this._toggleButton = new WebInspector.ToolbarToggle(WebInspector.UIString("Toggle screencast"), "phone-toolbar-item"); this._toggleButton.setToggled(this._enabledSetting.get()); this._toggleButton.addEventListener("click", this._toggleButtonClicked, this); WebInspector.targetManager.observeTargets(this);
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js index bfc4971..b442fd1 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js
@@ -2047,7 +2047,7 @@ */ function parsePayload(error, computedPayload) { - if (error || !computedPayload) + if (error || !computedPayload || !computedPayload.length) return null; var result = new Map(); for (var property of computedPayload)
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineEventOverview.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineEventOverview.js index e5d40c240..22cb4c5 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineEventOverview.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineEventOverview.js
@@ -104,7 +104,7 @@ */ WebInspector.TimelineEventOverview.Input = function(model) { - WebInspector.TimelineEventOverview.call(this, "input", WebInspector.UIString("Input"), model); + WebInspector.TimelineEventOverview.call(this, "input", null, model); } WebInspector.TimelineEventOverview.Input.prototype = {
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js index 6d173702..6107fbf 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
@@ -68,6 +68,13 @@ this._currentViews = []; this._viewModeSetting = WebInspector.settings.createSetting("timelineViewMode", WebInspector.TimelinePanel.ViewMode.FlameChart); + this._captureNetworkSetting = WebInspector.settings.createSetting("timelineCaptureNetwork", false); + this._captureJSProfileSetting = WebInspector.settings.createSetting("timelineEnableJSSampling", true); + this._captureMemorySetting = WebInspector.settings.createSetting("timelineCaptureMemory", false); + this._captureLayersAndPicturesSetting = WebInspector.settings.createSetting("timelineCaptureLayersAndPictures", false); + this._captureFilmStripSetting = WebInspector.settings.createSetting("timelineCaptureFilmStrip", false); + + this._panelToolbar = new WebInspector.Toolbar("", this.element); this._createToolbarItems(); var timelinePane = new WebInspector.VBox(); @@ -121,6 +128,15 @@ /** * @enum {string} */ +WebInspector.TimelinePanel.Perspectives = { + Load: "Load", + Responsiveness: "Responsiveness", + Custom: "Custom" +} + +/** + * @enum {string} + */ WebInspector.TimelinePanel.ViewMode = { FlameChart: "FlameChart", CallTree: "CallTree", @@ -328,51 +344,100 @@ _createToolbarItems: function() { - this._panelToolbar = new WebInspector.Toolbar("", this.element); + this._panelToolbar.removeToolbarItems(); - this._panelToolbar.appendToolbarItem(WebInspector.Toolbar.createActionButton(this._toggleRecordAction)); + var perspectiveSetting = WebInspector.settings.createSetting("timelinePerspective", WebInspector.TimelinePanel.Perspectives.Load); + if (Runtime.experiments.isEnabled("timelineRecordingPerspectives")) { + /** + * @this {!WebInspector.TimelinePanel} + */ + function onPerspectiveChanged() + { + perspectiveSetting.set(perspectiveCombobox.selectElement().value); + this._createToolbarItems(); + } + + /** + * @param {string} id + * @param {string} title + */ + function addPerspectiveOption(id, title) + { + var option = perspectiveCombobox.createOption(title, "", id); + perspectiveCombobox.addOption(option); + if (id === perspectiveSetting.get()) + perspectiveCombobox.select(option); + } + + var perspectiveCombobox = new WebInspector.ToolbarComboBox(onPerspectiveChanged.bind(this)); + addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Load, WebInspector.UIString("Page Load")); + addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Responsiveness, WebInspector.UIString("Responsiveness")); + addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Custom, WebInspector.UIString("Custom")); + this._panelToolbar.appendToolbarItem(perspectiveCombobox); + + switch (perspectiveSetting.get()) { + case WebInspector.TimelinePanel.Perspectives.Load: + this._captureNetworkSetting.set(true); + this._captureJSProfileSetting.set(true); + this._captureMemorySetting.set(false); + this._captureLayersAndPicturesSetting.set(false); + this._captureFilmStripSetting.set(true); + break; + case WebInspector.TimelinePanel.Perspectives.Responsiveness: + this._captureNetworkSetting.set(true); + this._captureJSProfileSetting.set(true); + this._captureMemorySetting.set(false); + this._captureLayersAndPicturesSetting.set(false); + this._captureFilmStripSetting.set(false); + break; + } + } + if (Runtime.experiments.isEnabled("timelineRecordingPerspectives") && perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Load) { + this._reloadButton = new WebInspector.ToolbarButton(WebInspector.UIString("Record & Reload"), "refresh-toolbar-item", 1); + this._reloadButton.addEventListener("click", () => WebInspector.targetManager.reloadPage()); + this._panelToolbar.appendToolbarItem(this._reloadButton); + } else { + this._panelToolbar.appendToolbarItem(WebInspector.Toolbar.createActionButton(this._toggleRecordAction)); + } + this._updateTimelineControls(); - var clearButton = new WebInspector.ToolbarButton(WebInspector.UIString("Clear recording"), "clear-toolbar-item"); clearButton.addEventListener("click", this._onClearButtonClick, this); this._panelToolbar.appendToolbarItem(clearButton); - this._panelToolbar.appendSeparator(); - var garbageCollectButton = new WebInspector.ToolbarButton(WebInspector.UIString("Collect garbage"), "garbage-collect-toolbar-item"); - garbageCollectButton.addEventListener("click", this._garbageCollectButtonClicked, this); - this._panelToolbar.appendToolbarItem(garbageCollectButton); this._panelToolbar.appendSeparator(); this._panelToolbar.appendText(WebInspector.UIString("Capture:")); - this._captureNetworkSetting = WebInspector.settings.createSetting("timelineCaptureNetwork", false); this._captureNetworkSetting.addChangeListener(this._onNetworkChanged, this); - if (Runtime.experiments.isEnabled("networkRequestsOnTimeline")) { - this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Network"), - this._captureNetworkSetting, - WebInspector.UIString("Capture network requests information"))); + if (!Runtime.experiments.isEnabled("timelineRecordingPerspectives") || perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Custom) { + if (Runtime.experiments.isEnabled("networkRequestsOnTimeline")) { + this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Network"), + this._captureNetworkSetting, + WebInspector.UIString("Capture network requests information"))); + } + this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("JS Profile"), + this._captureJSProfileSetting, + WebInspector.UIString("Capture JavaScript stacks with sampling profiler. (Has performance overhead)"))); + this._captureMemorySetting.addChangeListener(this._onModeChanged, this); + this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Memory"), + this._captureMemorySetting, + WebInspector.UIString("Capture memory information on every timeline event."))); + this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Paint"), + this._captureLayersAndPicturesSetting, + WebInspector.UIString("Capture graphics layer positions and painted pictures. (Has performance overhead)"))); } - this._enableJSSamplingSetting = WebInspector.settings.createSetting("timelineEnableJSSampling", true); - this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("JS Profile"), - this._enableJSSamplingSetting, - WebInspector.UIString("Capture JavaScript stacks with sampling profiler. (Has performance overhead)"))); - this._captureMemorySetting = WebInspector.settings.createSetting("timelineCaptureMemory", false); - this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Memory"), - this._captureMemorySetting, - WebInspector.UIString("Capture memory information on every timeline event."))); - this._captureMemorySetting.addChangeListener(this._onModeChanged, this); - this._captureLayersAndPicturesSetting = WebInspector.settings.createSetting("timelineCaptureLayersAndPictures", false); - this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Paint"), - this._captureLayersAndPicturesSetting, - WebInspector.UIString("Capture graphics layer positions and painted pictures. (Has performance overhead)"))); - - this._captureFilmStripSetting = WebInspector.settings.createSetting("timelineCaptureFilmStrip", false); this._captureFilmStripSetting.addChangeListener(this._onModeChanged, this); this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Screenshots"), this._captureFilmStripSetting, WebInspector.UIString("Capture screenshots while recording. (Has performance overhead)"))); + this._panelToolbar.appendSeparator(); + var garbageCollectButton = new WebInspector.ToolbarButton(WebInspector.UIString("Collect garbage"), "garbage-collect-toolbar-item"); + garbageCollectButton.addEventListener("click", this._garbageCollectButtonClicked, this); + this._panelToolbar.appendToolbarItem(garbageCollectButton); + if (Runtime.experiments.isEnabled("cpuThrottling")) { this._panelToolbar.appendSeparator(); this._cpuThrottlingCombobox = new WebInspector.ToolbarComboBox(this._onCPUThrottlingChanged.bind(this)); @@ -512,9 +577,9 @@ { // Set up overview controls. this._overviewControls = []; + this._overviewControls.push(new WebInspector.TimelineEventOverview.Responsiveness(this._model, this._frameModel)); if (Runtime.experiments.isEnabled("inputEventsOnTimelineOverview")) this._overviewControls.push(new WebInspector.TimelineEventOverview.Input(this._model)); - this._overviewControls.push(new WebInspector.TimelineEventOverview.Responsiveness(this._model, this._frameModel)); this._overviewControls.push(new WebInspector.TimelineEventOverview.Frames(this._model, this._frameModel)); this._overviewControls.push(new WebInspector.TimelineEventOverview.CPUActivity(this._model)); this._overviewControls.push(new WebInspector.TimelineEventOverview.Network(this._model)); @@ -592,7 +657,7 @@ this._statusPane.updateStatus(WebInspector.UIString("Initializing recording\u2026")); this._autoRecordGeneration = userInitiated ? null : Symbol("Generation"); - this._model.startRecording(true, this._enableJSSamplingSetting.get(), this._captureMemorySetting.get(), this._captureLayersAndPicturesSetting.get(), this._captureFilmStripSetting && this._captureFilmStripSetting.get()); + this._model.startRecording(true, this._captureJSProfileSetting.get(), this._captureMemorySetting.get(), this._captureLayersAndPicturesSetting.get(), this._captureFilmStripSetting && this._captureFilmStripSetting.get()); for (var i = 0; i < this._overviewControls.length; ++i) this._overviewControls[i].timelineStarted();
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/timelinePanel.css b/third_party/WebKit/Source/devtools/front_end/timeline/timelinePanel.css index cb5e126..5efbc2e 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/timelinePanel.css +++ b/third_party/WebKit/Source/devtools/front_end/timeline/timelinePanel.css
@@ -144,7 +144,9 @@ flex-basis: 22px; } -.overview-strip::before { +#timeline-overview-framerate::before, +#timeline-overview-network::before, +#timeline-overview-cpu-activity::before { content: ""; position: absolute; left: 0; @@ -158,10 +160,6 @@ z-index: -10; } -#timeline-overview-responsiveness::before { - display: none; -} - #timeline-overview-responsiveness { flex-basis: 6px; margin-top: 1px !important;
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js b/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js index fde87775..98900e5 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js
@@ -37,18 +37,25 @@ { /** @type {!Array.<!WebInspector.ToolbarItem>} */ this._items = []; + this._reverse = false; this.element = parentElement ? parentElement.createChild("div") : createElement("div"); this.element.className = className; this.element.classList.add("toolbar"); this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element, "ui/toolbar.css"); this._contentElement = this._shadowRoot.createChild("div", "toolbar-shadow"); - this._contentElement.createChild("content"); + this._insertionPoint = this._contentElement.createChild("content"); } WebInspector.Toolbar.prototype = { - makeWrappable: function() + /** + * @param {boolean=} reverse + */ + makeWrappable: function(reverse) { this._contentElement.classList.add("wrappable"); + this._reverse = !!reverse; + if (reverse) + this._contentElement.classList.add("wrappable-reverse"); }, makeVertical: function() @@ -82,7 +89,10 @@ { this._items.push(item); item._toolbar = this; - this._contentElement.insertBefore(item.element, this._contentElement.lastChild); + if (this._reverse) + this._contentElement.insertBefore(item.element, this._insertionPoint.nextSibling); + else + this._contentElement.insertBefore(item.element, this._insertionPoint); this._hideSeparatorDupes(); }, @@ -107,7 +117,7 @@ delete item._toolbar; this._items = []; this._contentElement.removeChildren(); - this._contentElement.createChild("content"); + this._insertionPoint = this._contentElement.createChild("content"); }, /** @@ -315,6 +325,14 @@ this.element.classList.toggle("toolbar-bold", bold); }, + /** + * @param {boolean} dimmed + */ + setDimmed: function(dimmed) + { + this.element.classList.toggle("toolbar-dimmed", dimmed); + }, + __proto__: WebInspector.ToolbarItem.prototype }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css b/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css index 7863f78..1f56cf5a 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css +++ b/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css
@@ -24,6 +24,10 @@ flex-wrap: wrap; } +.toolbar-shadow.wrappable-reverse { + flex-direction: row-reverse; +} + .toolbar-shadow.vertical { flex-direction: column; height: auto; @@ -66,6 +70,10 @@ font-weight: bold; } +.toolbar-dimmed .toolbar-text { + color: #999; +} + .toolbar-glyph { -webkit-mask-image: url(Images/toolbarButtonGlyphs.png); -webkit-mask-size: 352px 168px; @@ -261,35 +269,6 @@ -webkit-mask-position: -320px -120px; } -.emulation-toolbar-item.toolbar-glyph { - -webkit-mask-position: -288px -144px; -} - -@media (-webkit-min-device-pixel-ratio: 1.5) { -.emulation-toolbar-item.toolbar-glyph { - -webkit-mask-position: -160px 0; -} -} - -.emulation-toolbar-item.warning::after { - background-image: url(Images/toolbarButtonGlyphs.png); - background-size: 352px 168px; - width: 10px; - height: 12px; - content: ""; - position: absolute; - right: 3px; - bottom: 2px; - background-position: -202px -107px; - z-index: 1; -} - -@media (-webkit-min-device-pixel-ratio: 1.5) { -.emulation-toolbar-item.warning::before { - background-image: url(Images/toolbarButtonGlyphs_2x.png); -} -} /* media */ - .delete-toolbar-item.toolbar-glyph { -webkit-mask-position: -128px 0; } @@ -318,10 +297,6 @@ -webkit-mask-position: -224px -72px; } -.screencast-toolbar-item.toolbar-glyph { - -webkit-mask-position: -160px 0; -} - .record-toolbar-item.toolbar-glyph { -webkit-mask-position: -288px 0; } @@ -485,29 +460,19 @@ -webkit-mask-position: -32px -144px; } -.desktop-toolbar-item.toolbar-glyph { - -webkit-mask-position: -256px -144px; -} - -@media (-webkit-min-device-pixel-ratio: 1.5) { -.desktop-toolbar-item.toolbar-glyph { - -webkit-mask-position: -160px -144px; -} +.phone-toolbar-item.toolbar-glyph { + -webkit-mask-position: -288px -144px; } .rotate-screen-toolbar-item.toolbar-glyph { -webkit-mask-position: -192px -144px; } -.resize-toolbar-item.toolbar-glyph { - -webkit-mask-position: -224px -144px; -} - .enter-fullscreen-toolbar-item.toolbar-glyph { -webkit-mask-position: -256px -96px; } -.exit-fullscreen-toolbar-item.toolbar-glyph { +.responsive-toolbar-item.toolbar-glyph { -webkit-mask-position: -288px -96px; }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/timelineGrid.css b/third_party/WebKit/Source/devtools/front_end/ui_lazy/timelineGrid.css index db0da22..fe47002 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/timelineGrid.css +++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/timelineGrid.css
@@ -73,12 +73,15 @@ height: 100%; z-index: 300; pointer-events: none; + border: 1px none hsla(0, 0%, 70%, 0.5); } .timeline-curtain-left { left: 0; + border-right-style: solid; } .timeline-curtain-right { right: 0; + border-left-style: solid; }
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi index 73bb32c5..a1825d81 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gypi +++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -687,6 +687,7 @@ 'graphics/paint/DisplayItem.cpp', 'graphics/paint/DisplayItem.h', 'graphics/paint/DisplayItemCacheSkipper.h', + 'graphics/paint/DisplayItemClient.cpp', 'graphics/paint/DisplayItemClient.h', 'graphics/paint/DisplayItemList.h', 'graphics/paint/DrawingDisplayItem.cpp', @@ -1025,6 +1026,7 @@ 'graphics/filters/FilterOperationsTest.cpp', 'graphics/filters/ImageFilterBuilderTest.cpp', 'graphics/gpu/DrawingBufferTest.cpp', + 'graphics/paint/DisplayItemClientTest.cpp', 'graphics/paint/DisplayItemTest.cpp', 'graphics/paint/PaintArtifactToSkCanvasTest.cpp', 'graphics/paint/PaintChunkerTest.cpp',
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp index 36fc3f8..09036074 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp +++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
@@ -331,8 +331,10 @@ } if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled() - && !m_client->needsRepaint() && !paintController().cacheIsEmpty() && m_previousInterestRect == *interestRect) + && !m_client->needsRepaint() && !paintController().cacheIsEmpty() && m_previousInterestRect == *interestRect) { + ASSERT(!paintController().hasInvalidations()); return false; + } GraphicsContext context(paintController(), disabledMode);
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp new file mode 100644 index 0000000..560beea --- /dev/null +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp
@@ -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. + +#include "config.h" +#include "platform/graphics/paint/DisplayItemClient.h" + +#if ENABLE(ASSERT) + +#include "wtf/HashSet.h" + +namespace blink { + +HashSet<const DisplayItemClient*>* liveDisplayItemClients = nullptr; + +DisplayItemClient::DisplayItemClient() +{ + if (!liveDisplayItemClients) + liveDisplayItemClients = new HashSet<const DisplayItemClient*>(); + liveDisplayItemClients->add(this); +} + +DisplayItemClient::~DisplayItemClient() +{ + liveDisplayItemClients->remove(this); +} + +bool DisplayItemClient::isAlive(const DisplayItemClient& client) +{ + return liveDisplayItemClients && liveDisplayItemClients->contains(&client); +} + +} // namespace blink + +#endif // ENABLE(ASSERT)
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h index 4ed7200..118ac51d 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h
@@ -12,14 +12,28 @@ namespace blink { // The interface for objects that can be associated with display items. +// A DisplayItemClient object should live at least longer than the document cycle +// in which its display items are created during painting. +// After the document cycle, a pointer/reference to DisplayItemClient should be +// no longer dereferenced unless we can make sure the client is still valid. class PLATFORM_EXPORT DisplayItemClient { public: +#if ENABLE(ASSERT) + DisplayItemClient(); + virtual ~DisplayItemClient(); +#else virtual ~DisplayItemClient() { } +#endif virtual String debugName() const = 0; // The visual rect of this DisplayItemClient, in the space of its containing GraphicsLayer. virtual IntRect visualRect() const = 0; + +#if ENABLE(ASSERT) + // Tests if a DisplayItemClient object has been created and has not been deleted yet. + static bool isAlive(const DisplayItemClient&); +#endif }; inline bool operator==(const DisplayItemClient& client1, const DisplayItemClient& client2) { return &client1 == &client2; }
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClientTest.cpp b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClientTest.cpp new file mode 100644 index 0000000..78db3532 --- /dev/null +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClientTest.cpp
@@ -0,0 +1,33 @@ +// 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 "config.h" +#include "platform/graphics/paint/DisplayItemClient.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { +namespace { + +#if ENABLE(ASSERT) + +class TestDisplayItemClient : public DisplayItemClient { +public: + String debugName() const final { return "TestDisplayItemClient"; } + IntRect visualRect() const final { return IntRect(); } +}; + +TEST(DisplayItemClientTest, IsAlive) +{ + EXPECT_FALSE(DisplayItemClient::isAlive(*reinterpret_cast<DisplayItemClient*>(0x12345678))); + TestDisplayItemClient* testClient = new TestDisplayItemClient; + EXPECT_TRUE(DisplayItemClient::isAlive(*testClient)); + delete testClient; + EXPECT_FALSE(DisplayItemClient::isAlive(*testClient)); +} + +#endif // ENABLE(ASSERT) + +} // namespace +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.h b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.h index 9e07b480..ac4e1bed 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.h +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemList.h
@@ -47,6 +47,20 @@ #endif return result; } + +#if ENABLE(ASSERT) + void assertDisplayItemClientsAreAlive() const + { + for (auto& item : *this) { +#ifdef NDEBUG + ASSERT_WITH_MESSAGE(DisplayItemClient::isAlive(item.client()), "Short-lived DisplayItemClient. See crbug.com/570030."); +#else + ASSERT_WITH_MESSAGE(DisplayItemClient::isAlive(item.client()), "Short-lived DisplayItemClient: %s. See crbug.com/570030.", item.clientDebugString().utf8().data()); +#endif + } + } +#endif + }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintArtifact.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintArtifact.cpp index e7927557..4f304e2e7 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/PaintArtifact.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintArtifact.cpp
@@ -41,6 +41,9 @@ void PaintArtifact::appendToWebDisplayItemList(WebDisplayItemList* list) const { TRACE_EVENT0("blink,benchmark", "PaintArtifact::appendToWebDisplayItemList"); +#if ENABLE(ASSERT) + m_displayItemList.assertDisplayItemClientsAreAlive(); +#endif for (const DisplayItem& displayItem : m_displayItemList) { // TODO(wkorman): Pass the actual visual rect for the display item. displayItem.appendToWebDisplayItemList(IntRect(), list);
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp index 4a35299..d62b350 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
@@ -264,6 +264,17 @@ } while (!endSubsequenceId.matches(updatedList.last())); } +void PaintController::commitNewDisplayItems() +{ +#if ENABLE(ASSERT) + m_newDisplayItemList.assertDisplayItemClientsAreAlive(); +#endif + commitNewDisplayItemsInternal(); +#if ENABLE(ASSERT) + m_currentPaintArtifact.displayItemList().assertDisplayItemClientsAreAlive(); +#endif +} + // Update the existing display items by removing invalidated entries, updating // repainted ones, and appending new items. // - For cached drawing display item, copy the corresponding cached DrawingDisplayItem; @@ -275,7 +286,7 @@ // Coefficients are related to the ratio of out-of-order CachedDisplayItems // and the average number of (Drawing|Subsequence)DisplayItems per client. // -void PaintController::commitNewDisplayItems() +void PaintController::commitNewDisplayItemsInternal() { TRACE_EVENT2("blink,benchmark", "PaintController::commitNewDisplayItems", "current_display_list_size", (int)m_currentPaintArtifact.displayItemList().size(),
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.h b/third_party/WebKit/Source/platform/graphics/paint/PaintController.h index 9fdf1a0b..7f7f5ce 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.h +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
@@ -143,6 +143,10 @@ void showDebugData() const; #endif +#if ENABLE(ASSERT) + bool hasInvalidations() { return !m_invalidations.isEmpty(); } +#endif + void startTrackingPaintInvalidationObjects() { ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); @@ -170,6 +174,10 @@ m_clientsCheckedPaintInvalidation.add(&client); } +#if ENABLE(ASSERT) + void assertDisplayItemClientsAreLive(); +#endif + protected: PaintController() : m_newDisplayItemList(kInitialDisplayItemListCapacityBytes) @@ -213,6 +221,8 @@ void checkNoRemainingCachedDisplayItems(); #endif + void commitNewDisplayItemsInternal(); + // The last complete paint artifact. // In SPv2, this includes paint chunks as well as display items. PaintArtifact m_currentPaintArtifact;
diff --git a/third_party/WebKit/Source/web/LinkHighlightImpl.cpp b/third_party/WebKit/Source/web/LinkHighlightImpl.cpp index fd57056e..51e7f13e 100644 --- a/third_party/WebKit/Source/web/LinkHighlightImpl.cpp +++ b/third_party/WebKit/Source/web/LinkHighlightImpl.cpp
@@ -97,7 +97,6 @@ m_contentLayer->layer()->setDrawsContent(true); m_contentLayer->layer()->setOpacity(1); m_geometryNeedsUpdate = true; - updateGeometry(); } LinkHighlightImpl::~LinkHighlightImpl()
diff --git a/third_party/WebKit/Source/web/PageWidgetDelegate.cpp b/third_party/WebKit/Source/web/PageWidgetDelegate.cpp index 5cd1e6f..5e1f65b0 100644 --- a/third_party/WebKit/Source/web/PageWidgetDelegate.cpp +++ b/third_party/WebKit/Source/web/PageWidgetDelegate.cpp
@@ -58,11 +58,6 @@ page.animator().serviceScriptedAnimations(monotonicFrameBeginTime); } -void PageWidgetDelegate::updateLifecycleToCompositingCleanPlusScrolling(Page& page, LocalFrame& root) -{ - page.animator().updateLifecycleToCompositingCleanPlusScrolling(root); -} - void PageWidgetDelegate::updateAllLifecyclePhases(Page& page, LocalFrame& root) { page.animator().updateAllLifecyclePhases(root);
diff --git a/third_party/WebKit/Source/web/PageWidgetDelegate.h b/third_party/WebKit/Source/web/PageWidgetDelegate.h index 3140363..6e138ef5 100644 --- a/third_party/WebKit/Source/web/PageWidgetDelegate.h +++ b/third_party/WebKit/Source/web/PageWidgetDelegate.h
@@ -73,7 +73,6 @@ // to start performing the specified operation. // See documents of methods with the same names in FrameView class. - static void updateLifecycleToCompositingCleanPlusScrolling(Page&, LocalFrame& root); static void updateAllLifecyclePhases(Page&, LocalFrame& root); static void paint(Page&, WebCanvas*, const WebRect&, LocalFrame& root);
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp index 08da0d4..e849422 100644 --- a/third_party/WebKit/Source/web/WebViewImpl.cpp +++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -1449,9 +1449,6 @@ // don't get a new target to highlight. m_linkHighlights.clear(); - // LinkHighlight reads out layout and compositing state, so we need to make sure that's all up to date. - updateAllLifecyclePhases(); - for (size_t i = 0; i < highlightNodes.size(); ++i) { Node* node = highlightNodes[i]; @@ -1467,6 +1464,8 @@ m_linkHighlights.append(LinkHighlightImpl::create(node, this)); } + + updateAllLifecyclePhases(); } void WebViewImpl::animateDoubleTapZoom(const IntPoint& pointInRootFrame) @@ -2013,7 +2012,7 @@ m_pageColorOverlay->graphicsLayer()->paint(nullptr); } - // TODO(chrishtr): link highlight's don't currently paint themselves, it's still driven by cc. + // TODO(chrishtr): link highlights don't currently paint themselves, it's still driven by cc. // Fix this. for (size_t i = 0; i < m_linkHighlights.size(); ++i) m_linkHighlights[i]->updateGeometry(); @@ -3933,8 +3932,6 @@ void WebViewImpl::setBaseBackgroundColor(WebColor color) { - updateAllLifecyclePhases(); - if (m_baseBackgroundColor == color) return; @@ -3943,7 +3940,7 @@ if (m_page->mainFrame() && m_page->mainFrame()->isLocalFrame()) m_page->deprecatedLocalMainFrame()->view()->setBaseBackgroundColor(color); - updateLayerTreeBackgroundColor(); + updateAllLifecyclePhases(); } void WebViewImpl::setIsActive(bool active)
diff --git a/third_party/mojo/mojo_edk_tests.gyp b/third_party/mojo/mojo_edk_tests.gyp index c176ba83..1216f0f 100644 --- a/third_party/mojo/mojo_edk_tests.gyp +++ b/third_party/mojo/mojo_edk_tests.gyp
@@ -69,6 +69,8 @@ '../../mojo/public/cpp/bindings/tests/pickled_struct_blink.h', '../../mojo/public/cpp/bindings/tests/pickled_struct_chromium.cc', '../../mojo/public/cpp/bindings/tests/pickled_struct_chromium.h', + '../../mojo/public/cpp/bindings/tests/rect_blink.h', + '../../mojo/public/cpp/bindings/tests/rect_chromium.h', '../../mojo/public/cpp/bindings/tests/request_response_unittest.cc', '../../mojo/public/cpp/bindings/tests/router_test_util.cc', '../../mojo/public/cpp/bindings/tests/router_test_util.h', @@ -76,6 +78,7 @@ '../../mojo/public/cpp/bindings/tests/sample_service_unittest.cc', '../../mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc', '../../mojo/public/cpp/bindings/tests/string_unittest.cc', + '../../mojo/public/cpp/bindings/tests/struct_traits_unittest.cc', '../../mojo/public/cpp/bindings/tests/struct_unittest.cc', '../../mojo/public/cpp/bindings/tests/type_conversion_unittest.cc', '../../mojo/public/cpp/bindings/tests/union_unittest.cc',
diff --git a/tools/clang/pass_to_move/PassToMove.cpp b/tools/clang/pass_to_move/PassToMove.cpp index 2fd947c..c5858f4 100644 --- a/tools/clang/pass_to_move/PassToMove.cpp +++ b/tools/clang/pass_to_move/PassToMove.cpp
@@ -41,26 +41,30 @@ void RewriterCallback::run(const MatchFinder::MatchResult& result) { const clang::CXXMemberCallExpr* call_expr = result.Nodes.getNodeAs<clang::CXXMemberCallExpr>("expr"); - const bool is_arrow = - clang::dyn_cast<clang::MemberExpr>(call_expr->getCallee())->isArrow(); + const clang::MemberExpr* callee = + clang::dyn_cast<clang::MemberExpr>(call_expr->getCallee()); + const bool is_arrow = callee->isArrow(); const clang::Expr* arg = result.Nodes.getNodeAs<clang::Expr>("arg"); - clang::CharSourceRange arg_range = clang::CharSourceRange::getTokenRange( - result.SourceManager->getSpellingLoc(arg->getLocStart()), - result.SourceManager->getSpellingLoc(arg->getLocEnd())); - std::string new_source_text = "std::move("; - if (is_arrow) - new_source_text += "*"; - llvm::StringRef arg_text = clang::Lexer::getSourceText( - arg_range, *result.SourceManager, result.Context->getLangOpts()); - new_source_text.append(arg_text.data(), arg_text.size()); - new_source_text += ")"; + const char kMoveRefText[] = "std::move("; + const char kMovePtrText[] = "std::move(*"; - // Replace the entire original expression with std::move(arg). - clang::CharSourceRange expr_range = clang::CharSourceRange::getTokenRange( - result.SourceManager->getSpellingLoc(call_expr->getLocStart()), - result.SourceManager->getSpellingLoc(call_expr->getLocEnd())); - replacements_->emplace(*result.SourceManager, expr_range, new_source_text); + replacements_->emplace(*result.SourceManager, + result.SourceManager->getSpellingLoc( + arg->getLocStart()), + 0, + is_arrow ? kMovePtrText : kMoveRefText); + + // Delete everything but the closing parentheses from the original call to + // Pass(): the closing parantheses is left to match up with the parantheses + // just inserted with std::move. + replacements_->emplace(*result.SourceManager, + clang::CharSourceRange::getCharRange( + result.SourceManager->getSpellingLoc( + callee->getOperatorLoc()), + result.SourceManager->getSpellingLoc( + call_expr->getRParenLoc())), + ""); } } // namespace
diff --git a/tools/clang/pass_to_move/tests/test-expected.cc b/tools/clang/pass_to_move/tests/test-expected.cc index 9bd1ab68..65003f8 100644 --- a/tools/clang/pass_to_move/tests/test-expected.cc +++ b/tools/clang/pass_to_move/tests/test-expected.cc
@@ -24,19 +24,39 @@ A* a; }; -void F() { +struct F { + explicit F(A&&); + F&& Pass(); +}; + +void Test() { + // Pass that returns rvalue reference should use std::move. A a1; A a2 = std::move(a1); + // Pass that doesn't return a rvalue reference should not be rewritten. B b1; B b2 = b1.Pass(); + // std::move() needs to wrap the entire expression when passing a member. C c; A a3 = std::move(c.a); + // Don't rewrite things that return rvalue references that aren't named Pass. D d1; D d2 = d1.NotPass(); + // Pass via a pointer type should dereference the pointer first. E e; A a4 = std::move(*e.a); + + // Nested Pass() is handled correctly. + A a5; + F f = std::move(F(std::move(a5))); + + // Chained Pass is handled (mostly) correctly. The replacement applier dedupes + // the insertion of std::move, so the result is not completely correct... + // ... but hopefully there's very little code following this broken pattern. + A a6; + A a7 = std::move(a6)); }
diff --git a/tools/clang/pass_to_move/tests/test-original.cc b/tools/clang/pass_to_move/tests/test-original.cc index 06ea9e0..1e2a96d 100644 --- a/tools/clang/pass_to_move/tests/test-original.cc +++ b/tools/clang/pass_to_move/tests/test-original.cc
@@ -24,19 +24,39 @@ A* a; }; -void F() { +struct F { + explicit F(A&&); + F&& Pass(); +}; + +void Test() { + // Pass that returns rvalue reference should use std::move. A a1; A a2 = a1.Pass(); + // Pass that doesn't return a rvalue reference should not be rewritten. B b1; B b2 = b1.Pass(); + // std::move() needs to wrap the entire expression when passing a member. C c; A a3 = c.a.Pass(); + // Don't rewrite things that return rvalue references that aren't named Pass. D d1; D d2 = d1.NotPass(); + // Pass via a pointer type should dereference the pointer first. E e; A a4 = e.a->Pass(); + + // Nested Pass() is handled correctly. + A a5; + F f = F(a5.Pass()).Pass(); + + // Chained Pass is handled (mostly) correctly. The replacement applier dedupes + // the insertion of std::move, so the result is not completely correct... + // ... but hopefully there's very little code following this broken pattern. + A a6; + A a7 = a6.Pass().Pass(); }
diff --git a/tools/clang/scripts/apply_fixits.py b/tools/clang/scripts/apply_fixits.py new file mode 100755 index 0000000..6387f2d1 --- /dev/null +++ b/tools/clang/scripts/apply_fixits.py
@@ -0,0 +1,88 @@ +#!/usr/bin/env/python +# 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. +# +# Script to apply fixits generated by clang. This is to work around the fact +# that clang's -Xclang -fixit-recompile flag, which automatically applies fixits +# and recompiles, doesn't work well with parallel invocations of clang. +# +# Usage: +# 1. Enable parseable fixits and disable warnings as errors. Instructions for +# doing this vary based on the build environment, but for GN, warnings as +# errors can be disabled by setting treat_warnings_as_errors = false +# Enabling parseable fixits requires editing build/config/compiler/BUILD.gn +# and adding `-fdiagnostics-parseable-fixits` to cflags. +# 2. Build everything and capture the output: +# ninja -C <build_directory> &> generated-fixits +# 3. Apply the fixits with this script: +# python apply_fixits.py[ <build_directory>] < generated-fixits +# <build_directory> is optional and only required if your build directory is +# a non-standard location. + +import argparse +import collections +import fileinput +import os +import re +import sys + +# fix-it:"../../base/threading/sequenced_worker_pool.h":{341:3-341:11}:"" +# Note that the file path is relative to the build directory. +_FIXIT_RE = re.compile(r'^fix-it:"(?P<file>.+?)":' + r'{(?P<start_line>\d+?):(?P<start_col>\d+?)-' + r'(?P<end_line>\d+?):(?P<end_col>\d+?)}:' + r'"(?P<text>.*?)"$') + +FixIt = collections.namedtuple( + 'FixIt', ('start_line', 'start_col', 'end_line', 'end_col', 'text')) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + 'build_directory', + nargs='?', + default='out/Debug', + help='path to the build directory to complete relative paths in fixits') + args = parser.parse_args() + + fixits = collections.defaultdict(list) + for line in fileinput.input(): + if not line.startswith('fix-it:'): + continue + m = _FIXIT_RE.match(line) + if not m: + continue + # The negative line numbers are a cheap hack so we can sort things in line + # order but reverse column order. Applying the fixits in reverse order makes + # things simpler, since offsets won't have to be adjusted as the text is + # changed. + fixits[m.group('file')].append(FixIt( + int(m.group('start_line')), -int(m.group('start_col')), int(m.group( + 'end_line')), -int(m.group('end_col')), m.group('text'))) + for k, v in fixits.iteritems(): + v.sort() + with open(os.path.join(args.build_directory, k), 'rb+') as f: + lines = f.readlines() + last_fixit = None + for fixit in v: + if fixit.start_line != fixit.end_line: + print 'error: multiline fixits not supported! file: %s, fixit: %s' % ( + k, fixit) + sys.exit(1) + if fixit == last_fixit: + continue + last_fixit = fixit + # The line/column numbers emitted in fixit hints start at 1, so offset + # is appropriately. + line = lines[fixit.start_line - 1] + lines[fixit.start_line - 1] = (line[:-fixit.start_col - 1] + fixit.text + + line[-fixit.end_col - 1:]) + f.seek(0) + f.truncate() + f.writelines(lines) + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index c72bfd6..66a179d 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -19,6 +19,7 @@ import sys import tarfile import tempfile +import time import urllib2 import zipfile @@ -80,23 +81,38 @@ """Download url into output_file.""" CHUNK_SIZE = 4096 TOTAL_DOTS = 10 - sys.stdout.write('Downloading %s ' % url) - sys.stdout.flush() - response = urllib2.urlopen(url) - total_size = int(response.info().getheader('Content-Length').strip()) - bytes_done = 0 - dots_printed = 0 + num_retries = 3 + retry_wait_s = 5 # Doubled at each retry. + while True: - chunk = response.read(CHUNK_SIZE) - if not chunk: - break - output_file.write(chunk) - bytes_done += len(chunk) - num_dots = TOTAL_DOTS * bytes_done / total_size - sys.stdout.write('.' * (num_dots - dots_printed)) - sys.stdout.flush() - dots_printed = num_dots - print ' Done.' + try: + sys.stdout.write('Downloading %s ' % url) + sys.stdout.flush() + response = urllib2.urlopen(url) + total_size = int(response.info().getheader('Content-Length').strip()) + bytes_done = 0 + dots_printed = 0 + while True: + chunk = response.read(CHUNK_SIZE) + if not chunk: + break + output_file.write(chunk) + bytes_done += len(chunk) + num_dots = TOTAL_DOTS * bytes_done / total_size + sys.stdout.write('.' * (num_dots - dots_printed)) + sys.stdout.flush() + dots_printed = num_dots + print ' Done.' + return + except urllib2.URLError as e: + sys.stdout.write('\n') + print e + if num_retries == 0 or isinstance(e, urllib2.HTTPError) and e.code == 404: + raise e + num_retries -= 1 + print 'Retrying in %d s ...' % retry_wait_s + time.sleep(retry_wait_s) + retry_wait_s *= 2 def DownloadAndUnpack(url, output_dir): @@ -332,14 +348,10 @@ assert sys.platform.startswith('linux') cds_full_url = CDS_URL + '/Linux_x64/' + cds_file - # Check if there's a prebuilt binary and if so just fetch that. That's - # faster, and goma relies on having matching binary hashes on client and - # server too. - print 'Trying to download prebuilt clang' - + print 'Downloading prebuilt clang' + if os.path.exists(LLVM_BUILD_DIR): + RmTree(LLVM_BUILD_DIR) try: - if os.path.exists(LLVM_BUILD_DIR): - RmTree(LLVM_BUILD_DIR) DownloadAndUnpack(cds_full_url, LLVM_BUILD_DIR) print 'clang %s unpacked' % PACKAGE_VERSION # Download the gold plugin if requested to by an environment variable. @@ -349,8 +361,11 @@ RunCommand(['python', CHROMIUM_DIR+'/build/download_gold_plugin.py']) WriteStampFile(PACKAGE_VERSION) return 0 - except urllib2.HTTPError: - print 'Did not find prebuilt clang %s, building locally' % cds_file + except urllib2.URLError: + print 'Failed to download prebuilt clang %s' % cds_file + print 'Use --force-local-build if you want to build locally.' + print 'Exiting.' + return 1 if args.with_android and not os.path.exists(ANDROID_NDK_DIR): print 'Android NDK not found at ' + ANDROID_NDK_DIR
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc index 0435ead..d0c336e3 100644 --- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc +++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -1011,7 +1011,8 @@ if (!(info.image_scale_factor > 0.0)) info.image_scale_factor = 1; - *p = content::WebCursor(info); + *p = content::WebCursor(); + p->InitFromCursorInfo(info); return true; } };
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 60ad6d0..783b21e6 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -2882,6 +2882,13 @@ </description> </action> +<action name="DownloadNotification.Button_CopyToClipboard"> + <owner>yoshiki@chromium.org</owner> + <description> + User pushes "Copy to clipboard" button on download notification. + </description> +</action> + <action name="DownloadNotification.Button_Discard"> <owner>yoshiki@chromium.org</owner> <description> @@ -11960,6 +11967,305 @@ <description>Please enter the description of this user action.</description> </action> +<action name="Signin_EnterpriseAccountPrompt_Cancel"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user clicks 'cancel' in the sign in enterprise account + confirmation dialog. + </description> +</action> + +<action name="Signin_EnterpriseAccountPrompt_DontImportData"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses to not import data in the sign in enterprise + account confirmation dialog. + </description> +</action> + +<action name="Signin_EnterpriseAccountPrompt_ImportData"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses to import data in the sign in enterprise + account confirmation dialog. + </description> +</action> + +<action name="Signin_ImportDataPrompt_Cancel"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses to cancel (abort) sign in in the import data + confirmation dialog. + </description> +</action> + +<action name="Signin_ImportDataPrompt_DontImport"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses to not import data (create new profile) in + the import data confirmation dialog of sign in. + </description> +</action> + +<action name="Signin_ImportDataPrompt_ImportData"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses to import data in the import data + confirmation dialog of sign in. + </description> +</action> + +<action name="Signin_Impression_FromAppsPageLink"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in entry in the chrome://apps page. + </description> +</action> + +<action name="Signin_Impression_FromBookmarkBubble"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in entry in the bookmark bubble. + </description> +</action> + +<action name="Signin_Impression_FromCloudPrint"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in entry in the cloud print preview page. + </description> +</action> + +<action name="Signin_Impression_FromDevicesPage"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in entry in the chrome://devices page. + </description> +</action> + +<action name="Signin_Impression_FromExtensionInstallBubble"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in entry in the extension installed bubble. + </description> +</action> + +<action name="Signin_Impression_FromMenu"> + <owner>gogerald@chromium.org</owner> + <description>Recorded when showing sign in entry in the menu.</description> +</action> + +<action name="Signin_Impression_FromNTP"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in entry in the new tab page. + </description> +</action> + +<action name="Signin_Show_EnterpriseAccountPrompt"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in enterprise account confirmation dialog. + </description> +</action> + +<action name="Signin_Show_ImportDataPrompt"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing sign in import data confirmation dialog. + </description> +</action> + +<action name="Signin_Show_UntrustedSigninPrompt"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when showing untrusted sign in confirmation dialog. + </description> +</action> + +<action name="Signin_SigninPage_Loading"> + <owner>gogerald@chromium.org</owner> + <description>Recorded when sign in page is loading.</description> +</action> + +<action name="Signin_SigninPage_Shown"> + <owner>gogerald@chromium.org</owner> + <description>Recorded when sign in page is shown.</description> +</action> + +<action name="Signin_Signin_FromAppsPageLink"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_APPS_PAGE_LINK. + </description> +</action> + +<action name="Signin_Signin_FromAvatarBubbleSignin"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN. + </description> +</action> + +<action name="Signin_Signin_FromBookmarkBubble"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE. + </description> +</action> + +<action name="Signin_Signin_FromBookmarkManager"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER. + </description> +</action> + +<action name="Signin_Signin_FromCloudPrint"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_CLOUD_PRINT. + </description> +</action> + +<action name="Signin_Signin_FromContentArea"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_CONTENT_AREA. + </description> +</action> + +<action name="Signin_Signin_FromDevicesPage"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_DEVICES_PAGE. + </description> +</action> + +<action name="Signin_Signin_FromExtensionInstallBubble"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE. + </description> +</action> + +<action name="Signin_Signin_FromExtensions"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS. + </description> +</action> + +<action name="Signin_Signin_FromMenu"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_MENU. + </description> +</action> + +<action name="Signin_Signin_FromNTP"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_NTP_LINK. + </description> +</action> + +<action name="Signin_Signin_FromRecentTabs"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_RECENT_TABS. + </description> +</action> + +<action name="Signin_Signin_FromSettings"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS. + </description> +</action> + +<action name="Signin_Signin_FromSigninPromo"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_SIGNIN_PROMO. + </description> +</action> + +<action name="Signin_Signin_FromStartPage"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE. + </description> +</action> + +<action name="Signin_Signin_FromSupervisedUser"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_SUPERVISED_USER. + </description> +</action> + +<action name="Signin_Signin_FromUnspecifiedAccessPoint"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_UNSPECIFIED. + </description> +</action> + +<action name="Signin_Signin_FromUserManager"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded on sign in start from access point + signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER. + </description> +</action> + +<action name="Signin_Signin_Succeed"> + <owner>gogerald@chromium.org</owner> + <description>Recorded when user sign in was successful.</description> +</action> + +<action name="Signin_Signin_WithAdvancedSyncSettings"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses advanced sync settings in the sign in succeed + confirmation dialog. + </description> +</action> + +<action name="Signin_Signin_WithDefaultSyncSettings"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses default sync settings in the sign in succeed + confirmation dialog. + </description> +</action> + +<action name="Signin_Undo_Signin"> + <owner>gogerald@chromium.org</owner> + <description> + Recorded when the user chooses to undo (abort) the sign in process. It + closes sign in page without signing user in. + </description> +</action> + <action name="SiteChipPress"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index b4d637f..ec3c486 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -32704,6 +32704,26 @@ </summary> </histogram> +<histogram name="PhysicalWeb.ResolveTime.Background" units="ms"> + <owner>cco3@chromium.org</owner> + <owner>mattreynolds@chromium.org</owner> + <owner>mmocny@chromium.org</owner> + <summary> + Round trip time to the metadata server for a Physical Web URL resolution + which the client requests during a background scan. + </summary> +</histogram> + +<histogram name="PhysicalWeb.ResolveTime.Foreground" units="ms"> + <owner>cco3@chromium.org</owner> + <owner>mattreynolds@chromium.org</owner> + <owner>mmocny@chromium.org</owner> + <summary> + Round trip time to the metadata server for a Physical Web URL resolution + which the client requests during a foreground scan. + </summary> +</histogram> + <histogram name="Platform.AsvGroup"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary> @@ -48381,13 +48401,13 @@ </histogram> <histogram name="Sync.PageRevisitBookmarksMatchTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type to a page that didn't match a bookmark.</summary> </histogram> <histogram name="Sync.PageRevisitBookmarksMissTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type to a page that matched a bookmark.</summary> </histogram> @@ -48412,13 +48432,13 @@ </histogram> <histogram name="Sync.PageRevisitNavigationMatchTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type that matched a synced navigation.</summary> </histogram> <histogram name="Sync.PageRevisitNavigationMissTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type that didn't match a synced navigation.</summary> </histogram> @@ -48439,13 +48459,13 @@ </histogram> <histogram name="Sync.PageRevisitTabMatchTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type that matched a synced tab.</summary> </histogram> <histogram name="Sync.PageRevisitTabMissTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type that didn't match a synced tab.</summary> </histogram> @@ -48466,13 +48486,13 @@ </histogram> <histogram name="Sync.PageRevisitTypedUrlMatchTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type that didn't match a typed URL.</summary> </histogram> <histogram name="Sync.PageRevisitTypedUrlMissTransition" - units="PageVisitTransitionType"> + enum="PageVisitTransitionType"> <owner>skym@chromium.org</owner> <summary>Transition type that matched a typed URL.</summary> </histogram> @@ -74177,6 +74197,7 @@ <int value="9" label="Network error"/> <int value="10" label="Permission denied (no incognito push service)"/> <int value="11" label="Unable to retrieve the public key"/> + <int value="12" label="Empty or missing manifest"/> </enum> <enum name="PushUnregistrationStatus" type="int"> @@ -78075,6 +78096,7 @@ <int value="8" label="Lazy load for 'Open in new tab'"/> <int value="9" label="Stopped due to page loading when backgrounding"/> <int value="10" label="Evicted due to page loading when backgrounding"/> + <int value="11" label="Evicted due to OS terminating the renderer."/> </enum> <enum name="TabStripState" type="int"> @@ -83304,7 +83326,7 @@ <affected-histogram name="PageLoad.Timing2.NavigationToLoadEventFired"/> </histogram_suffixes> -<histogram_suffixes name="PageLoadEventConditions"> +<histogram_suffixes name="PageLoadEventConditions" separator="."> <suffix name="BeforeCommit"/> <suffix name="AfterCommit.BeforePaint"/> <affected-histogram name="PageLoad.AbortTiming.Close"/>
diff --git a/tools/perf/benchmarks/maps.py b/tools/perf/benchmarks/maps.py deleted file mode 100644 index 37db485..0000000 --- a/tools/perf/benchmarks/maps.py +++ /dev/null
@@ -1,73 +0,0 @@ -# Copyright 2013 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. - -"""Runs a Google Maps performance test. -Rerforms several common navigation actions on the map (pan, zoom, rotate)""" - -import re - -from core import path_util -from core import perf_benchmark - -from telemetry import benchmark -from telemetry.page import page as page_module -from telemetry.page import page_test -from telemetry import story -from telemetry.value import scalar - - -class _MapsMeasurement(page_test.PageTest): - def __init__(self): - super(_MapsMeasurement, self).__init__() - - def ValidateAndMeasurePage(self, page, tab, results): - js_get_results = 'document.getElementsByTagName("pre")[0].innerText' - test_results = tab.EvaluateJavaScript(js_get_results) - - total = re.search('total=([0-9]+)', test_results).group(1) - render = re.search('render=([0-9.]+),([0-9.]+)', test_results).group(2) - results.AddValue(scalar.ScalarValue( - results.current_page, 'total_time', 'ms', int(total))) - results.AddValue(scalar.ScalarValue( - results.current_page, 'render_mean_time', 'ms', float(render))) - -class MapsPage(page_module.Page): - def __init__(self, page_set, base_dir): - super(MapsPage, self).__init__( - url='http://localhost:10020/tracker.html', - page_set=page_set, - base_dir=base_dir, - make_javascript_deterministic=False) - - def RunNavigateSteps(self, action_runner): - super(MapsPage, self).RunNavigateSteps(action_runner) - action_runner.WaitForJavaScriptCondition('window.testDone') - - -@benchmark.Disabled('all') -class MapsBenchmark(perf_benchmark.PerfBenchmark): - """Basic Google Maps benchmarks.""" - test = _MapsMeasurement - - @classmethod - def Name(cls): - return 'maps' - - def CreateStorySet(self, options): - ps = story.StorySet(archive_data_file='data/maps.json', - base_dir=path_util.GetStorySetsDir(), - cloud_storage_bucket=story.PUBLIC_BUCKET) - ps.AddStory(MapsPage(ps, ps.base_dir)) - return ps - -class MapsNoVsync(MapsBenchmark): - """Runs the Google Maps benchmark with Vsync disabled""" - tag = 'novsync' - - @classmethod - def Name(cls): - return 'maps.novsync' - - def SetExtraBrowserOptions(self, options): - options.AppendExtraBrowserArgs('--disable-gpu-vsync')
diff --git a/tools/telemetry/catapult_base/__init__.py b/tools/telemetry/catapult_base/__init__.py index b98f5db..653dd32 100644 --- a/tools/telemetry/catapult_base/__init__.py +++ b/tools/telemetry/catapult_base/__init__.py
@@ -18,10 +18,6 @@ sys.path.insert(1, path) _AddDirToPythonPath(os.path.join(util.GetCatapultDir(), 'third_party', 'mock')) - -# TODO(nednguyen, aiolos): Copy these lib to catapult/third_party before -# actually moving catapult_base/ to catapult/ +_AddDirToPythonPath(os.path.join(util.GetCatapultDir(), 'third_party', 'mox3')) _AddDirToPythonPath( - os.path.join(os.path.dirname(__file__), '..', 'third_party', 'mox3')) -_AddDirToPythonPath( - os.path.join(os.path.dirname(__file__), '..', 'third_party', 'pyfakefs')) + os.path.join(util.GetCatapultDir(), 'third_party', 'pyfakefs'))
diff --git a/tools/telemetry/telemetry/benchmark_runner.py b/tools/telemetry/telemetry/benchmark_runner.py index bf2f0d81..00f27c4 100644 --- a/tools/telemetry/telemetry/benchmark_runner.py +++ b/tools/telemetry/telemetry/benchmark_runner.py
@@ -298,7 +298,7 @@ """Returns a list of all enabled benchmarks in a JSON format expected by buildbots. - JSON format (see build/android/pylib/perf/benchmark_runner.py): + JSON format: { "version": <int>, "steps": { <string>: {
diff --git a/tools/telemetry/telemetry/internal/backends/chrome/tab_list_backend.py b/tools/telemetry/telemetry/internal/backends/chrome/tab_list_backend.py index 59d8e8ef..aedc5d6b7 100644 --- a/tools/telemetry/telemetry/internal/backends/chrome/tab_list_backend.py +++ b/tools/telemetry/telemetry/internal/backends/chrome/tab_list_backend.py
@@ -10,7 +10,7 @@ from telemetry.internal.browser import tab -class TabUnexpectedResponseException(exceptions.Error): +class TabUnexpectedResponseException(exceptions.DevtoolsTargetCrashException): pass @@ -36,7 +36,9 @@ response = json.loads(response) context_id = response['id'] except (KeyError, ValueError): - raise TabUnexpectedResponseException('Received response: %s' % response) + raise TabUnexpectedResponseException( + app=self._browser_backend.browser, + msg='Received response: %s' % response) return self.GetBackendFromContextId(context_id) def CloseTab(self, tab_id, timeout=300): @@ -57,7 +59,9 @@ response = self._browser_backend.devtools_client.CloseTab(tab_id, timeout) if response != 'Target is closing': - raise TabUnexpectedResponseException('Received response: %s' % response) + raise TabUnexpectedResponseException( + app=self._browser_backend.browser, + msg='Received response: %s' % response) util.WaitFor(lambda: tab_id not in self.IterContextIds(), timeout=5) @@ -75,7 +79,9 @@ timeout) if response != 'Target activated': - raise TabUnexpectedResponseException('Received response: %s' % response) + raise TabUnexpectedResponseException( + app=self._browser_backend.browser, + msg='Received response: %s' % response) def Get(self, index, ret): """Returns self[index] if it exists, or ret if index is out of bounds."""
diff --git a/tools/telemetry/telemetry/internal/backends/mandoline/android.py b/tools/telemetry/telemetry/internal/backends/mandoline/android.py index 54e293d..57fd450 100644 --- a/tools/telemetry/telemetry/internal/backends/mandoline/android.py +++ b/tools/telemetry/telemetry/internal/backends/mandoline/android.py
@@ -17,11 +17,14 @@ from .paths import Paths +from telemetry.internal.util import binary_manager + from devil import base_error from devil.android import apk_helper from devil.android import device_errors from devil.android import device_utils -from pylib import constants +from devil.android.sdk import adb_wrapper +from devil.constants import exit_codes # Tags used by the mojo shell application logs. @@ -49,17 +52,15 @@ |config| is the mopy.config.Config for the build. ''' def __init__(self, config, chrome_root): - self.adb_path = constants.GetAdbPath() + self.adb_path = adb_wrapper.AdbWrapper.GetAdbPath() self.config = config self.paths = Paths(config, chrome_root) self.device = None self.shell_args = [] self.target_package = apk_helper.GetPackageName(self.paths.apk_path) self.temp_gdb_dir = None - # This is used by decive_utils.Install to check if the apk needs updating. - constants.SetOutputDirectory(self.paths.build_dir) - # TODO(msw): Use pylib's adb_wrapper and device_utils instead. + # TODO(msw): Use devil's adb_wrapper and device_utils instead. def _CreateADBCommand(self, args): adb_command = [self.adb_path, '-s', self.device.adb.GetDeviceSerial()] adb_command.extend(args) @@ -114,15 +115,15 @@ logging.getLogger().debug('Using device: %s', self.device) # Clean the logs on the device to avoid displaying prior activity. - subprocess.check_call(self._CreateADBCommand(['logcat', '-c'])) + self.device.adb.Logcat(clear=True) self.device.EnableRoot() self.device.Install(self.paths.apk_path) except base_error.BaseError as e: # Report 'device not found' as infra failures. See http://crbug.com/493900 print 'Exception in AndroidShell.InitShell:\n%s' % str(e) if e.is_infra_error or 'error: device not found' in str(e): - return constants.INFRA_EXIT_CODE - return constants.ERROR_EXIT_CODE + return exit_codes.INFRA + return exit_codes.ERROR return 0 @@ -138,20 +139,9 @@ def _GetLocalGdbPath(self): '''Returns the path to the android gdb.''' - if self.config.target_cpu == 'arm': - return os.path.join(constants.ANDROID_NDK_ROOT, 'toolchains', - 'arm-linux-androideabi-4.9', 'prebuilt', - 'linux-x86_64', 'bin', 'arm-linux-androideabi-gdb') - elif self.config.target_cpu == 'x86': - return os.path.join(constants.ANDROID_NDK_ROOT, 'toolchains', - 'x86-4.9', 'prebuilt', 'linux-x86_64', 'bin', - 'i686-linux-android-gdb') - elif self.config.target_cpu == 'x64': - return os.path.join(constants.ANDROID_NDK_ROOT, 'toolchains', - 'x86_64-4.9', 'prebuilt', 'linux-x86_64', 'bin', - 'x86_64-linux-android-gdb') - else: + if self.config.target_cpu not in ('arm', 'x86', 'x64'): raise Exception('Unknown target_cpu: %s' % self.config.target_cpu) + return binary_manager.FetchPath('gdb', self.config.target_cpu, 'android') def _WaitForProcessIdAndStartGdb(self, process): '''
diff --git a/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py b/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py index 7425e76..4065546 100644 --- a/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py +++ b/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py
@@ -17,7 +17,7 @@ android_platform_backend_module try: - from pylib import constants + from devil.android.sdk import keyevent except ImportError: pass @@ -91,7 +91,7 @@ logging_process = shell.ShowLogs(output) # Unlock device screen. - self.device.SendKeyEvent(constants.keyevent.KEYCODE_MENU) + self.device.SendKeyEvent(keyevent.KEYCODE_MENU) shell.StartActivity(self.activity, args, output, logging_process.terminate) try:
diff --git a/tools/telemetry/telemetry/internal/binary_dependencies.json b/tools/telemetry/telemetry/internal/binary_dependencies.json index 90a0a5b8..5937e3b 100644 --- a/tools/telemetry/telemetry/internal/binary_dependencies.json +++ b/tools/telemetry/telemetry/internal/binary_dependencies.json
@@ -109,6 +109,24 @@ } } }, + "gdb": { + "cloud_storage_base_folder": "temp_binary_dependencies", + "cloud_storage_bucket": "chromium-telemetry", + "file_info": { + "android_arm": { + "cloud_storage_hash": "9231584d135fb76bb7075d96ce387679de7ada7b", + "download_path": "bin/android/arm/arm-linux-androideabi-gdb" + }, + "android_x64": { + "cloud_storage_hash": "09177be2fed00b44df0e777932828425440b23b3", + "download_path": "bin/android/x64/x86_64-linux-androideabi-gdb" + }, + "android_x86": { + "cloud_storage_hash": "bcf02af039713a48b69b89bd7f0f9c81ed8183a4", + "download_path": "bin/android/x86/i686-linux-androideabi-gdb" + } + } + }, "horndis": { "cloud_storage_base_folder": "temp_binary_dependencies", "cloud_storage_bucket": "chromium-telemetry", @@ -129,6 +147,16 @@ } } }, + "hprof-conv": { + "cloud_storage_base_folder": "binary_dependencies", + "cloud_storage_bucket": "chromium-telemetry", + "file_info": { + "linux_x86_64": { + "cloud_storage_hash": "0b14eeee2e2a51cc94e361295379f69ee6f7cf8f", + "download_path": "../bin/linux/x86_64/hprof-conv" + } + } + }, "ipfw": { "cloud_storage_base_folder": "temp_binary_dependencies", "cloud_storage_bucket": "chromium-telemetry",
diff --git a/tools/telemetry/telemetry/internal/platform/android_platform_backend.py b/tools/telemetry/telemetry/internal/platform/android_platform_backend.py index 7da73db..b26358d 100644 --- a/tools/telemetry/telemetry/internal/platform/android_platform_backend.py +++ b/tools/telemetry/telemetry/internal/platform/android_platform_backend.py
@@ -6,11 +6,9 @@ import os import re import shutil -import stat import subprocess import tempfile -from telemetry.internal.util import binary_manager from telemetry.core import android_platform from telemetry.core import exceptions from telemetry.core import platform @@ -45,7 +43,6 @@ from devil.android.perf import thermal_throttle from devil.android.sdk import version_codes from devil.android.tools import video_recorder -from pylib import constants try: from devil.android.perf import surface_stats_collector @@ -53,9 +50,8 @@ surface_stats_collector = None -_DEVICE_COPY_SCRIPT_FILE = os.path.join( - constants.DIR_SOURCE_ROOT, 'build', 'android', 'pylib', - 'efficient_android_directory_copy.sh') +_DEVICE_COPY_SCRIPT_FILE = os.path.abspath(os.path.join( + os.path.dirname(__file__), 'efficient_android_directory_copy.sh')) _DEVICE_COPY_SCRIPT_LOCATION = ( '/data/local/tmp/efficient_android_directory_copy.sh') @@ -79,66 +75,6 @@ return command -def _SetupPrebuiltTools(device): - """Some of the android pylib scripts we depend on are lame and expect - binaries to be in the out/ directory. So we copy any prebuilt binaries there - as a prereq.""" - - # TODO(bulach): Build the targets for x86/mips. - device_tools = [ - 'file_poller', - 'forwarder_dist/device_forwarder', - 'memtrack_helper', - 'md5sum_dist/md5sum_bin', - 'purge_ashmem', - ] - - host_tools = [ - 'bitmaptools', - 'md5sum_bin_host', - ] - - platform_name = platform.GetHostPlatform().GetOSName() - if platform_name == 'linux': - host_tools.append('host_forwarder') - - arch_name = device.product_cpu_abi - has_device_prebuilt = (arch_name.startswith('armeabi') - or arch_name.startswith('arm64')) - if not has_device_prebuilt: - logging.warning('Unknown architecture type: %s' % arch_name) - return all([binary_manager.LocalPath(t, platform_name, arch_name) - for t in device_tools]) - - build_type = None - for t in device_tools + host_tools: - executable = os.path.basename(t) - locally_built_path = _FindLocallyBuiltPath(t) - if not build_type: - build_type = _GetBuildTypeOfPath(locally_built_path) or 'Release' - constants.SetBuildType(build_type) - dest = os.path.join(constants.GetOutDirectory(), t) - if not locally_built_path: - logging.info('Setting up prebuilt %s', dest) - if not os.path.exists(os.path.dirname(dest)): - os.makedirs(os.path.dirname(dest)) - platform_name = ('android' if t in device_tools else - platform.GetHostPlatform().GetOSName()) - bin_arch_name = (arch_name if t in device_tools else - platform.GetHostPlatform().GetArchName()) - prebuilt_path = binary_manager.FetchPath( - executable, bin_arch_name, platform_name) - if not prebuilt_path or not os.path.exists(prebuilt_path): - raise NotImplementedError(""" -%s must be checked into cloud storage. -Instructions: -http://www.chromium.org/developers/telemetry/upload_to_cloud_storage -""" % t) - shutil.copyfile(prebuilt_path, dest) - os.chmod(dest, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) - return True - - def _GetBuildTypeOfPath(path): if not path: return None @@ -155,13 +91,6 @@ 'AndroidPlatformBackend can only be initialized from remote device') super(AndroidPlatformBackend, self).__init__(device) self._device = device_utils.DeviceUtils(device.device_id) - installed_prebuilt_tools = _SetupPrebuiltTools(self._device) - if not installed_prebuilt_tools: - logging.error( - '%s detected, however prebuilt android tools could not ' - 'be used. To run on Android you must build them first:\n' - ' $ ninja -C out/Release android_tools' % device.name) - raise exceptions.PlatformError() # Trying to root the device, if possible. if not self._device.HasRoot(): try:
diff --git a/tools/telemetry/telemetry/internal/platform/android_platform_backend_unittest.py b/tools/telemetry/telemetry/internal/platform/android_platform_backend_unittest.py index 7030e82..91425512 100644 --- a/tools/telemetry/telemetry/internal/platform/android_platform_backend_unittest.py +++ b/tools/telemetry/telemetry/internal/platform/android_platform_backend_unittest.py
@@ -32,11 +32,6 @@ def get_prop(name, cache=None): return {'ro.product.cpu.abi': 'armeabi-v7a'}.get(name) - self.setup_prebuilt_tool_patcher = mock.patch( - 'telemetry.internal.platform.android_platform_backend._SetupPrebuiltTools') # pylint: disable=line-too-long - m = self.setup_prebuilt_tool_patcher.start() - m.return_value = True - self.device_patcher = mock.patch.multiple( device_utils.DeviceUtils, HasRoot=mock.MagicMock(return_value=True), @@ -47,7 +42,6 @@ self._stubs.Restore() android_platform_backend.psutil = self._actual_ps_util self.battery_patcher.stop() - self.setup_prebuilt_tool_patcher.stop() self.device_patcher.stop() @decorators.Disabled('chromeos') @@ -177,19 +171,10 @@ self.battery_patcher = mock.patch.object(battery_utils, 'BatteryUtils') self.battery_patcher.start() self._actual_ps_util = android_platform_backend.psutil - self.setup_prebuilt_tool_patcher = mock.patch( - 'telemetry.internal.platform.android_platform_backend._SetupPrebuiltTools') # pylint: disable=line-too-long - m = self.setup_prebuilt_tool_patcher.start() - m.return_value = True def get_prop(name, cache=None): return {'ro.product.cpu.abi': 'armeabi-v7a'}.get(name) - self.helper_patcher = mock.patch( - 'telemetry.internal.platform.android_platform_backend._SetupPrebuiltTools', # pylint: disable=line-too-long - return_value=True) - self.helper_patcher.start() - self.device_patcher = mock.patch.multiple( device_utils.DeviceUtils, FileExists=mock.MagicMock(return_value=False), @@ -202,8 +187,6 @@ android_platform_backend.psutil = self._actual_ps_util self.battery_patcher.stop() self.device_patcher.stop() - self.helper_patcher.stop() - self.setup_prebuilt_tool_patcher.stop() @decorators.Disabled('chromeos') def testPsutil1(self):
diff --git a/build/android/pylib/efficient_android_directory_copy.sh b/tools/telemetry/telemetry/internal/platform/efficient_android_directory_copy.sh similarity index 100% rename from build/android/pylib/efficient_android_directory_copy.sh rename to tools/telemetry/telemetry/internal/platform/efficient_android_directory_copy.sh
diff --git a/tools/telemetry/telemetry/internal/platform/profiler/java_heap_profiler.py b/tools/telemetry/telemetry/internal/platform/profiler/java_heap_profiler.py index 49307cbe..5ca082a 100644 --- a/tools/telemetry/telemetry/internal/platform/profiler/java_heap_profiler.py +++ b/tools/telemetry/telemetry/internal/platform/profiler/java_heap_profiler.py
@@ -7,15 +7,15 @@ import subprocess import threading +from telemetry.core import platform from telemetry.core import util from telemetry.internal.backends.chrome import android_browser_finder from telemetry.internal.platform import profiler +from telemetry.internal.util import binary_manager try: from devil.android import device_errors # pylint: disable=import-error - from pylib import constants # pylint: disable=import-error except ImportError: - constants = None device_errors = None @@ -61,8 +61,10 @@ if os.path.splitext(f)[1] == '.aprof': input_file = os.path.join(self._output_path, f) output_file = input_file.replace('.aprof', '.hprof') - hprof_conv = os.path.join(constants.ANDROID_SDK_ROOT, - 'tools', 'hprof-conv') + hprof_conv = binary_manager.FetchPath( + 'hprof-conv', + platform.GetHostPlatform().GetArchName(), + platform.GetHostPlatform().GetOSName()) subprocess.call([hprof_conv, input_file, output_file]) output_files.append(output_file) return output_files
diff --git a/tools/valgrind/drmemory/suppressions_full.txt b/tools/valgrind/drmemory/suppressions_full.txt index a3c72f6f..9c3a699 100644 --- a/tools/valgrind/drmemory/suppressions_full.txt +++ b/tools/valgrind/drmemory/suppressions_full.txt
@@ -1996,7 +1996,7 @@ MSVCR120.dll!vsnwprintf_s *!base::`anonymous namespace'::StringAppendVT<> *!base::StringPrintf -*!content::AccessibilityTreeFormatter::ToString +*!content::AccessibilityTreeFormatterWin::ToString *!content::AccessibilityTreeFormatter::RecursiveFormatAccessibilityTree UNADDRESSABLE ACCESS
diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc index 99e94ba..c5346908 100644 --- a/ui/gl/gl_surface.cc +++ b/ui/gl/gl_surface.cc
@@ -206,8 +206,11 @@ const RectF& contents_rect, float opacity, unsigned background_color, - const SizeF& bounds_size, - const gfx::Transform& transform) { + unsigned edge_aa_mask, + const RectF& bounds_rect, + bool is_clipped, + const RectF& clip_rect, + const Transform& transform) { NOTIMPLEMENTED(); return false; }
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index cf4b723..f91ef43 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h
@@ -172,7 +172,10 @@ const RectF& contents_rect, float opacity, unsigned background_color, - const SizeF& size, + unsigned edge_aa_mask, + const RectF& bounds_rect, + bool is_clipped, + const RectF& clip_rect, const Transform& transform); virtual bool IsSurfaceless() const;
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 6de9e5d..9bfb90fd 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -7,6 +7,8 @@ #include <dwmapi.h> #include <oleacc.h> #include <shellapi.h> +#include <tchar.h> +#include <tpcshrd.h> #include "base/bind.h" #include "base/bind_helpers.h" @@ -380,6 +382,18 @@ gfx::win::DirectManipulationHelper::CreateInstance(); if (direct_manipulation_helper_) direct_manipulation_helper_->Initialize(hwnd()); + + // Disable pen flicks (http://crbug.com/506977) + if (base::win::GetVersion() >= base::win::VERSION_WIN7) { + ATOM atom = ::GlobalAddAtom(MICROSOFT_TABLETPENSERVICE_PROPERTY); + DCHECK(atom); + + ::SetProp(hwnd(), MICROSOFT_TABLETPENSERVICE_PROPERTY, + reinterpret_cast<HANDLE>(TABLET_DISABLE_FLICKS | + TABLET_DISABLE_FLICKFALLBACKKEYS)); + + ::GlobalDeleteAtom(atom); + } } void HWNDMessageHandler::InitModalType(ui::ModalType modal_type) { @@ -406,6 +420,11 @@ // they can activate as foreground windows upon this window's destruction. RestoreEnabledIfNecessary(); + // Remove the property which disables pen flicks (http://crbug.com/506977) + // for this window. + if (base::win::GetVersion() >= base::win::VERSION_WIN7) + ::RemoveProp(hwnd(), MICROSOFT_TABLETPENSERVICE_PROPERTY); + if (!waiting_for_close_now_) { // And we delay the close so that if we are called from an ATL callback, // we don't destroy the window before the callback returned (as the caller