Merge "Added tests to CarAudioService"
diff --git a/cpp/evs/apps/default/Android.bp b/cpp/evs/apps/default/Android.bp
index 6d0ca59..1e55d53 100644
--- a/cpp/evs/apps/default/Android.bp
+++ b/cpp/evs/apps/default/Android.bp
@@ -21,108 +21,79 @@
 
 cc_binary {
     name: "evs_app",
-
-    srcs: [
-        "evs_app.cpp",
-        "EvsStateControl.cpp",
-        "EvsStats.cpp",
-        "RenderBase.cpp",
-        "RenderDirectView.cpp",
-        "RenderTopView.cpp",
-        "ConfigManager.cpp",
-        "glError.cpp",
-        "shader.cpp",
-        "TexWrapper.cpp",
-        "VideoTex.cpp",
-        "StreamHandler.cpp",
-        "FormatConvert.cpp",
-        "RenderPixelCopy.cpp",
+    defaults: [
+        "android.hardware.graphics.common-ndk_shared",
+        "vhalclient_defaults",
     ],
-
+    local_include_dirs: ["inc"],
+    srcs: ["src/*.cpp"],
     shared_libs: [
+        "android.hardware.automotive.vehicle@2.0",
+        "android.hardware.camera.device@3.2",
+        "libEGL",
+        "libGLESv2",
         "libbase",
         "libbinder",
         "libbinder_ndk",
+        "libcamera_metadata",
+        "libcartelemetry-evs-proto",
         "libcutils",
-        "libutils",
-        "libui",
-        "libhidlbase",
-        "libEGL",
-        "libGLESv2",
         "libhardware",
         "libpng",
-        "libcamera_metadata",
-        "android.frameworks.automotive.telemetry-V1-ndk",
-        "android.hardware.camera.device@3.2",
-        "android.hardware.automotive.evs@1.0",
-        "android.hardware.automotive.evs@1.1",
-        "android.hardware.automotive.vehicle@2.0",
-        "libcartelemetry-evs-proto",
         "libprotobuf-cpp-lite",
+        "libui",
+        "libutils",
     ],
-
     static_libs: [
+        "android.frameworks.automotive.telemetry-V1-ndk",
+        "android.hardware.automotive.evs-V1-ndk",
+        "android.hardware.common-V2-ndk",
+        "libaidlcommonsupport",
         "libmath",
         "libjsoncpp",
         "libvhalclient",
     ],
-
     required: [
         "config.json",
         "CarFromTop.png",
         "LabeledChecker.png",
     ],
-
     init_rc: ["evs_app.rc"],
-
-    defaults: ["vhalclient_defaults"],
-
-    cflags: ["-DLOG_TAG=\"EvsApp\""] + [
+    cflags: [
+        "-DLOG_TAG=\"EvsApp\"",
         "-DGL_GLEXT_PROTOTYPES",
         "-DEGL_EGLEXT_PROTOTYPES",
-    ] + [
         "-Wall",
         "-Werror",
         "-Wunused",
         "-Wunreachable-code",
     ],
-
 }
 
 cc_library {
     name: "libcartelemetry-evs-proto",
-    srcs: [
-        ":cartelemetry-evs-proto-srcs",
-    ],
+    srcs: [":cartelemetry-evs-proto-srcs"],
     proto: {
         export_proto_headers: true,
         type: "lite",
     },
-    shared_libs: [
-        "libprotobuf-cpp-lite",
-    ],
+    shared_libs: ["libprotobuf-cpp-lite"],
 }
 
 prebuilt_etc {
     name: "config.json",
-
-    src: "config.json",
+    src: "res/config.json",
     sub_dir: "automotive/evs",
-
 }
 
 prebuilt_etc {
     name: "CarFromTop.png",
-
-    src: "CarFromTop.png",
+    src: "res/CarFromTop.png",
     sub_dir: "automotive/evs",
-
 }
 
 prebuilt_etc {
     name: "LabeledChecker.png",
-
-    src: "LabeledChecker.png",
+    src: "res/LabeledChecker.png",
     sub_dir: "automotive/evs",
-
 }
diff --git a/cpp/evs/apps/default/StreamHandler.h b/cpp/evs/apps/default/StreamHandler.h
deleted file mode 100644
index 1089046..0000000
--- a/cpp/evs/apps/default/StreamHandler.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef EVS_VTS_STREAMHANDLER_H
-#define EVS_VTS_STREAMHANDLER_H
-
-#include "ui/GraphicBuffer.h"
-
-#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
-#include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h>
-#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
-
-#include <queue>
-
-using ::android::hardware::hidl_handle;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::automotive::evs::V1_1::EvsEventDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsCamera;
-using ::android::hardware::automotive::evs::V1_1::IEvsCameraStream;
-using ::android::hardware::automotive::evs::V1_1::IEvsDisplay;
-
-using EvsDisplayState = ::android::hardware::automotive::evs::V1_0::DisplayState;
-using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
-using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
-
-/*
- * StreamHandler:
- * This class can be used to receive camera imagery from an IEvsCamera implementation.  It will
- * hold onto the most recent image buffer, returning older ones.
- * Note that the video frames are delivered on a background thread, while the control interface
- * is actuated from the applications foreground thread.
- */
-class StreamHandler : public IEvsCameraStream {
-public:
-    virtual ~StreamHandler() { shutdown(); };
-
-    StreamHandler(android::sp<IEvsCamera> pCamera, uint32_t numBuffers = 2,
-                  bool useOwnBuffers = false,
-                  android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888, int32_t width = 640,
-                  int32_t height = 360);
-    void shutdown();
-
-    bool startStream();
-    void asyncStopStream();
-    void blockingStopStream();
-
-    bool isRunning();
-
-    bool newFrameAvailable();
-    const BufferDesc_1_1& getNewFrame();
-    void doneWithFrame(const BufferDesc_1_1& buffer);
-
-private:
-    // Implementation for ::android::hardware::automotive::evs::V1_0::IEvsCameraStream
-    Return<void> deliverFrame(const BufferDesc_1_0& buffer) override;
-
-    // Implementation for ::android::hardware::automotive::evs::V1_1::IEvsCameraStream
-    Return<void> deliverFrame_1_1(const hidl_vec<BufferDesc_1_1>& buffer) override;
-    Return<void> notify(const EvsEventDesc& event) override;
-
-    // Values initialized as startup
-    android::sp<IEvsCamera> mCamera;
-
-    // Since we get frames delivered to us asnchronously via the ICarCameraStream interface,
-    // we need to protect all member variables that may be modified while we're streaming
-    // (ie: those below)
-    std::mutex mLock;
-    std::condition_variable mSignal;
-
-    bool mRunning = false;
-
-    BufferDesc_1_1 mBuffers[2];
-    int mHeldBuffer = -1;   // Index of the one currently held by the client
-    int mReadyBuffer = -1;  // Index of the newest available buffer
-    hidl_vec<BufferDesc_1_1> mOwnBuffers;
-    bool mUseOwnBuffers;
-};
-
-#endif  // EVS_VTS_STREAMHANDLER_H
diff --git a/cpp/evs/apps/default/VideoTex.h b/cpp/evs/apps/default/VideoTex.h
deleted file mode 100644
index 4d82950..0000000
--- a/cpp/evs/apps/default/VideoTex.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef VIDEOTEX_H
-#define VIDEOTEX_H
-
-#include "StreamHandler.h"
-#include "TexWrapper.h"
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <GLES3/gl3.h>
-#include <GLES3/gl3ext.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
-
-#include <system/graphics-base.h>
-
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsCamera;
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
-using ::android::hardware::camera::device::V3_2::Stream;
-
-class VideoTex : public TexWrapper {
-    friend VideoTex* createVideoTexture(android::sp<IEvsEnumerator> pEnum, const char* evsCameraId,
-                                        std::unique_ptr<Stream> streamCfg, EGLDisplay glDisplay,
-                                        bool useExternalMemory, android_pixel_format_t format);
-
-public:
-    VideoTex() = delete;
-    virtual ~VideoTex();
-
-    bool refresh();  // returns true if the texture contents were updated
-
-private:
-    VideoTex(android::sp<IEvsEnumerator> pEnum, android::sp<IEvsCamera> pCamera,
-             android::sp<StreamHandler> pStreamHandler, EGLDisplay glDisplay);
-
-    android::sp<IEvsEnumerator> mEnumerator;
-    android::sp<IEvsCamera> mCamera;
-    android::sp<StreamHandler> mStreamHandler;
-    BufferDesc mImageBuffer;
-
-    EGLDisplay mDisplay;
-    EGLImageKHR mKHRimage = EGL_NO_IMAGE_KHR;
-};
-
-// Creates a video texture to draw the camera preview.  format is effective only
-// when useExternalMemory is true.
-VideoTex* createVideoTexture(android::sp<IEvsEnumerator> pEnum, const char* deviceName,
-                             std::unique_ptr<Stream> streamCfg, EGLDisplay glDisplay,
-                             bool useExternalMemory = false,
-                             android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888);
-
-#endif  // VIDEOTEX_H
diff --git a/cpp/evs/apps/default/ConfigManager.h b/cpp/evs/apps/default/inc/ConfigManager.h
similarity index 99%
rename from cpp/evs/apps/default/ConfigManager.h
rename to cpp/evs/apps/default/inc/ConfigManager.h
index 6251b6b..8df0c4c 100644
--- a/cpp/evs/apps/default/ConfigManager.h
+++ b/cpp/evs/apps/default/inc/ConfigManager.h
@@ -22,7 +22,7 @@
 
 #include <system/graphics-base.h>
 
-class ConfigManager {
+class ConfigManager final {
 public:
     struct CameraInfo {
         std::string cameraId = "";  // The name of the camera from the point of view of the HAL
diff --git a/cpp/evs/apps/default/EvsStateControl.h b/cpp/evs/apps/default/inc/EvsStateControl.h
similarity index 76%
rename from cpp/evs/apps/default/EvsStateControl.h
rename to cpp/evs/apps/default/inc/EvsStateControl.h
index e852a8d..cbc7c0a 100644
--- a/cpp/evs/apps/default/EvsStateControl.h
+++ b/cpp/evs/apps/default/inc/EvsStateControl.h
@@ -22,34 +22,28 @@
 #include "RenderBase.h"
 #include "StreamHandler.h"
 
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
 #include <aidl/android/hardware/automotive/vehicle/VehiclePropValues.h>
-#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
-#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
 
 #include <IVhalClient.h>
 
 #include <thread>
 
-using ::android::hardware::hidl_handle;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::automotive::evs::V1_1::CameraDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsDisplay;
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
-using ::android::hardware::camera::device::V3_2::Stream;
-
 /*
  * This class runs the main update loop for the EVS application.  It will sleep when it has
  * nothing to do.  It provides a thread safe way for other threads to wake it and pass commands
  * to it.
  */
-class EvsStateControl {
+class EvsStateControl final {
 public:
-    EvsStateControl(std::shared_ptr<android::frameworks::automotive::vhal::IVhalClient> pVnet,
-                    android::sp<IEvsEnumerator> pEvs, android::sp<IEvsDisplay> pDisplay,
-                    const ConfigManager& config);
+    EvsStateControl(
+            std::shared_ptr<android::frameworks::automotive::vhal::IVhalClient> pVnet,
+            std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> pEvs,
+            const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsDisplay>& pDisplay,
+            const ConfigManager& config);
 
     enum State {
         OFF = 0,
@@ -89,8 +83,8 @@
     bool configureEvsPipeline(State desiredState);  // Only call from one thread!
 
     std::shared_ptr<android::frameworks::automotive::vhal::IVhalClient> mVehicle;
-    android::sp<IEvsEnumerator> mEvs;
-    android::wp<IEvsDisplay> mDisplay;
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEvs;
+    std::weak_ptr<aidl::android::hardware::automotive::evs::IEvsDisplay> mDisplay;
     const ConfigManager& mConfig;
 
     aidl::android::hardware::automotive::vehicle::VehiclePropValue mGearValue;
@@ -104,7 +98,7 @@
     std::vector<ConfigManager::CameraInfo> mCameraList[NUM_STATES];
     std::unique_ptr<RenderBase> mCurrentRenderer;
     std::unique_ptr<RenderBase> mDesiredRenderer;
-    std::vector<CameraDesc> mCameraDescList[NUM_STATES];
+    std::vector<aidl::android::hardware::automotive::evs::CameraDesc> mCameraDescList[NUM_STATES];
 
     std::thread mRenderThread;  // The thread that runs the main rendering loop
 
diff --git a/cpp/evs/apps/default/EvsStats.h b/cpp/evs/apps/default/inc/EvsStats.h
similarity index 99%
rename from cpp/evs/apps/default/EvsStats.h
rename to cpp/evs/apps/default/inc/EvsStats.h
index 0d9d47f..2e3416b 100644
--- a/cpp/evs/apps/default/EvsStats.h
+++ b/cpp/evs/apps/default/inc/EvsStats.h
@@ -29,7 +29,7 @@
 //
 // Not thread-safe. Methods `startComputingFirstFrameLatency`, `finishComputingFirstFrameLatency`
 // and `sendCollectedDataBlocking` must be called from the same thread.
-class EvsStats {
+class EvsStats final {
 public:
     // Instantiates EvsStats.
     static EvsStats build();
diff --git a/cpp/evs/apps/default/EvsVehicleListener.h b/cpp/evs/apps/default/inc/EvsVehicleListener.h
similarity index 95%
rename from cpp/evs/apps/default/EvsVehicleListener.h
rename to cpp/evs/apps/default/inc/EvsVehicleListener.h
index 9269e8e..f804395 100644
--- a/cpp/evs/apps/default/EvsVehicleListener.h
+++ b/cpp/evs/apps/default/inc/EvsVehicleListener.h
@@ -28,7 +28,8 @@
  * applications is active, it can poll the vehicle state directly.  However, when it goes to
  * sleep, we need these notifications to bring it active again.
  */
-class EvsVehicleListener : public android::frameworks::automotive::vhal::ISubscriptionCallback {
+class EvsVehicleListener final :
+      public android::frameworks::automotive::vhal::ISubscriptionCallback {
 public:
     void onPropertyEvent([[maybe_unused]] const std::vector<
                          std::unique_ptr<android::frameworks::automotive::vhal::IHalPropValue>>&
diff --git a/cpp/evs/apps/default/FormatConvert.h b/cpp/evs/apps/default/inc/FormatConvert.h
similarity index 87%
rename from cpp/evs/apps/default/FormatConvert.h
rename to cpp/evs/apps/default/inc/FormatConvert.h
index c506b88..2993a34 100644
--- a/cpp/evs/apps/default/FormatConvert.h
+++ b/cpp/evs/apps/default/inc/FormatConvert.h
@@ -17,16 +17,10 @@
 #ifndef EVS_VTS_FORMATCONVERT_H
 #define EVS_VTS_FORMATCONVERT_H
 
-#include <android/hardware/automotive/evs/1.0/types.h>
-#include <android/hardware/automotive/evs/1.1/types.h>
-
 #include <stdint.h>
 
 #include <queue>
 
-using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
-using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
-
 // Given an image buffer in NV21 format (HAL_PIXEL_FORMAT_YCRCB_420_SP), output 32bit RGBx values.
 // The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved
 // U/V array.  It assumes an even width and height for the overall image, and a horizontal
@@ -56,7 +50,4 @@
                                    unsigned srcStridePixels, void* dst, unsigned dstStridePixels,
                                    unsigned pixelSize);
 
-// Fill BufferDesc v1.1 with a given BufferDesc v1.0 data.
-BufferDesc_1_1 convertBufferDesc(const BufferDesc_1_0& src);
-
 #endif  // EVS_VTS_FORMATCONVERT_H
diff --git a/cpp/evs/apps/default/RenderBase.h b/cpp/evs/apps/default/inc/RenderBase.h
similarity index 84%
rename from cpp/evs/apps/default/RenderBase.h
rename to cpp/evs/apps/default/inc/RenderBase.h
index e15f705..8f594a1 100644
--- a/cpp/evs/apps/default/RenderBase.h
+++ b/cpp/evs/apps/default/inc/RenderBase.h
@@ -23,9 +23,7 @@
 #include <GLES2/gl2ext.h>
 #include <GLES3/gl3.h>
 #include <GLES3/gl3ext.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
 
 /*
  * Abstract base class for the workhorse classes that handle the user interaction and display for
@@ -38,12 +36,14 @@
     virtual bool activate() = 0;
     virtual void deactivate() = 0;
 
-    virtual bool drawFrame(const BufferDesc& tgtBuffer) = 0;
+    virtual bool drawFrame(
+            const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer) = 0;
 
 protected:
     static bool prepareGL();
 
-    static bool attachRenderTarget(const BufferDesc& tgtBuffer);
+    static bool attachRenderTarget(
+            const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
     static void detachRenderTarget();
 
     // OpenGL state shared among all renderers
diff --git a/cpp/evs/apps/default/RenderDirectView.h b/cpp/evs/apps/default/inc/RenderDirectView.h
similarity index 62%
rename from cpp/evs/apps/default/RenderDirectView.h
rename to cpp/evs/apps/default/inc/RenderDirectView.h
index 151e148..4eb47b3 100644
--- a/cpp/evs/apps/default/RenderDirectView.h
+++ b/cpp/evs/apps/default/inc/RenderDirectView.h
@@ -21,30 +21,30 @@
 #include "RenderBase.h"
 #include "VideoTex.h"
 
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
 #include <math/mat2.h>
 
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
-using ::android::hardware::automotive::evs::V1_1::CameraDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
-
 /*
  * Renders the view from a single specified camera directly to the full display.
  */
-class RenderDirectView : public RenderBase {
+class RenderDirectView final : public RenderBase {
 public:
-    RenderDirectView(android::sp<IEvsEnumerator> enumerator, const CameraDesc& camDesc,
-                     const ConfigManager& config);
+    RenderDirectView(
+            std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> enumerator,
+            const aidl::android::hardware::automotive::evs::CameraDesc& camDesc,
+            const ConfigManager& config);
 
     virtual bool activate() override;
     virtual void deactivate() override;
 
-    virtual bool drawFrame(const BufferDesc& tgtBuffer);
+    virtual bool drawFrame(const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
 
 protected:
-    android::sp<IEvsEnumerator> mEnumerator;
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
     ConfigManager::CameraInfo mCameraInfo;
-    CameraDesc mCameraDesc;
+    aidl::android::hardware::automotive::evs::CameraDesc mCameraDesc;
     const ConfigManager& mConfig;
 
     std::unique_ptr<VideoTex> mTexture;
diff --git a/cpp/evs/apps/default/RenderPixelCopy.h b/cpp/evs/apps/default/inc/RenderPixelCopy.h
similarity index 64%
rename from cpp/evs/apps/default/RenderPixelCopy.h
rename to cpp/evs/apps/default/inc/RenderPixelCopy.h
index 283b9c8..f8da412 100644
--- a/cpp/evs/apps/default/RenderPixelCopy.h
+++ b/cpp/evs/apps/default/inc/RenderPixelCopy.h
@@ -21,27 +21,28 @@
 #include "RenderBase.h"
 #include "VideoTex.h"
 
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
 
 /*
  * Renders the view from a single specified camera directly to the full display.
  */
-class RenderPixelCopy : public RenderBase {
+class RenderPixelCopy final : public RenderBase {
 public:
-    RenderPixelCopy(android::sp<IEvsEnumerator> enumerator, const ConfigManager::CameraInfo& cam);
+    RenderPixelCopy(
+            std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> enumerator,
+            const ConfigManager::CameraInfo& cam);
 
     virtual bool activate() override;
     virtual void deactivate() override;
 
-    virtual bool drawFrame(const BufferDesc& tgtBuffer);
+    virtual bool drawFrame(const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
 
 protected:
-    android::sp<IEvsEnumerator> mEnumerator;
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
     ConfigManager::CameraInfo mCameraInfo;
 
-    android::sp<StreamHandler> mStreamHandler;
+    std::shared_ptr<StreamHandler> mStreamHandler;
 };
 
 #endif  // CAR_EVS_APP_RENDERPIXELCOPY_H
diff --git a/cpp/evs/apps/default/RenderTopView.h b/cpp/evs/apps/default/inc/RenderTopView.h
similarity index 74%
rename from cpp/evs/apps/default/RenderTopView.h
rename to cpp/evs/apps/default/inc/RenderTopView.h
index cd9ca30..d9cccc6 100644
--- a/cpp/evs/apps/default/RenderTopView.h
+++ b/cpp/evs/apps/default/inc/RenderTopView.h
@@ -21,24 +21,23 @@
 #include "RenderBase.h"
 #include "VideoTex.h"
 
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
 #include <math/mat4.h>
 
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
-
 /*
  * Combines the views from all available cameras into one reprojected top down view.
  */
-class RenderTopView : public RenderBase {
+class RenderTopView final : public RenderBase {
 public:
-    RenderTopView(android::sp<IEvsEnumerator> enumerator,
-                  const std::vector<ConfigManager::CameraInfo>& camList,
-                  const ConfigManager& config);
+    RenderTopView(
+            std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> enumerator,
+            const std::vector<ConfigManager::CameraInfo>& camList, const ConfigManager& config);
 
     virtual bool activate() override;
     virtual void deactivate() override;
 
-    virtual bool drawFrame(const BufferDesc& tgtBuffer);
+    virtual bool drawFrame(const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
 
 protected:
     struct ActiveCamera {
@@ -51,7 +50,7 @@
     void renderCarTopView();
     void renderCameraOntoGroundPlane(const ActiveCamera& cam);
 
-    android::sp<IEvsEnumerator> mEnumerator;
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
     const ConfigManager& mConfig;
     std::vector<ActiveCamera> mActiveCameras;
 
diff --git a/cpp/evs/apps/default/inc/StreamHandler.h b/cpp/evs/apps/default/inc/StreamHandler.h
new file mode 100644
index 0000000..3d291e2
--- /dev/null
+++ b/cpp/evs/apps/default/inc/StreamHandler.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVS_VTS_STREAMHANDLER_H
+#define EVS_VTS_STREAMHANDLER_H
+
+#include <aidl/android/hardware/automotive/evs/BnEvsCameraStream.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/DisplayState.h>
+#include <aidl/android/hardware/automotive/evs/EvsEventDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/graphics/common/HardwareBuffer.h>
+#include <ui/GraphicBuffer.h>
+
+#include <queue>
+
+/*
+ * StreamHandler:
+ * This class can be used to receive camera imagery from an IEvsCamera implementation.  It will
+ * hold onto the most recent image buffer, returning older ones.
+ * Note that the video frames are delivered on a background thread, while the control interface
+ * is actuated from the applications foreground thread.
+ */
+class StreamHandler final : public aidl::android::hardware::automotive::evs::BnEvsCameraStream {
+public:
+    virtual ~StreamHandler() { shutdown(); };
+
+    StreamHandler(
+            const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera>& cameraObj,
+            uint32_t numBuffers = 2, bool useOwnBuffers = false,
+            android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888, int32_t width = 640,
+            int32_t height = 360);
+    void shutdown();
+
+    bool startStream();
+    void asyncStopStream();
+    void blockingStopStream();
+
+    bool isRunning();
+
+    bool newFrameAvailable();
+    const aidl::android::hardware::automotive::evs::BufferDesc& getNewFrame();
+    void doneWithFrame(const aidl::android::hardware::automotive::evs::BufferDesc& buffer);
+
+private:
+    // Implementation for aidl::android::hardware::automotive::evs::IEvsCameraStream
+    ndk::ScopedAStatus deliverFrame(
+            const std::vector<aidl::android::hardware::automotive::evs::BufferDesc>& buffers)
+            override;
+    ndk::ScopedAStatus notify(
+            const aidl::android::hardware::automotive::evs::EvsEventDesc& event) override;
+
+    // Values initialized as startup
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera> mCamera;
+
+    // Since we get frames delivered to us asnchronously via the IEvsCameraStream interface,
+    // we need to protect all member variables that may be modified while we're streaming
+    // (i.e.: those below)
+    std::mutex mLock;
+    std::condition_variable mSignal;
+
+    bool mRunning = false;
+
+    aidl::android::hardware::automotive::evs::BufferDesc mBuffers[2];
+    int mHeldBuffer = -1;   // Index of the one currently held by the client
+    int mReadyBuffer = -1;  // Index of the newest available buffer
+    std::vector<aidl::android::hardware::automotive::evs::BufferDesc> mOwnBuffers;
+    bool mUseOwnBuffers;
+};
+
+#endif  // EVS_VTS_STREAMHANDLER_H
diff --git a/cpp/evs/apps/default/TexWrapper.h b/cpp/evs/apps/default/inc/TexWrapper.h
similarity index 100%
rename from cpp/evs/apps/default/TexWrapper.h
rename to cpp/evs/apps/default/inc/TexWrapper.h
diff --git a/cpp/evs/apps/default/inc/Utils.h b/cpp/evs/apps/default/inc/Utils.h
new file mode 100644
index 0000000..ed17d00
--- /dev/null
+++ b/cpp/evs/apps/default/inc/Utils.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <cutils/native_handle.h>
+
+aidl::android::hardware::automotive::evs::BufferDesc dupBufferDesc(
+        const aidl::android::hardware::automotive::evs::BufferDesc& src);
+native_handle_t* getNativeHandle(
+        const aidl::android::hardware::automotive::evs::BufferDesc& buffer);
diff --git a/cpp/evs/apps/default/inc/VideoTex.h b/cpp/evs/apps/default/inc/VideoTex.h
new file mode 100644
index 0000000..0667bc0
--- /dev/null
+++ b/cpp/evs/apps/default/inc/VideoTex.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef VIDEOTEX_H
+#define VIDEOTEX_H
+
+#include "StreamHandler.h"
+#include "TexWrapper.h"
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <GLES3/gl3.h>
+#include <GLES3/gl3ext.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/Stream.h>
+
+#include <system/graphics-base.h>
+
+class VideoTex final : public TexWrapper {
+    friend VideoTex* createVideoTexture(
+            const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator>& pEnum,
+            const char* evsCameraId,
+            std::unique_ptr<aidl::android::hardware::automotive::evs::Stream> streamCfg,
+            EGLDisplay glDisplay, bool useExternalMemory, android_pixel_format_t format);
+
+public:
+    VideoTex() = delete;
+    virtual ~VideoTex();
+
+    bool refresh();  // returns true if the texture contents were updated
+
+private:
+    VideoTex(std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> pEnum,
+             std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera> pCamera,
+             std::shared_ptr<StreamHandler> pStreamHandler, EGLDisplay glDisplay);
+
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
+    std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera> mCamera;
+    std::shared_ptr<StreamHandler> mStreamHandler;
+    aidl::android::hardware::automotive::evs::BufferDesc mImageBuffer;
+
+    EGLDisplay mDisplay;
+    EGLImageKHR mKHRimage = EGL_NO_IMAGE_KHR;
+};
+
+// Creates a video texture to draw the camera preview.  format is effective only
+// when useExternalMemory is true.
+VideoTex* createVideoTexture(
+        const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator>& pEnum,
+        const char* deviceName,
+        std::unique_ptr<aidl::android::hardware::automotive::evs::Stream> streamCfg,
+        EGLDisplay glDisplay, bool useExternalMemory = false,
+        android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888);
+
+#endif  // VIDEOTEX_H
diff --git a/cpp/evs/apps/default/glError.h b/cpp/evs/apps/default/inc/glError.h
similarity index 100%
rename from cpp/evs/apps/default/glError.h
rename to cpp/evs/apps/default/inc/glError.h
diff --git a/cpp/evs/apps/default/shader.h b/cpp/evs/apps/default/inc/shader.h
similarity index 100%
rename from cpp/evs/apps/default/shader.h
rename to cpp/evs/apps/default/inc/shader.h
diff --git a/cpp/evs/apps/default/shader_projectedTex.h b/cpp/evs/apps/default/inc/shader_projectedTex.h
similarity index 100%
rename from cpp/evs/apps/default/shader_projectedTex.h
rename to cpp/evs/apps/default/inc/shader_projectedTex.h
diff --git a/cpp/evs/apps/default/shader_simpleTex.h b/cpp/evs/apps/default/inc/shader_simpleTex.h
similarity index 100%
rename from cpp/evs/apps/default/shader_simpleTex.h
rename to cpp/evs/apps/default/inc/shader_simpleTex.h
diff --git a/cpp/evs/apps/default/CarFromTop.png b/cpp/evs/apps/default/res/CarFromTop.png
similarity index 100%
rename from cpp/evs/apps/default/CarFromTop.png
rename to cpp/evs/apps/default/res/CarFromTop.png
Binary files differ
diff --git a/cpp/evs/apps/default/LabeledChecker.png b/cpp/evs/apps/default/res/LabeledChecker.png
similarity index 100%
rename from cpp/evs/apps/default/LabeledChecker.png
rename to cpp/evs/apps/default/res/LabeledChecker.png
Binary files differ
diff --git a/cpp/evs/apps/default/config.json b/cpp/evs/apps/default/res/config.json
similarity index 100%
rename from cpp/evs/apps/default/config.json
rename to cpp/evs/apps/default/res/config.json
diff --git a/cpp/evs/apps/default/config.json.readme b/cpp/evs/apps/default/res/config.json.readme
similarity index 100%
rename from cpp/evs/apps/default/config.json.readme
rename to cpp/evs/apps/default/res/config.json.readme
diff --git a/cpp/evs/apps/default/ConfigManager.cpp b/cpp/evs/apps/default/src/ConfigManager.cpp
similarity index 100%
rename from cpp/evs/apps/default/ConfigManager.cpp
rename to cpp/evs/apps/default/src/ConfigManager.cpp
diff --git a/cpp/evs/apps/default/EvsStateControl.cpp b/cpp/evs/apps/default/src/EvsStateControl.cpp
similarity index 74%
rename from cpp/evs/apps/default/EvsStateControl.cpp
rename to cpp/evs/apps/default/src/EvsStateControl.cpp
index e2cdba4..dbcd58a 100644
--- a/cpp/evs/apps/default/EvsStateControl.cpp
+++ b/cpp/evs/apps/default/src/EvsStateControl.cpp
@@ -20,6 +20,10 @@
 #include "RenderPixelCopy.h"
 #include "RenderTopView.h"
 
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/DisplayState.h>
+#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
 #include <aidl/android/hardware/automotive/vehicle/VehicleGear.h>
 #include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
 #include <aidl/android/hardware/automotive/vehicle/VehiclePropertyType.h>
@@ -32,23 +36,25 @@
 #include <stdio.h>
 #include <string.h>
 
-using ::aidl::android::hardware::automotive::vehicle::VehicleGear;
-using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
-using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
-using ::aidl::android::hardware::automotive::vehicle::VehiclePropValue;
-using ::aidl::android::hardware::automotive::vehicle::VehicleTurnSignal;
-using ::android::base::Result;
-using ::android::frameworks::automotive::vhal::ErrorCode;
-using ::android::frameworks::automotive::vhal::IHalPropValue;
-using ::android::frameworks::automotive::vhal::IVhalClient;
-using ::android::frameworks::automotive::vhal::VhalClientResult;
-using ::android::hardware::automotive::evs::V1_0::EvsResult;
-using EvsDisplayState = ::android::hardware::automotive::evs::V1_0::DisplayState;
-using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
-using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
+namespace {
 
-static bool isSfReady() {
-    return ::ndk::SpAIBinder(::AServiceManager_getService("SurfaceFlinger")).get() != nullptr;
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::CameraDesc;
+using aidl::android::hardware::automotive::evs::DisplayState;
+using aidl::android::hardware::automotive::evs::IEvsDisplay;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::vehicle::VehicleGear;
+using aidl::android::hardware::automotive::vehicle::VehicleProperty;
+using aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
+using aidl::android::hardware::automotive::vehicle::VehiclePropValue;
+using aidl::android::hardware::automotive::vehicle::VehicleTurnSignal;
+using android::frameworks::automotive::vhal::ErrorCode;
+using android::frameworks::automotive::vhal::IHalPropValue;
+using android::frameworks::automotive::vhal::IVhalClient;
+using android::frameworks::automotive::vhal::VhalClientResult;
+
+bool isSfReady() {
+    return ndk::SpAIBinder(AServiceManager_getService("SurfaceFlinger")).get() != nullptr;
 }
 
 inline constexpr VehiclePropertyType getPropType(VehicleProperty prop) {
@@ -56,9 +62,12 @@
                                             static_cast<int32_t>(VehiclePropertyType::MASK));
 }
 
+}  // namespace
+
 EvsStateControl::EvsStateControl(std::shared_ptr<IVhalClient> pVnet,
-                                 android::sp<IEvsEnumerator> pEvs,
-                                 android::sp<IEvsDisplay> pDisplay, const ConfigManager& config) :
+                                 std::shared_ptr<IEvsEnumerator> pEvs,
+                                 const std::shared_ptr<IEvsDisplay>& pDisplay,
+                                 const ConfigManager& config) :
       mVehicle(pVnet),
       mEvs(pEvs),
       mDisplay(pDisplay),
@@ -77,48 +86,52 @@
     // This way we only ever deal with cameras which exist in the system
     // Build our set of cameras for the states we support
     LOG(DEBUG) << "Requesting camera list";
-    mEvs->getCameraList_1_1([this, &config](hidl_vec<CameraDesc> cameraList) {
-        LOG(INFO) << "Camera list callback received " << cameraList.size() << "cameras.";
-        for (auto&& cam : cameraList) {
-            LOG(DEBUG) << "Found camera " << cam.v1.cameraId;
-            bool cameraConfigFound = false;
+    std::vector<CameraDesc> cameraList;
+    if (auto status = mEvs->getCameraList(&cameraList); !status.isOk()) {
+        LOG(ERROR) << "Failed to get the camera list.";
+        return;
+    }
 
-            // Check our configuration for information about this camera
-            // Note that a camera can have a compound function string
-            // such that a camera can be "right/reverse" and be used for both.
-            // If more than one camera is listed for a given function, we'll
-            // list all of them and let the UX/rendering logic use one, some
-            // or all of them as appropriate.
-            for (auto&& info : config.getCameras()) {
-                if (cam.v1.cameraId == info.cameraId) {
-                    // We found a match!
-                    if (info.function.find("reverse") != std::string::npos) {
-                        mCameraList[State::REVERSE].emplace_back(info);
-                        mCameraDescList[State::REVERSE].emplace_back(cam);
-                    }
-                    if (info.function.find("right") != std::string::npos) {
-                        mCameraList[State::RIGHT].emplace_back(info);
-                        mCameraDescList[State::RIGHT].emplace_back(cam);
-                    }
-                    if (info.function.find("left") != std::string::npos) {
-                        mCameraList[State::LEFT].emplace_back(info);
-                        mCameraDescList[State::LEFT].emplace_back(cam);
-                    }
-                    if (info.function.find("park") != std::string::npos) {
-                        mCameraList[State::PARKING].emplace_back(info);
-                        mCameraDescList[State::PARKING].emplace_back(cam);
-                    }
-                    cameraConfigFound = true;
-                    break;
+    LOG(INFO) << "Camera list callback received " << cameraList.size() << "cameras.";
+    for (auto&& cam : cameraList) {
+        LOG(DEBUG) << "Found camera " << cam.id;
+        bool cameraConfigFound = false;
+
+        // Check our configuration for information about this camera
+        // Note that a camera can have a compound function string
+        // such that a camera can be "right/reverse" and be used for both.
+        // If more than one camera is listed for a given function, we'll
+        // list all of them and let the UX/rendering logic use one, some
+        // or all of them as appropriate.
+        for (auto&& info : config.getCameras()) {
+            if (cam.id == info.cameraId) {
+                // We found a match!
+                if (info.function.find("reverse") != std::string::npos) {
+                    mCameraList[State::REVERSE].emplace_back(info);
+                    mCameraDescList[State::REVERSE].emplace_back(cam);
                 }
-            }
-            if (!cameraConfigFound) {
-                LOG(WARNING) << "No config information for hardware camera " << cam.v1.cameraId;
+                if (info.function.find("right") != std::string::npos) {
+                    mCameraList[State::RIGHT].emplace_back(info);
+                    mCameraDescList[State::RIGHT].emplace_back(cam);
+                }
+                if (info.function.find("left") != std::string::npos) {
+                    mCameraList[State::LEFT].emplace_back(info);
+                    mCameraDescList[State::LEFT].emplace_back(cam);
+                }
+                if (info.function.find("park") != std::string::npos) {
+                    mCameraList[State::PARKING].emplace_back(info);
+                    mCameraDescList[State::PARKING].emplace_back(cam);
+                }
+                cameraConfigFound = true;
+                break;
             }
         }
-    });
+        if (!cameraConfigFound) {
+            LOG(WARNING) << "No config information for hardware camera " << cam.id;
+        }
+    }
 
-    LOG(DEBUG) << "State controller ready";
+    LOG(INFO) << "State controller ready";
 }
 
 bool EvsStateControl::startUpdateLoop() {
@@ -158,9 +171,9 @@
     bool run = true;
     while (run) {
         // Process incoming commands
-        android::sp<IEvsDisplay> displayHandle;
+        std::shared_ptr<IEvsDisplay> displayHandle;
         {
-            std::lock_guard<std::mutex> lock(mLock);
+            std::lock_guard lock(mLock);
             while (!mCommandQueue.empty()) {
                 const Command& cmd = mCommandQueue.front();
                 switch (cmd.operation) {
@@ -177,7 +190,7 @@
                 mCommandQueue.pop();
             }
 
-            displayHandle = mDisplay.promote();
+            displayHandle = mDisplay.lock();
         }
 
         if (!displayHandle) {
@@ -194,16 +207,13 @@
         // If we have an active renderer, give it a chance to draw
         if (mCurrentRenderer) {
             // Get the output buffer we'll use to display the imagery
-            BufferDesc_1_0 tgtBuffer = {};
-            displayHandle->getTargetBuffer(
-                    [&tgtBuffer](const BufferDesc_1_0& buff) { tgtBuffer = buff; });
-
-            if (tgtBuffer.memHandle == nullptr) {
+            BufferDesc tgtBuffer;
+            if (auto status = displayHandle->getTargetBuffer(&tgtBuffer); !status.isOk()) {
                 LOG(ERROR) << "Didn't get requested output buffer -- skipping this frame.";
                 run = false;
             } else {
                 // Generate our output image
-                if (!mCurrentRenderer->drawFrame(convertBufferDesc(tgtBuffer))) {
+                if (!mCurrentRenderer->drawFrame(tgtBuffer)) {
                     // If drawing failed, we want to exit quickly so an app restart can happen
                     run = false;
                 }
@@ -365,20 +375,20 @@
     }
 
     // Since we're changing states, shut down the current renderer
-    if (mCurrentRenderer != nullptr) {
+    if (mCurrentRenderer) {
         mCurrentRenderer->deactivate();
-        mCurrentRenderer = nullptr;  // It's a smart pointer, so destructs on assignment to null
+        mCurrentRenderer.reset();
     }
 
     // Now set the display state based on whether we have a video feed to show
-    android::sp<IEvsDisplay> displayHandle = mDisplay.promote();
+    std::shared_ptr<IEvsDisplay> displayHandle = mDisplay.lock();
     if (!displayHandle) {
         return false;
     }
 
-    if (mDesiredRenderer == nullptr) {
+    if (!mDesiredRenderer) {
         LOG(DEBUG) << "Turning off the display";
-        displayHandle->setDisplayState(EvsDisplayState::NOT_VISIBLE);
+        displayHandle->setDisplayState(DisplayState::NOT_VISIBLE);
     } else {
         mCurrentRenderer = std::move(mDesiredRenderer);
 
@@ -393,10 +403,9 @@
         // Activate the display
         LOG(DEBUG) << "EvsActivateDisplayTiming start time: " << android::elapsedRealtime()
                    << " ms.";
-        Return<EvsResult> result =
-                displayHandle->setDisplayState(EvsDisplayState::VISIBLE_ON_NEXT_FRAME);
-        if (result != EvsResult::OK) {
-            LOG(ERROR) << "setDisplayState returned an error " << result.description();
+        if (auto status = displayHandle->setDisplayState(DisplayState::VISIBLE_ON_NEXT_FRAME);
+            !status.isOk()) {
+            LOG(ERROR) << "Failed to set a display state as VISIBLE_ON_NEXT_FRAME.";
             return false;
         }
     }
@@ -407,7 +416,7 @@
 
     mFirstFrameIsDisplayed = false;  // Got a new renderer, mark first frame is not displayed.
 
-    if (mCurrentRenderer != nullptr && desiredState == State::REVERSE) {
+    if (mCurrentRenderer && desiredState == State::REVERSE) {
         // Start computing the latency when the evs state changes.
         mEvsStats.startComputingFirstFrameLatency(desiredStateTimeMillis);
     }
diff --git a/cpp/evs/apps/default/EvsStats.cpp b/cpp/evs/apps/default/src/EvsStats.cpp
similarity index 100%
rename from cpp/evs/apps/default/EvsStats.cpp
rename to cpp/evs/apps/default/src/EvsStats.cpp
diff --git a/cpp/evs/apps/default/FormatConvert.cpp b/cpp/evs/apps/default/src/FormatConvert.cpp
similarity index 91%
rename from cpp/evs/apps/default/FormatConvert.cpp
rename to cpp/evs/apps/default/src/FormatConvert.cpp
index 499d405..768c489 100644
--- a/cpp/evs/apps/default/FormatConvert.cpp
+++ b/cpp/evs/apps/default/src/FormatConvert.cpp
@@ -152,20 +152,3 @@
         dst = (uint8_t*)dst + dstStridePixels * pixelSize;
     }
 }
-
-BufferDesc_1_1 convertBufferDesc(const BufferDesc_1_0& src) {
-    BufferDesc_1_1 dst = {};
-    AHardwareBuffer_Desc* pDesc = reinterpret_cast<AHardwareBuffer_Desc*>(&dst.buffer.description);
-    pDesc->width = src.width;
-    pDesc->height = src.height;
-    pDesc->layers = 1;
-    pDesc->format = src.format;
-    pDesc->usage = static_cast<uint64_t>(src.usage);
-    pDesc->stride = src.stride;
-
-    dst.buffer.nativeHandle = src.memHandle;
-    dst.pixelSize = src.pixelSize;
-    dst.bufferId = src.bufferId;
-
-    return dst;
-}
diff --git a/cpp/evs/apps/default/RenderBase.cpp b/cpp/evs/apps/default/src/RenderBase.cpp
similarity index 90%
rename from cpp/evs/apps/default/RenderBase.cpp
rename to cpp/evs/apps/default/src/RenderBase.cpp
index f4728a4..4d009f6 100644
--- a/cpp/evs/apps/default/RenderBase.cpp
+++ b/cpp/evs/apps/default/src/RenderBase.cpp
@@ -16,16 +16,26 @@
 
 #include "RenderBase.h"
 
+#include "Utils.h"
 #include "glError.h"
 
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidlcommonsupport/NativeHandle.h>
 #include <android-base/logging.h>
+#include <android-base/scopeguard.h>
 #include <ui/GraphicBuffer.h>
 
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+
 // Eventually we shouldn't need this dependency, but for now the
 // graphics allocator interface isn't fully supported on all platforms
 // and this is our work around.
 using ::android::GraphicBuffer;
 
+}  // namespace
+
 // OpenGL state shared among all renderers
 EGLDisplay RenderBase::sDisplay = EGL_NO_DISPLAY;
 EGLContext RenderBase::sContext = EGL_NO_CONTEXT;
@@ -131,6 +141,14 @@
 }
 
 bool RenderBase::attachRenderTarget(const BufferDesc& tgtBuffer) {
+    native_handle_t* nativeHandle = getNativeHandle(tgtBuffer);
+    if (nativeHandle == nullptr) {
+        LOG(ERROR) << "Target buffer is invalid.";
+        return false;
+    }
+
+    const auto handleGuard =
+            android::base::make_scope_guard([nativeHandle] { free(nativeHandle); });
     const AHardwareBuffer_Desc* pDesc =
             reinterpret_cast<const AHardwareBuffer_Desc*>(&tgtBuffer.buffer.description);
     // Hardcoded to RGBx for now
@@ -141,9 +159,9 @@
 
     // create a GraphicBuffer from the existing handle
     android::sp<GraphicBuffer> pGfxBuffer =
-            new GraphicBuffer(tgtBuffer.buffer.nativeHandle, GraphicBuffer::CLONE_HANDLE,
-                              pDesc->width, pDesc->height, pDesc->format, pDesc->layers,
-                              GRALLOC_USAGE_HW_RENDER, pDesc->stride);
+            new GraphicBuffer(nativeHandle, GraphicBuffer::CLONE_HANDLE, pDesc->width,
+                              pDesc->height, pDesc->format, pDesc->layers, GRALLOC_USAGE_HW_RENDER,
+                              pDesc->stride);
     if (pGfxBuffer.get() == nullptr) {
         LOG(ERROR) << "Failed to allocate GraphicBuffer to wrap image handle";
         return false;
diff --git a/cpp/evs/apps/default/RenderDirectView.cpp b/cpp/evs/apps/default/src/RenderDirectView.cpp
similarity index 90%
rename from cpp/evs/apps/default/RenderDirectView.cpp
rename to cpp/evs/apps/default/src/RenderDirectView.cpp
index 5df2db1..806b559 100644
--- a/cpp/evs/apps/default/RenderDirectView.cpp
+++ b/cpp/evs/apps/default/src/RenderDirectView.cpp
@@ -21,13 +21,20 @@
 #include "shader.h"
 #include "shader_simpleTex.h"
 
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/Stream.h>
+#include <aidl/android/hardware/graphics/common/PixelFormat.h>
 #include <android-base/logging.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
 #include <math/mat4.h>
 #include <system/camera_metadata.h>
 
-using ::android::hardware::camera::device::V3_2::Stream;
-using ::android::hardware::graphics::common::V1_0::PixelFormat;
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::CameraDesc;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::evs::Stream;
 
 typedef struct {
     int32_t id;
@@ -40,14 +47,16 @@
 
 const size_t kStreamCfgSz = sizeof(RawStreamConfig) / sizeof(int32_t);
 
-RenderDirectView::RenderDirectView(android::sp<IEvsEnumerator> enumerator,
+}  // namespace
+
+RenderDirectView::RenderDirectView(std::shared_ptr<IEvsEnumerator> enumerator,
                                    const CameraDesc& camDesc, const ConfigManager& config) :
       mEnumerator(enumerator), mCameraDesc(camDesc), mConfig(config) {
     // Find and store the target camera configuration
     const auto& camList = mConfig.getCameras();
     const auto target = std::find_if(camList.begin(), camList.end(),
                                      [this](const ConfigManager::CameraInfo& info) {
-                                         return info.cameraId == mCameraDesc.v1.cameraId;
+                                         return info.cameraId == mCameraDesc.id;
                                      });
     if (target != camList.end()) {
         // Store the info
@@ -114,15 +123,15 @@
     }
 
     // This client always wants below input data format
-    targetCfg->format = static_cast<PixelFormat>(HAL_PIXEL_FORMAT_RGBA_8888);
+    targetCfg->format = aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
 
     // Construct our video texture
-    mTexture.reset(createVideoTexture(mEnumerator, mCameraDesc.v1.cameraId.c_str(),
+    mTexture.reset(createVideoTexture(mEnumerator, mCameraDesc.id.c_str(),
                                       foundCfg ? std::move(targetCfg) : nullptr, sDisplay,
                                       mConfig.getUseExternalMemory(),
                                       mConfig.getExternalMemoryFormat()));
     if (!mTexture) {
-        LOG(ERROR) << "Failed to set up video texture for " << mCameraDesc.v1.cameraId;
+        LOG(ERROR) << "Failed to set up video texture for " << mCameraDesc.id;
         // TODO(b/237904870): We may want to return false here.
     }
 
diff --git a/cpp/evs/apps/default/RenderPixelCopy.cpp b/cpp/evs/apps/default/src/RenderPixelCopy.cpp
similarity index 72%
rename from cpp/evs/apps/default/RenderPixelCopy.cpp
rename to cpp/evs/apps/default/src/RenderPixelCopy.cpp
index e264e1e..04b7f36 100644
--- a/cpp/evs/apps/default/RenderPixelCopy.cpp
+++ b/cpp/evs/apps/default/src/RenderPixelCopy.cpp
@@ -17,10 +17,26 @@
 #include "RenderPixelCopy.h"
 
 #include "FormatConvert.h"
+#include "Utils.h"
 
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/Stream.h>
+#include <aidlcommonsupport/NativeHandle.h>
 #include <android-base/logging.h>
+#include <android-base/scopeguard.h>
+#include <android/binder_manager.h>
 
-RenderPixelCopy::RenderPixelCopy(android::sp<IEvsEnumerator> enumerator,
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::IEvsCamera;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::evs::Stream;
+
+}  // namespace
+
+RenderPixelCopy::RenderPixelCopy(std::shared_ptr<IEvsEnumerator> enumerator,
                                  const ConfigManager::CameraInfo& cam) {
     mEnumerator = enumerator;
     mCameraInfo = cam;
@@ -28,18 +44,18 @@
 
 bool RenderPixelCopy::activate() {
     // Set up the camera to feed this texture
-    android::sp<IEvsCamera> pCamera =
-            IEvsCamera::castFrom(mEnumerator->openCamera(mCameraInfo.cameraId.c_str()))
-                    .withDefault(nullptr);
-
-    if (pCamera.get() == nullptr) {
+    Stream emptyConfig;
+    std::shared_ptr<IEvsCamera> pCamera;
+    if (auto status = mEnumerator->openCamera(mCameraInfo.cameraId.c_str(), emptyConfig, &pCamera);
+        !status.isOk()) {
         LOG(ERROR) << "Failed to allocate new EVS Camera interface";
         return false;
     }
 
     // Initialize the stream that will help us update this texture's contents
-    android::sp<StreamHandler> pStreamHandler = new StreamHandler(pCamera);
-    if (pStreamHandler.get() == nullptr) {
+    std::shared_ptr<StreamHandler> pStreamHandler =
+            ndk::SharedRefBase::make<StreamHandler>(pCamera);
+    if (!pStreamHandler) {
         LOG(ERROR) << "Failed to allocate FrameHandler";
         return false;
     }
@@ -51,21 +67,27 @@
     }
 
     mStreamHandler = pStreamHandler;
-
     return true;
 }
 
 void RenderPixelCopy::deactivate() {
-    mStreamHandler = nullptr;
+    mStreamHandler.reset();
 }
 
 bool RenderPixelCopy::drawFrame(const BufferDesc& tgtBuffer) {
     bool success = true;
+    native_handle_t* targetBufferNativeHandle = getNativeHandle(tgtBuffer);
+    if (targetBufferNativeHandle == nullptr) {
+        LOG(ERROR) << "Target buffer has an invalid native handle.";
+        return false;
+    }
+
+    const auto handleGuard = android::base::make_scope_guard(
+            [targetBufferNativeHandle] { free(targetBufferNativeHandle); });
     const AHardwareBuffer_Desc* pTgtDesc =
             reinterpret_cast<const AHardwareBuffer_Desc*>(&tgtBuffer.buffer.description);
-
     android::sp<android::GraphicBuffer> tgt =
-            new android::GraphicBuffer(tgtBuffer.buffer.nativeHandle,
+            new android::GraphicBuffer(targetBufferNativeHandle,
                                        android::GraphicBuffer::CLONE_HANDLE, pTgtDesc->width,
                                        pTgtDesc->height, pTgtDesc->format, pTgtDesc->layers,
                                        pTgtDesc->usage, pTgtDesc->stride);
@@ -83,6 +105,14 @@
             // Make sure we have the latest frame data
             if (mStreamHandler->newFrameAvailable()) {
                 const BufferDesc& srcBuffer = mStreamHandler->getNewFrame();
+                native_handle_t* srcBufferNativeHandle = getNativeHandle(srcBuffer);
+                if (srcBufferNativeHandle == nullptr) {
+                    LOG(ERROR) << "Target buffer has an invalid native handle.";
+                    return false;
+                }
+
+                const auto handleGuard = android::base::make_scope_guard(
+                        [srcBufferNativeHandle] { free(srcBufferNativeHandle); });
                 const AHardwareBuffer_Desc* pSrcDesc =
                         reinterpret_cast<const AHardwareBuffer_Desc*>(
                                 &srcBuffer.buffer.description);
@@ -90,7 +120,7 @@
                 // Lock our source buffer for reading (current expectation are for this to be NV21
                 // format)
                 android::sp<android::GraphicBuffer> src =
-                        new android::GraphicBuffer(srcBuffer.buffer.nativeHandle,
+                        new android::GraphicBuffer(srcBufferNativeHandle,
                                                    android::GraphicBuffer::CLONE_HANDLE,
                                                    pSrcDesc->width, pSrcDesc->height,
                                                    pSrcDesc->format, pSrcDesc->layers,
@@ -113,7 +143,7 @@
                     } else if (pSrcDesc->format == pTgtDesc->format) {  // 32bit RGBA
                         copyMatchedInterleavedFormats(width, height, srcPixels, pSrcDesc->stride,
                                                       tgtPixels, pTgtDesc->stride,
-                                                      tgtBuffer.pixelSize);
+                                                      tgtBuffer.pixelSizeBytes);
                     }
                 } else {
                     LOG(ERROR) << "Failed to get pointer into src image data";
diff --git a/cpp/evs/apps/default/RenderTopView.cpp b/cpp/evs/apps/default/src/RenderTopView.cpp
similarity index 95%
rename from cpp/evs/apps/default/RenderTopView.cpp
rename to cpp/evs/apps/default/src/RenderTopView.cpp
index b8afd9d..398cfb8 100644
--- a/cpp/evs/apps/default/RenderTopView.cpp
+++ b/cpp/evs/apps/default/src/RenderTopView.cpp
@@ -23,20 +23,21 @@
 #include "shader_simpleTex.h"
 
 #include <android-base/logging.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
 #include <math/mat4.h>
 #include <math/vec3.h>
 
-using ::android::hardware::camera::device::V3_2::Stream;
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
 
 // Simple aliases to make geometric math using vectors more readable
-static const unsigned X = 0;
-static const unsigned Y = 1;
-static const unsigned Z = 2;
-// static const unsigned W = 3;
+const unsigned X = 0;
+const unsigned Y = 1;
+const unsigned Z = 2;
 
 // Since we assume no roll in these views, we can simplify the required math
-static android::vec3 unitVectorFromPitchAndYaw(float pitch, float yaw) {
+android::vec3 unitVectorFromPitchAndYaw(float pitch, float yaw) {
     float sinPitch, cosPitch;
     sincosf(pitch, &sinPitch, &cosPitch);
     float sinYaw, cosYaw;
@@ -46,7 +47,7 @@
 
 // Helper function to set up a perspective matrix with independent horizontal and vertical
 // angles of view.
-static android::mat4 perspective(float hfov, float vfov, float near, float far) {
+android::mat4 perspective(float hfov, float vfov, float near, float far) {
     const float tanHalfFovX = tanf(hfov * 0.5f);
     const float tanHalfFovY = tanf(vfov * 0.5f);
 
@@ -62,7 +63,7 @@
 // Helper function to set up a view matrix for a camera given it's yaw & pitch & location
 // Yes, with a bit of work, we could use lookAt, but it does a lot of extra work
 // internally that we can short cut.
-static android::mat4 cameraLookMatrix(const ConfigManager::CameraInfo& cam) {
+android::mat4 cameraLookMatrix(const ConfigManager::CameraInfo& cam) {
     float sinYaw, cosYaw;
     sincosf(cam.yaw, &sinYaw, &cosYaw);
 
@@ -88,7 +89,9 @@
     return Result;
 }
 
-RenderTopView::RenderTopView(android::sp<IEvsEnumerator> enumerator,
+}  // namespace
+
+RenderTopView::RenderTopView(std::shared_ptr<IEvsEnumerator> enumerator,
                              const std::vector<ConfigManager::CameraInfo>& camList,
                              const ConfigManager& mConfig) :
       mEnumerator(enumerator), mConfig(mConfig) {
diff --git a/cpp/evs/apps/default/StreamHandler.cpp b/cpp/evs/apps/default/src/StreamHandler.cpp
similarity index 61%
rename from cpp/evs/apps/default/StreamHandler.cpp
rename to cpp/evs/apps/default/src/StreamHandler.cpp
index 28b3b9a..f37ecf5 100644
--- a/cpp/evs/apps/default/StreamHandler.cpp
+++ b/cpp/evs/apps/default/src/StreamHandler.cpp
@@ -16,6 +16,12 @@
 
 #include "StreamHandler.h"
 
+#include "Utils.h"
+
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/EvsEventDesc.h>
+#include <aidl/android/hardware/automotive/evs/EvsEventType.h>
+#include <aidlcommonsupport/NativeHandle.h>
 #include <android-base/logging.h>
 #include <cutils/native_handle.h>
 #include <ui/GraphicBufferAllocator.h>
@@ -23,12 +29,16 @@
 #include <stdio.h>
 #include <string.h>
 
-using ::android::hardware::automotive::evs::V1_0::EvsResult;
-using ::android::hardware::automotive::evs::V1_1::EvsEventType;
-using ::android::hardware::automotive::evs::V1_1::IEvsCameraStream;
+namespace {
 
-buffer_handle_t memHandle = nullptr;
-StreamHandler::StreamHandler(android::sp<IEvsCamera> pCamera, uint32_t numBuffers,
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::EvsEventDesc;
+using aidl::android::hardware::automotive::evs::EvsEventType;
+using aidl::android::hardware::automotive::evs::IEvsCamera;
+
+}  // namespace
+
+StreamHandler::StreamHandler(const std::shared_ptr<IEvsCamera>& pCamera, uint32_t numBuffers,
                              bool useOwnBuffers, android_pixel_format_t format, int32_t width,
                              int32_t height) :
       mCamera(pCamera), mUseOwnBuffers(useOwnBuffers) {
@@ -40,6 +50,7 @@
         mOwnBuffers.resize(numBuffers);
 
         // Acquire the graphics buffer allocator
+        buffer_handle_t memHandle = nullptr;
         android::GraphicBufferAllocator& alloc(android::GraphicBufferAllocator::get());
         const auto usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_RARELY |
                 GRALLOC_USAGE_SW_WRITE_OFTEN;
@@ -50,7 +61,7 @@
             if (result != android::NO_ERROR) {
                 LOG(ERROR) << __FUNCTION__ << " failed to allocate memory.";
             } else {
-                BufferDesc_1_1 buf;
+                BufferDesc buf;
                 AHardwareBuffer_Desc* pDesc =
                         reinterpret_cast<AHardwareBuffer_Desc*>(&buf.buffer.description);
                 pDesc->width = width;
@@ -60,18 +71,17 @@
                 pDesc->usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_RARELY |
                         GRALLOC_USAGE_SW_WRITE_OFTEN;
                 pDesc->stride = pixelsPerLine;
-                buf.buffer.nativeHandle = memHandle;
+                buf.buffer.handle = android::dupToAidl(memHandle);
                 buf.bufferId = i;  // Unique number to identify this buffer
-                mOwnBuffers[i] = buf;
+                mOwnBuffers[i] = std::move(buf);
             }
         }
 
         int delta = 0;
-        EvsResult result = EvsResult::OK;
-        pCamera->importExternalBuffers(mOwnBuffers, [&](auto _result, auto _delta) {
-            result = _result;
-            delta = _delta;
-        });
+        if (auto status = pCamera->importExternalBuffers(mOwnBuffers, &delta); !status.isOk()) {
+            PLOG(ERROR) << "Failed to import buffers.";
+            return;
+        }
 
         LOG(INFO) << delta << " buffers are imported by EVS.";
     }
@@ -85,37 +95,41 @@
     // our remote object references so they can be freed
     mCamera = nullptr;
 
-    if (mUseOwnBuffers) {
-        android::GraphicBufferAllocator& alloc(android::GraphicBufferAllocator::get());
-        for (auto& b : mOwnBuffers) {
-            alloc.free(b.buffer.nativeHandle);
-        }
-
-        mOwnBuffers.resize(0);
+    if (!mUseOwnBuffers) {
+        return;
     }
+
+    android::GraphicBufferAllocator& alloc(android::GraphicBufferAllocator::get());
+    for (auto& b : mOwnBuffers) {
+        alloc.free(android::makeFromAidl(b.buffer.handle));
+    }
+
+    mOwnBuffers.resize(0);
 }
 
 bool StreamHandler::startStream() {
-    std::unique_lock<std::mutex> lock(mLock);
-
-    if (!mRunning) {
-        // Tell the camera to start streaming
-        Return<EvsResult> result = mCamera->startVideoStream(this);
-        if (result != EvsResult::OK) {
-            return false;
-        }
-
-        // Mark ourselves as running
-        mRunning = true;
+    std::lock_guard lock(mLock);
+    if (mRunning) {
+        return true;
     }
 
+    // Tell the camera to start streaming
+    if (auto status = mCamera->startVideoStream(ref<StreamHandler>()); !status.isOk()) {
+        LOG(ERROR) << "Failed to request a video stream.";
+        return false;
+    }
+
+    // Mark ourselves as running
+    mRunning = true;
     return true;
 }
 
 void StreamHandler::asyncStopStream() {
     // Tell the camera to stop streaming.
     // This will result in a null frame being delivered when the stream actually stops.
-    mCamera->stopVideoStream();
+    if (auto status = mCamera->stopVideoStream(); !status.isOk()) {
+        LOG(WARNING) << "Failed to stop a video stream.";
+    }
 }
 
 void StreamHandler::blockingStopStream() {
@@ -123,24 +137,24 @@
     asyncStopStream();
 
     // Wait until the stream has actually stopped
-    std::unique_lock<std::mutex> lock(mLock);
+    std::unique_lock lock(mLock);
     if (mRunning) {
         mSignal.wait(lock, [this]() { return !mRunning; });
     }
 }
 
 bool StreamHandler::isRunning() {
-    std::unique_lock<std::mutex> lock(mLock);
+    std::lock_guard lock(mLock);
     return mRunning;
 }
 
 bool StreamHandler::newFrameAvailable() {
-    std::unique_lock<std::mutex> lock(mLock);
+    std::lock_guard lock(mLock);
     return (mReadyBuffer >= 0);
 }
 
-const BufferDesc_1_1& StreamHandler::getNewFrame() {
-    std::unique_lock<std::mutex> lock(mLock);
+const BufferDesc& StreamHandler::getNewFrame() {
+    std::lock_guard lock(mLock);
 
     if (mHeldBuffer >= 0) {
         LOG(ERROR) << "Ignored call for new frame while still holding the old one.";
@@ -159,20 +173,25 @@
     return mBuffers[mHeldBuffer];
 }
 
-void StreamHandler::doneWithFrame(const BufferDesc_1_1& bufDesc_1_1) {
-    std::unique_lock<std::mutex> lock(mLock);
+void StreamHandler::doneWithFrame(const BufferDesc& bufDesc) {
+    std::lock_guard lock(mLock);
 
     // We better be getting back the buffer we original delivered!
-    if ((mHeldBuffer < 0) || (bufDesc_1_1.bufferId != mBuffers[mHeldBuffer].bufferId)) {
-        LOG(ERROR) << "StreamHandler::doneWithFrame got an unexpected bufDesc_1_1!";
+    if (mHeldBuffer < 0) {
+        // Safely ignores a call with an invalid buffer reference.
+        return;
+    }
+
+    if (bufDesc.bufferId != mBuffers[mHeldBuffer].bufferId) {
+        LOG(WARNING) << __FUNCTION__ << " ignores an unexpected buffer; expected = "
+                     << mBuffers[mHeldBuffer].bufferId << ", received = " << bufDesc.bufferId;
+        return;
     }
 
     // Send the buffer back to the underlying camera
-    hidl_vec<BufferDesc_1_1> frames;
-    frames.resize(1);
-    frames[0] = mBuffers[mHeldBuffer];
-    auto ret = mCamera->doneWithFrame_1_1(frames);
-    if (!ret.isOk()) {
+    std::vector<BufferDesc> frames(1);
+    frames[0] = std::move(mBuffers[mHeldBuffer]);
+    if (auto status = mCamera->doneWithFrame(frames); !status.isOk()) {
         LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
     }
 
@@ -180,59 +199,42 @@
     mHeldBuffer = -1;
 }
 
-Return<void> StreamHandler::deliverFrame(const BufferDesc_1_0& bufDesc_1_0) {
-    LOG(INFO) << "Ignores a frame delivered from v1.0 EVS service.";
-    auto ret = mCamera->doneWithFrame(bufDesc_1_0);
-    if (!ret.isOk()) {
-        LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
-    }
-
-    return Void();
-}
-
-Return<void> StreamHandler::deliverFrame_1_1(const hidl_vec<BufferDesc_1_1>& buffers) {
+ndk::ScopedAStatus StreamHandler::deliverFrame(const std::vector<BufferDesc>& buffers) {
     LOG(DEBUG) << "Received frames from the camera";
 
     // Take the lock to protect our frame slots and running state variable
-    std::unique_lock<std::mutex> lock(mLock);
-    BufferDesc_1_1 bufDesc = buffers[0];
-    if (bufDesc.buffer.nativeHandle.getNativeHandle() == nullptr) {
-        // Signal that the last frame has been received and the stream is stopped
-        LOG(WARNING) << "Invalid null frame (id: " << std::hex << bufDesc.bufferId
-                     << ") is ignored";
-    } else {
-        // Do we already have a "ready" frame?
-        if (mReadyBuffer >= 0) {
-            // Send the previously saved buffer back to the camera unused
-            hidl_vec<BufferDesc_1_1> frames;
-            frames.resize(1);
-            frames[0] = mBuffers[mReadyBuffer];
-            auto ret = mCamera->doneWithFrame_1_1(frames);
-            if (!ret.isOk()) {
-                LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
-            }
+    std::unique_lock lock(mLock);
+    const BufferDesc& bufferToUse = buffers[0];
 
-            // We'll reuse the same ready buffer index
-        } else if (mHeldBuffer >= 0) {
-            // The client is holding a buffer, so use the other slot for "on deck"
-            mReadyBuffer = 1 - mHeldBuffer;
-        } else {
-            // This is our first buffer, so just pick a slot
-            mReadyBuffer = 0;
+    // Do we already have a "ready" frame?
+    if (mReadyBuffer >= 0) {
+        // Send the previously saved buffer back to the camera unused
+        std::vector<BufferDesc> frames(1);
+        frames[0] = std::move(mBuffers[mReadyBuffer]);
+        if (auto status = mCamera->doneWithFrame(frames); !status.isOk()) {
+            LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
         }
 
-        // Save this frame until our client is interested in it
-        mBuffers[mReadyBuffer] = bufDesc;
+        // We'll reuse the same ready buffer index
+    } else if (mHeldBuffer >= 0) {
+        // The client is holding a buffer, so use the other slot for "on deck"
+        mReadyBuffer = 1 - mHeldBuffer;
+    } else {
+        // This is our first buffer, so just pick a slot
+        mReadyBuffer = 0;
     }
 
-    // Notify anybody who cares that things have changed
-    lock.unlock();
-    mSignal.notify_all();
+    // Save this frame until our client is interested in it
+    mBuffers[mReadyBuffer] = dupBufferDesc(bufferToUse);
 
-    return Void();
+    // Notify anybody who cares that things have changed
+    mSignal.notify_all();
+    lock.unlock();
+
+    return ndk::ScopedAStatus::ok();
 }
 
-Return<void> StreamHandler::notify(const EvsEventDesc& event) {
+ndk::ScopedAStatus StreamHandler::notify(const EvsEventDesc& event) {
     switch (event.aType) {
         case EvsEventType::STREAM_STOPPED: {
             {
@@ -264,5 +266,5 @@
             break;
     }
 
-    return Void();
+    return ndk::ScopedAStatus::ok();
 }
diff --git a/cpp/evs/apps/default/TexWrapper.cpp b/cpp/evs/apps/default/src/TexWrapper.cpp
similarity index 100%
rename from cpp/evs/apps/default/TexWrapper.cpp
rename to cpp/evs/apps/default/src/TexWrapper.cpp
diff --git a/cpp/evs/apps/default/src/Utils.cpp b/cpp/evs/apps/default/src/Utils.cpp
new file mode 100644
index 0000000..47e7356
--- /dev/null
+++ b/cpp/evs/apps/default/src/Utils.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils.h"
+
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidlcommonsupport/NativeHandle.h>
+#include <android-base/logging.h>
+
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::common::NativeHandle;
+using aidl::android::hardware::graphics::common::HardwareBuffer;
+
+NativeHandle dupNativeHandle(const NativeHandle& handle) {
+    NativeHandle dup;
+
+    dup.fds = std::vector<::ndk::ScopedFileDescriptor>(handle.fds.size());
+    const size_t n = handle.fds.size();
+    for (size_t i = 0; i < n; ++i) {
+        dup.fds[i] = std::move(handle.fds[i].dup());
+    }
+    dup.ints = handle.ints;
+
+    return std::move(dup);
+}
+
+HardwareBuffer dupHardwareBuffer(const HardwareBuffer& buffer) {
+    HardwareBuffer dup = {
+            .description = buffer.description,
+            .handle = dupNativeHandle(buffer.handle),
+    };
+
+    return std::move(dup);
+}
+
+}  // namespace
+
+BufferDesc dupBufferDesc(const BufferDesc& src) {
+    BufferDesc dup = {
+            .buffer = dupHardwareBuffer(src.buffer),
+            .pixelSizeBytes = src.pixelSizeBytes,
+            .bufferId = src.bufferId,
+            .deviceId = src.deviceId,
+            .timestamp = src.timestamp,
+            .metadata = src.metadata,
+    };
+
+    return std::move(dup);
+}
+
+native_handle_t* getNativeHandle(const BufferDesc& buffer) {
+    native_handle_t* nativeHandle = android::makeFromAidl(buffer.buffer.handle);
+    if (nativeHandle == nullptr ||
+        !std::all_of(nativeHandle->data + 0, nativeHandle->data + nativeHandle->numFds,
+                     [](int fd) { return fd >= 0; })) {
+        LOG(ERROR) << "Buffer " << buffer.bufferId << " contains an invalid native handle.";
+        free(nativeHandle);
+        return nullptr;
+    }
+
+    return nativeHandle;
+}
diff --git a/cpp/evs/apps/default/VideoTex.cpp b/cpp/evs/apps/default/src/VideoTex.cpp
similarity index 68%
rename from cpp/evs/apps/default/VideoTex.cpp
rename to cpp/evs/apps/default/src/VideoTex.cpp
index df795c5..07abbee 100644
--- a/cpp/evs/apps/default/VideoTex.cpp
+++ b/cpp/evs/apps/default/src/VideoTex.cpp
@@ -15,10 +15,14 @@
  */
 #include "VideoTex.h"
 
+#include "Utils.h"
 #include "glError.h"
 
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidlcommonsupport/NativeHandle.h>
 #include <android-base/logging.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
+#include <android-base/scopeguard.h>
 #include <ui/GraphicBuffer.h>
 
 #include <alloca.h>
@@ -29,15 +33,18 @@
 #include <sys/ioctl.h>
 #include <unistd.h>
 
-#include <vector>
+namespace {
 
-// Eventually we shouldn't need this dependency, but for now the
-// graphics allocator interface isn't fully supported on all platforms
-// and this is our work around.
-using ::android::GraphicBuffer;
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::IEvsCamera;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::evs::Stream;
+using android::GraphicBuffer;
 
-VideoTex::VideoTex(android::sp<IEvsEnumerator> pEnum, android::sp<IEvsCamera> pCamera,
-                   android::sp<StreamHandler> pStreamHandler, EGLDisplay glDisplay) :
+}  // namespace
+
+VideoTex::VideoTex(std::shared_ptr<IEvsEnumerator> pEnum, std::shared_ptr<IEvsCamera> pCamera,
+                   std::shared_ptr<StreamHandler> pStreamHandler, EGLDisplay glDisplay) :
       TexWrapper(),
       mEnumerator(pEnum),
       mCamera(pCamera),
@@ -68,7 +75,7 @@
     }
 
     // If we already have an image backing us, then it's time to return it
-    if (mImageBuffer.buffer.nativeHandle.getNativeHandle() != nullptr) {
+    if (getNativeHandle(mImageBuffer) != nullptr) {
         // Drop our device texture image
         if (mKHRimage != EGL_NO_IMAGE_KHR) {
             eglDestroyImageKHR(mDisplay, mKHRimage);
@@ -80,17 +87,25 @@
     }
 
     // Get the new image we want to use as our contents
-    mImageBuffer = mStreamHandler->getNewFrame();
+    mImageBuffer = dupBufferDesc(mStreamHandler->getNewFrame());
 
     // create a GraphicBuffer from the existing handle
+    native_handle_t* nativeHandle = getNativeHandle(mImageBuffer);
+    const auto handleGuard =
+            android::base::make_scope_guard([nativeHandle] { free(nativeHandle); });
+    if (nativeHandle == nullptr) {
+        // New frame contains an invalid native handle.
+        return false;
+    }
+
     const AHardwareBuffer_Desc* pDesc =
             reinterpret_cast<const AHardwareBuffer_Desc*>(&mImageBuffer.buffer.description);
-    android::sp<GraphicBuffer> pGfxBuffer =
-            new GraphicBuffer(mImageBuffer.buffer.nativeHandle, GraphicBuffer::CLONE_HANDLE,
-                              pDesc->width, pDesc->height, pDesc->format,
+    android::sp<GraphicBuffer> pGfxBuffer =  // AHardwareBuffer_to_GraphicBuffer?
+            new GraphicBuffer(nativeHandle, GraphicBuffer::CLONE_HANDLE, pDesc->width,
+                              pDesc->height, pDesc->format,
                               1,  // pDesc->layers,
                               GRALLOC_USAGE_HW_TEXTURE, pDesc->stride);
-    if (pGfxBuffer.get() == nullptr) {
+    if (!pGfxBuffer) {
         LOG(ERROR) << "Failed to allocate GraphicBuffer to wrap image handle";
         // Returning "true" in this error condition because we already released the
         // previous image (if any) and so the texture may change in unpredictable ways now!
@@ -124,35 +139,27 @@
     return true;
 }
 
-VideoTex* createVideoTexture(android::sp<IEvsEnumerator> pEnum, const char* evsCameraId,
+VideoTex* createVideoTexture(const std::shared_ptr<IEvsEnumerator>& pEnum, const char* evsCameraId,
                              std::unique_ptr<Stream> streamCfg, EGLDisplay glDisplay,
                              bool useExternalMemory, android_pixel_format_t format) {
     // Set up the camera to feed this texture
-    android::sp<IEvsCamera> pCamera = nullptr;
-    android::sp<StreamHandler> pStreamHandler = nullptr;
-    if (streamCfg != nullptr) {
-        pCamera = pEnum->openCamera_1_1(evsCameraId, *streamCfg);
-
-        // Initialize the stream that will help us update this texture's contents
-        pStreamHandler =
-                new StreamHandler(pCamera,
-                                  2,  // number of buffers
-                                  useExternalMemory, format, streamCfg->width, streamCfg->height);
-    } else {
-        pCamera = IEvsCamera::castFrom(pEnum->openCamera(evsCameraId)).withDefault(nullptr);
-
-        // Initialize the stream with the default resolution
-        pStreamHandler = new StreamHandler(pCamera,
-                                           2,  // number of buffers
-                                           useExternalMemory, format);
-    }
-
-    if (pCamera == nullptr) {
-        LOG(ERROR) << "Failed to allocate new EVS Camera interface for " << evsCameraId;
+    std::shared_ptr<IEvsCamera> pCamera;
+    std::shared_ptr<StreamHandler> pStreamHandler;
+    if (!streamCfg) {
+        LOG(ERROR) << "Given stream configuration is invalid.";
         return nullptr;
     }
 
-    if (pStreamHandler == nullptr) {
+    if (auto status = pEnum->openCamera(evsCameraId, *streamCfg, &pCamera); !status.isOk()) {
+        LOG(ERROR) << "Failed to open a camera " << evsCameraId;
+        return nullptr;
+    }
+
+    // Initialize the stream that will help us update this texture's contents
+    pStreamHandler =
+            ndk::SharedRefBase::make<StreamHandler>(pCamera, /* numBuffers= */ 2, useExternalMemory,
+                                                    format, streamCfg->width, streamCfg->height);
+    if (!pStreamHandler) {
         LOG(ERROR) << "Failed to allocate FrameHandler";
         return nullptr;
     }
diff --git a/cpp/evs/apps/default/evs_app.cpp b/cpp/evs/apps/default/src/evs_app.cpp
similarity index 82%
rename from cpp/evs/apps/default/evs_app.cpp
rename to cpp/evs/apps/default/src/evs_app.cpp
index 27bca9f..d4385d5 100644
--- a/cpp/evs/apps/default/evs_app.cpp
+++ b/cpp/evs/apps/default/src/evs_app.cpp
@@ -18,17 +18,16 @@
 #include "EvsStateControl.h"
 #include "EvsVehicleListener.h"
 
+#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
 #include <aidl/android/hardware/automotive/vehicle/SubscribeOptions.h>
 #include <aidl/android/hardware/automotive/vehicle/VehicleGear.h>
 #include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
 #include <android-base/logging.h>
-#include <android-base/macros.h>  // arraysize
 #include <android-base/strings.h>
-#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-#include <hidl/HidlTransportSupport.h>
-#include <hwbinder/IPCThreadState.h>
-#include <hwbinder/ProcessState.h>
+#include <android/binder_ibinder.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
 #include <utils/Errors.h>
 #include <utils/Log.h>
 #include <utils/StrongPointer.h>
@@ -39,27 +38,23 @@
 
 namespace {
 
-using ::aidl::android::hardware::automotive::vehicle::VehicleGear;
-using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
-using ::android::base::EqualsIgnoreCase;
+using aidl::android::hardware::automotive::evs::IEvsDisplay;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::vehicle::VehicleGear;
+using aidl::android::hardware::automotive::vehicle::VehicleProperty;
+using android::base::EqualsIgnoreCase;
+using android::frameworks::automotive::vhal::ISubscriptionClient;
+using android::frameworks::automotive::vhal::IVhalClient;
 
-// libhidl:
-using ::android::frameworks::automotive::vhal::ISubscriptionClient;
-using ::android::frameworks::automotive::vhal::IVhalClient;
-using ::android::hardware::configureRpcThreadpool;
-using ::android::hardware::joinRpcThreadpool;
+const char CONFIG_DEFAULT_PATH[] = "/system/etc/automotive/evs/config.json";
+const char CONFIG_OVERRIDE_PATH[] = "/system/etc/automotive/evs/config_override.json";
 
-const char* CONFIG_DEFAULT_PATH = "/system/etc/automotive/evs/config.json";
-const char* CONFIG_OVERRIDE_PATH = "/system/etc/automotive/evs/config_override.json";
-
-android::sp<IEvsEnumerator> pEvs;
-android::sp<IEvsDisplay> pDisplay;
+std::shared_ptr<IEvsEnumerator> pEvsService;
+std::shared_ptr<IEvsDisplay> pDisplay;
 EvsStateControl* pStateController;
 
-}  // namespace
-
-// Helper to subscribe to VHal notifications
-static bool subscribeToVHal(ISubscriptionClient* client, VehicleProperty propertyId) {
+// Helper to subscribe to Vhal notifications
+bool subscribeToVHal(ISubscriptionClient* client, VehicleProperty propertyId) {
     assert(pVnet != nullptr);
     assert(listener != nullptr);
 
@@ -80,7 +75,7 @@
     return true;
 }
 
-static bool convertStringToFormat(const char* str, android_pixel_format_t* output) {
+bool convertStringToFormat(const char* str, android_pixel_format_t* output) {
     bool result = true;
     if (EqualsIgnoreCase(str, "RGBA8888")) {
         *output = HAL_PIXEL_FORMAT_RGBA_8888;
@@ -97,6 +92,8 @@
     return result;
 }
 
+}  // namespace
+
 // Main entry point
 int main(int argc, char** argv) {
     LOG(INFO) << "EVS app starting";
@@ -192,16 +189,28 @@
     // This pool will handle the EvsCameraStream callbacks.
     // Note:  This _will_ run in parallel with the EvsListener run() loop below which
     // runs the application logic that reacts to the async events.
-    configureRpcThreadpool(1, false /* callerWillJoin */);
+    if (!ABinderProcess_setThreadPoolMaxThreadCount(/* numThreads= */ 1)) {
+        LOG(ERROR) << "Failed to confgiure the binder thread pool.";
+        return EXIT_FAILURE;
+    }
+    ABinderProcess_startThreadPool();
 
     // Construct our async helper object
     std::shared_ptr<EvsVehicleListener> pEvsListener = std::make_shared<EvsVehicleListener>();
 
     // Get the EVS manager service
     LOG(INFO) << "Acquiring EVS Enumerator";
-    pEvs = IEvsEnumerator::getService(evsServiceName);
-    if (pEvs.get() == nullptr) {
-        LOG(ERROR) << "getService(" << evsServiceName << ") returned NULL.  Exiting.";
+    std::string serviceName =
+            std::string(IEvsEnumerator::descriptor) + "/" + std::string(evsServiceName);
+    if (!AServiceManager_isDeclared(serviceName.c_str())) {
+        LOG(ERROR) << serviceName << " is not declared. Exiting.";
+        return EXIT_FAILURE;
+    }
+
+    pEvsService = IEvsEnumerator::fromBinder(
+            ndk::SpAIBinder(AServiceManager_checkService(serviceName.c_str())));
+    if (!pEvsService) {
+        LOG(ERROR) << "Failed to get " << serviceName << ". Exiting.";
         return EXIT_FAILURE;
     }
 
@@ -215,8 +224,7 @@
         return EXIT_FAILURE;
     }
 
-    pDisplay = pEvs->openDisplay_1_1(displayId);
-    if (pDisplay.get() == nullptr) {
+    if (auto status = pEvsService->openDisplay(displayId, &pDisplay); !status.isOk()) {
         LOG(ERROR) << "EVS Display unavailable.  Exiting.";
         return EXIT_FAILURE;
     }
@@ -253,7 +261,7 @@
 
     // Configure ourselves for the current vehicle state at startup
     LOG(INFO) << "Constructing state controller";
-    pStateController = new EvsStateControl(pVnet, pEvs, pDisplay, config);
+    pStateController = new EvsStateControl(pVnet, pEvsService, pDisplay, config);
     if (!pStateController->startUpdateLoop()) {
         LOG(ERROR) << "Initial configuration failed.  Exiting.";
         return EXIT_FAILURE;
diff --git a/cpp/evs/apps/default/glError.cpp b/cpp/evs/apps/default/src/glError.cpp
similarity index 100%
rename from cpp/evs/apps/default/glError.cpp
rename to cpp/evs/apps/default/src/glError.cpp
diff --git a/cpp/evs/apps/default/shader.cpp b/cpp/evs/apps/default/src/shader.cpp
similarity index 85%
rename from cpp/evs/apps/default/shader.cpp
rename to cpp/evs/apps/default/src/shader.cpp
index aa993c0..90fd1d0 100644
--- a/cpp/evs/apps/default/shader.cpp
+++ b/cpp/evs/apps/default/src/shader.cpp
@@ -100,27 +100,30 @@
         return 0;
     }
 
-#if 0  // Debug output to diagnose shader parameters
+#if defined(DEBUG)  // Debug output to diagnose shader parameters
     GLint numShaderParams;
     GLchar paramName[128];
     GLint paramSize;
     GLenum paramType;
-    const char *typeName = "?";
+    const char* typeName = "?";
     printf("Shader parameters for %s:\n", name);
     glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numShaderParams);
-    for (GLint i=0; i<numShaderParams; i++) {
-        glGetActiveUniform(program,
-                           i,
-                           sizeof(paramName),
-                           nullptr,
-                           &paramSize,
-                           &paramType,
+    for (GLint i = 0; i < numShaderParams; i++) {
+        glGetActiveUniform(program, i, sizeof(paramName), nullptr, &paramSize, &paramType,
                            paramName);
         switch (paramType) {
-            case GL_FLOAT:      typeName = "GL_FLOAT"; break;
-            case GL_FLOAT_VEC4: typeName = "GL_FLOAT_VEC4"; break;
-            case GL_FLOAT_MAT4: typeName = "GL_FLOAT_MAT4"; break;
-            case GL_SAMPLER_2D: typeName = "GL_SAMPLER_2D"; break;
+            case GL_FLOAT:
+                typeName = "GL_FLOAT";
+                break;
+            case GL_FLOAT_VEC4:
+                typeName = "GL_FLOAT_VEC4";
+                break;
+            case GL_FLOAT_MAT4:
+                typeName = "GL_FLOAT_MAT4";
+                break;
+            case GL_SAMPLER_2D:
+                typeName = "GL_SAMPLER_2D";
+                break;
         }
 
         printf("  %2d: %s\t (%d) of type %s(%d)\n", i, paramName, paramSize, typeName, paramType);
diff --git a/cpp/watchdog/server/src/WatchdogProcessService.cpp b/cpp/watchdog/server/src/WatchdogProcessService.cpp
index 914d462..01c746e 100644
--- a/cpp/watchdog/server/src/WatchdogProcessService.cpp
+++ b/cpp/watchdog/server/src/WatchdogProcessService.cpp
@@ -71,6 +71,7 @@
 using ::android::binder::Status;
 using ::android::frameworks::automotive::vhal::HalPropError;
 using ::android::frameworks::automotive::vhal::IHalPropValue;
+using ::android::frameworks::automotive::vhal::ISubscriptionClient;
 using ::android::frameworks::automotive::vhal::IVhalClient;
 using ::android::hardware::hidl_vec;
 using ::android::hardware::interfacesEqual;
@@ -535,39 +536,45 @@
 }
 
 void WatchdogProcessService::terminate() {
-    Mutex::Autolock lock(mMutex);
-    if (!mServiceStarted) {
-        return;
-    }
-    for (auto& [_, clients] : mClientsByTimeout) {
-        for (auto& [_, client] : clients) {
-            client.unlinkToDeath(mBinderDeathRecipient.get());
+    std::unique_ptr<ISubscriptionClient> propertySubscriptionClient;
+    {
+        Mutex::Autolock lock(mMutex);
+        if (!mServiceStarted) {
+            return;
         }
-        clients.clear();
+        for (auto& [_, clients] : mClientsByTimeout) {
+            for (auto& [_, client] : clients) {
+                client.unlinkToDeath(mBinderDeathRecipient.get());
+            }
+            clients.clear();
+        }
+        mClientsByTimeout.clear();
+        mWatchdogServiceHelper.clear();
+        if (mMonitor != nullptr) {
+            AIBinder* aiBinder = mMonitor->asBinder().get();
+            mDeathRegistrationWrapper->unlinkToDeath(aiBinder, mBinderDeathRecipient.get(),
+                                                     static_cast<void*>(aiBinder));
+            mMonitor.reset();
+        }
+        mHandlerLooper->removeMessages(mMessageHandler, MSG_VHAL_HEALTH_CHECK);
+        mServiceStarted = false;
+        if (mVhalService == nullptr) {
+            return;
+        }
+        if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) == 0) {
+            propertySubscriptionClient =
+                    mVhalService->getSubscriptionClient(mPropertyChangeListener);
+        }
+        mVhalService->removeOnBinderDiedCallback(mOnBinderDiedCallback);
+        mVhalService.reset();
     }
-    mClientsByTimeout.clear();
-    mWatchdogServiceHelper.clear();
-    if (mMonitor != nullptr) {
-        AIBinder* aiBinder = mMonitor->asBinder().get();
-        mDeathRegistrationWrapper->unlinkToDeath(aiBinder, mBinderDeathRecipient.get(),
-                                                 static_cast<void*>(aiBinder));
-        mMonitor.reset();
-    }
-    mHandlerLooper->removeMessages(mMessageHandler, MSG_VHAL_HEALTH_CHECK);
-    mServiceStarted = false;
-    if (mVhalService == nullptr) {
-        return;
-    }
-    if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) == 0) {
+    if (propertySubscriptionClient != nullptr) {
         std::vector<int32_t> propIds = {static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)};
-        auto result =
-                mVhalService->getSubscriptionClient(mPropertyChangeListener)->unsubscribe(propIds);
+        auto result = propertySubscriptionClient->unsubscribe(propIds);
         if (!result.ok()) {
             ALOGW("Failed to unsubscribe from VHAL_HEARTBEAT.");
         }
     }
-    mVhalService->removeOnBinderDiedCallback(mOnBinderDiedCallback);
-    mVhalService.reset();
 }
 
 ScopedAStatus WatchdogProcessService::registerClient(const ClientInfo& clientInfo,
@@ -839,25 +846,29 @@
 }
 
 Result<void> WatchdogProcessService::updateVhal(const VehiclePropValue& value) {
-    Mutex::Autolock lock(mMutex);
-    const auto& connectRet = connectToVhalLocked();
+    const auto& connectRet = connectToVhal();
     if (!connectRet.ok()) {
         std::string errorMsg = "VHAL is not connected: " + connectRet.error().message();
         ALOGW("%s", errorMsg.c_str());
         return Error() << errorMsg;
     }
     int32_t propId = value.prop;
-    if (mNotSupportedVhalProperties.count(static_cast<VehicleProperty>(propId)) > 0) {
-        std::string errorMsg = StringPrintf("VHAL doesn't support property(id: %d)", propId);
-        ALOGW("%s", errorMsg.c_str());
-        return Error() << errorMsg;
+    std::shared_ptr<IVhalClient> vhalService;
+    {
+        Mutex::Autolock lock(mMutex);
+        if (mNotSupportedVhalProperties.count(static_cast<VehicleProperty>(propId)) > 0) {
+            std::string errorMsg = StringPrintf("VHAL doesn't support property(id: %d)", propId);
+            ALOGW("%s", errorMsg.c_str());
+            return Error() << errorMsg;
+        }
+        vhalService = mVhalService;
     }
 
-    auto halPropValue = mVhalService->createHalPropValue(propId);
+    auto halPropValue = vhalService->createHalPropValue(propId);
     halPropValue->setInt32Values(value.value.int32Values);
     halPropValue->setInt64Values(value.value.int64Values);
     halPropValue->setStringValue(value.value.stringValue);
-    if (auto result = mVhalService->setValueSync(*halPropValue); !result.ok()) {
+    if (auto result = vhalService->setValueSync(*halPropValue); !result.ok()) {
         return Error() << "Failed to set propValue(" << propId
                        << ") to VHAL, error: " << result.error().message();
     }
@@ -876,55 +887,65 @@
     return Error() << "Failed to read " << cmdLinePath;
 }
 
-Result<void> WatchdogProcessService::connectToVhalLocked() {
-    if (mVhalService != nullptr) {
-        return {};
+Result<void> WatchdogProcessService::connectToVhal() {
+    {
+        Mutex::Autolock lock(mMutex);
+        if (mVhalService != nullptr) {
+            return {};
+        }
+        mVhalService = IVhalClient::tryCreate();
+        if (mVhalService == nullptr) {
+            return Error() << "Failed to connect to VHAL.";
+        }
+        mVhalService->addOnBinderDiedCallback(mOnBinderDiedCallback);
     }
-    mVhalService = IVhalClient::tryCreate();
-    if (mVhalService == nullptr) {
-        return Error() << "Failed to connect to VHAL.";
-    }
-    mVhalService->addOnBinderDiedCallback(mOnBinderDiedCallback);
-    queryVhalPropertiesLocked();
-    subscribeToVhalHeartBeatLocked();
+    queryVhalProperties();
+    subscribeToVhalHeartBeat();
     ALOGI("Successfully connected to VHAL.");
     return {};
 }
 
-void WatchdogProcessService::queryVhalPropertiesLocked() {
-    mNotSupportedVhalProperties.clear();
+void WatchdogProcessService::queryVhalProperties() {
+    std::shared_ptr<IVhalClient> vhalService;
+    {
+        Mutex::Autolock lock(mMutex);
+        vhalService = mVhalService;
+    }
+    std::unordered_set<VehicleProperty> notSupportedProperties;
     std::vector<VehicleProperty> propIds = {VehicleProperty::WATCHDOG_ALIVE,
                                             VehicleProperty::WATCHDOG_TERMINATED_PROCESS,
                                             VehicleProperty::VHAL_HEARTBEAT};
     for (const auto& propId : propIds) {
-        if (!isVhalPropertySupportedLocked(propId)) {
-            mNotSupportedVhalProperties.insert(propId);
+        if (auto result = vhalService->getPropConfigs({static_cast<int32_t>(propId)});
+            !result.ok()) {
+            notSupportedProperties.insert(propId);
         }
     }
-}
-
-bool WatchdogProcessService::isVhalPropertySupportedLocked(VehicleProperty propId) {
-    auto result = mVhalService->getPropConfigs({static_cast<int32_t>(propId)});
-    return result.ok();
-}
-
-void WatchdogProcessService::subscribeToVhalHeartBeatLocked() {
-    if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) > 0) {
-        ALOGW("VHAL doesn't support VHAL_HEARTBEAT. Checking VHAL health is disabled.");
-        return;
+    {
+        Mutex::Autolock lock(mMutex);
+        mNotSupportedVhalProperties = std::move(notSupportedProperties);
     }
+}
 
-    mVhalHeartBeat = {
-            .eventTime = 0,
-            .value = 0,
-    };
+void WatchdogProcessService::subscribeToVhalHeartBeat() {
+    std::unique_ptr<ISubscriptionClient> propertySubscriptionClient;
+    {
+        Mutex::Autolock lock(mMutex);
+        if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) > 0) {
+            ALOGW("VHAL doesn't support VHAL_HEARTBEAT. Checking VHAL health is disabled.");
+            return;
+        }
 
+        mVhalHeartBeat = {
+                .eventTime = 0,
+                .value = 0,
+        };
+        propertySubscriptionClient = mVhalService->getSubscriptionClient(mPropertyChangeListener);
+    }
     std::vector<SubscribeOptions> options = {
             {.propId = static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT), .areaIds = {}},
     };
-    if (auto result =
-                mVhalService->getSubscriptionClient(mPropertyChangeListener)->subscribe(options);
-        !result.ok()) {
+    if (auto result = propertySubscriptionClient->subscribe(options); !result.ok()) {
         ALOGW("Failed to subscribe to VHAL_HEARTBEAT. Checking VHAL health is disabled. '%s'",
               result.error().message().c_str());
         return;
diff --git a/cpp/watchdog/server/src/WatchdogProcessService.h b/cpp/watchdog/server/src/WatchdogProcessService.h
index 5a942e0..d76f235 100644
--- a/cpp/watchdog/server/src/WatchdogProcessService.h
+++ b/cpp/watchdog/server/src/WatchdogProcessService.h
@@ -249,8 +249,8 @@
     int32_t getNewSessionId();
     android::base::Result<void> updateVhal(
             const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
-    android::base::Result<void> connectToVhalLocked();
-    void subscribeToVhalHeartBeatLocked();
+    android::base::Result<void> connectToVhal();
+    void subscribeToVhalHeartBeat();
     std::optional<aidl::android::automotive::watchdog::internal::ProcessIdentifier>
     cacheVhalProcessIdentifier();
     void reportWatchdogAliveToVhal();
@@ -259,9 +259,7 @@
                     processesNotResponding);
     android::base::Result<std::string> readProcCmdLine(int32_t pid);
     void handleVhalDeath();
-    void queryVhalPropertiesLocked();
-    bool isVhalPropertySupportedLocked(
-            aidl::android::hardware::automotive::vehicle::VehicleProperty propId);
+    void queryVhalProperties();
     void updateVhalHeartBeat(int64_t value);
     void checkVhalHealth();
     void terminateVhal();
diff --git a/service-builtin/src/com/android/car/CarService.java b/service-builtin/src/com/android/car/CarService.java
index 30f57b9..42c3636 100644
--- a/service-builtin/src/com/android/car/CarService.java
+++ b/service-builtin/src/com/android/car/CarService.java
@@ -18,10 +18,19 @@
 
 import android.content.Intent;
 
+import com.android.internal.os.BinderInternal;
+
 /** Proxy service for CarServciceImpl */
 public class CarService extends ServiceProxy {
+
+    // Binder threads are set to 31. system_server is also using 31.
+    // check sMaxBinderThreads in SystemServer.java
+    private  static final int MAX_BINDER_THREADS = 31;
+
     public CarService() {
         super(UpdatablePackageDependency.CAR_SERVICE_IMPL_CLASS);
+        // Increase the number of binder threads in car service
+        BinderInternal.setMaxThreads(MAX_BINDER_THREADS);
     }
 
     @Override
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index f701543..82b530a 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -529,4 +529,9 @@
     <!-- Related to OEM customization service. Default timeout for critical calls made by CarService
          to OEM service. After this timeout, CarService would itself and OEM Service. -->
     <integer name="config_oemCarService_crashCall_timeout_ms">10000</integer>
+
+    <!-- Related to OEM customization service. Default thread pool size for communicating with the
+         OEM Service. The value can only be between 8 and 16. If value is higher than 16, thread
+         pool size will be 16. If value is lower than 8, thread pool size will be 8.-->
+    <integer name="config_oemCarService_thread_pool_size">8</integer>
 </resources>
diff --git a/service/res/values/overlayable.xml b/service/res/values/overlayable.xml
index 7b95ed1..7925093 100644
--- a/service/res/values/overlayable.xml
+++ b/service/res/values/overlayable.xml
@@ -115,6 +115,7 @@
           <item type="integer" name="config_oemCarService_serviceReady_timeout_ms"/>
           <item type="integer" name="config_oemCarService_regularCall_timeout_ms"/>
           <item type="integer" name="config_oemCarService_crashCall_timeout_ms"/>
+          <item type="integer" name="config_oemCarService_thread_pool_size"/>
           <!-- Params from config.xml that can be overlaid -->
 
           <!-- XML files that can be overlaid -->
diff --git a/service/src/com/android/car/oem/CarOemProxyService.java b/service/src/com/android/car/oem/CarOemProxyService.java
index 6db8436..380270d 100644
--- a/service/src/com/android/car/oem/CarOemProxyService.java
+++ b/service/src/com/android/car/oem/CarOemProxyService.java
@@ -46,6 +46,7 @@
 import com.android.car.R;
 import com.android.car.internal.util.IndentingPrintWriter;
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.ArrayList;
 import java.util.concurrent.CountDownLatch;
@@ -132,7 +133,17 @@
 
     private final IOemCarServiceCallback mOemCarServiceCallback = new IOemCarServiceCallbackImpl();
 
+    @VisibleForTesting
     public CarOemProxyService(Context context) {
+        this(context, null);
+    }
+
+    @VisibleForTesting
+    public CarOemProxyService(Context context, CarOemProxyServiceHelper helper) {
+        this(context, helper, null);
+    }
+
+    public CarOemProxyService(Context context, CarOemProxyServiceHelper helper, Handler handler) {
         // Bind to the OemCarService
         mContext = context;
         Resources res = mContext.getResources();
@@ -177,7 +188,7 @@
 
         Slogf.i(TAG, "Binding to Oem Service with intent: %s", intent);
         mHandlerThread = CarServiceUtils.getHandlerThread("car_oem_service");
-        mHandler = new Handler(mHandlerThread.getLooper());
+        mHandler = handler == null ? new Handler(mHandlerThread.getLooper()) : handler;
 
         mIsOemServiceBound = mContext.bindServiceAsUser(intent, mCarOemServiceConnection,
                 Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM);
@@ -190,7 +201,7 @@
             Slogf.e(TAG,
                     "Couldn't bound to OemCarService. Oem service feature is marked disabled.");
         }
-        mHelper = new CarOemProxyServiceHelper(mContext);
+        mHelper = helper ==  null ? new CarOemProxyServiceHelper(mContext) : helper;
     }
 
     private boolean isInvalidComponentName(Context context, String componentName) {
@@ -410,7 +421,7 @@
         if (!mIsOemServiceConnected) {
             Slogf.e(TAG, "OEM Service is not connected within: %dms, calling to crash CarService",
                     mOemServiceConnectionTimeoutMs);
-            mHelper.crashCarService("Timeout Exception");
+            mHelper.crashCarService("OEM Service not connected");
         }
     }
 
@@ -437,7 +448,7 @@
             if (!mIsOemServiceReady) {
                 Slogf.e(TAG, "OEM Service is not ready within: " + mOemServiceReadyTimeoutMs
                         + "ms, calling to crash CarService");
-                mHelper.crashCarService("Service not ready");
+                mHelper.crashCarService("OEM Service not ready");
             }
         }
         Slogf.i(TAG, "OEM Service is ready.");
diff --git a/service/src/com/android/car/oem/CarOemProxyServiceHelper.java b/service/src/com/android/car/oem/CarOemProxyServiceHelper.java
index ba19c94..1360435 100644
--- a/service/src/com/android/car/oem/CarOemProxyServiceHelper.java
+++ b/service/src/com/android/car/oem/CarOemProxyServiceHelper.java
@@ -63,15 +63,22 @@
 
     private static final int MAX_CIRCULAR_CALLS_PER_CALLER = 5;
     private static final int MAX_CIRCULAR_CALL_TOTAL = 10;
+    private static final int MAX_THREAD_POOL_SIZE = 16;
+    private static final int MIN_THREAD_POOL_SIZE = 18;
 
     private final Object mLock = new Object();
 
-    // TODO(b/239607518):Resize threadpool using system property or dynamically if too many calls
-    // are getting timed out.
-    private static final int THREAD_POOL_SIZE = 5;
-
     private final int mRegularCallTimeoutMs;
     private final int mCrashCallTimeoutMs;
+    // Kept for dumping
+    private final int mThreadPoolSizeFromRRO;
+
+    // Thread pool size will be read from resource overlay. The default value is 8. The maximum
+    // and minimum thread pool size can be MAX_THREAD_POOL_SIZE and MIN_THREAD_POOL_SIZE
+    // respectively. If resource overlay value is more than MAX_THREAD_POOL_SIZE, then thread
+    // pool size will be MAX_THREAD_POOL_SIZE. If resource overlay value is less than
+    // MIN_THREAD_POOL_SIZE, then thread pool size will be MIN_THREAD_POOL_SIZE.
+    private final int mBinderDispatchThreadPoolSize;
 
     /**
      * This map would keep track of possible circular calls
@@ -102,13 +109,26 @@
     private int mOemCarServicePid;
 
     public CarOemProxyServiceHelper(Context context) {
-        Slogf.i(TAG, "Creating thread pool of size %d", THREAD_POOL_SIZE);
-        mThreadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
         Resources res = context.getResources();
         mRegularCallTimeoutMs = res
                 .getInteger(R.integer.config_oemCarService_regularCall_timeout_ms);
         mCrashCallTimeoutMs = res
                 .getInteger(R.integer.config_oemCarService_crashCall_timeout_ms);
+        mThreadPoolSizeFromRRO = res
+                .getInteger(R.integer.config_oemCarService_thread_pool_size);
+        if (mThreadPoolSizeFromRRO > MAX_THREAD_POOL_SIZE) {
+            mBinderDispatchThreadPoolSize = MAX_THREAD_POOL_SIZE;
+        } else if (mThreadPoolSizeFromRRO < MIN_THREAD_POOL_SIZE) {
+            mBinderDispatchThreadPoolSize = MIN_THREAD_POOL_SIZE;
+        } else {
+            mBinderDispatchThreadPoolSize = mThreadPoolSizeFromRRO;
+        }
+
+        mThreadPool = Executors.newFixedThreadPool(mBinderDispatchThreadPoolSize);
+
+        Slogf.i(TAG, "RegularCallTimeoutMs: %d, CrashCallTimeoutMs: %d, ThreadPoolSizeFromRRO: %d,"
+                + " ThreadPoolSize: %d.", mRegularCallTimeoutMs,
+                mCrashCallTimeoutMs, mThreadPoolSizeFromRRO, mBinderDispatchThreadPoolSize);
     }
 
     /**
@@ -244,8 +264,6 @@
             Slogf.e(TAG, "Current Circular Calls for %s is %d which is more than the limit %d."
                     + " Calling to crash CarService", callerTag, (currentCircularCallForTag + 1),
                     MAX_CIRCULAR_CALLS_PER_CALLER);
-            // TODO(b/239607309): Research how to dump stack on OEM service for debugging if
-            // possible. One way is to get the OEM service stack as string from OEM service.
             crashCarService("Max Circular call for " + callerTag);
         }
 
@@ -418,6 +436,10 @@
                 }
                 writer.decreaseIndent();
             }
+            writer.printf("mRegularCallTimeoutMs: %d\n", mRegularCallTimeoutMs);
+            writer.printf("mCrashCallTimeoutMs: %d\n", mCrashCallTimeoutMs);
+            writer.printf("mBinderDispatchThreadPoolSize: %d\n", mBinderDispatchThreadPoolSize);
+            writer.printf("ThreadPoolSizeFromRRO: %d\n", mThreadPoolSizeFromRRO);
         }
         writer.decreaseIndent();
     }
diff --git a/tests/carservice_unit_test/src/com/android/car/oem/CarOemProxyServiceTest.java b/tests/carservice_unit_test/src/com/android/car/oem/CarOemProxyServiceTest.java
new file mode 100644
index 0000000..e9d2072
--- /dev/null
+++ b/tests/carservice_unit_test/src/com/android/car/oem/CarOemProxyServiceTest.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.oem;
+
+import static com.android.compatibility.common.util.SystemUtil.eventually;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.CarVersion;
+import android.car.builtin.content.pm.PackageManagerHelper;
+import android.car.oem.IOemCarAudioFocusService;
+import android.car.oem.IOemCarService;
+import android.car.oem.IOemCarServiceCallback;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.car.test.mocks.JavaMockitoHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.RemoteException;
+
+import com.android.car.R;
+import com.android.internal.annotations.GuardedBy;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+
+public final class CarOemProxyServiceTest extends AbstractExtendedMockitoTestCase {
+
+    private static final String COMPONENT_NAME = "android.car.test/unittest";
+
+    @Mock
+    private Context mContext;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private CarOemProxyServiceHelper mCarOemProxyServiceHelper;
+    @Captor
+    ArgumentCaptor<String> mReasonCapture;
+    @Captor
+    ArgumentCaptor<ServiceConnection> mConnectionCapture;
+
+    private final TestOemCarService mTestOemCarService = new TestOemCarService();
+
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+    @Override
+    protected void onSessionBuilder(CustomMockitoSessionBuilder session) {
+        session.spyStatic(PackageManagerHelper.class);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        mockCallTimeout(/* timeoutMs= */ 5000);
+    }
+
+    @Test
+    public void testFeatureDisabled() throws Exception {
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+
+        assertThat(carOemProxyService.isOemServiceEnabled()).isFalse();
+    }
+
+    @Test
+    public void testFeatureEnabled() throws Exception {
+        mockOemCarServiceComponent();
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+
+        assertThat(carOemProxyService.isOemServiceEnabled()).isTrue();
+        assertThat(carOemProxyService.getOemServiceName()).isEqualTo(COMPONENT_NAME);
+    }
+
+    @Test
+    public void testOemServiceCalledPriorToInit() throws Exception {
+        mockOemCarServiceComponent();
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+        mockServiceConnection();
+
+        assertThrows(IllegalStateException.class,
+                () -> carOemProxyService.getCarOemAudioFocusService());
+    }
+
+    @Test
+    public void testCarServiceCrash_oemNotConnected() throws Exception {
+        mockCallTimeout(/* timeoutMs= */ 100);
+        mockOemCarServiceComponent();
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext,
+                mCarOemProxyServiceHelper, mHandler);
+
+        //call will wait for OEM service connected
+        carOemProxyService.onInitComplete();
+        waitForHandlerThreadToFinish();
+
+        // First it will call crash with "OEM Service not connected", as it is mocked, it would
+        // continue with other calls.
+        verify(mCarOemProxyServiceHelper, times(2)).crashCarService(mReasonCapture.capture());
+        assertThat(mReasonCapture.getAllValues()).containsExactly("OEM Service not connected",
+                "OEM Service not ready");
+    }
+
+    @Test
+    public void testCarServiceCrash_oemNotReady() throws Exception {
+        mockCallTimeout(/* timeoutMs= */ 100);
+        mockOemCarServiceComponent();
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext,
+                mCarOemProxyServiceHelper, mHandler);
+        mockServiceConnection();
+
+        //call will wait for OEM service ready
+        carOemProxyService.onInitComplete();
+        waitForHandlerThreadToFinish();
+
+        verify(mCarOemProxyServiceHelper).crashCarService("OEM Service not ready");
+    }
+
+    @Test
+    public void testOemServiceIsReady() throws Exception {
+        mockOemCarServiceComponent();
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+        mockServiceConnection();
+        mockServiceReady();
+        carOemProxyService.onInitComplete();
+
+        eventually(() -> assertWithMessage("Oem Service not ready.")
+                .that(carOemProxyService.isOemServiceReady()).isTrue());
+
+        assertThat(carOemProxyService.getCarOemAudioFocusService()).isNull();
+    }
+
+    @Test
+    public void testCallbackWhenOemServiceIsReady() throws Exception {
+        CountDownLatch latch = new CountDownLatch(1);
+        mockOemCarServiceComponent();
+        CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+        mockServiceConnection();
+        mockServiceReady();
+
+        carOemProxyService.registerCallback(() -> latch.countDown());
+        carOemProxyService.onInitComplete();
+
+        JavaMockitoHelper.await(latch, 5000);
+    }
+
+    private void waitForHandlerThreadToFinish() {
+        int timeoutMs = 2000;
+        assertWithMessage("handler not idle in %sms", timeoutMs)
+                .that(mHandler.runWithScissors(() -> {}, timeoutMs)).isTrue();
+    }
+
+    private void mockServiceConnection() {
+        verify(mContext).bindServiceAsUser(any(), mConnectionCapture.capture(), anyInt(), any());
+        ServiceConnection connection = mConnectionCapture.getValue();
+        connection.onServiceConnected(ComponentName.unflattenFromString(COMPONENT_NAME),
+                mTestOemCarService);
+    }
+
+    private void mockOemCarServiceComponent() throws Exception {
+        when(mResources.getString(R.string.config_oemCarService)).thenReturn(COMPONENT_NAME);
+        // make it a valid component.
+        String packageName = ComponentName.unflattenFromString(COMPONENT_NAME).getPackageName();
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.applicationInfo = new ApplicationInfo();
+        when(mPackageManager.getPackageInfo(packageName, 0)).thenReturn(packageInfo);
+        doReturn(true).when(() -> PackageManagerHelper.isSystemApp(any()));
+        when(mContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenReturn(true);
+    }
+
+    private void mockCallTimeout(int timeoutMs) {
+        when(mResources.getInteger(R.integer.config_oemCarService_connection_timeout_ms))
+                .thenReturn(timeoutMs);
+        when(mResources.getInteger(R.integer.config_oemCarService_serviceReady_timeout_ms))
+                .thenReturn(timeoutMs);
+    }
+
+    private void mockServiceReady() throws Exception {
+        mTestOemCarService.mockServiceReady();
+    }
+
+    private final class TestOemCarService extends IOemCarService.Stub {
+
+        private final Object mLock = new Object();
+
+        @GuardedBy("mLock")
+        private boolean mMockedServiceReady;
+
+        public void mockServiceReady() {
+            synchronized (mLock) {
+                mMockedServiceReady = true;
+            }
+        }
+
+        @Override
+        public IOemCarAudioFocusService getOemAudioFocusService() {
+            return null;
+        }
+
+        @Override
+        public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+        }
+
+        @Override
+        public CarVersion getSupportedCarVersion() {
+            return CarVersion.VERSION_CODES.TIRAMISU_2;
+        }
+
+        @Override
+        public void onCarServiceReady(IOemCarServiceCallback callback) throws RemoteException {
+            boolean mockedServiceReady;
+            synchronized (mLock) {
+                mockedServiceReady = mMockedServiceReady;
+            }
+            if (mockedServiceReady) {
+                callback.sendOemCarServiceReady();
+            }
+        }
+
+        @Override
+        public String getAllStackTraces() {
+            return "";
+        }
+
+        @Override
+        public boolean isOemServiceReady() {
+            return true;
+        }
+    }
+}
diff --git a/tools/telemetry/lua-interpreter/data/anr_occurred.json b/tools/telemetry/lua-interpreter/data/anr_occurred.json
index f944256..66b7c10 100644
--- a/tools/telemetry/lua-interpreter/data/anr_occurred.json
+++ b/tools/telemetry/lua-interpreter/data/anr_occurred.json
@@ -58,5 +58,14 @@
     ],
     "stats.process_name": [
         "com.android.systemui"
+    ],
+    "stats.is_incremental": [
+        false
+    ],
+    "stats.read_logs_enabled": [
+        false
+    ],
+    "stats.loading_progress": [
+        1.0
     ]
 }
diff --git a/tools/telemetry/lua-interpreter/data/app_crash_occurred.json b/tools/telemetry/lua-interpreter/data/app_crash_occurred.json
index 2642bfa..83fda11 100644
--- a/tools/telemetry/lua-interpreter/data/app_crash_occurred.json
+++ b/tools/telemetry/lua-interpreter/data/app_crash_occurred.json
@@ -58,5 +58,14 @@
     ],
     "stats.process_name": [
         "com.android.calendar"
+    ],
+    "stats.is_incremental": [
+        false
+    ],
+    "stats.read_logs_enabled": [
+        false
+    ],
+    "stats.loading_progress": [
+        1.0
     ]
 }
diff --git a/tools/telemetry/lua-interpreter/data/process_memory_snapshot.json b/tools/telemetry/lua-interpreter/data/process_memory_snapshot.json
new file mode 100644
index 0000000..96698c1
--- /dev/null
+++ b/tools/telemetry/lua-interpreter/data/process_memory_snapshot.json
@@ -0,0 +1,5513 @@
+{
+    "stats.pid": [
+      1810,
+      421,
+      3668,
+      556,
+      1930,
+      1270,
+      505,
+      1275,
+      1030,
+      4438,
+      501,
+      1808,
+      1659,
+      4118,
+      457,
+      565,
+      1041,
+      10673,
+      966,
+      1346,
+      5382,
+      1077,
+      567,
+      3333,
+      2039,
+      1011,
+      2270,
+      1027,
+      975,
+      1327,
+      2036,
+      1,
+      455,
+      1363,
+      1260,
+      456,
+      499,
+      1345,
+      568,
+      1348,
+      487,
+      5443,
+      10775,
+      1258,
+      1026,
+      554,
+      1103,
+      10773,
+      1202,
+      2846,
+      2229,
+      484,
+      4277,
+      2573,
+      1259,
+      520,
+      485,
+      558,
+      504,
+      1310,
+      449,
+      1100,
+      557,
+      1019,
+      1022,
+      2766,
+      1055,
+      1014,
+      976,
+      1340,
+      965,
+      1012,
+      1025,
+      3249,
+      10712,
+      506,
+      1047,
+      517,
+      1220,
+      569,
+      1817,
+      2514,
+      1681,
+      1050,
+      1031,
+      516,
+      1056,
+      427,
+      1215,
+      1078,
+      1292,
+      964,
+      4145,
+      2216,
+      439,
+      2181,
+      1362,
+      519,
+      357,
+      631,
+      10648,
+      1015,
+      10724,
+      4830,
+      1738,
+      1342,
+      1424,
+      458,
+      1017,
+      1255,
+      1279,
+      1343,
+      1018,
+      2953,
+      3692,
+      482,
+      1829,
+      5311,
+      500,
+      518,
+      1324,
+      1338,
+      1219,
+      1013,
+      1267,
+      3158,
+      483,
+      2658,
+      10900,
+      1761,
+      536,
+      1024,
+      6801,
+      2782,
+      1097,
+      1218,
+      1086,
+      3976,
+      3446,
+      3756,
+      6780,
+      3373,
+      3824,
+      1058,
+      3038,
+      1036,
+      2473,
+      1928,
+      2161,
+      1028,
+      1029,
+      5118,
+      1040,
+      2260,
+      3116,
+      2428,
+      1079,
+      4463,
+      3212,
+      3416,
+      1023,
+      526,
+      5479,
+      1016,
+      2737,
+      20161,
+      20337,
+      420,
+      420,
+      3000,
+      3000,
+      1769,
+      1769,
+      1328,
+      1328,
+      503,
+      503,
+      19498,
+      1329,
+      1329,
+      1042,
+      1042,
+      500,
+      500,
+      1768,
+      1768,
+      1659,
+      1659,
+      4092,
+      4092,
+      456,
+      456,
+      562,
+      562,
+      1057,
+      1057,
+      9691,
+      9691,
+      973,
+      973,
+      553,
+      553,
+      1929,
+      1929,
+      563,
+      563,
+      3286,
+      3286,
+      2040,
+      2040,
+      1018,
+      1018,
+      2329,
+      2329,
+      1039,
+      1039,
+      983,
+      983,
+      1346,
+      1346,
+      2039,
+      2039,
+      11896,
+      1,
+      1,
+      454,
+      454,
+      1381,
+      1381,
+      1293,
+      1293,
+      455,
+      455,
+      498,
+      498,
+      1356,
+      1356,
+      564,
+      564,
+      19113,
+      19113,
+      1358,
+      1358,
+      485,
+      485,
+      18890,
+      18890,
+      1235,
+      1235,
+      1357,
+      1357,
+      1080,
+      1080,
+      19452,
+      1038,
+      1038,
+      552,
+      552,
+      1103,
+      1103,
+      18888,
+      18888,
+      1211,
+      1211,
+      2631,
+      2631,
+      2252,
+      2252,
+      483,
+      483,
+      3720,
+      3720,
+      2826,
+      2826,
+      1291,
+      1291,
+      521,
+      521,
+      484,
+      484,
+      555,
+      555,
+      502,
+      502,
+      1343,
+      1343,
+      453,
+      453,
+      1101,
+      1101,
+      554,
+      554,
+      1026,
+      1026,
+      1028,
+      1028,
+      2232,
+      2232,
+      1063,
+      1063,
+      1021,
+      1021,
+      984,
+      984,
+      20056,
+      1350,
+      1350,
+      11916,
+      11916,
+      972,
+      972,
+      1019,
+      1019,
+      1032,
+      1032,
+      3346,
+      3346,
+      18828,
+      18828,
+      505,
+      505,
+      1059,
+      1059,
+      516,
+      516,
+      1226,
+      1226,
+      565,
+      565,
+      1771,
+      1771,
+      2475,
+      2475,
+      1683,
+      1683,
+      1060,
+      1060,
+      1049,
+      1049,
+      515,
+      515,
+      1066,
+      1066,
+      438,
+      438,
+      1221,
+      1221,
+      1081,
+      1081,
+      1342,
+      1342,
+      971,
+      971,
+      15243,
+      15243,
+      2213,
+      2213,
+      1040,
+      1040,
+      1041,
+      1041,
+      452,
+      452,
+      2162,
+      2162,
+      1379,
+      1379,
+      1022,
+      1022,
+      518,
+      518,
+      357,
+      357,
+      631,
+      631,
+      18798,
+      18798,
+      1432,
+      1432,
+      457,
+      457,
+      1024,
+      1024,
+      1229,
+      1229,
+      1335,
+      1335,
+      1352,
+      1352,
+      1025,
+      1025,
+      2639,
+      2639,
+      3682,
+      3682,
+      481,
+      481,
+      19925,
+      1790,
+      1790,
+      4969,
+      4969,
+      499,
+      499,
+      517,
+      517,
+      1345,
+      1345,
+      1348,
+      1348,
+      1740,
+      1740,
+      4606,
+      4606,
+      18840,
+      18840,
+      1351,
+      1351,
+      1225,
+      1225,
+      1020,
+      1020,
+      1323,
+      1323,
+      20223,
+      19075,
+      19075,
+      482,
+      482,
+      3190,
+      3190,
+      19010,
+      20831,
+      1730,
+      1730,
+      529,
+      529,
+      1031,
+      1031,
+      6818,
+      6818,
+      19951,
+      2256,
+      2256,
+      1094,
+      1094,
+      1224,
+      1224,
+      1088,
+      1088,
+      3892,
+      3892,
+      14974,
+      14974,
+      3383,
+      3383,
+      3753,
+      3753,
+      1069,
+      1069,
+      4631,
+      4631,
+      1052,
+      1052,
+      2577,
+      2577,
+      1924,
+      1924,
+      2184,
+      2184,
+      1055,
+      1055,
+      2264,
+      2264,
+      2862,
+      2862,
+      2543,
+      2543,
+      1082,
+      1082,
+      2957,
+      2957,
+      3210,
+      3210,
+      19570,
+      3420,
+      3420,
+      1030,
+      1030,
+      524,
+      524,
+      15228,
+      15228,
+      3544,
+      3544,
+      1023,
+      1023,
+      2804,
+      2804
+    ],
+    "stats.uid": [
+      1001,
+      1000,
+      1010151,
+      1000,
+      10060,
+      0,
+      1000,
+      1040,
+      9999,
+      1010171,
+      1041,
+      1068,
+      1010,
+      10058,
+      1000,
+      0,
+      1000,
+      1010141,
+      0,
+      1000,
+      1010096,
+      1000,
+      1000,
+      1010145,
+      1000,
+      1041,
+      1010093,
+      0,
+      0,
+      1046,
+      9999,
+      0,
+      1000,
+      1021,
+      1047,
+      0,
+      1000,
+      0,
+      1054,
+      0,
+      1000,
+      10152,
+      0,
+      0,
+      1000,
+      1000,
+      2903,
+      0,
+      1000,
+      10187,
+      1010139,
+      1000,
+      1010103,
+      1010151,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      0,
+      1000,
+      1000,
+      1017,
+      1000,
+      1000,
+      0,
+      1000,
+      1002,
+      0,
+      1000,
+      0,
+      1000,
+      1000,
+      1010057,
+      0,
+      1000,
+      1000,
+      1000,
+      9999,
+      1000,
+      10165,
+      1010148,
+      1000,
+      1000,
+      1041,
+      1000,
+      1046,
+      1000,
+      1000,
+      1000,
+      1013,
+      1066,
+      1000,
+      1001000,
+      1013,
+      1001002,
+      1021,
+      1003,
+      0,
+      1058,
+      1010090,
+      1013,
+      1010070,
+      1010084,
+      1053,
+      1001,
+      1000,
+      1092,
+      1013,
+      0,
+      1013,
+      1021,
+      1021,
+      10151,
+      1001000,
+      1036,
+      10151,
+      1010058,
+      1041,
+      1062,
+      1010,
+      1046,
+      9999,
+      1054,
+      1067,
+      10176,
+      1069,
+      1010177,
+      1010147,
+      1073,
+      0,
+      1000,
+      10087,
+      10151,
+      1072,
+      1019,
+      1076,
+      10152,
+      1010063,
+      10171,
+      1010061,
+      1010138,
+      1010061,
+      2906,
+      1010152,
+      1000,
+      1010145,
+      10148,
+      1010151,
+      1010,
+      1041,
+      1010152,
+      1000,
+      1010165,
+      1010151,
+      1010102,
+      1041,
+      1010150,
+      1010187,
+      1010159,
+      1000,
+      1062,
+      1001000,
+      1013,
+      1010161,
+      10090,
+      1010081,
+      1000,
+      1000,
+      1010151,
+      1010151,
+      1001,
+      1001,
+      0,
+      0,
+      1000,
+      1000,
+      1010171,
+      1040,
+      1040,
+      9999,
+      9999,
+      1041,
+      1041,
+      1068,
+      1068,
+      1010,
+      1010,
+      10058,
+      10058,
+      1000,
+      1000,
+      0,
+      0,
+      1000,
+      1000,
+      1010141,
+      1010141,
+      0,
+      0,
+      1000,
+      1000,
+      10060,
+      10060,
+      1000,
+      1000,
+      1010145,
+      1010145,
+      1000,
+      1000,
+      1041,
+      1041,
+      1010093,
+      1010093,
+      0,
+      0,
+      0,
+      0,
+      1046,
+      1046,
+      9999,
+      9999,
+      10144,
+      0,
+      0,
+      1000,
+      1000,
+      1021,
+      1021,
+      1047,
+      1047,
+      0,
+      0,
+      1000,
+      1000,
+      0,
+      0,
+      1054,
+      1054,
+      0,
+      0,
+      0,
+      0,
+      1000,
+      1000,
+      0,
+      0,
+      0,
+      0,
+      1000,
+      1000,
+      1000,
+      1000,
+      1010151,
+      1000,
+      1000,
+      1000,
+      1000,
+      2903,
+      2903,
+      0,
+      0,
+      1000,
+      1000,
+      10187,
+      10187,
+      1010139,
+      1010139,
+      1000,
+      1000,
+      1010103,
+      1010103,
+      1010151,
+      1010151,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      0,
+      0,
+      1000,
+      1000,
+      1000,
+      1000,
+      1017,
+      1017,
+      1000,
+      1000,
+      1000,
+      1000,
+      0,
+      0,
+      1000,
+      1000,
+      1002,
+      1002,
+      0,
+      0,
+      1010089,
+      1000,
+      1000,
+      1010144,
+      1010144,
+      0,
+      0,
+      1000,
+      1000,
+      1000,
+      1000,
+      1010057,
+      1010057,
+      0,
+      0,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      9999,
+      9999,
+      1000,
+      1000,
+      10165,
+      10165,
+      1010148,
+      1010148,
+      1000,
+      1000,
+      1000,
+      1000,
+      1041,
+      1041,
+      1000,
+      1000,
+      1046,
+      1046,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1000,
+      1013,
+      1013,
+      1066,
+      1066,
+      1000,
+      1000,
+      1001000,
+      1001000,
+      1010,
+      1010,
+      1041,
+      1041,
+      1013,
+      1013,
+      1001002,
+      1001002,
+      1021,
+      1021,
+      1013,
+      1013,
+      1003,
+      1003,
+      0,
+      0,
+      1058,
+      1058,
+      1010090,
+      1010090,
+      1000,
+      1000,
+      1092,
+      1092,
+      1013,
+      1013,
+      0,
+      0,
+      1013,
+      1013,
+      1021,
+      1021,
+      1021,
+      1021,
+      10151,
+      10151,
+      1001000,
+      1001000,
+      1036,
+      1036,
+      1010108,
+      10151,
+      10151,
+      1010058,
+      1010058,
+      1041,
+      1041,
+      1062,
+      1062,
+      1010,
+      1010,
+      1046,
+      1046,
+      1053,
+      1053,
+      1010084,
+      1010084,
+      1010070,
+      1010070,
+      1001,
+      1001,
+      9999,
+      9999,
+      1054,
+      1054,
+      1067,
+      1067,
+      1010088,
+      10176,
+      10176,
+      1069,
+      1069,
+      1010177,
+      1010177,
+      1010147,
+      1010147,
+      1073,
+      1073,
+      0,
+      0,
+      1000,
+      1000,
+      10087,
+      10087,
+      1010095,
+      10151,
+      10151,
+      1072,
+      1072,
+      1019,
+      1019,
+      1076,
+      1076,
+      10152,
+      10152,
+      1010061,
+      1010061,
+      1010138,
+      1010138,
+      1010061,
+      1010061,
+      2906,
+      2906,
+      1010152,
+      1010152,
+      1000,
+      1000,
+      1010145,
+      1010145,
+      10148,
+      10148,
+      1010151,
+      1010151,
+      1000,
+      1000,
+      1010165,
+      1010165,
+      1010151,
+      1010151,
+      1010102,
+      1010102,
+      1041,
+      1041,
+      1010150,
+      1010150,
+      1010187,
+      1010187,
+      1010140,
+      1010159,
+      1010159,
+      1000,
+      1000,
+      1062,
+      1062,
+      1001000,
+      1001000,
+      1010063,
+      1010063,
+      1013,
+      1013,
+      1010161,
+      1010161
+    ],
+    "stats.gpu_memory_kb": [
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0
+    ],
+    "stats.swap_in_kilobytes": [
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0
+    ],
+    "stats.process_name": [
+      "com.android.phone",
+      "/system/vendor/bin/ais_server",
+      "com.google.process.gapps",
+      "/system/bin/carpowerpolicyd",
+      "com.android.car.cartelemetryapp",
+      "/system/bin/installd",
+      "/vendor/bin/hw/android.hardware.keymaster@4.1-service-qti",
+      "media.extractor",
+      "/vendor/bin/hw/android.hardware.memtrack-service.example",
+      "com.google.android.permissioncontroller",
+      "/vendor/bin/audioextplugind",
+      "com.android.se",
+      "/vendor/bin/hw/wpa_supplicant",
+      "com.android.car.messenger",
+      "/system/bin/android.automotive.telemetryd@1.0",
+      "/vendor/bin/hw/android.hardware.boot@1.2-service",
+      "/vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service",
+      "com.google.android.car.setupwizard",
+      "zygote64",
+      "/system/bin/gatekeeperd",
+      "com.android.car.dialer",
+      "/vendor/bin/pd-mapper",
+      "/vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti",
+      "com.google.android.carassistant:search",
+      "com.android.experimentalcar",
+      "/vendor/bin/hw/android.hardware.audio.service",
+      "com.google.android.embedded.projection",
+      "/vendor/bin/hw/android.hardware.usb@1.2-service-qti",
+      "/system/bin/iptables-restore",
+      "media.codec",
+      "/system/bin/com.android.car.procfsinspector",
+      "/system/bin/init",
+      "/vendor/bin/timedaemon",
+      "xtra-daemon",
+      "/system/bin/cameraserver",
+      "/vendor/bin/ipcdaemon",
+      "/vendor/bin/audio_hal_plugin_service",
+      "/vendor/bin/update_agent",
+      "/vendor/bin/hw/android.hardware.automotive.vehicle@V1-pasa-service",
+      "/system/bin/update_engine",
+      "/vendor/bin/vndservicemanager",
+      "com.android.vending:background",
+      "app_process",
+      "/vendor/bin/thermal-engine",
+      "/vendor/bin/hw/android.hardware.thermal@2.0-service.mock",
+      "/system/bin/hw/android.system.suspend-service",
+      "/vendor/bin/tftp_server",
+      "/system/bin/sh",
+      "/vendor/bin/diag-router",
+      "com.google.android.providers.media.module",
+      ".qtidataservices",
+      "/system/bin/servicemanager",
+      "com.google.android.car.netdbug",
+      "com.google.android.gms",
+      "/vendor/bin/cdsprpcd",
+      "/vendor/bin/android.hardware.automotive.evs@1.1-pasa",
+      "/system/bin/hwservicemanager",
+      "/vendor/bin/hw/android.hardware.atrace@1.0-service",
+      "/system/bin/carwatchdogd",
+      "/system/bin/storaged",
+      "/vendor/bin/audiod",
+      "/system/bin/surfaceflinger",
+      "/system/bin/keystore2",
+      "/vendor/bin/hw/android.hardware.graphics.composer@2.4-service",
+      "/vendor/bin/hw/android.hardware.health@2.1-service",
+      "/vendor/bin/car_power_daemon",
+      "/vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti",
+      "/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti",
+      "/system/bin/ip6tables-restore",
+      "/system/vendor/bin/cnss-daemon",
+      "/system/bin/netd",
+      "/system/bin/hw/android.hidl.allocator@1.0-service",
+      "/vendor/bin/hw/android.hardware.sensors@1.0-service",
+      "com.android.car.media",
+      "/apex/com.android.adbd/bin/adbd",
+      "/vendor/bin/hw/android.hardware.security.keymint-service-qti",
+      "/vendor/bin/hw/vendor.qti.hardware.display.allocator-service",
+      "/vendor/bin/hw/vendor.qti.hardware.qseecom@1.0-service",
+      "/system/bin/traced",
+      "/vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service",
+      "com.android.systemui",
+      "com.google.android.companiondevicesupport",
+      "com.android.car",
+      "/vendor/bin/hw/vendor.qti.hardware.soter@1.0-service",
+      "/vendor/bin/panasonic.hardware.broadcastradio.pasa@2.0-service",
+      "/vendor/bin/qseecomd",
+      "media.hwcodec",
+      "/vendor/bin/adsprpcd",
+      "/vendor/bin/pm-proxy",
+      "/vendor/bin/pm-service",
+      "/system/bin/mediaserver",
+      "/apex/com.android.os.statsd/bin/statsd",
+      "com.android.car.developeroptions",
+      "com.android.car",
+      "/vendor/bin/adsprpcd",
+      "com.google.android.bluetooth",
+      "lowi-server",
+      "/system/bin/android.frameworks.automotive.display@1.0-service",
+      "/system/bin/ueventd",
+      "/system/bin/tombstoned",
+      "com.google.android.car.kitchensink",
+      "/vendor/bin/hw/android.hardware.cas@1.2-service",
+      "android.process.media",
+      "com.google.android.apps.automotive.sensing.sensorreplay.recordingapp",
+      "webview_zygote",
+      "/vendor/bin/ssgqmigd",
+      "system",
+      "/system/bin/prng_seeder",
+      "/vendor/bin/hw/android.hardware.drm@1.4-service.widevine",
+      "/vendor/bin/keyhandler",
+      "media.metrics",
+      "/system/vendor/bin/loc_launcher",
+      "/vendor/bin/hw/android.hardware.gnss@2.1-service-qti",
+      "com.google.process.gservices",
+      "com.qualcomm.qti.services.secureui:sui_service",
+      "/system/bin/logd",
+      "com.google.android.gms.persistent",
+      "com.android.car.messenger",
+      "/vendor/bin/I2CAbs_serverd",
+      "/system/bin/evsmanagerd",
+      "/system/bin/wificond",
+      "media.swcodec",
+      "/system/bin/traced_probes",
+      "/vendor/bin/hw/android.hardware.automotive.can@1.0-service",
+      "/system/bin/incidentd",
+      "com.android.car.scriptexecutor:com.android.car.scriptexecutor.ScriptExecutor",
+      "/system/bin/lmkd",
+      "com.google.android.ext.services",
+      "com.google.android.apps.maps",
+      "com.android.networkstack.process",
+      "/system/bin/vold",
+      "/vendor/bin/hw/android.hardware.power-service",
+      "android.car.cluster",
+      "com.google.android.gms",
+      "/system/bin/gpuservice",
+      "/system/bin/drmserver",
+      "/system/bin/credstore",
+      "com.android.vending",
+      "com.android.car.carlauncher",
+      "com.google.android.permissioncontroller",
+      "com.android.car.radio:appService",
+      "com.android.car.custominput.sample",
+      "com.android.car.radio",
+      "/vendor/bin/qrtr-ns",
+      "com.android.vending",
+      "/vendor/bin/hw/vendor.display.color@1.0-service",
+      "com.google.android.carassistant:interactor",
+      "com.google.android.companiondevicesupport",
+      "com.google.android.gms.persistent",
+      "/vendor/bin/hw/android.hardware.wifi@1.0-service",
+      "/vendor/bin/hw/android.hardware.automotive.audiocontrol-service.example",
+      "com.android.vending:background",
+      "/vendor/bin/hw/vendor.qti.automotive.qcarcam@1.0-service",
+      "com.android.systemui",
+      "com.google.process.gservices",
+      "com.android.car.rotary",
+      "/system/bin/audioserver",
+      "com.google.android.apps.automotive.templates.host:renderer_service",
+      "com.google.android.providers.media.module",
+      "com.google.android.tts",
+      "/vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-qti",
+      "/vendor/bin/evs_pasa_app",
+      "com.android.car.developeroptions",
+      "/vendor/bin/hw/android.hardware.drm@1.4-service.clearkey",
+      "com.google.android.apps.automotive.inputmethod",
+      "com.google.android.car.kitchensink",
+      "com.google.android.gms.vehicle.testapp",
+      "/system/vendor/bin/ais_server",
+      "/system/vendor/bin/ais_server",
+      "com.google.process.gapps",
+      "com.google.process.gapps",
+      "com.android.phone",
+      "com.android.phone",
+      "/system/bin/installd",
+      "/system/bin/installd",
+      "/vendor/bin/hw/android.hardware.keymaster@4.1-service-qti",
+      "/vendor/bin/hw/android.hardware.keymaster@4.1-service-qti",
+      "com.google.android.permissioncontroller",
+      "media.extractor",
+      "media.extractor",
+      "/vendor/bin/hw/android.hardware.memtrack-service.example",
+      "/vendor/bin/hw/android.hardware.memtrack-service.example",
+      "/vendor/bin/audioextplugind",
+      "/vendor/bin/audioextplugind",
+      "com.android.se",
+      "com.android.se",
+      "/vendor/bin/hw/wpa_supplicant",
+      "/vendor/bin/hw/wpa_supplicant",
+      "com.android.car.messenger",
+      "com.android.car.messenger",
+      "/system/bin/android.automotive.telemetryd@1.0",
+      "/system/bin/android.automotive.telemetryd@1.0",
+      "/vendor/bin/hw/android.hardware.boot@1.2-service",
+      "/vendor/bin/hw/android.hardware.boot@1.2-service",
+      "/vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service",
+      "/vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service",
+      "com.google.android.car.setupwizard",
+      "com.google.android.car.setupwizard",
+      "zygote64",
+      "zygote64",
+      "/system/bin/carpowerpolicyd",
+      "/system/bin/carpowerpolicyd",
+      "com.android.car.cartelemetryapp",
+      "com.android.car.cartelemetryapp",
+      "/vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti",
+      "/vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti",
+      "com.google.android.carassistant:search",
+      "com.google.android.carassistant:search",
+      "com.android.experimentalcar",
+      "com.android.experimentalcar",
+      "/vendor/bin/hw/android.hardware.audio.service",
+      "/vendor/bin/hw/android.hardware.audio.service",
+      "com.google.android.embedded.projection",
+      "com.google.android.embedded.projection",
+      "/vendor/bin/hw/android.hardware.usb@1.2-service-qti",
+      "/vendor/bin/hw/android.hardware.usb@1.2-service-qti",
+      "/system/bin/iptables-restore",
+      "/system/bin/iptables-restore",
+      "media.codec",
+      "media.codec",
+      "/system/bin/com.android.car.procfsinspector",
+      "/system/bin/com.android.car.procfsinspector",
+      "com.google.android.configupdater",
+      "/system/bin/init",
+      "/system/bin/init",
+      "/vendor/bin/timedaemon",
+      "/vendor/bin/timedaemon",
+      "xtra-daemon",
+      "xtra-daemon",
+      "/system/bin/cameraserver",
+      "/system/bin/cameraserver",
+      "/vendor/bin/ipcdaemon",
+      "/vendor/bin/ipcdaemon",
+      "/vendor/bin/audio_hal_plugin_service",
+      "/vendor/bin/audio_hal_plugin_service",
+      "/vendor/bin/update_agent",
+      "/vendor/bin/update_agent",
+      "/vendor/bin/hw/android.hardware.automotive.vehicle@V1-pasa-service",
+      "/vendor/bin/hw/android.hardware.automotive.vehicle@V1-pasa-service",
+      "-/system/bin/sh",
+      "-/system/bin/sh",
+      "/system/bin/update_engine",
+      "/system/bin/update_engine",
+      "/vendor/bin/vndservicemanager",
+      "/vendor/bin/vndservicemanager",
+      "app_process",
+      "app_process",
+      "/vendor/bin/thermal-engine",
+      "/vendor/bin/thermal-engine",
+      "/system/bin/gatekeeperd",
+      "/system/bin/gatekeeperd",
+      "/vendor/bin/pd-mapper",
+      "/vendor/bin/pd-mapper",
+      "com.google.android.gms.unstable",
+      "/vendor/bin/hw/android.hardware.thermal@2.0-service.mock",
+      "/vendor/bin/hw/android.hardware.thermal@2.0-service.mock",
+      "/system/bin/hw/android.system.suspend-service",
+      "/system/bin/hw/android.system.suspend-service",
+      "/vendor/bin/tftp_server",
+      "/vendor/bin/tftp_server",
+      "/system/bin/sh",
+      "/system/bin/sh",
+      "/vendor/bin/diag-router",
+      "/vendor/bin/diag-router",
+      "com.google.android.providers.media.module",
+      "com.google.android.providers.media.module",
+      ".qtidataservices",
+      ".qtidataservices",
+      "/system/bin/servicemanager",
+      "/system/bin/servicemanager",
+      "com.google.android.car.netdbug",
+      "com.google.android.car.netdbug",
+      "com.google.android.gms",
+      "com.google.android.gms",
+      "/vendor/bin/cdsprpcd",
+      "/vendor/bin/cdsprpcd",
+      "/vendor/bin/android.hardware.automotive.evs@1.1-pasa",
+      "/vendor/bin/android.hardware.automotive.evs@1.1-pasa",
+      "/system/bin/hwservicemanager",
+      "/system/bin/hwservicemanager",
+      "/vendor/bin/hw/android.hardware.atrace@1.0-service",
+      "/vendor/bin/hw/android.hardware.atrace@1.0-service",
+      "/system/bin/carwatchdogd",
+      "/system/bin/carwatchdogd",
+      "/system/bin/storaged",
+      "/system/bin/storaged",
+      "/vendor/bin/audiod",
+      "/vendor/bin/audiod",
+      "/system/bin/surfaceflinger",
+      "/system/bin/surfaceflinger",
+      "/system/bin/keystore2",
+      "/system/bin/keystore2",
+      "/vendor/bin/hw/android.hardware.graphics.composer@2.4-service",
+      "/vendor/bin/hw/android.hardware.graphics.composer@2.4-service",
+      "/vendor/bin/hw/android.hardware.health@2.1-service",
+      "/vendor/bin/hw/android.hardware.health@2.1-service",
+      "/vendor/bin/car_power_daemon",
+      "/vendor/bin/car_power_daemon",
+      "/vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti",
+      "/vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti",
+      "/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti",
+      "/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti",
+      "/system/bin/ip6tables-restore",
+      "/system/bin/ip6tables-restore",
+      "com.android.car.ui.paintbooth",
+      "/system/vendor/bin/cnss-daemon",
+      "/system/vendor/bin/cnss-daemon",
+      "com.google.android.configupdater",
+      "com.google.android.configupdater",
+      "/system/bin/netd",
+      "/system/bin/netd",
+      "/system/bin/hw/android.hidl.allocator@1.0-service",
+      "/system/bin/hw/android.hidl.allocator@1.0-service",
+      "/vendor/bin/hw/android.hardware.sensors@1.0-service",
+      "/vendor/bin/hw/android.hardware.sensors@1.0-service",
+      "com.android.car.media",
+      "com.android.car.media",
+      "/apex/com.android.adbd/bin/adbd",
+      "/apex/com.android.adbd/bin/adbd",
+      "/vendor/bin/hw/android.hardware.security.keymint-service-qti",
+      "/vendor/bin/hw/android.hardware.security.keymint-service-qti",
+      "/vendor/bin/hw/vendor.qti.hardware.display.allocator-service",
+      "/vendor/bin/hw/vendor.qti.hardware.display.allocator-service",
+      "/vendor/bin/hw/vendor.qti.hardware.qseecom@1.0-service",
+      "/vendor/bin/hw/vendor.qti.hardware.qseecom@1.0-service",
+      "/system/bin/traced",
+      "/system/bin/traced",
+      "/vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service",
+      "/vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service",
+      "com.android.systemui",
+      "com.android.systemui",
+      "com.google.android.companiondevicesupport",
+      "com.google.android.companiondevicesupport",
+      "com.android.car",
+      "com.android.car",
+      "/vendor/bin/hw/vendor.qti.hardware.soter@1.0-service",
+      "/vendor/bin/hw/vendor.qti.hardware.soter@1.0-service",
+      "/vendor/bin/panasonic.hardware.broadcastradio.pasa@2.0-service",
+      "/vendor/bin/panasonic.hardware.broadcastradio.pasa@2.0-service",
+      "/vendor/bin/qseecomd",
+      "/vendor/bin/qseecomd",
+      "media.hwcodec",
+      "media.hwcodec",
+      "/vendor/bin/adsprpcd",
+      "/vendor/bin/adsprpcd",
+      "/vendor/bin/pm-proxy",
+      "/vendor/bin/pm-proxy",
+      "/vendor/bin/pm-service",
+      "/vendor/bin/pm-service",
+      "/system/bin/mediaserver",
+      "/system/bin/mediaserver",
+      "/apex/com.android.os.statsd/bin/statsd",
+      "/apex/com.android.os.statsd/bin/statsd",
+      "com.android.car.developeroptions",
+      "com.android.car.developeroptions",
+      "com.android.car",
+      "com.android.car",
+      "/vendor/bin/hw/android.hardware.wifi@1.0-service",
+      "/vendor/bin/hw/android.hardware.wifi@1.0-service",
+      "/vendor/bin/hw/android.hardware.automotive.audiocontrol-service.example",
+      "/vendor/bin/hw/android.hardware.automotive.audiocontrol-service.example",
+      "/vendor/bin/adsprpcd",
+      "/vendor/bin/adsprpcd",
+      "com.google.android.bluetooth",
+      "com.google.android.bluetooth",
+      "lowi-server",
+      "lowi-server",
+      "/vendor/bin/hw/android.hardware.cas@1.2-service",
+      "/vendor/bin/hw/android.hardware.cas@1.2-service",
+      "/system/bin/android.frameworks.automotive.display@1.0-service",
+      "/system/bin/android.frameworks.automotive.display@1.0-service",
+      "/system/bin/ueventd",
+      "/system/bin/ueventd",
+      "/system/bin/tombstoned",
+      "/system/bin/tombstoned",
+      "com.google.android.car.kitchensink",
+      "com.google.android.car.kitchensink",
+      "system",
+      "system",
+      "/system/bin/prng_seeder",
+      "/system/bin/prng_seeder",
+      "/vendor/bin/hw/android.hardware.drm@1.4-service.widevine",
+      "/vendor/bin/hw/android.hardware.drm@1.4-service.widevine",
+      "/vendor/bin/keyhandler",
+      "/vendor/bin/keyhandler",
+      "media.metrics",
+      "media.metrics",
+      "/system/vendor/bin/loc_launcher",
+      "/system/vendor/bin/loc_launcher",
+      "/vendor/bin/hw/android.hardware.gnss@2.1-service-qti",
+      "/vendor/bin/hw/android.hardware.gnss@2.1-service-qti",
+      "com.google.process.gservices",
+      "com.google.process.gservices",
+      "com.qualcomm.qti.services.secureui:sui_service",
+      "com.qualcomm.qti.services.secureui:sui_service",
+      "/system/bin/logd",
+      "/system/bin/logd",
+      "com.android.car.calendar",
+      "com.google.android.gms.persistent",
+      "com.google.android.gms.persistent",
+      "com.android.car.messenger",
+      "com.android.car.messenger",
+      "/vendor/bin/I2CAbs_serverd",
+      "/vendor/bin/I2CAbs_serverd",
+      "/system/bin/evsmanagerd",
+      "/system/bin/evsmanagerd",
+      "/system/bin/wificond",
+      "/system/bin/wificond",
+      "media.swcodec",
+      "media.swcodec",
+      "webview_zygote",
+      "webview_zygote",
+      "com.google.android.apps.automotive.sensing.sensorreplay.recordingapp",
+      "com.google.android.apps.automotive.sensing.sensorreplay.recordingapp",
+      "android.process.media",
+      "android.process.media",
+      "/vendor/bin/ssgqmigd",
+      "/vendor/bin/ssgqmigd",
+      "/system/bin/traced_probes",
+      "/system/bin/traced_probes",
+      "/vendor/bin/hw/android.hardware.automotive.can@1.0-service",
+      "/vendor/bin/hw/android.hardware.automotive.can@1.0-service",
+      "/system/bin/incidentd",
+      "/system/bin/incidentd",
+      "com.google.android.apps.geo.autograph.vms.client.console.car",
+      "com.android.car.scriptexecutor:com.android.car.scriptexecutor.ScriptExecutor",
+      "com.android.car.scriptexecutor:com.android.car.scriptexecutor.ScriptExecutor",
+      "/system/bin/lmkd",
+      "/system/bin/lmkd",
+      "com.google.android.ext.services",
+      "com.google.android.ext.services",
+      "com.google.android.apps.maps",
+      "com.google.android.apps.maps",
+      "com.android.networkstack.process",
+      "com.android.networkstack.process",
+      "/system/bin/vold",
+      "/system/bin/vold",
+      "/vendor/bin/hw/android.hardware.power-service",
+      "/vendor/bin/hw/android.hardware.power-service",
+      "android.car.cluster",
+      "android.car.cluster",
+      "com.android.providers.calendar",
+      "com.google.android.gms",
+      "com.google.android.gms",
+      "/system/bin/gpuservice",
+      "/system/bin/gpuservice",
+      "/system/bin/drmserver",
+      "/system/bin/drmserver",
+      "/system/bin/credstore",
+      "/system/bin/credstore",
+      "com.android.vending",
+      "com.android.vending",
+      "com.android.car.radio:appService",
+      "com.android.car.radio:appService",
+      "com.android.car.custominput.sample",
+      "com.android.car.custominput.sample",
+      "com.android.car.radio",
+      "com.android.car.radio",
+      "/vendor/bin/qrtr-ns",
+      "/vendor/bin/qrtr-ns",
+      "com.android.vending",
+      "com.android.vending",
+      "/vendor/bin/hw/vendor.display.color@1.0-service",
+      "/vendor/bin/hw/vendor.display.color@1.0-service",
+      "com.google.android.carassistant:interactor",
+      "com.google.android.carassistant:interactor",
+      "com.google.android.companiondevicesupport",
+      "com.google.android.companiondevicesupport",
+      "com.google.android.gms.persistent",
+      "com.google.android.gms.persistent",
+      "/vendor/bin/hw/vendor.qti.automotive.qcarcam@1.0-service",
+      "/vendor/bin/hw/vendor.qti.automotive.qcarcam@1.0-service",
+      "com.android.systemui",
+      "com.android.systemui",
+      "com.google.process.gservices",
+      "com.google.process.gservices",
+      "com.android.car.rotary",
+      "com.android.car.rotary",
+      "/system/bin/audioserver",
+      "/system/bin/audioserver",
+      "com.google.android.apps.automotive.templates.host:renderer_service",
+      "com.google.android.apps.automotive.templates.host:renderer_service",
+      "com.google.android.providers.media.module",
+      "com.google.android.providers.media.module",
+      "com.google.android.partnersetup",
+      "com.google.android.tts",
+      "com.google.android.tts",
+      "/vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-qti",
+      "/vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-qti",
+      "/vendor/bin/evs_pasa_app",
+      "/vendor/bin/evs_pasa_app",
+      "com.android.car.developeroptions",
+      "com.android.car.developeroptions",
+      "com.android.car.carlauncher",
+      "com.android.car.carlauncher",
+      "/vendor/bin/hw/android.hardware.drm@1.4-service.clearkey",
+      "/vendor/bin/hw/android.hardware.drm@1.4-service.clearkey",
+      "com.google.android.apps.automotive.inputmethod",
+      "com.google.android.apps.automotive.inputmethod"
+    ],
+    "stats.elapsed_timestamp_nanos": [
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      944668609012,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951,
+      2797710058984,
+      3020312433951
+    ],
+    "stats.rss_in_kilobytes": [
+      129580,
+      40648,
+      100748,
+      5120,
+      94216,
+      7328,
+      5696,
+      29332,
+      4704,
+      106680,
+      9592,
+      95560,
+      11104,
+      97588,
+      3892,
+      4580,
+      5008,
+      104292,
+      173916,
+      6268,
+      97464,
+      4068,
+      4988,
+      248216,
+      91948,
+      29060,
+      108020,
+      5292,
+      3444,
+      11180,
+      4088,
+      13868,
+      5412,
+      9688,
+      26596,
+      2076,
+      4036,
+      4884,
+      5508,
+      10240,
+      3664,
+      134704,
+      123708,
+      5356,
+      4932,
+      5172,
+      3060,
+      3136,
+      6852,
+      120140,
+      91772,
+      5348,
+      94224,
+      173616,
+      5376,
+      33984,
+      5956,
+      3700,
+      6796,
+      5756,
+      9300,
+      51664,
+      14464,
+      21796,
+      5024,
+      6736,
+      5108,
+      6724,
+      3372,
+      5248,
+      10560,
+      3968,
+      5824,
+      101612,
+      10508,
+      7628,
+      8644,
+      4560,
+      3940,
+      6104,
+      235072,
+      109868,
+      122004,
+      5880,
+      6636,
+      4956,
+      22364,
+      4428,
+      4416,
+      4660,
+      26080,
+      6424,
+      117576,
+      101860,
+      4468,
+      121616,
+      6648,
+      8260,
+      8984,
+      2192,
+      169308,
+      4988,
+      97980,
+      96160,
+      84204,
+      2412,
+      386552,
+      6032,
+      9864,
+      5036,
+      8112,
+      4524,
+      17768,
+      99124,
+      90332,
+      7292,
+      187564,
+      97992,
+      1988,
+      6632,
+      7044,
+      21660,
+      3848,
+      4848,
+      5428,
+      88420,
+      2632,
+      89836,
+      172968,
+      106336,
+      9424,
+      5232,
+      120584,
+      169900,
+      8440,
+      7892,
+      8140,
+      178348,
+      182868,
+      104920,
+      107640,
+      88720,
+      95832,
+      2944,
+      183184,
+      7448,
+      162236,
+      112912,
+      186168,
+      15588,
+      5688,
+      134844,
+      4988,
+      153224,
+      99776,
+      122064,
+      31104,
+      157180,
+      121484,
+      221260,
+      21608,
+      10772,
+      115964,
+      8484,
+      138928,
+      169288,
+      158284,
+      40156,
+      40156,
+      101708,
+      101708,
+      130920,
+      131192,
+      7236,
+      7236,
+      4648,
+      4648,
+      134988,
+      29188,
+      29188,
+      4680,
+      4680,
+      9524,
+      9524,
+      95808,
+      95808,
+      11012,
+      11012,
+      99476,
+      99476,
+      3908,
+      3908,
+      4336,
+      4336,
+      5004,
+      5004,
+      99832,
+      99832,
+      174704,
+      174868,
+      4700,
+      4700,
+      94208,
+      94208,
+      4968,
+      4968,
+      247452,
+      247452,
+      92516,
+      92516,
+      29188,
+      29188,
+      108864,
+      108864,
+      5088,
+      5088,
+      3464,
+      3464,
+      11192,
+      11192,
+      4172,
+      4172,
+      90128,
+      13908,
+      13908,
+      5288,
+      5288,
+      9768,
+      9768,
+      26832,
+      26832,
+      2000,
+      2000,
+      3776,
+      3776,
+      4924,
+      4924,
+      5328,
+      5328,
+      3204,
+      3204,
+      10300,
+      10300,
+      4160,
+      4160,
+      123376,
+      126028,
+      5368,
+      5368,
+      6224,
+      6224,
+      4100,
+      4100,
+      152960,
+      4776,
+      4776,
+      4860,
+      4860,
+      3016,
+      3016,
+      3328,
+      3328,
+      6992,
+      6992,
+      121204,
+      121204,
+      92120,
+      92120,
+      5444,
+      5444,
+      96352,
+      96352,
+      170884,
+      171608,
+      5312,
+      5312,
+      33556,
+      33556,
+      5924,
+      5924,
+      3608,
+      3608,
+      6712,
+      6736,
+      5700,
+      5700,
+      9008,
+      9008,
+      52932,
+      55384,
+      14036,
+      14248,
+      21500,
+      21864,
+      5100,
+      5100,
+      6680,
+      6680,
+      5224,
+      5224,
+      6816,
+      6816,
+      3280,
+      3280,
+      153084,
+      5300,
+      5300,
+      90076,
+      90076,
+      10260,
+      10288,
+      3556,
+      3556,
+      5724,
+      5724,
+      103384,
+      103384,
+      11440,
+      11552,
+      7416,
+      7416,
+      8524,
+      8632,
+      4432,
+      4432,
+      3708,
+      3844,
+      5796,
+      5796,
+      219540,
+      233712,
+      111600,
+      111600,
+      122440,
+      123540,
+      5860,
+      5860,
+      6856,
+      6856,
+      5064,
+      5064,
+      23044,
+      23888,
+      4328,
+      4328,
+      4620,
+      4620,
+      4712,
+      4712,
+      24636,
+      24636,
+      6620,
+      6656,
+      122316,
+      122316,
+      100868,
+      100868,
+      16480,
+      16560,
+      5584,
+      5584,
+      4380,
+      4380,
+      122516,
+      122516,
+      6524,
+      6520,
+      4928,
+      4928,
+      7876,
+      7876,
+      9040,
+      9040,
+      2232,
+      2232,
+      170328,
+      166160,
+      354656,
+      394084,
+      6076,
+      6076,
+      9672,
+      9672,
+      5116,
+      5116,
+      8492,
+      8492,
+      4932,
+      4932,
+      17688,
+      17664,
+      99456,
+      99456,
+      90772,
+      90772,
+      7260,
+      7288,
+      152436,
+      185168,
+      188556,
+      98056,
+      98056,
+      1836,
+      1836,
+      6492,
+      6492,
+      7264,
+      7264,
+      21976,
+      21976,
+      83920,
+      83920,
+      97720,
+      97720,
+      99616,
+      99616,
+      2384,
+      2384,
+      3736,
+      3736,
+      5016,
+      5016,
+      5588,
+      5588,
+      162932,
+      85828,
+      85828,
+      2604,
+      2604,
+      87400,
+      87400,
+      159516,
+      158640,
+      106936,
+      106892,
+      9508,
+      9520,
+      5160,
+      5160,
+      124104,
+      124588,
+      96940,
+      168880,
+      168904,
+      8336,
+      8336,
+      7852,
+      7852,
+      7412,
+      7412,
+      168528,
+      168528,
+      107964,
+      107964,
+      90296,
+      90296,
+      97900,
+      97900,
+      2960,
+      2960,
+      168864,
+      168864,
+      7420,
+      7420,
+      162908,
+      165912,
+      109752,
+      109752,
+      189336,
+      191356,
+      5112,
+      5112,
+      150656,
+      151264,
+      101168,
+      100232,
+      120372,
+      122668,
+      31384,
+      31448,
+      158128,
+      158128,
+      120152,
+      120152,
+      92484,
+      217308,
+      217308,
+      21480,
+      21480,
+      10544,
+      10544,
+      122240,
+      122240,
+      170428,
+      234808,
+      8392,
+      8392,
+      139568,
+      186048
+    ],
+    "stats.has_foreground_services": [
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      true,
+      true,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false,
+      false
+    ],
+    "stats.anon_rss_in_kilobytes": [
+      50728,
+      26464,
+      47488,
+      784,
+      46724,
+      1996,
+      920,
+      4796,
+      712,
+      47592,
+      1912,
+      48432,
+      1268,
+      46796,
+      636,
+      764,
+      776,
+      54092,
+      47536,
+      900,
+      46984,
+      696,
+      840,
+      125996,
+      46552,
+      17160,
+      49208,
+      732,
+      888,
+      2104,
+      636,
+      5316,
+      840,
+      1460,
+      3820,
+      460,
+      704,
+      776,
+      1280,
+      1364,
+      672,
+      50232,
+      30324,
+      1584,
+      704,
+      1072,
+      528,
+      668,
+      2348,
+      51004,
+      46676,
+      1300,
+      47152,
+      62336,
+      768,
+      5488,
+      1300,
+      668,
+      2232,
+      848,
+      3376,
+      13816,
+      2652,
+      4256,
+      776,
+      888,
+      756,
+      1460,
+      728,
+      980,
+      1824,
+      708,
+      884,
+      47312,
+      5280,
+      1152,
+      1248,
+      788,
+      768,
+      972,
+      79192,
+      48884,
+      50912,
+      848,
+      884,
+      1032,
+      4428,
+      752,
+      692,
+      736,
+      4496,
+      1548,
+      47220,
+      48100,
+      788,
+      49508,
+      1472,
+      1300,
+      2872,
+      412,
+      64952,
+      728,
+      46932,
+      46616,
+      46840,
+      416,
+      122764,
+      812,
+      1244,
+      784,
+      1984,
+      676,
+      2680,
+      45840,
+      46580,
+      3068,
+      70400,
+      47088,
+      512,
+      996,
+      1084,
+      3648,
+      720,
+      704,
+      880,
+      46880,
+      472,
+      46604,
+      68776,
+      49624,
+      2184,
+      760,
+      48376,
+      60572,
+      1356,
+      1200,
+      1144,
+      68356,
+      60268,
+      47448,
+      47688,
+      46776,
+      46628,
+      508,
+      74100,
+      996,
+      65360,
+      48936,
+      67588,
+      5728,
+      856,
+      50300,
+      792,
+      57472,
+      46316,
+      48344,
+      6432,
+      51404,
+      51856,
+      133636,
+      3532,
+      1632,
+      47204,
+      1096,
+      51624,
+      52880,
+      58800,
+      26472,
+      26472,
+      47904,
+      47904,
+      50840,
+      51112,
+      1884,
+      1884,
+      836,
+      836,
+      53184,
+      4512,
+      4512,
+      704,
+      704,
+      1888,
+      1888,
+      48448,
+      48420,
+      1344,
+      1344,
+      46996,
+      46996,
+      632,
+      632,
+      772,
+      772,
+      768,
+      768,
+      52204,
+      52204,
+      47636,
+      47800,
+      816,
+      816,
+      46856,
+      46856,
+      832,
+      832,
+      125400,
+      125400,
+      46604,
+      46604,
+      17168,
+      17168,
+      49752,
+      49752,
+      736,
+      736,
+      888,
+      888,
+      2104,
+      2104,
+      640,
+      640,
+      46768,
+      5284,
+      5284,
+      836,
+      836,
+      1456,
+      1456,
+      3836,
+      3836,
+      460,
+      460,
+      708,
+      708,
+      768,
+      768,
+      1280,
+      1280,
+      752,
+      752,
+      1356,
+      1356,
+      804,
+      804,
+      30344,
+      30944,
+      1596,
+      1596,
+      908,
+      908,
+      684,
+      684,
+      52792,
+      708,
+      708,
+      1048,
+      1048,
+      524,
+      524,
+      668,
+      668,
+      2392,
+      2392,
+      50992,
+      50992,
+      46828,
+      46828,
+      1304,
+      1304,
+      47380,
+      47380,
+      59676,
+      60972,
+      764,
+      764,
+      5472,
+      5472,
+      1292,
+      1292,
+      676,
+      676,
+      2316,
+      2340,
+      852,
+      852,
+      3368,
+      3368,
+      13900,
+      15476,
+      2712,
+      2920,
+      4296,
+      4660,
+      784,
+      784,
+      888,
+      888,
+      760,
+      760,
+      1456,
+      1456,
+      716,
+      716,
+      57176,
+      988,
+      988,
+      46780,
+      46780,
+      1896,
+      1924,
+      700,
+      700,
+      880,
+      880,
+      47284,
+      47284,
+      6196,
+      6308,
+      1132,
+      1132,
+      1256,
+      1364,
+      780,
+      780,
+      772,
+      908,
+      972,
+      972,
+      75992,
+      77580,
+      49128,
+      49128,
+      51964,
+      52972,
+      840,
+      840,
+      984,
+      984,
+      1036,
+      1036,
+      4444,
+      4460,
+      752,
+      752,
+      692,
+      692,
+      732,
+      732,
+      4012,
+      4012,
+      1712,
+      1740,
+      47380,
+      47380,
+      47772,
+      47772,
+      6548,
+      6628,
+      848,
+      848,
+      784,
+      784,
+      49716,
+      49716,
+      1392,
+      1388,
+      672,
+      672,
+      1296,
+      1296,
+      2836,
+      2836,
+      412,
+      412,
+      63952,
+      58536,
+      98360,
+      127632,
+      812,
+      812,
+      1252,
+      1252,
+      788,
+      788,
+      1776,
+      1776,
+      896,
+      896,
+      2688,
+      2664,
+      46216,
+      46216,
+      46708,
+      46708,
+      3128,
+      3156,
+      53500,
+      68276,
+      70644,
+      46952,
+      46952,
+      508,
+      508,
+      1012,
+      1012,
+      1312,
+      1312,
+      3808,
+      3808,
+      46956,
+      46956,
+      47796,
+      47796,
+      47180,
+      47180,
+      416,
+      416,
+      712,
+      712,
+      700,
+      700,
+      876,
+      876,
+      55600,
+      46816,
+      46816,
+      472,
+      472,
+      46708,
+      46708,
+      55908,
+      56324,
+      49896,
+      49824,
+      2188,
+      2200,
+      752,
+      752,
+      48512,
+      48932,
+      46960,
+      58460,
+      58484,
+      1356,
+      1356,
+      1200,
+      1200,
+      1148,
+      1148,
+      61100,
+      61100,
+      47848,
+      47848,
+      46964,
+      46964,
+      46824,
+      46824,
+      512,
+      512,
+      61532,
+      61532,
+      1000,
+      1000,
+      65224,
+      68200,
+      47352,
+      47352,
+      67644,
+      69380,
+      792,
+      792,
+      56360,
+      56524,
+      47812,
+      46876,
+      48852,
+      48888,
+      6436,
+      6460,
+      51752,
+      51752,
+      50952,
+      50952,
+      46880,
+      128616,
+      128616,
+      3536,
+      3536,
+      1628,
+      1628,
+      47392,
+      47392,
+      58640,
+      76924,
+      1096,
+      1096,
+      52024,
+      62968
+    ],
+    "stats.oom_score_adj": [
+      -800,
+      -1001,
+      925,
+      -1001,
+      100,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      975,
+      -1001,
+      -800,
+      -1001,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      925,
+      -1001,
+      -1001,
+      945,
+      -1001,
+      -1001,
+      250,
+      100,
+      -1001,
+      100,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      965,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -700,
+      500,
+      -1001,
+      200,
+      905,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -800,
+      100,
+      -800,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      955,
+      100,
+      -1001,
+      -700,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      0,
+      -1001,
+      915,
+      200,
+      -1001,
+      -1001,
+      -900,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      945,
+      800,
+      -1001,
+      100,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      100,
+      -1001,
+      100,
+      100,
+      -800,
+      -1001,
+      -1001,
+      -700,
+      905,
+      -1001,
+      -1001,
+      -1001,
+      935,
+      600,
+      955,
+      200,
+      100,
+      200,
+      -1001,
+      935,
+      -1001,
+      100,
+      100,
+      100,
+      -1001,
+      -1001,
+      975,
+      -1001,
+      500,
+      915,
+      100,
+      -1001,
+      200,
+      -700,
+      100,
+      -1001,
+      -1001,
+      965,
+      -1001,
+      200,
+      910,
+      200,
+      -1001,
+      -1001,
+      925,
+      945,
+      -800,
+      -800,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      905,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -800,
+      -800,
+      -1001,
+      -1001,
+      200,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      945,
+      955,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      100,
+      100,
+      -1001,
+      -1001,
+      250,
+      0,
+      100,
+      100,
+      -1001,
+      -1001,
+      100,
+      100,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      999,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      935,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -700,
+      -700,
+      999,
+      985,
+      -1001,
+      -1001,
+      200,
+      200,
+      905,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      930,
+      -1001,
+      -1001,
+      999,
+      975,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      200,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -800,
+      -800,
+      100,
+      100,
+      -800,
+      -800,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      965,
+      955,
+      100,
+      100,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -700,
+      -700,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      0,
+      920,
+      -900,
+      -900,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      955,
+      915,
+      999,
+      985,
+      -1001,
+      -1001,
+      940,
+      100,
+      100,
+      200,
+      200,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      200,
+      200,
+      905,
+      945,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      900,
+      100,
+      100,
+      -1001,
+      -1001,
+      100,
+      100,
+      100,
+      100,
+      -800,
+      -800,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -700,
+      -700,
+      925,
+      905,
+      905,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      995,
+      975,
+      200,
+      100,
+      100,
+      100,
+      200,
+      100,
+      -1001,
+      -1001,
+      985,
+      965,
+      -1001,
+      -1001,
+      100,
+      100,
+      100,
+      100,
+      100,
+      100,
+      -1001,
+      -1001,
+      905,
+      905,
+      915,
+      925,
+      100,
+      100,
+      -1001,
+      -1001,
+      200,
+      200,
+      -700,
+      -700,
+      935,
+      100,
+      100,
+      -1001,
+      -1001,
+      -1001,
+      -1001,
+      975,
+      965,
+      600,
+      0,
+      -1001,
+      -1001,
+      200,
+      200
+    ],
+    "stats.anon_rss_and_swap_in_kilobytes": [
+      50728,
+      26464,
+      47488,
+      784,
+      46724,
+      1996,
+      920,
+      4796,
+      712,
+      47592,
+      1912,
+      48432,
+      1268,
+      46796,
+      636,
+      764,
+      776,
+      54092,
+      47536,
+      900,
+      46984,
+      696,
+      840,
+      125996,
+      46552,
+      17160,
+      49208,
+      732,
+      888,
+      2104,
+      636,
+      5316,
+      840,
+      1460,
+      3820,
+      460,
+      704,
+      776,
+      1280,
+      1364,
+      672,
+      50232,
+      30324,
+      1584,
+      704,
+      1072,
+      528,
+      668,
+      2348,
+      51004,
+      46676,
+      1300,
+      47152,
+      62336,
+      768,
+      5488,
+      1300,
+      668,
+      2232,
+      848,
+      3376,
+      13816,
+      2652,
+      4256,
+      776,
+      888,
+      756,
+      1460,
+      728,
+      980,
+      1824,
+      708,
+      884,
+      47312,
+      5280,
+      1152,
+      1248,
+      788,
+      768,
+      972,
+      79192,
+      48884,
+      50912,
+      848,
+      884,
+      1032,
+      4428,
+      752,
+      692,
+      736,
+      4496,
+      1548,
+      47220,
+      48100,
+      788,
+      49508,
+      1472,
+      1300,
+      2872,
+      412,
+      64952,
+      728,
+      46932,
+      46616,
+      46840,
+      416,
+      122764,
+      812,
+      1244,
+      784,
+      1984,
+      676,
+      2680,
+      45840,
+      46580,
+      3068,
+      70400,
+      47088,
+      512,
+      996,
+      1084,
+      3648,
+      720,
+      704,
+      880,
+      46880,
+      472,
+      46604,
+      68776,
+      49624,
+      2184,
+      760,
+      48376,
+      60572,
+      1356,
+      1200,
+      1144,
+      68356,
+      60268,
+      47448,
+      47688,
+      46776,
+      46628,
+      508,
+      74100,
+      996,
+      65360,
+      48936,
+      67588,
+      5728,
+      856,
+      50300,
+      792,
+      57472,
+      46316,
+      48344,
+      6432,
+      51404,
+      51856,
+      133636,
+      3532,
+      1632,
+      47204,
+      1096,
+      51624,
+      52880,
+      58800,
+      26472,
+      26472,
+      47904,
+      47904,
+      50840,
+      51112,
+      1884,
+      1884,
+      836,
+      836,
+      53184,
+      4512,
+      4512,
+      704,
+      704,
+      1888,
+      1888,
+      48448,
+      48420,
+      1344,
+      1344,
+      46996,
+      46996,
+      632,
+      632,
+      772,
+      772,
+      768,
+      768,
+      52204,
+      52204,
+      47636,
+      47800,
+      816,
+      816,
+      46856,
+      46856,
+      832,
+      832,
+      125400,
+      125400,
+      46604,
+      46604,
+      17168,
+      17168,
+      49752,
+      49752,
+      736,
+      736,
+      888,
+      888,
+      2104,
+      2104,
+      640,
+      640,
+      46768,
+      5284,
+      5284,
+      836,
+      836,
+      1456,
+      1456,
+      3836,
+      3836,
+      460,
+      460,
+      708,
+      708,
+      768,
+      768,
+      1280,
+      1280,
+      752,
+      752,
+      1356,
+      1356,
+      804,
+      804,
+      30344,
+      30944,
+      1596,
+      1596,
+      908,
+      908,
+      684,
+      684,
+      52792,
+      708,
+      708,
+      1048,
+      1048,
+      524,
+      524,
+      668,
+      668,
+      2392,
+      2392,
+      50992,
+      50992,
+      46828,
+      46828,
+      1304,
+      1304,
+      47380,
+      47380,
+      59676,
+      60972,
+      764,
+      764,
+      5472,
+      5472,
+      1292,
+      1292,
+      676,
+      676,
+      2316,
+      2340,
+      852,
+      852,
+      3368,
+      3368,
+      13900,
+      15476,
+      2712,
+      2920,
+      4296,
+      4660,
+      784,
+      784,
+      888,
+      888,
+      760,
+      760,
+      1456,
+      1456,
+      716,
+      716,
+      57176,
+      988,
+      988,
+      46780,
+      46780,
+      1896,
+      1924,
+      700,
+      700,
+      880,
+      880,
+      47284,
+      47284,
+      6196,
+      6308,
+      1132,
+      1132,
+      1256,
+      1364,
+      780,
+      780,
+      772,
+      908,
+      972,
+      972,
+      75992,
+      77580,
+      49128,
+      49128,
+      51964,
+      52972,
+      840,
+      840,
+      984,
+      984,
+      1036,
+      1036,
+      4444,
+      4460,
+      752,
+      752,
+      692,
+      692,
+      732,
+      732,
+      4012,
+      4012,
+      1712,
+      1740,
+      47380,
+      47380,
+      47772,
+      47772,
+      6548,
+      6628,
+      848,
+      848,
+      784,
+      784,
+      49716,
+      49716,
+      1392,
+      1388,
+      672,
+      672,
+      1296,
+      1296,
+      2836,
+      2836,
+      412,
+      412,
+      63952,
+      58536,
+      98360,
+      127632,
+      812,
+      812,
+      1252,
+      1252,
+      788,
+      788,
+      1776,
+      1776,
+      896,
+      896,
+      2688,
+      2664,
+      46216,
+      46216,
+      46708,
+      46708,
+      3128,
+      3156,
+      53500,
+      68276,
+      70644,
+      46952,
+      46952,
+      508,
+      508,
+      1012,
+      1012,
+      1312,
+      1312,
+      3808,
+      3808,
+      46956,
+      46956,
+      47796,
+      47796,
+      47180,
+      47180,
+      416,
+      416,
+      712,
+      712,
+      700,
+      700,
+      876,
+      876,
+      55600,
+      46816,
+      46816,
+      472,
+      472,
+      46708,
+      46708,
+      55908,
+      56324,
+      49896,
+      49824,
+      2188,
+      2200,
+      752,
+      752,
+      48512,
+      48932,
+      46960,
+      58460,
+      58484,
+      1356,
+      1356,
+      1200,
+      1200,
+      1148,
+      1148,
+      61100,
+      61100,
+      47848,
+      47848,
+      46964,
+      46964,
+      46824,
+      46824,
+      512,
+      512,
+      61532,
+      61532,
+      1000,
+      1000,
+      65224,
+      68200,
+      47352,
+      47352,
+      67644,
+      69380,
+      792,
+      792,
+      56360,
+      56524,
+      47812,
+      46876,
+      48852,
+      48888,
+      6436,
+      6460,
+      51752,
+      51752,
+      50952,
+      50952,
+      46880,
+      128616,
+      128616,
+      3536,
+      3536,
+      1628,
+      1628,
+      47392,
+      47392,
+      58640,
+      76924,
+      1096,
+      1096,
+      52024,
+      62968
+    ]
+  }
\ No newline at end of file