summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/16.txt2
-rw-r--r--api/current.txt2
-rw-r--r--cmds/app_process/app_main.cpp2
-rw-r--r--cmds/bootanimation/BootAnimation.cpp4
-rw-r--r--cmds/bootanimation/bootanimation_main.cpp2
-rw-r--r--cmds/dumpstate/dumpstate.c18
-rw-r--r--cmds/dumpsys/dumpsys.cpp2
-rw-r--r--cmds/installd/commands.c130
-rw-r--r--cmds/installd/installd.c38
-rw-r--r--cmds/installd/utils.c48
-rw-r--r--cmds/ip-up-vpn/ip-up-vpn.c16
-rw-r--r--cmds/keystore/keystore.cpp14
-rw-r--r--cmds/screenshot/screenshot.c12
-rw-r--r--cmds/servicemanager/binder.c12
-rw-r--r--cmds/servicemanager/service_manager.c22
-rw-r--r--cmds/stagefright/record.cpp2
-rw-r--r--cmds/stagefright/sf2.cpp2
-rw-r--r--cmds/stagefright/stream.cpp2
-rw-r--r--cmds/system_server/library/system_init.cpp14
-rw-r--r--cmds/system_server/system_main.cpp4
-rw-r--r--core/java/android/animation/LayoutTransition.java8
-rw-r--r--core/java/android/hardware/CameraSound.java8
-rw-r--r--core/java/android/view/inputmethod/InputMethodSubtype.java107
-rw-r--r--core/java/android/webkit/HTML5Audio.java6
-rw-r--r--core/java/android/webkit/WebSettings.java2
-rw-r--r--core/java/android/webkit/WebView.java99
-rw-r--r--core/java/android/webkit/WebViewCore.java396
-rw-r--r--core/java/android/widget/RelativeLayout.java50
-rw-r--r--core/java/android/widget/VideoView.java1
-rw-r--r--core/jni/AndroidRuntime.cpp24
-rw-r--r--core/jni/android/graphics/Canvas.cpp11
-rw-r--r--core/jni/android/graphics/Graphics.cpp2
-rw-r--r--core/jni/android/graphics/NinePatchImpl.cpp2
-rw-r--r--core/jni/android/graphics/Paint.cpp4
-rw-r--r--core/jni/android/graphics/SurfaceTexture.cpp12
-rw-r--r--core/jni/android/graphics/TextLayout.cpp27
-rw-r--r--core/jni/android/graphics/TextLayout.h2
-rw-r--r--core/jni/android/graphics/TextLayoutCache.cpp9
-rw-r--r--core/jni/android/opengl/util.cpp6
-rw-r--r--core/jni/android_app_NativeActivity.cpp42
-rw-r--r--core/jni/android_app_backup_FullBackup.cpp4
-rw-r--r--core/jni/android_backup_BackupHelperDispatcher.cpp10
-rwxr-xr-xcore/jni/android_bluetooth_BluetoothAudioGateway.cpp66
-rw-r--r--core/jni/android_bluetooth_HeadsetBase.cpp48
-rw-r--r--core/jni/android_bluetooth_common.cpp14
-rw-r--r--core/jni/android_bluetooth_common.h6
-rw-r--r--core/jni/android_database_CursorWindow.cpp4
-rw-r--r--core/jni/android_database_SQLiteCompiledSql.cpp4
-rw-r--r--core/jni/android_database_SQLiteDatabase.cpp60
-rw-r--r--core/jni/android_database_SQLiteDebug.cpp8
-rw-r--r--core/jni/android_database_SQLiteProgram.cpp4
-rw-r--r--core/jni/android_database_SQLiteQuery.cpp10
-rw-r--r--core/jni/android_database_SQLiteStatement.cpp12
-rw-r--r--core/jni/android_debug_JNITest.cpp12
-rw-r--r--core/jni/android_emoji_EmojiFactory.cpp8
-rw-r--r--core/jni/android_hardware_Camera.cpp24
-rw-r--r--core/jni/android_hardware_UsbDeviceConnection.cpp20
-rw-r--r--core/jni/android_hardware_UsbRequest.cpp16
-rw-r--r--core/jni/android_media_AudioRecord.cpp40
-rw-r--r--core/jni/android_media_AudioTrack.cpp44
-rw-r--r--core/jni/android_media_JetPlayer.cpp40
-rw-r--r--core/jni/android_media_ToneGenerator.cpp8
-rw-r--r--core/jni/android_net_LocalSocketImpl.cpp2
-rw-r--r--core/jni/android_net_TrafficStats.cpp6
-rw-r--r--core/jni/android_os_Debug.cpp6
-rw-r--r--core/jni/android_os_StatFs.cpp6
-rw-r--r--core/jni/android_os_UEventObserver.cpp2
-rw-r--r--core/jni/android_server_BluetoothA2dpService.cpp10
-rw-r--r--core/jni/android_server_BluetoothEventLoop.cpp58
-rw-r--r--core/jni/android_server_BluetoothService.cpp58
-rw-r--r--core/jni/android_server_NetworkManagementSocketTagger.cpp4
-rw-r--r--core/jni/android_server_Watchdog.cpp6
-rw-r--r--core/jni/android_util_Binder.cpp42
-rw-r--r--core/jni/android_util_EventLog.cpp6
-rw-r--r--core/jni/android_util_FileObserver.cpp6
-rw-r--r--core/jni/android_util_Log.cpp2
-rw-r--r--core/jni/android_util_Process.cpp40
-rw-r--r--core/jni/android_view_DisplayEventReceiver.cpp12
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp4
-rw-r--r--core/jni/android_view_InputChannel.cpp10
-rw-r--r--core/jni/android_view_InputEventReceiver.cpp20
-rw-r--r--core/jni/android_view_KeyEvent.cpp4
-rw-r--r--core/jni/android_view_MotionEvent.cpp4
-rw-r--r--core/jni/android_view_PointerIcon.cpp4
-rw-r--r--core/jni/android_view_VelocityTracker.cpp2
-rw-r--r--core/jni/com_android_internal_content_NativeLibraryHelper.cpp14
-rw-r--r--core/res/res/drawable-large-nodpi/default_wallpaper.jpgbin382047 -> 273356 bytes
-rw-r--r--core/res/res/drawable-nodpi/default_wallpaper.jpgbin28946 -> 81201 bytes
-rw-r--r--core/res/res/drawable-xlarge-nodpi/default_wallpaper.jpgbin382047 -> 273356 bytes
-rw-r--r--docs/html/guide/topics/fundamentals/activities.jd87
-rw-r--r--docs/html/guide/topics/fundamentals/fragments.jd6
-rw-r--r--docs/html/guide/topics/fundamentals/tasks-and-back-stack.jd62
-rw-r--r--docs/html/guide/topics/resources/index.jd28
-rw-r--r--docs/html/guide/topics/resources/providing-resources.jd10
-rw-r--r--docs/html/images/activity_fragment_lifecycle.pngbin50826 -> 47065 bytes
-rw-r--r--docs/html/images/activity_lifecycle.graffle9886
-rw-r--r--docs/html/images/activity_lifecycle.pngbin66148 -> 81796 bytes
-rw-r--r--docs/html/images/fragment_lifecycle.pngbin69715 -> 74551 bytes
-rw-r--r--docs/html/images/fundamentals/diagram_backstack.pngbin45329 -> 42790 bytes
-rw-r--r--docs/html/images/fundamentals/diagram_backstack_singletask_multiactivity.pngbin56854 -> 57883 bytes
-rw-r--r--docs/html/images/fundamentals/diagram_multiple_instances.pngbin12140 -> 24344 bytes
-rw-r--r--docs/html/images/fundamentals/diagram_multitasking.pngbin21931 -> 24646 bytes
-rw-r--r--docs/html/images/fundamentals/restore_instance.graffle3096
-rw-r--r--docs/html/images/fundamentals/restore_instance.pngbin83427 -> 73436 bytes
-rw-r--r--docs/html/images/fundamentals/service_binding_tree_lifecycle.pngbin69225 -> 76028 bytes
-rw-r--r--docs/html/images/fundamentals/service_lifecycle.graffle8595
-rw-r--r--docs/html/images/resources/res-selection-flowchart.graffle2629
-rw-r--r--docs/html/images/resources/res-selection-flowchart.pngbin32754 -> 75022 bytes
-rw-r--r--docs/html/images/resources/resource_devices_diagram.graffle4358
-rw-r--r--docs/html/images/resources/resource_devices_diagram1.pngbin29222 -> 19175 bytes
-rw-r--r--docs/html/images/resources/resource_devices_diagram2.pngbin32274 -> 19956 bytes
-rw-r--r--docs/html/images/service_lifecycle.pngbin75830 -> 74708 bytes
-rw-r--r--drm/common/ReadWriteUtils.cpp4
-rw-r--r--drm/jni/android_drm_DrmManagerClient.cpp2
-rw-r--r--drm/libdrmframework/DrmManagerClientImpl.cpp4
-rw-r--r--drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp22
-rw-r--r--graphics/jni/android_renderscript_RenderScript.cpp6
-rw-r--r--include/media/AudioTrack.h5
-rw-r--r--include/utils/GenerationCache.h2
-rw-r--r--include/utils/ResourceTypes.h10
-rw-r--r--libs/binder/Binder.cpp2
-rw-r--r--libs/binder/BpBinder.cpp2
-rw-r--r--libs/binder/CursorWindow.cpp8
-rw-r--r--libs/binder/IMemory.cpp8
-rw-r--r--libs/binder/IPCThreadState.cpp16
-rw-r--r--libs/binder/IServiceManager.cpp8
-rw-r--r--libs/binder/MemoryDealer.cpp4
-rw-r--r--libs/binder/MemoryHeapBase.cpp6
-rw-r--r--libs/binder/MemoryHeapPmem.cpp12
-rw-r--r--libs/binder/Parcel.cpp28
-rw-r--r--libs/binder/ProcessState.cpp14
-rw-r--r--libs/camera/Camera.cpp12
-rw-r--r--libs/camera/CameraParameters.cpp8
-rw-r--r--libs/cpustats/ThreadCpuUsage.cpp16
-rw-r--r--libs/gui/BitTube.cpp4
-rw-r--r--libs/gui/DisplayEventReceiver.cpp2
-rw-r--r--libs/gui/ISurfaceComposer.cpp10
-rw-r--r--libs/gui/SensorEventQueue.cpp6
-rw-r--r--libs/gui/SensorManager.cpp4
-rw-r--r--libs/gui/Surface.cpp6
-rw-r--r--libs/gui/SurfaceTexture.cpp18
-rw-r--r--libs/gui/SurfaceTextureClient.cpp32
-rw-r--r--libs/hwui/Caches.cpp2
-rw-r--r--libs/hwui/DisplayListRenderer.cpp4
-rw-r--r--libs/hwui/FontRenderer.cpp8
-rw-r--r--libs/hwui/GradientCache.cpp2
-rw-r--r--libs/hwui/LayerRenderer.cpp6
-rw-r--r--libs/hwui/OpenGLRenderer.cpp6
-rw-r--r--libs/hwui/Program.cpp6
-rw-r--r--libs/hwui/ShapeCache.h4
-rw-r--r--libs/hwui/TextureCache.cpp6
-rw-r--r--libs/rs/driver/rsdAllocation.cpp6
-rw-r--r--libs/rs/driver/rsdBcc.cpp34
-rw-r--r--libs/rs/driver/rsdCore.cpp14
-rw-r--r--libs/rs/driver/rsdGL.cpp28
-rw-r--r--libs/rs/driver/rsdMeshObj.cpp2
-rw-r--r--libs/rs/driver/rsdProgramStore.cpp6
-rw-r--r--libs/rs/driver/rsdRuntimeMath.cpp2
-rw-r--r--libs/rs/driver/rsdRuntimeStubs.cpp2
-rw-r--r--libs/rs/driver/rsdShader.cpp12
-rw-r--r--libs/rs/driver/rsdShaderCache.cpp12
-rw-r--r--libs/rs/rsAdapter.cpp2
-rw-r--r--libs/rs/rsAllocation.cpp30
-rw-r--r--libs/rs/rsAnimation.cpp2
-rw-r--r--libs/rs/rsContext.cpp26
-rw-r--r--libs/rs/rsContext.h4
-rw-r--r--libs/rs/rsElement.cpp2
-rw-r--r--libs/rs/rsFBOCache.cpp6
-rw-r--r--libs/rs/rsFifoSocket.cpp16
-rw-r--r--libs/rs/rsFileA3D.cpp20
-rw-r--r--libs/rs/rsFont.cpp28
-rw-r--r--libs/rs/rsLocklessFifo.cpp4
-rw-r--r--libs/rs/rsMesh.cpp8
-rw-r--r--libs/rs/rsMutex.cpp6
-rw-r--r--libs/rs/rsObjectBase.cpp6
-rw-r--r--libs/rs/rsProgram.cpp10
-rw-r--r--libs/rs/rsProgramFragment.cpp8
-rw-r--r--libs/rs/rsScript.cpp20
-rw-r--r--libs/rs/rsScriptC.cpp24
-rw-r--r--libs/rs/rsScriptC_Lib.cpp8
-rw-r--r--libs/rs/rsScriptC_LibGL.cpp12
-rw-r--r--libs/rs/rsSignal.cpp16
-rw-r--r--libs/rs/rsThreadIO.cpp38
-rw-r--r--libs/rs/rsType.cpp2
-rw-r--r--libs/rs/rsUtils.h2
-rw-r--r--libs/rs/rsg_generator.c6
-rw-r--r--libs/ui/FramebufferNativeWindow.cpp8
-rw-r--r--libs/ui/GraphicBuffer.cpp2
-rw-r--r--libs/ui/GraphicBufferAllocator.cpp6
-rw-r--r--libs/ui/GraphicBufferMapper.cpp10
-rw-r--r--libs/ui/Input.cpp2
-rw-r--r--libs/ui/InputTransport.cpp52
-rw-r--r--libs/ui/KeyCharacterMap.cpp48
-rw-r--r--libs/ui/KeyLayoutMap.cpp36
-rw-r--r--libs/ui/Keyboard.cpp6
-rw-r--r--libs/ui/Region.cpp12
-rw-r--r--libs/ui/VirtualKeyMap.cpp12
-rw-r--r--libs/utils/Asset.cpp18
-rw-r--r--libs/utils/AssetManager.cpp44
-rw-r--r--libs/utils/BackupData.cpp6
-rw-r--r--libs/utils/BackupHelpers.cpp44
-rw-r--r--libs/utils/BlobCache.cpp20
-rw-r--r--libs/utils/FileMap.cpp10
-rw-r--r--libs/utils/Looper.cpp22
-rw-r--r--libs/utils/ObbFile.cpp54
-rw-r--r--libs/utils/PropertyMap.cpp18
-rw-r--r--libs/utils/RefBase.cpp10
-rw-r--r--libs/utils/ResourceTypes.cpp218
-rw-r--r--libs/utils/Static.cpp4
-rw-r--r--libs/utils/StreamingZipInflater.cpp6
-rw-r--r--libs/utils/SystemClock.cpp6
-rw-r--r--libs/utils/Threads.cpp6
-rw-r--r--libs/utils/Tokenizer.cpp6
-rw-r--r--libs/utils/ZipFileRO.cpp76
-rw-r--r--libs/utils/ZipUtils.cpp12
-rw-r--r--media/java/android/media/MediaScanner.java52
-rw-r--r--media/java/android/media/ThumbnailUtils.java13
-rw-r--r--media/jni/android_media_MediaMetadataRetriever.cpp12
-rw-r--r--media/jni/android_media_MediaPlayer.cpp30
-rw-r--r--media/jni/android_media_MediaRecorder.cpp10
-rw-r--r--media/jni/android_media_MediaScanner.cpp8
-rw-r--r--media/jni/android_media_Utils.cpp2
-rw-r--r--media/jni/android_mtp_MtpDatabase.cpp74
-rw-r--r--media/jni/android_mtp_MtpDevice.cpp82
-rw-r--r--media/jni/android_mtp_MtpServer.cpp32
-rw-r--r--media/jni/audioeffect/android_media_AudioEffect.cpp58
-rw-r--r--media/jni/audioeffect/android_media_Visualizer.cpp20
-rwxr-xr-xmedia/jni/mediaeditor/VideoEditorLogging.h2
-rwxr-xr-xmedia/jni/mediaeditor/VideoEditorMain.cpp20
-rw-r--r--media/jni/soundpool/SoundPool.cpp12
-rw-r--r--media/jni/soundpool/SoundPoolThread.cpp2
-rw-r--r--media/jni/soundpool/android_media_SoundPool.cpp8
-rw-r--r--media/libeffects/factory/EffectsFactory.c22
-rwxr-xr-xmedia/libeffects/preprocessing/PreProcessing.cpp46
-rw-r--r--media/libeffects/testlibs/EffectEqualizer.cpp4
-rw-r--r--media/libeffects/testlibs/EffectReverb.c4
-rw-r--r--media/libeffects/visualizer/EffectVisualizer.cpp4
-rw-r--r--media/libmedia/AudioEffect.cpp12
-rw-r--r--media/libmedia/AudioRecord.cpp30
-rw-r--r--media/libmedia/AudioSystem.cpp14
-rw-r--r--media/libmedia/AudioTrack.cpp91
-rw-r--r--media/libmedia/IAudioFlinger.cpp6
-rw-r--r--media/libmedia/IAudioRecord.cpp2
-rw-r--r--media/libmedia/IAudioTrack.cpp4
-rw-r--r--media/libmedia/IMediaDeathNotifier.cpp6
-rw-r--r--media/libmedia/IOMX.cpp2
-rw-r--r--media/libmedia/JetPlayer.cpp20
-rw-r--r--media/libmedia/MediaProfiles.cpp28
-rw-r--r--media/libmedia/MediaScanner.cpp2
-rw-r--r--media/libmedia/MediaScannerClient.cpp6
-rw-r--r--media/libmedia/Metadata.cpp4
-rw-r--r--media/libmedia/ToneGenerator.cpp18
-rw-r--r--media/libmedia/Visualizer.cpp4
-rw-r--r--media/libmedia/mediametadataretriever.cpp24
-rw-r--r--media/libmedia/mediaplayer.cpp42
-rw-r--r--media/libmedia/mediarecorder.cpp130
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp46
-rw-r--r--media/libmediaplayerservice/MediaRecorderClient.cpp44
-rw-r--r--media/libmediaplayerservice/MetadataRetrieverClient.cpp26
-rw-r--r--media/libmediaplayerservice/MidiFile.cpp28
-rw-r--r--media/libmediaplayerservice/MidiMetadataRetriever.cpp6
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.cpp118
-rw-r--r--media/libmediaplayerservice/TestPlayerStub.cpp6
-rw-r--r--media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp6
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp10
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp4
-rw-r--r--media/libmediaplayerservice/nuplayer/RTSPSource.cpp2
-rw-r--r--media/libmediaplayerservice/nuplayer/StreamingSource.cpp6
-rw-r--r--media/libstagefright/AACWriter.cpp4
-rw-r--r--media/libstagefright/ACodec.cpp30
-rw-r--r--media/libstagefright/AMRExtractor.cpp4
-rw-r--r--media/libstagefright/AVIExtractor.cpp6
-rw-r--r--media/libstagefright/AudioSource.cpp6
-rw-r--r--media/libstagefright/AwesomePlayer.cpp32
-rwxr-xr-xmedia/libstagefright/CameraSource.cpp34
-rw-r--r--media/libstagefright/CameraSourceTimeLapse.cpp4
-rw-r--r--media/libstagefright/DRMExtractor.cpp2
-rw-r--r--media/libstagefright/ESDS.cpp2
-rw-r--r--media/libstagefright/FLACExtractor.cpp30
-rw-r--r--media/libstagefright/FileSource.cpp2
-rw-r--r--media/libstagefright/HTTPBase.cpp8
-rw-r--r--media/libstagefright/MP3Extractor.cpp4
-rw-r--r--media/libstagefright/MPEG4Extractor.cpp18
-rwxr-xr-xmedia/libstagefright/MPEG4Writer.cpp62
-rw-r--r--media/libstagefright/MediaBuffer.cpp2
-rw-r--r--media/libstagefright/NuCachedSource2.cpp20
-rwxr-xr-xmedia/libstagefright/OMXCodec.cpp78
-rw-r--r--media/libstagefright/OggExtractor.cpp8
-rw-r--r--media/libstagefright/SampleIterator.cpp8
-rw-r--r--media/libstagefright/SampleTable.cpp4
-rw-r--r--media/libstagefright/StagefrightMediaScanner.cpp2
-rw-r--r--media/libstagefright/StagefrightMetadataRetriever.cpp8
-rw-r--r--media/libstagefright/SurfaceMediaSource.cpp32
-rw-r--r--media/libstagefright/TimedEventQueue.cpp4
-rw-r--r--media/libstagefright/VBRISeeker.cpp2
-rw-r--r--media/libstagefright/WVMExtractor.cpp4
-rw-r--r--media/libstagefright/avc_utils.cpp4
-rw-r--r--media/libstagefright/codecs/aacdec/SoftAAC.cpp10
-rw-r--r--media/libstagefright/codecs/aacenc/AACEncoder.cpp18
-rw-r--r--media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp2
-rw-r--r--media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp6
-rw-r--r--media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp14
-rw-r--r--media/libstagefright/codecs/avc/enc/AVCEncoder.cpp20
-rw-r--r--media/libstagefright/codecs/g711/dec/SoftG711.cpp2
-rw-r--r--media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp6
-rw-r--r--media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp36
-rw-r--r--media/libstagefright/codecs/mp3dec/SoftMP3.cpp4
-rw-r--r--media/libstagefright/codecs/on2/dec/SoftVPX.cpp4
-rw-r--r--media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp4
-rw-r--r--media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp4
-rw-r--r--media/libstagefright/colorconversion/SoftwareRenderer.cpp4
-rw-r--r--media/libstagefright/foundation/AHierarchicalStateMachine.cpp2
-rw-r--r--media/libstagefright/foundation/ALooperRoster.cpp8
-rw-r--r--media/libstagefright/foundation/AMessage.cpp4
-rw-r--r--media/libstagefright/foundation/hexdump.cpp2
-rw-r--r--media/libstagefright/httplive/LiveDataSource.cpp4
-rw-r--r--media/libstagefright/httplive/LiveSession.cpp42
-rw-r--r--media/libstagefright/httplive/M3UParser.cpp4
-rw-r--r--media/libstagefright/id3/ID3.cpp2
-rw-r--r--media/libstagefright/matroska/MatroskaExtractor.cpp4
-rw-r--r--media/libstagefright/mpeg2ts/ATSParser.cpp20
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.cpp18
-rw-r--r--media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp10
-rw-r--r--media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp2
-rw-r--r--media/libstagefright/omx/OMXMaster.cpp4
-rw-r--r--media/libstagefright/omx/OMXNodeInstance.cpp36
-rw-r--r--media/libstagefright/omx/SoftOMXPlugin.cpp2
-rw-r--r--media/libstagefright/omx/tests/OMXHarness.cpp16
-rw-r--r--media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp6
-rw-r--r--media/libstagefright/rtsp/APacketSource.cpp4
-rw-r--r--media/libstagefright/rtsp/ARTPConnection.cpp10
-rw-r--r--media/libstagefright/rtsp/ARTPSession.cpp14
-rw-r--r--media/libstagefright/rtsp/ARTPSource.cpp6
-rw-r--r--media/libstagefright/rtsp/ARTPWriter.cpp4
-rw-r--r--media/libstagefright/rtsp/ARTSPConnection.cpp26
-rw-r--r--media/libstagefright/rtsp/ASessionDescription.cpp2
-rw-r--r--media/libstagefright/rtsp/MyHandler.h64
-rw-r--r--media/libstagefright/rtsp/UDPPusher.cpp8
-rw-r--r--media/libstagefright/rtsp/rtp_test.cpp2
-rw-r--r--media/libstagefright/tests/DummyRecorder.cpp2
-rw-r--r--media/libstagefright/tests/SurfaceMediaSource_test.cpp6
-rw-r--r--media/libstagefright/timedtext/TimedTextPlayer.cpp2
-rw-r--r--media/libstagefright/yuv/YUVImage.cpp8
-rw-r--r--media/mediaserver/main_mediaserver.cpp2
-rw-r--r--media/mtp/MtpDataPacket.cpp2
-rw-r--r--media/mtp/MtpDevice.cpp30
-rw-r--r--media/mtp/MtpPacket.cpp8
-rw-r--r--media/mtp/MtpProperty.cpp32
-rw-r--r--media/mtp/MtpServer.cpp32
-rw-r--r--media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp4
-rw-r--r--native/android/looper.cpp4
-rw-r--r--native/android/storage_manager.cpp6
-rw-r--r--opengl/libagl/TextureObjectManager.cpp2
-rw-r--r--opengl/libagl/egl.cpp8
-rw-r--r--opengl/libagl/mipmap.cpp2
-rw-r--r--opengl/libs/EGL/Loader.cpp4
-rw-r--r--opengl/libs/EGL/egl.cpp4
-rw-r--r--opengl/libs/EGL/eglApi.cpp8
-rw-r--r--opengl/libs/EGL/egl_cache.cpp32
-rw-r--r--opengl/libs/EGL/egl_display.cpp6
-rw-r--r--opengl/libs/EGL/egl_object.cpp2
-rw-r--r--opengl/libs/EGL/egl_object.h4
-rw-r--r--opengl/libs/EGL/egl_tls.cpp2
-rw-r--r--opengl/libs/GLES2_dbg/src/dbgcontext.cpp4
-rw-r--r--opengl/libs/GLES_CM/gl.cpp2
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_eglapi.cpp2
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_fixup.cpp6
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_transport.cpp8
-rw-r--r--opengl/tests/gl2_jni/jni/gl_code.cpp14
-rw-r--r--opengl/tests/gl_jni/jni/gl_code.cpp2
-rw-r--r--opengl/tests/gl_perf/fill_common.cpp8
-rw-r--r--opengl/tests/gl_perfapp/jni/gl_code.cpp12
-rw-r--r--opengl/tests/gldual/jni/gl_code.cpp14
-rw-r--r--packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java15
-rw-r--r--services/audioflinger/AudioFlinger.cpp175
-rw-r--r--services/audioflinger/AudioFlinger.h6
-rw-r--r--services/audioflinger/AudioMixer.cpp128
-rw-r--r--services/audioflinger/AudioMixer.h14
-rw-r--r--services/audioflinger/AudioPolicyService.cpp44
-rw-r--r--services/audioflinger/AudioResampler.cpp30
-rw-r--r--services/audioflinger/AudioResamplerCubic.cpp12
-rw-r--r--services/camera/libcameraservice/CameraHardwareInterface.h12
-rw-r--r--services/camera/libcameraservice/CameraHardwareStub.cpp8
-rw-r--r--services/camera/libcameraservice/CameraService.cpp74
-rw-r--r--services/camera/libcameraservice/CameraService.h1
-rw-r--r--services/camera/tests/CameraServiceTest/CameraServiceTest.cpp2
-rw-r--r--services/input/EventHub.cpp66
-rw-r--r--services/input/InputDispatcher.cpp64
-rw-r--r--services/input/InputManager.cpp8
-rw-r--r--services/input/InputReader.cpp54
-rw-r--r--services/input/SpriteController.cpp22
-rw-r--r--services/java/com/android/server/connectivity/Tethering.java16
-rw-r--r--services/java/com/android/server/pm/Settings.java9
-rw-r--r--services/jni/com_android_server_AlarmManagerService.cpp6
-rw-r--r--services/jni/com_android_server_BatteryService.cpp32
-rw-r--r--services/jni/com_android_server_InputManager.cpp20
-rw-r--r--services/jni/com_android_server_PowerManagerService.cpp2
-rw-r--r--services/jni/com_android_server_UsbDeviceManager.cpp10
-rw-r--r--services/jni/com_android_server_UsbHostManager.cpp12
-rw-r--r--services/jni/com_android_server_VibratorService.cpp4
-rw-r--r--services/jni/com_android_server_connectivity_Vpn.cpp28
-rwxr-xr-xservices/jni/com_android_server_location_GpsLocationProvider.cpp24
-rw-r--r--services/jni/onload.cpp2
-rw-r--r--services/sensorservice/Fusion.cpp2
-rw-r--r--services/sensorservice/SensorDevice.cpp8
-rw-r--r--services/sensorservice/SensorInterface.cpp2
-rw-r--r--services/sensorservice/SensorService.cpp12
-rw-r--r--services/surfaceflinger/DisplayHardware/DisplayHardware.cpp46
-rw-r--r--services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp4
-rw-r--r--services/surfaceflinger/DisplayHardware/HWComposer.cpp4
-rw-r--r--services/surfaceflinger/EventThread.cpp2
-rw-r--r--services/surfaceflinger/LayerScreenshot.cpp2
-rw-r--r--services/surfaceflinger/MessageQueue.cpp4
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp48
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnection.java3
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnectionTracker.java13
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java104
-rw-r--r--test-runner/src/android/test/BandwidthTest.java32
-rw-r--r--test-runner/src/android/test/BandwidthTestRunner.java92
-rw-r--r--test-runner/src/android/test/InstrumentationTestRunner.java10
-rw-r--r--tests/TileBenchmark/Android.mk10
-rw-r--r--tests/TileBenchmark/AndroidManifest.xml4
-rw-r--r--tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java (renamed from tests/TileBenchmark/tests/src/com/test/tilebenchmark/PerformanceTest.java)2
-rw-r--r--tests/TileBenchmark/tests/Android.mk16
-rw-r--r--tests/TileBenchmark/tests/AndroidManifest.xml27
-rw-r--r--tools/aapt/Command.cpp169
-rw-r--r--tools/aapt/ZipEntry.cpp4
-rw-r--r--tools/aapt/ZipFile.cpp8
-rw-r--r--voip/jni/rtp/AudioGroup.cpp34
-rw-r--r--voip/jni/rtp/EchoSuppressor.cpp2
-rw-r--r--voip/jni/rtp/RtpStream.cpp2
432 files changed, 32642 insertions, 3594 deletions
diff --git a/api/16.txt b/api/16.txt
index 13fba29d2875..8e07844725c3 100644
--- a/api/16.txt
+++ b/api/16.txt
@@ -25259,7 +25259,7 @@ package android.webkit {
field public static final java.lang.String SCHEME_TEL = "tel:";
}
- public class WebView.HitTestResult {
+ public static class WebView.HitTestResult {
method public java.lang.String getExtra();
method public int getType();
field public static final deprecated int ANCHOR_TYPE = 1; // 0x1
diff --git a/api/current.txt b/api/current.txt
index db3b30d618b5..1f6ba1b3b921 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -25433,7 +25433,7 @@ package android.webkit {
field public static final java.lang.String SCHEME_TEL = "tel:";
}
- public class WebView.HitTestResult {
+ public static class WebView.HitTestResult {
method public java.lang.String getExtra();
method public int getType();
field public static final deprecated int ANCHOR_TYPE = 1; // 0x1
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 12d16690f3ab..6fe358c7ee54 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -72,7 +72,7 @@ public:
char* slashClassName = toSlashClassName(mClassName);
mClass = env->FindClass(slashClassName);
if (mClass == NULL) {
- LOGE("ERROR: could not find class '%s'\n", mClassName);
+ ALOGE("ERROR: could not find class '%s'\n", mClassName);
}
free(slashClassName);
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index f2503671b645..0d5b4caa91b4 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -69,7 +69,7 @@ BootAnimation::~BootAnimation() {
void BootAnimation::onFirstRef() {
status_t err = mSession->linkToComposerDeath(this);
- LOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
+ ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
if (err == NO_ERROR) {
run("BootAnimation", PRIORITY_DISPLAY);
}
@@ -374,7 +374,7 @@ bool BootAnimation::movie()
size_t numEntries = zip.getNumEntries();
ZipEntryRO desc = zip.findEntryByName("desc.txt");
FileMap* descMap = zip.createEntryFileMap(desc);
- LOGE_IF(!descMap, "descMap is null");
+ ALOGE_IF(!descMap, "descMap is null");
if (!descMap) {
return false;
}
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp
index 5f8b7441f4dc..ff809d369fb3 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -47,7 +47,7 @@ int main(int argc, char** argv)
char value[PROPERTY_VALUE_MAX];
property_get("debug.sf.nobootanimation", value, "0");
int noBootAnimation = atoi(value);
- LOGI_IF(noBootAnimation, "boot animation disabled");
+ ALOGI_IF(noBootAnimation, "boot animation disabled");
if (!noBootAnimation) {
sp<ProcessState> proc(ProcessState::self());
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index 02e1f1ce6187..83c881a74902 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -87,9 +87,9 @@ static void dumpstate() {
dump_file("BUDDYINFO", "/proc/buddyinfo");
if (screenshot_path[0]) {
- LOGI("taking screenshot\n");
+ ALOGI("taking screenshot\n");
run_command(NULL, 5, "su", "root", "screenshot", screenshot_path, NULL);
- LOGI("wrote screenshot: %s\n", screenshot_path);
+ ALOGI("wrote screenshot: %s\n", screenshot_path);
}
run_command("SYSTEM SETTINGS", 20, "su", "root", "sqlite3",
@@ -285,7 +285,7 @@ int main(int argc, char *argv[]) {
int use_socket = 0;
int do_fb = 0;
- LOGI("begin\n");
+ ALOGI("begin\n");
/* set as high priority, and protect from OOM killer */
setpriority(PRIO_PROCESS, 0, -20);
@@ -329,22 +329,22 @@ int main(int argc, char *argv[]) {
if (getuid() == 0) {
if (prctl(PR_SET_KEEPCAPS, 1) < 0) {
- LOGE("prctl(PR_SET_KEEPCAPS) failed: %s\n", strerror(errno));
+ ALOGE("prctl(PR_SET_KEEPCAPS) failed: %s\n", strerror(errno));
return -1;
}
/* switch to non-root user and group */
gid_t groups[] = { AID_LOG, AID_SDCARD_RW, AID_MOUNT, AID_INET };
if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) {
- LOGE("Unable to setgroups, aborting: %s\n", strerror(errno));
+ ALOGE("Unable to setgroups, aborting: %s\n", strerror(errno));
return -1;
}
if (setgid(AID_SHELL) != 0) {
- LOGE("Unable to setgid, aborting: %s\n", strerror(errno));
+ ALOGE("Unable to setgid, aborting: %s\n", strerror(errno));
return -1;
}
if (setuid(AID_SHELL) != 0) {
- LOGE("Unable to setuid, aborting: %s\n", strerror(errno));
+ ALOGE("Unable to setuid, aborting: %s\n", strerror(errno));
return -1;
}
@@ -361,7 +361,7 @@ int main(int argc, char *argv[]) {
capdata[1].inheritable = 0;
if (capset(&capheader, &capdata[0]) < 0) {
- LOGE("capset failed: %s\n", strerror(errno));
+ ALOGE("capset failed: %s\n", strerror(errno));
return -1;
}
}
@@ -422,7 +422,7 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "rename(%s, %s): %s\n", tmp_path, path, strerror(errno));
}
- LOGI("done\n");
+ ALOGI("done\n");
return 0;
}
diff --git a/cmds/dumpsys/dumpsys.cpp b/cmds/dumpsys/dumpsys.cpp
index fdc5d5d63ecf..7dad6b625b6a 100644
--- a/cmds/dumpsys/dumpsys.cpp
+++ b/cmds/dumpsys/dumpsys.cpp
@@ -31,7 +31,7 @@ int main(int argc, char* const argv[])
sp<IServiceManager> sm = defaultServiceManager();
fflush(stdout);
if (sm == NULL) {
- LOGE("Unable to get default service manager!");
+ ALOGE("Unable to get default service manager!");
aerr << "dumpsys: Unable to get default service manager!" << endl;
return 20;
}
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
index db7258517379..dd92bbe499bc 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -30,47 +30,47 @@ int install(const char *pkgname, uid_t uid, gid_t gid)
char libdir[PKG_PATH_MAX];
if ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) {
- LOGE("invalid uid/gid: %d %d\n", uid, gid);
+ ALOGE("invalid uid/gid: %d %d\n", uid, gid);
return -1;
}
if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, 0)) {
- LOGE("cannot create package path\n");
+ ALOGE("cannot create package path\n");
return -1;
}
if (create_pkg_path(libdir, pkgname, PKG_LIB_POSTFIX, 0)) {
- LOGE("cannot create package lib path\n");
+ ALOGE("cannot create package lib path\n");
return -1;
}
if (mkdir(pkgdir, 0751) < 0) {
- LOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
+ ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
return -errno;
}
if (chmod(pkgdir, 0751) < 0) {
- LOGE("cannot chmod dir '%s': %s\n", pkgdir, strerror(errno));
+ ALOGE("cannot chmod dir '%s': %s\n", pkgdir, strerror(errno));
unlink(pkgdir);
return -errno;
}
if (chown(pkgdir, uid, gid) < 0) {
- LOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno));
+ ALOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno));
unlink(pkgdir);
return -errno;
}
if (mkdir(libdir, 0755) < 0) {
- LOGE("cannot create dir '%s': %s\n", libdir, strerror(errno));
+ ALOGE("cannot create dir '%s': %s\n", libdir, strerror(errno));
unlink(pkgdir);
return -errno;
}
if (chmod(libdir, 0755) < 0) {
- LOGE("cannot chmod dir '%s': %s\n", libdir, strerror(errno));
+ ALOGE("cannot chmod dir '%s': %s\n", libdir, strerror(errno));
unlink(libdir);
unlink(pkgdir);
return -errno;
}
if (chown(libdir, AID_SYSTEM, AID_SYSTEM) < 0) {
- LOGE("cannot chown dir '%s': %s\n", libdir, strerror(errno));
+ ALOGE("cannot chown dir '%s': %s\n", libdir, strerror(errno));
unlink(libdir);
unlink(pkgdir);
return -errno;
@@ -100,7 +100,7 @@ int renamepkg(const char *oldpkgname, const char *newpkgname)
return -1;
if (rename(oldpkgdir, newpkgdir) < 0) {
- LOGE("cannot rename dir '%s' to '%s': %s\n", oldpkgdir, newpkgdir, strerror(errno));
+ ALOGE("cannot rename dir '%s' to '%s': %s\n", oldpkgdir, newpkgdir, strerror(errno));
return -errno;
}
return 0;
@@ -127,11 +127,11 @@ int make_user_data(const char *pkgname, uid_t uid, uid_t persona)
return -1;
}
if (mkdir(pkgdir, 0751) < 0) {
- LOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
+ ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
return -errno;
}
if (chown(pkgdir, uid, uid) < 0) {
- LOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno));
+ ALOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno));
unlink(pkgdir);
return -errno;
}
@@ -165,7 +165,7 @@ static int64_t disk_free()
if (statfs(android_data_dir.path, &sfs) == 0) {
return sfs.f_bavail * sfs.f_bsize;
} else {
- LOGE("Couldn't statfs %s: %s\n", android_data_dir.path, strerror(errno));
+ ALOGE("Couldn't statfs %s: %s\n", android_data_dir.path, strerror(errno));
return -1;
}
}
@@ -189,17 +189,17 @@ int free_cache(int64_t free_size)
avail = disk_free();
if (avail < 0) return -1;
- LOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail);
+ ALOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail);
if (avail >= free_size) return 0;
if (create_persona_path(datadir, 0)) {
- LOGE("couldn't get directory for persona 0");
+ ALOGE("couldn't get directory for persona 0");
return -1;
}
d = opendir(datadir);
if (d == NULL) {
- LOGE("cannot open %s: %s\n", datadir, strerror(errno));
+ ALOGE("cannot open %s: %s\n", datadir, strerror(errno));
return -1;
}
dfd = dirfd(d);
@@ -245,7 +245,7 @@ int move_dex(const char *src, const char *dst)
ALOGV("move %s -> %s\n", src_dex, dst_dex);
if (rename(src_dex, dst_dex) < 0) {
- LOGE("Couldn't move %s: %s\n", src_dex, strerror(errno));
+ ALOGE("Couldn't move %s: %s\n", src_dex, strerror(errno));
return -1;
} else {
return 0;
@@ -261,7 +261,7 @@ int rm_dex(const char *path)
ALOGV("unlink %s\n", dex_path);
if (unlink(dex_path) < 0) {
- LOGE("Couldn't unlink %s: %s\n", dex_path, strerror(errno));
+ ALOGE("Couldn't unlink %s: %s\n", dex_path, strerror(errno));
return -1;
} else {
return 0;
@@ -281,12 +281,12 @@ int protect(char *pkgname, gid_t gid)
if (stat(pkgpath, &s) < 0) return -1;
if (chown(pkgpath, s.st_uid, gid) < 0) {
- LOGE("failed to chgrp '%s': %s\n", pkgpath, strerror(errno));
+ ALOGE("failed to chgrp '%s': %s\n", pkgpath, strerror(errno));
return -1;
}
if (chmod(pkgpath, S_IRUSR|S_IWUSR|S_IRGRP) < 0) {
- LOGE("failed to chmod '%s': %s\n", pkgpath, strerror(errno));
+ ALOGE("failed to chmod '%s': %s\n", pkgpath, strerror(errno));
return -1;
}
@@ -443,7 +443,7 @@ static void run_dexopt(int zip_fd, int odex_fd, const char* input_file_name,
execl(DEX_OPT_BIN, DEX_OPT_BIN, "--zip", zip_num, odex_num, input_file_name,
dexopt_flags, (char*) NULL);
- LOGE("execl(%s) failed: %s\n", DEX_OPT_BIN, strerror(errno));
+ ALOGE("execl(%s) failed: %s\n", DEX_OPT_BIN, strerror(errno));
}
static int wait_dexopt(pid_t pid, const char* apk_path)
@@ -463,7 +463,7 @@ static int wait_dexopt(pid_t pid, const char* apk_path)
}
}
if (got_pid != pid) {
- LOGW("waitpid failed: wanted %d, got %d: %s\n",
+ ALOGW("waitpid failed: wanted %d, got %d: %s\n",
(int) pid, (int) got_pid, strerror(errno));
return 1;
}
@@ -472,7 +472,7 @@ static int wait_dexopt(pid_t pid, const char* apk_path)
ALOGV("DexInv: --- END '%s' (success) ---\n", apk_path);
return 0;
} else {
- LOGW("DexInv: --- END '%s' --- status=0x%04x, process failed\n",
+ ALOGW("DexInv: --- END '%s' --- status=0x%04x, process failed\n",
apk_path, status);
return status; /* always nonzero */
}
@@ -515,24 +515,24 @@ int dexopt(const char *apk_path, uid_t uid, int is_public)
zip_fd = open(apk_path, O_RDONLY, 0);
if (zip_fd < 0) {
- LOGE("dexopt cannot open '%s' for input\n", apk_path);
+ ALOGE("dexopt cannot open '%s' for input\n", apk_path);
return -1;
}
unlink(dex_path);
odex_fd = open(dex_path, O_RDWR | O_CREAT | O_EXCL, 0644);
if (odex_fd < 0) {
- LOGE("dexopt cannot open '%s' for output\n", dex_path);
+ ALOGE("dexopt cannot open '%s' for output\n", dex_path);
goto fail;
}
if (fchown(odex_fd, AID_SYSTEM, uid) < 0) {
- LOGE("dexopt cannot chown '%s'\n", dex_path);
+ ALOGE("dexopt cannot chown '%s'\n", dex_path);
goto fail;
}
if (fchmod(odex_fd,
S_IRUSR|S_IWUSR|S_IRGRP |
(is_public ? S_IROTH : 0)) < 0) {
- LOGE("dexopt cannot chmod '%s'\n", dex_path);
+ ALOGE("dexopt cannot chmod '%s'\n", dex_path);
goto fail;
}
@@ -543,15 +543,15 @@ int dexopt(const char *apk_path, uid_t uid, int is_public)
if (pid == 0) {
/* child -- drop privileges before continuing */
if (setgid(uid) != 0) {
- LOGE("setgid(%d) failed during dexopt\n", uid);
+ ALOGE("setgid(%d) failed during dexopt\n", uid);
exit(64);
}
if (setuid(uid) != 0) {
- LOGE("setuid(%d) during dexopt\n", uid);
+ ALOGE("setuid(%d) during dexopt\n", uid);
exit(65);
}
if (flock(odex_fd, LOCK_EX | LOCK_NB) != 0) {
- LOGE("flock(%s) failed: %s\n", dex_path, strerror(errno));
+ ALOGE("flock(%s) failed: %s\n", dex_path, strerror(errno));
exit(66);
}
@@ -560,7 +560,7 @@ int dexopt(const char *apk_path, uid_t uid, int is_public)
} else {
res = wait_dexopt(pid, apk_path);
if (res != 0) {
- LOGE("dexopt failed on '%s' res = %d\n", dex_path, res);
+ ALOGE("dexopt failed on '%s' res = %d\n", dex_path, res);
goto fail;
}
}
@@ -595,7 +595,7 @@ void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid,
if (mkdir(path, mode) == 0) {
chown(path, uid, gid);
} else {
- LOGW("Unable to make directory %s: %s\n", path, strerror(errno));
+ ALOGW("Unable to make directory %s: %s\n", path, strerror(errno));
}
}
path[basepos] = '/';
@@ -616,7 +616,7 @@ int movefileordir(char* srcpath, char* dstpath, int dstbasepos,
int dstend = strlen(dstpath);
if (lstat(srcpath, statbuf) < 0) {
- LOGW("Unable to stat %s: %s\n", srcpath, strerror(errno));
+ ALOGW("Unable to stat %s: %s\n", srcpath, strerror(errno));
return 1;
}
@@ -626,12 +626,12 @@ int movefileordir(char* srcpath, char* dstpath, int dstbasepos,
ALOGV("Renaming %s to %s (uid %d)\n", srcpath, dstpath, dstuid);
if (rename(srcpath, dstpath) >= 0) {
if (chown(dstpath, dstuid, dstgid) < 0) {
- LOGE("cannot chown %s: %s\n", dstpath, strerror(errno));
+ ALOGE("cannot chown %s: %s\n", dstpath, strerror(errno));
unlink(dstpath);
return 1;
}
} else {
- LOGW("Unable to rename %s to %s: %s\n",
+ ALOGW("Unable to rename %s to %s: %s\n",
srcpath, dstpath, strerror(errno));
return 1;
}
@@ -640,7 +640,7 @@ int movefileordir(char* srcpath, char* dstpath, int dstbasepos,
d = opendir(srcpath);
if (d == NULL) {
- LOGW("Unable to opendir %s: %s\n", srcpath, strerror(errno));
+ ALOGW("Unable to opendir %s: %s\n", srcpath, strerror(errno));
return 1;
}
@@ -655,12 +655,12 @@ int movefileordir(char* srcpath, char* dstpath, int dstbasepos,
}
if ((srcend+strlen(name)) >= (PKG_PATH_MAX-2)) {
- LOGW("Source path too long; skipping: %s/%s\n", srcpath, name);
+ ALOGW("Source path too long; skipping: %s/%s\n", srcpath, name);
continue;
}
if ((dstend+strlen(name)) >= (PKG_PATH_MAX-2)) {
- LOGW("Destination path too long; skipping: %s/%s\n", dstpath, name);
+ ALOGW("Destination path too long; skipping: %s/%s\n", dstpath, name);
continue;
}
@@ -716,7 +716,7 @@ int movefiles()
} else {
subfd = openat(dfd, name, O_RDONLY);
if (subfd < 0) {
- LOGW("Unable to open update commands at %s%s\n",
+ ALOGW("Unable to open update commands at %s%s\n",
UPDATE_COMMANDS_DIR_PREFIX, name);
continue;
}
@@ -742,7 +742,7 @@ int movefiles()
// skip comments and empty lines.
} else if (hasspace) {
if (dstpkg[0] == 0) {
- LOGW("Path before package line in %s%s: %s\n",
+ ALOGW("Path before package line in %s%s: %s\n",
UPDATE_COMMANDS_DIR_PREFIX, name, buf+bufp);
} else if (srcpkg[0] == 0) {
// Skip -- source package no longer exists.
@@ -758,7 +758,7 @@ int movefiles()
} else {
char* div = strchr(buf+bufp, ':');
if (div == NULL) {
- LOGW("Bad package spec in %s%s; no ':' sep: %s\n",
+ ALOGW("Bad package spec in %s%s; no ':' sep: %s\n",
UPDATE_COMMANDS_DIR_PREFIX, name, buf+bufp);
} else {
*div = 0;
@@ -767,14 +767,14 @@ int movefiles()
strcpy(dstpkg, buf+bufp);
} else {
srcpkg[0] = dstpkg[0] = 0;
- LOGW("Package name too long in %s%s: %s\n",
+ ALOGW("Package name too long in %s%s: %s\n",
UPDATE_COMMANDS_DIR_PREFIX, name, buf+bufp);
}
if (strlen(div) < PKG_NAME_MAX) {
strcpy(srcpkg, div);
} else {
srcpkg[0] = dstpkg[0] = 0;
- LOGW("Package name too long in %s%s: %s\n",
+ ALOGW("Package name too long in %s%s: %s\n",
UPDATE_COMMANDS_DIR_PREFIX, name, div);
}
if (srcpkg[0] != 0) {
@@ -785,7 +785,7 @@ int movefiles()
}
} else {
srcpkg[0] = 0;
- LOGW("Can't create path %s in %s%s\n",
+ ALOGW("Can't create path %s in %s%s\n",
div, UPDATE_COMMANDS_DIR_PREFIX, name);
}
if (srcpkg[0] != 0) {
@@ -802,7 +802,7 @@ int movefiles()
}
} else {
srcpkg[0] = 0;
- LOGW("Can't create path %s in %s%s\n",
+ ALOGW("Can't create path %s in %s%s\n",
div, UPDATE_COMMANDS_DIR_PREFIX, name);
}
}
@@ -815,7 +815,7 @@ int movefiles()
} else {
if (bufp == 0) {
if (bufp < bufe) {
- LOGW("Line too long in %s%s, skipping: %s\n",
+ ALOGW("Line too long in %s%s, skipping: %s\n",
UPDATE_COMMANDS_DIR_PREFIX, name, buf);
}
} else if (bufp < bufe) {
@@ -825,7 +825,7 @@ int movefiles()
}
readlen = read(subfd, buf+bufe, PKG_PATH_MAX-bufe);
if (readlen < 0) {
- LOGW("Failure reading update commands in %s%s: %s\n",
+ ALOGW("Failure reading update commands in %s%s: %s\n",
UPDATE_COMMANDS_DIR_PREFIX, name, strerror(errno));
break;
} else if (readlen == 0) {
@@ -852,30 +852,30 @@ int linklib(const char* dataDir, const char* asecLibDir)
const size_t libdirLen = strlen(dataDir) + strlen(PKG_LIB_POSTFIX);
if (libdirLen >= PKG_PATH_MAX) {
- LOGE("library dir len too large");
+ ALOGE("library dir len too large");
return -1;
}
if (snprintf(libdir, sizeof(libdir), "%s%s", dataDir, PKG_LIB_POSTFIX) != (ssize_t)libdirLen) {
- LOGE("library dir not written successfully: %s\n", strerror(errno));
+ ALOGE("library dir not written successfully: %s\n", strerror(errno));
return -1;
}
if (stat(dataDir, &s) < 0) return -1;
if (chown(dataDir, 0, 0) < 0) {
- LOGE("failed to chown '%s': %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chown '%s': %s\n", dataDir, strerror(errno));
return -1;
}
if (chmod(dataDir, 0700) < 0) {
- LOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
rc = -1;
goto out;
}
if (lstat(libdir, &libStat) < 0) {
- LOGE("couldn't stat lib dir: %s\n", strerror(errno));
+ ALOGE("couldn't stat lib dir: %s\n", strerror(errno));
rc = -1;
goto out;
}
@@ -893,13 +893,13 @@ int linklib(const char* dataDir, const char* asecLibDir)
}
if (symlink(asecLibDir, libdir) < 0) {
- LOGE("couldn't symlink directory '%s' -> '%s': %s\n", libdir, asecLibDir, strerror(errno));
+ ALOGE("couldn't symlink directory '%s' -> '%s': %s\n", libdir, asecLibDir, strerror(errno));
rc = -errno;
goto out;
}
if (lchown(libdir, AID_SYSTEM, AID_SYSTEM) < 0) {
- LOGE("cannot chown dir '%s': %s\n", libdir, strerror(errno));
+ ALOGE("cannot chown dir '%s': %s\n", libdir, strerror(errno));
unlink(libdir);
rc = -errno;
goto out;
@@ -907,12 +907,12 @@ int linklib(const char* dataDir, const char* asecLibDir)
out:
if (chmod(dataDir, s.st_mode) < 0) {
- LOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
return -errno;
}
if (chown(dataDir, s.st_uid, s.st_gid) < 0) {
- LOGE("failed to chown '%s' : %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chown '%s' : %s\n", dataDir, strerror(errno));
return -errno;
}
@@ -931,28 +931,28 @@ int unlinklib(const char* dataDir)
}
if (snprintf(libdir, sizeof(libdir), "%s%s", dataDir, PKG_LIB_POSTFIX) != (ssize_t)libdirLen) {
- LOGE("library dir not written successfully: %s\n", strerror(errno));
+ ALOGE("library dir not written successfully: %s\n", strerror(errno));
return -1;
}
if (stat(dataDir, &s) < 0) {
- LOGE("couldn't state data dir");
+ ALOGE("couldn't state data dir");
return -1;
}
if (chown(dataDir, 0, 0) < 0) {
- LOGE("failed to chown '%s': %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chown '%s': %s\n", dataDir, strerror(errno));
return -1;
}
if (chmod(dataDir, 0700) < 0) {
- LOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
rc = -1;
goto out;
}
if (lstat(libdir, &libStat) < 0) {
- LOGE("couldn't stat lib dir: %s\n", strerror(errno));
+ ALOGE("couldn't stat lib dir: %s\n", strerror(errno));
rc = -1;
goto out;
}
@@ -970,13 +970,13 @@ int unlinklib(const char* dataDir)
}
if (mkdir(libdir, 0755) < 0) {
- LOGE("cannot create dir '%s': %s\n", libdir, strerror(errno));
+ ALOGE("cannot create dir '%s': %s\n", libdir, strerror(errno));
rc = -errno;
goto out;
}
if (chown(libdir, AID_SYSTEM, AID_SYSTEM) < 0) {
- LOGE("cannot chown dir '%s': %s\n", libdir, strerror(errno));
+ ALOGE("cannot chown dir '%s': %s\n", libdir, strerror(errno));
unlink(libdir);
rc = -errno;
goto out;
@@ -984,12 +984,12 @@ int unlinklib(const char* dataDir)
out:
if (chmod(dataDir, s.st_mode) < 0) {
- LOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chmod '%s': %s\n", dataDir, strerror(errno));
return -1;
}
if (chown(dataDir, s.st_uid, s.st_gid) < 0) {
- LOGE("failed to chown '%s' : %s\n", dataDir, strerror(errno));
+ ALOGE("failed to chown '%s' : %s\n", dataDir, strerror(errno));
return -1;
}
diff --git a/cmds/installd/installd.c b/cmds/installd/installd.c
index feb6b927dd9b..569b491be012 100644
--- a/cmds/installd/installd.c
+++ b/cmds/installd/installd.c
@@ -157,11 +157,11 @@ static int readx(int s, void *_buf, int count)
r = read(s, buf + n, count - n);
if (r < 0) {
if (errno == EINTR) continue;
- LOGE("read error: %s\n", strerror(errno));
+ ALOGE("read error: %s\n", strerror(errno));
return -1;
}
if (r == 0) {
- LOGE("eof\n");
+ ALOGE("eof\n");
return -1; /* EOF */
}
n += r;
@@ -178,7 +178,7 @@ static int writex(int s, const void *_buf, int count)
r = write(s, buf + n, count - n);
if (r < 0) {
if (errno == EINTR) continue;
- LOGE("write error: %s\n", strerror(errno));
+ ALOGE("write error: %s\n", strerror(errno));
return -1;
}
n += r;
@@ -200,7 +200,7 @@ static int execute(int s, char cmd[BUFFER_MAX])
unsigned short count;
int ret = -1;
-// LOGI("execute('%s')\n", cmd);
+// ALOGI("execute('%s')\n", cmd);
/* default reply is "" */
reply[0] = 0;
@@ -213,7 +213,7 @@ static int execute(int s, char cmd[BUFFER_MAX])
n++;
arg[n] = cmd;
if (n == TOKEN_MAX) {
- LOGE("too many arguments\n");
+ ALOGE("too many arguments\n");
goto done;
}
}
@@ -223,7 +223,7 @@ static int execute(int s, char cmd[BUFFER_MAX])
for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) {
if (!strcmp(cmds[i].name,arg[0])) {
if (n != cmds[i].numargs) {
- LOGE("%s requires %d arguments (%d given)\n",
+ ALOGE("%s requires %d arguments (%d given)\n",
cmds[i].name, cmds[i].numargs, n);
} else {
ret = cmds[i].func(arg + 1, reply);
@@ -231,7 +231,7 @@ static int execute(int s, char cmd[BUFFER_MAX])
goto done;
}
}
- LOGE("unsupported command '%s'\n", arg[0]);
+ ALOGE("unsupported command '%s'\n", arg[0]);
done:
if (reply[0]) {
@@ -242,7 +242,7 @@ done:
if (n > BUFFER_MAX) n = BUFFER_MAX;
count = n;
-// LOGI("reply: '%s'\n", cmd);
+// ALOGI("reply: '%s'\n", cmd);
if (writex(s, &count, sizeof(count))) return -1;
if (writex(s, cmd, count)) return -1;
return 0;
@@ -290,7 +290,7 @@ int initialize_globals() {
android_system_dirs.dirs = calloc(android_system_dirs.count, sizeof(dir_rec_t));
if (android_system_dirs.dirs == NULL) {
- LOGE("Couldn't allocate array for dirs; aborting\n");
+ ALOGE("Couldn't allocate array for dirs; aborting\n");
return -1;
}
@@ -351,22 +351,22 @@ int main(const int argc, const char *argv[]) {
int lsocket, s, count;
if (initialize_globals() < 0) {
- LOGE("Could not initialize globals; exiting.\n");
+ ALOGE("Could not initialize globals; exiting.\n");
exit(1);
}
if (initialize_directories() < 0) {
- LOGE("Could not create directories; exiting.\n");
+ ALOGE("Could not create directories; exiting.\n");
exit(1);
}
lsocket = android_get_control_socket(SOCKET_PATH);
if (lsocket < 0) {
- LOGE("Failed to get socket from environment: %s\n", strerror(errno));
+ ALOGE("Failed to get socket from environment: %s\n", strerror(errno));
exit(1);
}
if (listen(lsocket, 5)) {
- LOGE("Listen on socket failed: %s\n", strerror(errno));
+ ALOGE("Listen on socket failed: %s\n", strerror(errno));
exit(1);
}
fcntl(lsocket, F_SETFD, FD_CLOEXEC);
@@ -375,30 +375,30 @@ int main(const int argc, const char *argv[]) {
alen = sizeof(addr);
s = accept(lsocket, &addr, &alen);
if (s < 0) {
- LOGE("Accept failed: %s\n", strerror(errno));
+ ALOGE("Accept failed: %s\n", strerror(errno));
continue;
}
fcntl(s, F_SETFD, FD_CLOEXEC);
- LOGI("new connection\n");
+ ALOGI("new connection\n");
for (;;) {
unsigned short count;
if (readx(s, &count, sizeof(count))) {
- LOGE("failed to read size\n");
+ ALOGE("failed to read size\n");
break;
}
if ((count < 1) || (count >= BUFFER_MAX)) {
- LOGE("invalid size %d\n", count);
+ ALOGE("invalid size %d\n", count);
break;
}
if (readx(s, buf, count)) {
- LOGE("failed to read command\n");
+ ALOGE("failed to read command\n");
break;
}
buf[count] = 0;
if (execute(s, buf)) break;
}
- LOGI("closing connection\n");
+ ALOGI("closing connection\n");
close(s);
}
diff --git a/cmds/installd/utils.c b/cmds/installd/utils.c
index a53a93ce1073..52ec9e86a44a 100644
--- a/cmds/installd/utils.c
+++ b/cmds/installd/utils.c
@@ -42,7 +42,7 @@ int create_pkg_path_in_dir(char path[PKG_PATH_MAX],
if (append_and_increment(&dst, dir->path, &dst_size) < 0
|| append_and_increment(&dst, pkgname, &dst_size) < 0
|| append_and_increment(&dst, postfix, &dst_size) < 0) {
- LOGE("Error building APK path");
+ ALOGE("Error building APK path");
return -1;
}
@@ -76,14 +76,14 @@ int create_pkg_path(char path[PKG_PATH_MAX],
if (append_and_increment(&dst, android_data_dir.path, &dst_size) < 0
|| append_and_increment(&dst, persona_prefix, &dst_size) < 0) {
- LOGE("Error building prefix for APK path");
+ ALOGE("Error building prefix for APK path");
return -1;
}
if (persona != 0) {
int ret = snprintf(dst, dst_size, "%d/", persona);
if (ret < 0 || (size_t) ret != uid_len + 1) {
- LOGW("Error appending UID to APK path");
+ ALOGW("Error appending UID to APK path");
return -1;
}
}
@@ -117,18 +117,18 @@ int create_persona_path(char path[PKG_PATH_MAX],
if (append_and_increment(&dst, android_data_dir.path, &dst_size) < 0
|| append_and_increment(&dst, persona_prefix, &dst_size) < 0) {
- LOGE("Error building prefix for user path");
+ ALOGE("Error building prefix for user path");
return -1;
}
if (persona != 0) {
if (dst_size < uid_len + 1) {
- LOGE("Error building user path");
+ ALOGE("Error building user path");
return -1;
}
int ret = snprintf(dst, dst_size, "%d/", persona);
if (ret < 0 || (size_t) ret != uid_len) {
- LOGE("Error appending persona id to path");
+ ALOGE("Error appending persona id to path");
return -1;
}
}
@@ -163,7 +163,7 @@ int is_valid_package_name(const char* pkgname) {
} else if (*x == '.') {
if ((x == pkgname) || (x[1] == '.') || (x[1] == 0)) {
/* periods must not be first, last, or doubled */
- LOGE("invalid package name '%s'\n", pkgname);
+ ALOGE("invalid package name '%s'\n", pkgname);
return -1;
}
} else if (*x == '-') {
@@ -172,7 +172,7 @@ int is_valid_package_name(const char* pkgname) {
alpha = 1;
} else {
/* anything not A-Z, a-z, 0-9, _, or . is invalid */
- LOGE("invalid package name '%s'\n", pkgname);
+ ALOGE("invalid package name '%s'\n", pkgname);
return -1;
}
@@ -184,7 +184,7 @@ int is_valid_package_name(const char* pkgname) {
x++;
while (*x) {
if (!isalnum(*x)) {
- LOGE("invalid package name '%s' should include only numbers after -\n", pkgname);
+ ALOGE("invalid package name '%s' should include only numbers after -\n", pkgname);
return -1;
}
x++;
@@ -222,13 +222,13 @@ static int _delete_dir_contents(DIR *d, const char *ignore)
subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY);
if (subfd < 0) {
- LOGE("Couldn't openat %s: %s\n", name, strerror(errno));
+ ALOGE("Couldn't openat %s: %s\n", name, strerror(errno));
result = -1;
continue;
}
subdir = fdopendir(subfd);
if (subdir == NULL) {
- LOGE("Couldn't fdopendir %s: %s\n", name, strerror(errno));
+ ALOGE("Couldn't fdopendir %s: %s\n", name, strerror(errno));
close(subfd);
result = -1;
continue;
@@ -238,12 +238,12 @@ static int _delete_dir_contents(DIR *d, const char *ignore)
}
closedir(subdir);
if (unlinkat(dfd, name, AT_REMOVEDIR) < 0) {
- LOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno));
+ ALOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno));
result = -1;
}
} else {
if (unlinkat(dfd, name, 0) < 0) {
- LOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno));
+ ALOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno));
result = -1;
}
}
@@ -261,14 +261,14 @@ int delete_dir_contents(const char *pathname,
d = opendir(pathname);
if (d == NULL) {
- LOGE("Couldn't opendir %s: %s\n", pathname, strerror(errno));
+ ALOGE("Couldn't opendir %s: %s\n", pathname, strerror(errno));
return -errno;
}
res = _delete_dir_contents(d, ignore);
closedir(d);
if (also_delete_dir) {
if (rmdir(pathname)) {
- LOGE("Couldn't rmdir %s: %s\n", pathname, strerror(errno));
+ ALOGE("Couldn't rmdir %s: %s\n", pathname, strerror(errno));
res = -1;
}
}
@@ -282,12 +282,12 @@ int delete_dir_contents_fd(int dfd, const char *name)
fd = openat(dfd, name, O_RDONLY | O_DIRECTORY);
if (fd < 0) {
- LOGE("Couldn't openat %s: %s\n", name, strerror(errno));
+ ALOGE("Couldn't openat %s: %s\n", name, strerror(errno));
return -1;
}
d = fdopendir(fd);
if (d == NULL) {
- LOGE("Couldn't fdopendir %s: %s\n", name, strerror(errno));
+ ALOGE("Couldn't fdopendir %s: %s\n", name, strerror(errno));
close(fd);
return -1;
}
@@ -307,7 +307,7 @@ int validate_system_app_path(const char* path) {
const size_t dir_len = android_system_dirs.dirs[i].len;
if (!strncmp(path, android_system_dirs.dirs[i].path, dir_len)) {
if (path[dir_len] == '.' || strchr(path + dir_len, '/') != NULL) {
- LOGE("invalid system apk path '%s' (trickery)\n", path);
+ ALOGE("invalid system apk path '%s' (trickery)\n", path);
return -1;
}
return 0;
@@ -326,7 +326,7 @@ int get_path_from_env(dir_rec_t* rec, const char* var) {
const char* path = getenv(var);
int ret = get_path_from_string(rec, path);
if (ret < 0) {
- LOGW("Problem finding value for environment variable %s\n", var);
+ ALOGW("Problem finding value for environment variable %s\n", var);
}
return ret;
}
@@ -377,7 +377,7 @@ int get_path_from_string(dir_rec_t* rec, const char* path) {
if (append_and_increment(&dst, path, &dst_size) < 0
|| append_and_increment(&dst, "/", &dst_size)) {
- LOGE("Error canonicalizing path");
+ ALOGE("Error canonicalizing path");
return -1;
}
@@ -395,7 +395,7 @@ int copy_and_append(dir_rec_t* dst, const dir_rec_t* src, const char* suffix) {
if (dst->path == NULL
|| snprintf(dst->path, dstSize, "%s%s", src->path, suffix)
!= (ssize_t) dst->len) {
- LOGE("Could not allocate memory to hold appended path; aborting\n");
+ ALOGE("Could not allocate memory to hold appended path; aborting\n");
return -1;
}
@@ -422,7 +422,7 @@ int validate_apk_path(const char *path)
dir_len = android_asec_dir.len;
allowsubdir = 1;
} else {
- LOGE("invalid apk path '%s' (bad prefix)\n", path);
+ ALOGE("invalid apk path '%s' (bad prefix)\n", path);
return -1;
}
@@ -435,7 +435,7 @@ int validate_apk_path(const char *path)
++subdir;
if (!allowsubdir
|| (path_len > (size_t) (subdir - path) && (strchr(subdir, '/') != NULL))) {
- LOGE("invalid apk path '%s' (subdir?)\n", path);
+ ALOGE("invalid apk path '%s' (subdir?)\n", path);
return -1;
}
}
@@ -446,7 +446,7 @@ int validate_apk_path(const char *path)
*/
if (path[dir_len] == '.'
|| (subdir != NULL && ((*subdir == '.') || (strchr(subdir, '/') != NULL)))) {
- LOGE("invalid apk path '%s' (trickery)\n", path);
+ ALOGE("invalid apk path '%s' (trickery)\n", path);
return -1;
}
diff --git a/cmds/ip-up-vpn/ip-up-vpn.c b/cmds/ip-up-vpn/ip-up-vpn.c
index 0e6286f9279c..9fcc950c229a 100644
--- a/cmds/ip-up-vpn/ip-up-vpn.c
+++ b/cmds/ip-up-vpn/ip-up-vpn.c
@@ -67,7 +67,7 @@ int main(int argc, char **argv)
{
FILE *state = fopen(DIR ".tmp", "wb");
if (!state) {
- LOGE("Cannot create state: %s", strerror(errno));
+ ALOGE("Cannot create state: %s", strerror(errno));
return 1;
}
@@ -97,7 +97,7 @@ int main(int argc, char **argv)
while (!ioctl(s, SIOCDELRT, &rt));
}
if (errno != ESRCH) {
- LOGE("Cannot remove host route: %s", strerror(errno));
+ ALOGE("Cannot remove host route: %s", strerror(errno));
return 1;
}
@@ -105,7 +105,7 @@ int main(int argc, char **argv)
rt.rt_flags |= RTF_GATEWAY;
if (!set_address(&rt.rt_gateway, argv[1]) ||
(ioctl(s, SIOCADDRT, &rt) && errno != EEXIST)) {
- LOGE("Cannot create host route: %s", strerror(errno));
+ ALOGE("Cannot create host route: %s", strerror(errno));
return 1;
}
@@ -113,21 +113,21 @@ int main(int argc, char **argv)
ifr.ifr_flags = IFF_UP;
strncpy(ifr.ifr_name, interface, IFNAMSIZ);
if (ioctl(s, SIOCSIFFLAGS, &ifr)) {
- LOGE("Cannot bring up %s: %s", interface, strerror(errno));
+ ALOGE("Cannot bring up %s: %s", interface, strerror(errno));
return 1;
}
/* Set the address. */
if (!set_address(&ifr.ifr_addr, address) ||
ioctl(s, SIOCSIFADDR, &ifr)) {
- LOGE("Cannot set address: %s", strerror(errno));
+ ALOGE("Cannot set address: %s", strerror(errno));
return 1;
}
/* Set the netmask. */
if (set_address(&ifr.ifr_netmask, env("INTERNAL_NETMASK4"))) {
if (ioctl(s, SIOCSIFNETMASK, &ifr)) {
- LOGE("Cannot set netmask: %s", strerror(errno));
+ ALOGE("Cannot set netmask: %s", strerror(errno));
return 1;
}
}
@@ -140,13 +140,13 @@ int main(int argc, char **argv)
fprintf(state, "%s\n", env("INTERNAL_DNS4_LIST"));
fprintf(state, "%s\n", env("DEFAULT_DOMAIN"));
} else {
- LOGE("Cannot parse parameters");
+ ALOGE("Cannot parse parameters");
return 1;
}
fclose(state);
if (chmod(DIR ".tmp", 0444) || rename(DIR ".tmp", DIR "state")) {
- LOGE("Cannot write state: %s", strerror(errno));
+ ALOGE("Cannot write state: %s", strerror(errno));
return 1;
}
return 0;
diff --git a/cmds/keystore/keystore.cpp b/cmds/keystore/keystore.cpp
index 4b4b9b9d4adb..05f77e5326d9 100644
--- a/cmds/keystore/keystore.cpp
+++ b/cmds/keystore/keystore.cpp
@@ -133,7 +133,7 @@ public:
const char* randomDevice = "/dev/urandom";
mRandom = ::open(randomDevice, O_RDONLY);
if (mRandom == -1) {
- LOGE("open: %s: %s", randomDevice, strerror(errno));
+ ALOGE("open: %s: %s", randomDevice, strerror(errno));
return false;
}
return true;
@@ -754,11 +754,11 @@ static ResponseCode process(KeyStore* keyStore, int sock, uid_t uid, int8_t code
int main(int argc, char* argv[]) {
int controlSocket = android_get_control_socket("keystore");
if (argc < 2) {
- LOGE("A directory must be specified!");
+ ALOGE("A directory must be specified!");
return 1;
}
if (chdir(argv[1]) == -1) {
- LOGE("chdir: %s: %s", argv[1], strerror(errno));
+ ALOGE("chdir: %s: %s", argv[1], strerror(errno));
return 1;
}
@@ -767,7 +767,7 @@ int main(int argc, char* argv[]) {
return 1;
}
if (listen(controlSocket, 3) == -1) {
- LOGE("listen: %s", strerror(errno));
+ ALOGE("listen: %s", strerror(errno));
return 1;
}
@@ -785,7 +785,7 @@ int main(int argc, char* argv[]) {
socklen_t size = sizeof(cred);
int credResult = getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cred, &size);
if (credResult != 0) {
- LOGW("getsockopt: %s", strerror(errno));
+ ALOGW("getsockopt: %s", strerror(errno));
} else {
int8_t request;
if (recv_code(sock, &request)) {
@@ -796,7 +796,7 @@ int main(int argc, char* argv[]) {
} else {
send_code(sock, response);
}
- LOGI("uid: %d action: %c -> %d state: %d -> %d retry: %d",
+ ALOGI("uid: %d action: %c -> %d state: %d -> %d retry: %d",
cred.uid,
request, response,
old_state, keyStore.getState(),
@@ -805,6 +805,6 @@ int main(int argc, char* argv[]) {
}
close(sock);
}
- LOGE("accept: %s", strerror(errno));
+ ALOGE("accept: %s", strerror(errno));
return 1;
}
diff --git a/cmds/screenshot/screenshot.c b/cmds/screenshot/screenshot.c
index 048636c64e53..cca80c3c1abd 100644
--- a/cmds/screenshot/screenshot.c
+++ b/cmds/screenshot/screenshot.c
@@ -26,20 +26,20 @@ void take_screenshot(FILE *fb_in, FILE *fb_out) {
fb = fileno(fb_in);
if(fb < 0) {
- LOGE("failed to open framebuffer\n");
+ ALOGE("failed to open framebuffer\n");
return;
}
fb_in = fdopen(fb, "r");
if(ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0) {
- LOGE("failed to get framebuffer info\n");
+ ALOGE("failed to get framebuffer info\n");
return;
}
fcntl(fb, F_SETFD, FD_CLOEXEC);
png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png == NULL) {
- LOGE("failed png_create_write_struct\n");
+ ALOGE("failed png_create_write_struct\n");
fclose(fb_in);
return;
}
@@ -47,13 +47,13 @@ void take_screenshot(FILE *fb_in, FILE *fb_out) {
png_init_io(png, fb_out);
info = png_create_info_struct(png);
if (info == NULL) {
- LOGE("failed png_create_info_struct\n");
+ ALOGE("failed png_create_info_struct\n");
png_destroy_write_struct(&png, NULL);
fclose(fb_in);
return;
}
if (setjmp(png_jmpbuf(png))) {
- LOGE("failed png setjmp\n");
+ ALOGE("failed png setjmp\n");
png_destroy_write_struct(&png, NULL);
fclose(fb_in);
return;
@@ -68,7 +68,7 @@ void take_screenshot(FILE *fb_in, FILE *fb_out) {
rowlen=vinfo.xres * bytespp;
if (rowlen > sizeof(imgbuf)) {
- LOGE("crazy rowlen: %d\n", rowlen);
+ ALOGE("crazy rowlen: %d\n", rowlen);
png_destroy_write_struct(&png, NULL);
fclose(fb_in);
return;
diff --git a/cmds/servicemanager/binder.c b/cmds/servicemanager/binder.c
index b03b62040b2f..918d4d4e9633 100644
--- a/cmds/servicemanager/binder.c
+++ b/cmds/servicemanager/binder.c
@@ -219,7 +219,7 @@ int binder_parse(struct binder_state *bs, struct binder_io *bio,
case BR_TRANSACTION: {
struct binder_txn *txn = (void *) ptr;
if ((end - ptr) * sizeof(uint32_t) < sizeof(struct binder_txn)) {
- LOGE("parse: txn too small!\n");
+ ALOGE("parse: txn too small!\n");
return -1;
}
binder_dump_txn(txn);
@@ -240,7 +240,7 @@ int binder_parse(struct binder_state *bs, struct binder_io *bio,
case BR_REPLY: {
struct binder_txn *txn = (void*) ptr;
if ((end - ptr) * sizeof(uint32_t) < sizeof(struct binder_txn)) {
- LOGE("parse: reply too small!\n");
+ ALOGE("parse: reply too small!\n");
return -1;
}
binder_dump_txn(txn);
@@ -266,7 +266,7 @@ int binder_parse(struct binder_state *bs, struct binder_io *bio,
r = -1;
break;
default:
- LOGE("parse: OOPS %d\n", cmd);
+ ALOGE("parse: OOPS %d\n", cmd);
return -1;
}
}
@@ -375,17 +375,17 @@ void binder_loop(struct binder_state *bs, binder_handler func)
res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
if (res < 0) {
- LOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));
+ ALOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));
break;
}
res = binder_parse(bs, 0, readbuf, bwr.read_consumed, func);
if (res == 0) {
- LOGE("binder_loop: unexpected reply?!\n");
+ ALOGE("binder_loop: unexpected reply?!\n");
break;
}
if (res < 0) {
- LOGE("binder_loop: io error %d %s\n", res, strerror(errno));
+ ALOGE("binder_loop: io error %d %s\n", res, strerror(errno));
break;
}
}
diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c
index 2df450f34def..42d8977339ee 100644
--- a/cmds/servicemanager/service_manager.c
+++ b/cmds/servicemanager/service_manager.c
@@ -11,8 +11,8 @@
#include "binder.h"
#if 0
-#define LOGI(x...) fprintf(stderr, "svcmgr: " x)
-#define LOGE(x...) fprintf(stderr, "svcmgr: " x)
+#define ALOGI(x...) fprintf(stderr, "svcmgr: " x)
+#define ALOGE(x...) fprintf(stderr, "svcmgr: " x)
#else
#define LOG_TAG "ServiceManager"
#include <cutils/log.h>
@@ -115,7 +115,7 @@ struct svcinfo *find_svc(uint16_t *s16, unsigned len)
void svcinfo_death(struct binder_state *bs, void *ptr)
{
struct svcinfo *si = ptr;
- LOGI("service '%s' died\n", str8(si->name));
+ ALOGI("service '%s' died\n", str8(si->name));
if (si->ptr) {
binder_release(bs, si->ptr);
si->ptr = 0;
@@ -133,7 +133,7 @@ void *do_find_service(struct binder_state *bs, uint16_t *s, unsigned len)
struct svcinfo *si;
si = find_svc(s, len);
-// LOGI("check_service('%s') ptr = %p\n", str8(s), si ? si->ptr : 0);
+// ALOGI("check_service('%s') ptr = %p\n", str8(s), si ? si->ptr : 0);
if (si && si->ptr) {
return si->ptr;
} else {
@@ -146,13 +146,13 @@ int do_add_service(struct binder_state *bs,
void *ptr, unsigned uid)
{
struct svcinfo *si;
-// LOGI("add_service('%s',%p) uid=%d\n", str8(s), ptr, uid);
+// ALOGI("add_service('%s',%p) uid=%d\n", str8(s), ptr, uid);
if (!ptr || (len == 0) || (len > 127))
return -1;
if (!svc_can_register(uid, s)) {
- LOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED\n",
+ ALOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED\n",
str8(s), ptr, uid);
return -1;
}
@@ -160,7 +160,7 @@ int do_add_service(struct binder_state *bs,
si = find_svc(s, len);
if (si) {
if (si->ptr) {
- LOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED, OVERRIDE\n",
+ ALOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED, OVERRIDE\n",
str8(s), ptr, uid);
svcinfo_death(bs, si);
}
@@ -168,7 +168,7 @@ int do_add_service(struct binder_state *bs,
} else {
si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));
if (!si) {
- LOGE("add_service('%s',%p) uid=%d - OUT OF MEMORY\n",
+ ALOGE("add_service('%s',%p) uid=%d - OUT OF MEMORY\n",
str8(s), ptr, uid);
return -1;
}
@@ -198,7 +198,7 @@ int svcmgr_handler(struct binder_state *bs,
void *ptr;
uint32_t strict_policy;
-// LOGI("target=%p code=%d pid=%d uid=%d\n",
+// ALOGI("target=%p code=%d pid=%d uid=%d\n",
// txn->target, txn->code, txn->sender_pid, txn->sender_euid);
if (txn->target != svcmgr_handle)
@@ -246,7 +246,7 @@ int svcmgr_handler(struct binder_state *bs,
return -1;
}
default:
- LOGE("unknown code %d\n", txn->code);
+ ALOGE("unknown code %d\n", txn->code);
return -1;
}
@@ -262,7 +262,7 @@ int main(int argc, char **argv)
bs = binder_open(128*1024);
if (binder_become_context_manager(bs)) {
- LOGE("cannot become context manager (%s)\n", strerror(errno));
+ ALOGE("cannot become context manager (%s)\n", strerror(errno));
return -1;
}
diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp
index b7182991eaea..613435df15e8 100644
--- a/cmds/stagefright/record.cpp
+++ b/cmds/stagefright/record.cpp
@@ -96,7 +96,7 @@ public:
++mNumFramesOutput;
// printf("DummySource::read - returning buffer\n");
- // LOGI("DummySource::read - returning buffer");
+ // ALOGI("DummySource::read - returning buffer");
return OK;
}
diff --git a/cmds/stagefright/sf2.cpp b/cmds/stagefright/sf2.cpp
index 7551d31f389d..ae80f8804992 100644
--- a/cmds/stagefright/sf2.cpp
+++ b/cmds/stagefright/sf2.cpp
@@ -454,7 +454,7 @@ private:
if (sizeNeeded > sizeLeft) {
if (outBuffer->size() == 0) {
- LOGE("Unable to fit even a single input buffer of size %d.",
+ ALOGE("Unable to fit even a single input buffer of size %d.",
sizeNeeded);
}
CHECK_GT(outBuffer->size(), 0u);
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp
index 24403dcc234c..0d6c738292da 100644
--- a/cmds/stagefright/stream.cpp
+++ b/cmds/stagefright/stream.cpp
@@ -90,7 +90,7 @@ void MyStreamSource::onBufferAvailable(size_t index) {
#if 0
if (mNumPacketsSent >= 20000) {
- LOGI("signalling discontinuity now");
+ ALOGI("signalling discontinuity now");
off64_t offset = 0;
CHECK((offset % 188) == 0);
diff --git a/cmds/system_server/library/system_init.cpp b/cmds/system_server/library/system_init.cpp
index 59360d3c6287..bfbc13870717 100644
--- a/cmds/system_server/library/system_init.cpp
+++ b/cmds/system_server/library/system_init.cpp
@@ -42,7 +42,7 @@ public:
virtual void binderDied(const wp<IBinder>& who)
{
- LOGI("Grim Reaper killing system_server...");
+ ALOGI("Grim Reaper killing system_server...");
kill(getpid(), SIGKILL);
}
};
@@ -53,12 +53,12 @@ public:
extern "C" status_t system_init()
{
- LOGI("Entered system_init()");
+ ALOGI("Entered system_init()");
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
- LOGI("ServiceManager: %p\n", sm.get());
+ ALOGI("ServiceManager: %p\n", sm.get());
sp<GrimReaper> grim = new GrimReaper();
sm->asBinder()->linkToDeath(grim, grim.get(), 0);
@@ -82,10 +82,10 @@ extern "C" status_t system_init()
// All other servers should just start the Android runtime at
// the beginning of their processes's main(), before calling
// the init function.
- LOGI("System server: starting Android runtime.\n");
+ ALOGI("System server: starting Android runtime.\n");
AndroidRuntime* runtime = AndroidRuntime::getRuntime();
- LOGI("System server: starting Android services.\n");
+ ALOGI("System server: starting Android services.\n");
JNIEnv* env = runtime->getJNIEnv();
if (env == NULL) {
return UNKNOWN_ERROR;
@@ -100,10 +100,10 @@ extern "C" status_t system_init()
}
env->CallStaticVoidMethod(clazz, methodId);
- LOGI("System server: entering thread pool.\n");
+ ALOGI("System server: entering thread pool.\n");
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
- LOGI("System server: exiting thread pool.\n");
+ ALOGI("System server: exiting thread pool.\n");
return NO_ERROR;
}
diff --git a/cmds/system_server/system_main.cpp b/cmds/system_server/system_main.cpp
index d67329d63f17..ddff065c916d 100644
--- a/cmds/system_server/system_main.cpp
+++ b/cmds/system_server/system_main.cpp
@@ -44,12 +44,12 @@ static void blockSignals()
int main(int argc, const char* const argv[])
{
- LOGI("System server is starting with pid=%d.\n", getpid());
+ ALOGI("System server is starting with pid=%d.\n", getpid());
blockSignals();
// You can trust me, honestly!
- LOGW("*** Current priority: %d\n", getpriority(PRIO_PROCESS, 0));
+ ALOGW("*** Current priority: %d\n", getpriority(PRIO_PROCESS, 0));
setpriority(PRIO_PROCESS, 0, -1);
system_init();
diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java
index 7f0ea991af12..894f4287f709 100644
--- a/core/java/android/animation/LayoutTransition.java
+++ b/core/java/android/animation/LayoutTransition.java
@@ -321,13 +321,13 @@ public class LayoutTransition {
public long getStartDelay(int transitionType) {
switch (transitionType) {
case CHANGE_APPEARING:
- return mChangingAppearingDuration;
+ return mChangingAppearingDelay;
case CHANGE_DISAPPEARING:
- return mChangingDisappearingDuration;
+ return mChangingDisappearingDelay;
case APPEARING:
- return mAppearingDuration;
+ return mAppearingDelay;
case DISAPPEARING:
- return mDisappearingDuration;
+ return mDisappearingDelay;
}
// shouldn't reach here
return 0;
diff --git a/core/java/android/hardware/CameraSound.java b/core/java/android/hardware/CameraSound.java
index 32de0cde5918..dc97ff097f14 100644
--- a/core/java/android/hardware/CameraSound.java
+++ b/core/java/android/hardware/CameraSound.java
@@ -110,7 +110,6 @@ public class CameraSound {
private static class CameraSoundPlayer implements Runnable {
private int mSoundId;
- private int mAudioStreamType;
private MediaPlayer mPlayer;
private Thread mThread;
private boolean mExit;
@@ -147,7 +146,7 @@ public class CameraSound {
}
mPlayer = new MediaPlayer();
try {
- mPlayer.setAudioStreamType(mAudioStreamType);
+ mPlayer.setAudioStreamType(AudioManager.STREAM_SYSTEM_ENFORCED);
mPlayer.setDataSource(soundFilePath);
mPlayer.setLooping(false);
mPlayer.prepare();
@@ -179,11 +178,6 @@ public class CameraSound {
public CameraSoundPlayer(int soundId) {
mSoundId = soundId;
- if (SystemProperties.get("ro.camera.sound.forced", "0").equals("0")) {
- mAudioStreamType = AudioManager.STREAM_MUSIC;
- } else {
- mAudioStreamType = AudioManager.STREAM_SYSTEM_ENFORCED;
- }
}
public void play() {
diff --git a/core/java/android/view/inputmethod/InputMethodSubtype.java b/core/java/android/view/inputmethod/InputMethodSubtype.java
index 93caabe4cdc3..18dec5273cb1 100644
--- a/core/java/android/view/inputmethod/InputMethodSubtype.java
+++ b/core/java/android/view/inputmethod/InputMethodSubtype.java
@@ -31,17 +31,15 @@ import java.util.List;
import java.util.Locale;
/**
- * This class is used to specify meta information of a subtype contained in an input method.
- * Subtype can describe locale (e.g. en_US, fr_FR...) and mode (e.g. voice, keyboard...), and is
- * used for IME switch and settings. The input method subtype allows the system to bring up the
- * specified subtype of the designated input method directly.
+ * This class is used to specify meta information of a subtype contained in an input method editor
+ * (IME). Subtype can describe locale (e.g. en_US, fr_FR...) and mode (e.g. voice, keyboard...),
+ * and is used for IME switch and settings. The input method subtype allows the system to bring up
+ * the specified subtype of the designated IME directly.
*
- * <p>It should be defined in an XML resource file of the input method
- * with the <code>&lt;subtype></code> element.
- * For more information, see the guide to
+ * <p>It should be defined in an XML resource file of the input method with the
+ * <code>&lt;subtype&gt;</code> element. For more information, see the guide to
* <a href="{@docRoot}resources/articles/creating-input-method.html">
* Creating an Input Method</a>.</p>
- *
*/
public final class InputMethodSubtype implements Parcelable {
private static final String TAG = InputMethodSubtype.class.getSimpleName();
@@ -59,13 +57,24 @@ public final class InputMethodSubtype implements Parcelable {
private HashMap<String, String> mExtraValueHashMapCache;
/**
- * Constructor
- * @param nameId The name of the subtype
- * @param iconId The icon of the subtype
+ * Constructor.
+ * @param nameId Resource ID of the subtype name string. The string resource may have exactly
+ * one %s in it. If there is, the %s part will be replaced with the locale's display name by
+ * the formatter. Please refer to {@link #getDisplayName} for details.
+ * @param iconId Resource ID of the subtype icon drawable.
* @param locale The locale supported by the subtype
* @param mode The mode supported by the subtype
- * @param extraValue The extra value of the subtype
- * @param isAuxiliary true when this subtype is one shot subtype.
+ * @param extraValue The extra value of the subtype. This string is free-form, but the API
+ * supplies tools to deal with a key-value comma-separated list; see
+ * {@link #containsExtraValueKey} and {@link #getExtraValueOf}.
+ * @param isAuxiliary true when this subtype is auxiliary, false otherwise. An auxiliary
+ * subtype will not be shown in the list of enabled IMEs for choosing the current IME in
+ * the Settings even when this subtype is enabled. Please note that this subtype will still
+ * be shown in the list of IMEs in the IME switcher to allow the user to tentatively switch
+ * to this subtype while an IME is shown. The framework will never switch the current IME to
+ * this subtype by {@link android.view.inputmethod.InputMethodManager#switchToLastInputMethod}.
+ * The intent of having this flag is to allow for IMEs that are invoked in a one-shot way as
+ * auxiliary input mode, and return to the previous IME once it is finished (e.g. voice input).
* @hide
*/
public InputMethodSubtype(int nameId, int iconId, String locale, String mode, String extraValue,
@@ -74,16 +83,28 @@ public final class InputMethodSubtype implements Parcelable {
}
/**
- * Constructor
- * @param nameId The name of the subtype
- * @param iconId The icon of the subtype
+ * Constructor.
+ * @param nameId Resource ID of the subtype name string. The string resource may have exactly
+ * one %s in it. If there is, the %s part will be replaced with the locale's display name by
+ * the formatter. Please refer to {@link #getDisplayName} for details.
+ * @param iconId Resource ID of the subtype icon drawable.
* @param locale The locale supported by the subtype
* @param mode The mode supported by the subtype
- * @param extraValue The extra value of the subtype
- * @param isAuxiliary true when this subtype is one shot subtype.
- * @param overridesImplicitlyEnabledSubtype true when this subtype should be selected by default
- * if no other subtypes are selected explicitly. Note that a subtype with this parameter being
- * true will not be shown in the subtypes list.
+ * @param extraValue The extra value of the subtype. This string is free-form, but the API
+ * supplies tools to deal with a key-value comma-separated list; see
+ * {@link #containsExtraValueKey} and {@link #getExtraValueOf}.
+ * @param isAuxiliary true when this subtype is auxiliary, false otherwise. An auxiliary
+ * subtype will not be shown in the list of enabled IMEs for choosing the current IME in
+ * the Settings even when this subtype is enabled. Please note that this subtype will still
+ * be shown in the list of IMEs in the IME switcher to allow the user to tentatively switch
+ * to this subtype while an IME is shown. The framework will never switch the current IME to
+ * this subtype by {@link android.view.inputmethod.InputMethodManager#switchToLastInputMethod}.
+ * The intent of having this flag is to allow for IMEs that are invoked in a one-shot way as
+ * auxiliary input mode, and return to the previous IME once it is finished (e.g. voice input).
+ * @param overridesImplicitlyEnabledSubtype true when this subtype should be enabled by default
+ * if no other subtypes in the IME are enabled explicitly. Note that a subtype with this
+ * parameter being true will not be shown in the list of subtypes in each IME's subtype enabler.
+ * Having an "automatic" subtype is an example use of this flag.
*/
public InputMethodSubtype(int nameId, int iconId, String locale, String mode, String extraValue,
boolean isAuxiliary, boolean overridesImplicitlyEnabledSubtype) {
@@ -115,52 +136,60 @@ public final class InputMethodSubtype implements Parcelable {
}
/**
- * @return the name of the subtype
+ * @return Resource ID of the subtype name string.
*/
public int getNameResId() {
return mSubtypeNameResId;
}
/**
- * @return the icon of the subtype
+ * @return Resource ID of the subtype icon drawable.
*/
public int getIconResId() {
return mSubtypeIconResId;
}
/**
- * @return the locale of the subtype
+ * @return The locale of the subtype. This method returns the "locale" string parameter passed
+ * to the constructor.
*/
public String getLocale() {
return mSubtypeLocale;
}
/**
- * @return the mode of the subtype
+ * @return The mode of the subtype.
*/
public String getMode() {
return mSubtypeMode;
}
/**
- * @return the extra value of the subtype
+ * @return The extra value of the subtype.
*/
public String getExtraValue() {
return mSubtypeExtraValue;
}
/**
- * @return true if this subtype is one shot subtype. One shot subtype will not be shown in the
- * ime switch list when this subtype is implicitly enabled. The framework will never
- * switch the current ime to this subtype by switchToLastInputMethod in InputMethodManager.
+ * @return true if this subtype is auxiliary, false otherwise. An auxiliary subtype will not be
+ * shown in the list of enabled IMEs for choosing the current IME in the Settings even when this
+ * subtype is enabled. Please note that this subtype will still be shown in the list of IMEs in
+ * the IME switcher to allow the user to tentatively switch to this subtype while an IME is
+ * shown. The framework will never switch the current IME to this subtype by
+ * {@link android.view.inputmethod.InputMethodManager#switchToLastInputMethod}.
+ * The intent of having this flag is to allow for IMEs that are invoked in a one-shot way as
+ * auxiliary input mode, and return to the previous IME once it is finished (e.g. voice input).
*/
public boolean isAuxiliary() {
return mIsAuxiliary;
}
/**
- * @return true when this subtype is selected by default if no other subtypes are selected
- * explicitly. Note that a subtype that returns true will not be shown in the subtypes list.
+ * @return true when this subtype will be enabled by default if no other subtypes in the IME
+ * are enabled explicitly, false otherwise. Note that a subtype with this method returning true
+ * will not be shown in the list of subtypes in each IME's subtype enabler. Having an
+ * "automatic" subtype is an example use of this flag.
*/
public boolean overridesImplicitlyEnabledSubtype() {
return mOverridesImplicitlyEnabledSubtype;
@@ -171,10 +200,10 @@ public final class InputMethodSubtype implements Parcelable {
* @param packageName The package name of the IME
* @param appInfo The application info of the IME
* @return a display name for this subtype. The string resource of the label (mSubtypeNameResId)
- * can have only one %s in it. If there is, the %s part will be replaced with the locale's
- * display name by the formatter. If there is not, this method simply returns the string
- * specified by mSubtypeNameResId. If mSubtypeNameResId is not specified (== 0), it's up to the
- * framework to generate an appropriate display name.
+ * may have exactly one %s in it. If there is, the %s part will be replaced with the locale's
+ * display name by the formatter. If there is not, this method returns the string specified by
+ * mSubtypeNameResId. If mSubtypeNameResId is not specified (== 0), it's up to the framework to
+ * generate an appropriate display name.
*/
public CharSequence getDisplayName(
Context context, String packageName, ApplicationInfo appInfo) {
@@ -215,8 +244,8 @@ public final class InputMethodSubtype implements Parcelable {
/**
* The string of ExtraValue in subtype should be defined as follows:
* example: key0,key1=value1,key2,key3,key4=value4
- * @param key the key of extra value
- * @return the subtype contains specified the extra value
+ * @param key The key of extra value
+ * @return The subtype contains specified the extra value
*/
public boolean containsExtraValueKey(String key) {
return getExtraValueHashMap().containsKey(key);
@@ -225,8 +254,8 @@ public final class InputMethodSubtype implements Parcelable {
/**
* The string of ExtraValue in subtype should be defined as follows:
* example: key0,key1=value1,key2,key3,key4=value4
- * @param key the key of extra value
- * @return the value of the specified key
+ * @param key The key of extra value
+ * @return The value of the specified key
*/
public String getExtraValueOf(String key) {
return getExtraValueHashMap().get(key);
diff --git a/core/java/android/webkit/HTML5Audio.java b/core/java/android/webkit/HTML5Audio.java
index 97d61ba73d55..0baf2eb7371e 100644
--- a/core/java/android/webkit/HTML5Audio.java
+++ b/core/java/android/webkit/HTML5Audio.java
@@ -311,7 +311,11 @@ class HTML5Audio extends Handler
}
private float getMaxTimeSeekable() {
- return mMediaPlayer.getDuration() / 1000.0f;
+ if (mState >= PREPARED) {
+ return mMediaPlayer.getDuration() / 1000.0f;
+ } else {
+ return 0;
+ }
}
private native void nativeOnBuffering(int percent, int nativePointer);
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 617584b144b2..08d94e2d1d70 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -142,7 +142,7 @@ public class WebSettings {
}
// TODO: Keep this up to date
- private static final String PREVIOUS_VERSION = "3.1";
+ private static final String PREVIOUS_VERSION = "4.0.3";
// WebView associated with this WebSettings.
private WebView mWebView;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index fa82c46e2f56..fd58aeddafd0 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -27,7 +27,6 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.DataSetObserver;
@@ -57,9 +56,9 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.StrictMode;
+import android.os.SystemClock;
import android.provider.Settings;
import android.speech.tts.TextToSpeech;
-import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.EventLog;
import android.util.Log;
@@ -84,6 +83,7 @@ import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
@@ -126,7 +126,8 @@ import java.util.regex.Pattern;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
-import static javax.microedition.khronos.egl.EGL10.*;
+
+import static javax.microedition.khronos.egl.EGL10.EGL_DEFAULT_DISPLAY;
/**
* <p>A View that displays web pages. This class is the basis upon which you
@@ -333,6 +334,7 @@ public class WebView extends AbsoluteLayout
ViewGroup.OnHierarchyChangeListener {
private class InnerGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
+ @Override
public void onGlobalLayout() {
if (isShown()) {
setGLRectViewport();
@@ -341,6 +343,7 @@ public class WebView extends AbsoluteLayout
}
private class InnerScrollChangedListener implements ViewTreeObserver.OnScrollChangedListener {
+ @Override
public void onScrollChanged() {
if (isShown()) {
setGLRectViewport();
@@ -348,6 +351,43 @@ public class WebView extends AbsoluteLayout
}
}
+ /**
+ * InputConnection used for ContentEditable. This captures the 'delete'
+ * commands and sends delete key presses.
+ */
+ private class WebViewInputConnection extends BaseInputConnection {
+ public WebViewInputConnection() {
+ super(WebView.this, false);
+ }
+
+ private void sendKeyPress(int keyCode) {
+ long eventTime = SystemClock.uptimeMillis();
+ sendKeyEvent(new KeyEvent(eventTime, eventTime,
+ KeyEvent.ACTION_DOWN, keyCode, 0, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ KeyEvent.FLAG_SOFT_KEYBOARD));
+ sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
+ KeyEvent.ACTION_UP, keyCode, 0, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ KeyEvent.FLAG_SOFT_KEYBOARD));
+ }
+
+ @Override
+ public boolean deleteSurroundingText(int leftLength, int rightLength) {
+ // Look for one-character delete and send it as a key press.
+ if (leftLength == 1 && rightLength == 0) {
+ sendKeyPress(KeyEvent.KEYCODE_DEL);
+ } else if (leftLength == 0 && rightLength == 1){
+ sendKeyPress(KeyEvent.KEYCODE_FORWARD_DEL);
+ } else if (mWebViewCore != null) {
+ mWebViewCore.sendMessage(EventHub.DELETE_SURROUNDING_TEXT,
+ leftLength, rightLength);
+ }
+ return super.deleteSurroundingText(leftLength, rightLength);
+ }
+ }
+
+
// The listener to capture global layout change event.
private InnerGlobalLayoutListener mGlobalLayoutListener = null;
@@ -372,6 +412,8 @@ public class WebView extends AbsoluteLayout
private final Rect mViewRectViewport = new Rect();
private final RectF mVisibleContentRect = new RectF();
private boolean mGLViewportEmpty = false;
+ WebViewInputConnection mInputConnection = new WebViewInputConnection();
+
/**
* Transportation object for returning WebView across thread boundaries.
@@ -952,8 +994,7 @@ public class WebView extends AbsoluteLayout
public void onNewPicture(WebView view, Picture picture);
}
- // FIXME: Want to make this public, but need to change the API file.
- public /*static*/ class HitTestResult {
+ public static class HitTestResult {
/**
* Default HitTestResult, where the target is unknown
*/
@@ -1243,7 +1284,7 @@ public class WebView extends AbsoluteLayout
PackageManager pm = mContext.getPackageManager();
for (String name : sGoogleApps) {
try {
- PackageInfo pInfo = pm.getPackageInfo(name,
+ pm.getPackageInfo(name,
PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);
installedPackages.add(name);
} catch (PackageManager.NameNotFoundException e) {
@@ -1415,23 +1456,27 @@ public class WebView extends AbsoluteLayout
.setMessage(com.android.internal.R.string.save_password_message)
.setPositiveButton(com.android.internal.R.string.save_password_notnow,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
resumeMsg.sendToTarget();
}
})
.setNeutralButton(com.android.internal.R.string.save_password_remember,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
remember.sendToTarget();
}
})
.setNegativeButton(com.android.internal.R.string.save_password_never,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
neverRemember.sendToTarget();
}
})
.setOnCancelListener(new OnCancelListener() {
+ @Override
public void onCancel(DialogInterface dialog) {
resumeMsg.sendToTarget();
}
@@ -1517,6 +1562,7 @@ public class WebView extends AbsoluteLayout
*
* @deprecated This method is now obsolete.
*/
+ @Deprecated
public int getVisibleTitleHeight() {
checkThread();
return getVisibleTitleHeightImpl();
@@ -1855,6 +1901,7 @@ public class WebView extends AbsoluteLayout
// contains valid data.
final File temp = new File(dest.getPath() + ".writing");
new Thread(new Runnable() {
+ @Override
public void run() {
FileOutputStream out = null;
try {
@@ -1924,6 +1971,7 @@ public class WebView extends AbsoluteLayout
final FileInputStream in = new FileInputStream(src);
final Bundle copy = new Bundle(b);
new Thread(new Runnable() {
+ @Override
public void run() {
try {
final Picture p = Picture.createFromStream(in);
@@ -1931,6 +1979,7 @@ public class WebView extends AbsoluteLayout
// Post a runnable on the main thread to update the
// history picture fields.
mPrivateHandler.post(new Runnable() {
+ @Override
public void run() {
restoreHistoryPictureFields(p, copy);
}
@@ -2659,8 +2708,8 @@ public class WebView extends AbsoluteLayout
int slop = viewToContentDimension(mNavSlop);
cursorBounds.inset(-slop, -slop);
if (cursorBounds.contains(contentX, contentY)) {
- contentX = (int) cursorBounds.centerX();
- contentY = (int) cursorBounds.centerY();
+ contentX = cursorBounds.centerX();
+ contentY = cursorBounds.centerY();
}
}
}
@@ -4857,10 +4906,16 @@ public class WebView extends AbsoluteLayout
}
@Override
+ public boolean onCheckIsTextEditor() {
+ return true;
+ }
+
+ @Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
- InputConnection connection = super.onCreateInputConnection(outAttrs);
- outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_FULLSCREEN;
- return connection;
+ outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN
+ | EditorInfo.TYPE_CLASS_TEXT
+ | EditorInfo.TYPE_TEXT_VARIATION_NORMAL;
+ return mInputConnection;
}
/**
@@ -5055,6 +5110,7 @@ public class WebView extends AbsoluteLayout
mWebSettings = getSettings();
}
+ @Override
public void run() {
ArrayList<String> pastEntries = new ArrayList<String>();
@@ -5717,6 +5773,7 @@ public class WebView extends AbsoluteLayout
* @deprecated WebView no longer needs to implement
* ViewGroup.OnHierarchyChangeListener. This method does nothing now.
*/
+ @Override
// Cannot add @hide as this can always be accessed via the interface.
@Deprecated
public void onChildViewAdded(View parent, View child) {}
@@ -5725,6 +5782,7 @@ public class WebView extends AbsoluteLayout
* @deprecated WebView no longer needs to implement
* ViewGroup.OnHierarchyChangeListener. This method does nothing now.
*/
+ @Override
// Cannot add @hide as this can always be accessed via the interface.
@Deprecated
public void onChildViewRemoved(View p, View child) {}
@@ -5733,6 +5791,7 @@ public class WebView extends AbsoluteLayout
* @deprecated WebView should not have implemented
* ViewTreeObserver.OnGlobalFocusChangeListener. This method does nothing now.
*/
+ @Override
// Cannot add @hide as this can always be accessed via the interface.
@Deprecated
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
@@ -6169,9 +6228,10 @@ public class WebView extends AbsoluteLayout
}
if (DEBUG_TOUCH_HIGHLIGHT) {
if (getSettings().getNavDump()) {
- mTouchHighlightX = (int) x + mScrollX;
- mTouchHighlightY = (int) y + mScrollY;
+ mTouchHighlightX = x + mScrollX;
+ mTouchHighlightY = y + mScrollY;
mPrivateHandler.postDelayed(new Runnable() {
+ @Override
public void run() {
mTouchHighlightX = mTouchHighlightY = 0;
invalidate();
@@ -6763,8 +6823,6 @@ public class WebView extends AbsoluteLayout
int oldY = mScrollY;
int rangeX = computeMaxScrollX();
int rangeY = computeMaxScrollY();
- int overscrollDistance = mOverscrollDistance;
-
// Check for the original scrolling layer in case we change
// directions. mTouchMode might be TOUCH_DRAG_MODE if we have
// reached the edge of a layer but mScrollingLayer will be non-zero
@@ -7477,8 +7535,8 @@ public class WebView extends AbsoluteLayout
return false;
}
mDragFromTextInput = true;
- event.offsetLocation((float) (mWebTextView.getLeft() - mScrollX),
- (float) (mWebTextView.getTop() - mScrollY));
+ event.offsetLocation((mWebTextView.getLeft() - mScrollX),
+ (mWebTextView.getTop() - mScrollY));
boolean result = onTouchEvent(event);
mDragFromTextInput = false;
return result;
@@ -9033,7 +9091,7 @@ public class WebView extends AbsoluteLayout
if (position < 0 || position >= getCount()) {
return null;
}
- return (Container) getItem(position);
+ return getItem(position);
}
@Override
@@ -9132,6 +9190,7 @@ public class WebView extends AbsoluteLayout
}
}
+ @Override
public void run() {
final ListView listView = (ListView) LayoutInflater.from(mContext)
.inflate(com.android.internal.R.layout.select_dialog, null);
@@ -9142,6 +9201,7 @@ public class WebView extends AbsoluteLayout
if (mMultiple) {
b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
mWebViewCore.sendMessage(
EventHub.LISTBOX_CHOICES,
@@ -9150,6 +9210,7 @@ public class WebView extends AbsoluteLayout
}});
b.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int which) {
mWebViewCore.sendMessage(
EventHub.SINGLE_LISTBOX_CHOICE, -2, 0);
@@ -9173,6 +9234,7 @@ public class WebView extends AbsoluteLayout
}
} else {
listView.setOnItemClickListener(new OnItemClickListener() {
+ @Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
// Rather than sending the message right away, send it
@@ -9193,6 +9255,7 @@ public class WebView extends AbsoluteLayout
}
}
mListBoxDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
public void onCancel(DialogInterface dialog) {
mWebViewCore.sendMessage(
EventHub.SINGLE_LISTBOX_CHOICE, -2, 0);
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index d99e264a632b..06572e9daefc 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -37,18 +37,14 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
-import android.webkit.DeviceMotionService;
-import android.webkit.DeviceMotionAndOrientationManager;
-import android.webkit.DeviceOrientationService;
-import android.webkit.JniUtil;
+
+import junit.framework.Assert;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
-import junit.framework.Assert;
-
/**
* @hide
*/
@@ -382,8 +378,9 @@ public final class WebViewCore {
mCallbackProxy.onExceededDatabaseQuota(url, databaseIdentifier,
currentQuota, estimatedSize, getUsedQuota(),
new WebStorage.QuotaUpdater() {
+ @Override
public void updateQuota(long quota) {
- nativeSetNewStorageLimit(quota);
+ nativeSetNewStorageLimit(mNativeClass, quota);
}
});
}
@@ -396,14 +393,16 @@ public final class WebViewCore {
protected void reachedMaxAppCacheSize(long spaceNeeded) {
mCallbackProxy.onReachedMaxAppCacheSize(spaceNeeded, getUsedQuota(),
new WebStorage.QuotaUpdater() {
+ @Override
public void updateQuota(long quota) {
- nativeSetNewStorageLimit(quota);
+ nativeSetNewStorageLimit(mNativeClass, quota);
}
});
}
protected void populateVisitedLinks() {
ValueCallback callback = new ValueCallback<String[]>() {
+ @Override
public void onReceiveValue(String[] value) {
sendMessage(EventHub.POPULATE_VISITED_LINKS, (Object)value);
}
@@ -420,14 +419,15 @@ public final class WebViewCore {
protected void geolocationPermissionsShowPrompt(String origin) {
mCallbackProxy.onGeolocationPermissionsShowPrompt(origin,
new GeolocationPermissions.Callback() {
- public void invoke(String origin, boolean allow, boolean remember) {
- GeolocationPermissionsData data = new GeolocationPermissionsData();
- data.mOrigin = origin;
- data.mAllow = allow;
- data.mRemember = remember;
- // Marshall to WebCore thread.
- sendMessage(EventHub.GEOLOCATION_PERMISSIONS_PROVIDE, data);
- }
+ @Override
+ public void invoke(String origin, boolean allow, boolean remember) {
+ GeolocationPermissionsData data = new GeolocationPermissionsData();
+ data.mOrigin = origin;
+ data.mAllow = allow;
+ data.mRemember = remember;
+ // Marshall to WebCore thread.
+ sendMessage(EventHub.GEOLOCATION_PERMISSIONS_PROVIDE, data);
+ }
});
}
@@ -501,7 +501,7 @@ public final class WebViewCore {
* Clear the picture set. To be called only on the WebCore thread.
*/
/* package */ void clearContent() {
- nativeClearContent();
+ nativeClearContent(mNativeClass);
}
//-------------------------------------------------------------------------
@@ -513,15 +513,16 @@ public final class WebViewCore {
/**
* Empty the picture set.
*/
- private native void nativeClearContent();
+ private native void nativeClearContent(int nativeClass);
- private native void nativeContentInvalidateAll();
+ private native void nativeContentInvalidateAll(int nativeClass);
/**
* Redraw a portion of the picture set. The Point wh returns the
* width and height of the overall picture.
*/
- private native int nativeRecordContent(Region invalRegion, Point wh);
+ private native int nativeRecordContent(int nativeClass, Region invalRegion,
+ Point wh);
/**
* Update the layers' content
@@ -533,25 +534,27 @@ public final class WebViewCore {
*/
private native void nativeNotifyAnimationStarted(int nativeClass);
- private native boolean nativeFocusBoundsChanged();
+ private native boolean nativeFocusBoundsChanged(int nativeClass);
/**
* Splits slow parts of the picture set. Called from the webkit thread after
* WebView.nativeDraw() returns content to be split.
*/
- private native void nativeSplitContent(int content);
+ private native void nativeSplitContent(int nativeClass, int content);
- private native boolean nativeKey(int keyCode, int unichar,
- int repeatCount, boolean isShift, boolean isAlt, boolean isSym,
- boolean isDown);
+ private native boolean nativeKey(int nativeClass, int keyCode,
+ int unichar, int repeatCount, boolean isShift, boolean isAlt,
+ boolean isSym, boolean isDown);
- private native void nativeClick(int framePtr, int nodePtr, boolean fake);
+ private native void nativeClick(int nativeClass, int framePtr, int nodePtr,
+ boolean fake);
- private native void nativeSendListBoxChoices(boolean[] choices, int size);
+ private native void nativeSendListBoxChoices(int nativeClass,
+ boolean[] choices, int size);
- private native void nativeSendListBoxChoice(int choice);
+ private native void nativeSendListBoxChoice(int nativeClass, int choice);
- private native void nativeCloseIdleConnections();
+ private native void nativeCloseIdleConnections(int nativeClass);
/* Tell webkit what its width and height are, for the purposes
of layout/line-breaking. These coordinates are in document space,
@@ -561,75 +564,96 @@ public final class WebViewCore {
fixed size, textWrapWidth can be different from width with zooming.
should this be called nativeSetViewPortSize?
*/
- private native void nativeSetSize(int width, int height, int textWrapWidth,
- float scale, int screenWidth, int screenHeight, int anchorX,
- int anchorY, boolean ignoreHeight);
+ private native void nativeSetSize(int nativeClass, int width, int height,
+ int textWrapWidth, float scale, int screenWidth, int screenHeight,
+ int anchorX, int anchorY, boolean ignoreHeight);
- private native int nativeGetContentMinPrefWidth();
+ private native int nativeGetContentMinPrefWidth(int nativeClass);
// Start: functions that deal with text editing
private native void nativeReplaceTextfieldText(
- int oldStart, int oldEnd, String replace, int newStart, int newEnd,
- int textGeneration);
+ int nativeClass, int oldStart, int oldEnd, String replace,
+ int newStart, int newEnd, int textGeneration);
- private native void passToJs(int gen,
- String currentText, int keyCode, int keyValue, boolean down,
- boolean cap, boolean fn, boolean sym);
+ private native void passToJs(int nativeClass,
+ int gen, String currentText, int keyCode, int keyValue,
+ boolean down, boolean cap, boolean fn, boolean sym);
- private native void nativeSetFocusControllerActive(boolean active);
+ private native void nativeSetFocusControllerActive(int nativeClass,
+ boolean active);
- private native void nativeSaveDocumentState(int frame);
+ private native void nativeSaveDocumentState(int nativeClass, int frame);
- private native void nativeMoveFocus(int framePtr, int nodePointer);
- private native void nativeMoveMouse(int framePtr, int x, int y);
+ private native void nativeMoveFocus(int nativeClass, int framePtr,
+ int nodePointer);
+ private native void nativeMoveMouse(int nativeClass, int framePtr, int x,
+ int y);
- private native void nativeMoveMouseIfLatest(int moveGeneration,
- int framePtr, int x, int y);
+ private native void nativeMoveMouseIfLatest(int nativeClass,
+ int moveGeneration, int framePtr, int x, int y);
- private native String nativeRetrieveHref(int x, int y);
- private native String nativeRetrieveAnchorText(int x, int y);
- private native String nativeRetrieveImageSource(int x, int y);
- private native void nativeStopPaintingCaret();
- private native void nativeTouchUp(int touchGeneration,
- int framePtr, int nodePtr, int x, int y);
+ private native String nativeRetrieveHref(int nativeClass, int x, int y);
+ private native String nativeRetrieveAnchorText(int nativeClass,
+ int x, int y);
+ private native String nativeRetrieveImageSource(int nativeClass,
+ int x, int y);
+ private native void nativeStopPaintingCaret(int nativeClass);
+ private native void nativeTouchUp(int nativeClass,
+ int touchGeneration, int framePtr, int nodePtr, int x, int y);
- private native boolean nativeHandleTouchEvent(int action, int[] idArray,
- int[] xArray, int[] yArray, int count, int actionIndex, int metaState);
+ private native boolean nativeHandleTouchEvent(int nativeClass, int action,
+ int[] idArray, int[] xArray, int[] yArray, int count,
+ int actionIndex, int metaState);
- private native void nativeUpdateFrameCache();
+ private native void nativeUpdateFrameCache(int nativeClass);
- private native void nativeSetBackgroundColor(int color);
+ private native void nativeSetBackgroundColor(int nativeClass, int color);
- private native void nativeDumpDomTree(boolean useFile);
+ private native void nativeDumpDomTree(int nativeClass, boolean useFile);
- private native void nativeDumpRenderTree(boolean useFile);
+ private native void nativeDumpRenderTree(int nativeClass, boolean useFile);
- private native void nativeDumpNavTree();
+ private native void nativeDumpNavTree(int nativeClass);
- private native void nativeSetJsFlags(String flags);
+ private native void nativeSetJsFlags(int nativeClass, String flags);
/**
* Delete text from start to end in the focused textfield. If there is no
* focus, or if start == end, silently fail. If start and end are out of
* order, swap them.
- * @param start Beginning of selection to delete.
- * @param end End of selection to delete.
- * @param textGeneration Text generation number when delete was pressed.
+ * @param nativeClass Pointer to the C++ WebViewCore object mNativeClass
+ * @param start Beginning of selection to delete.
+ * @param end End of selection to delete.
+ * @param textGeneration Text generation number when delete was pressed.
*/
- private native void nativeDeleteSelection(int start, int end,
- int textGeneration);
+ private native void nativeDeleteSelection(int nativeClass, int start,
+ int end, int textGeneration);
+
+ /**
+ * Delete text near the cursor.
+ * @param nativeClass The pointer to the native class (mNativeClass)
+ * @param leftLength The number of characters to the left of the cursor to
+ * delete
+ * @param rightLength The number of characters to the right of the cursor
+ * to delete.
+ */
+ private native void nativeDeleteSurroundingText(int nativeClass,
+ int leftLength,
+ int rightLength);
/**
* Set the selection to (start, end) in the focused textfield. If start and
* end are out of order, swap them.
- * @param start Beginning of selection.
- * @param end End of selection.
+ * @param nativeClass Pointer to the C++ WebViewCore object mNativeClass
+ * @param start Beginning of selection.
+ * @param end End of selection.
*/
- private native void nativeSetSelection(int start, int end);
+ private native void nativeSetSelection(int nativeClass, int start, int end);
// Register a scheme to be treated as local scheme so that it can access
// local asset files for resources
- private native void nativeRegisterURLSchemeAsLocal(String scheme);
+ private native void nativeRegisterURLSchemeAsLocal(int nativeClass,
+ String scheme);
/*
* Inform webcore that the user has decided whether to allow or deny new
@@ -637,34 +661,39 @@ public final class WebViewCore {
* the main thread should wake up now.
* @param limit Is the new quota for an origin or new app cache max size.
*/
- private native void nativeSetNewStorageLimit(long limit);
+ private native void nativeSetNewStorageLimit(int nativeClass, long limit);
/**
* Provide WebCore with a Geolocation permission state for the specified
* origin.
+ * @param nativeClass Pointer to the C++ WebViewCore object mNativeClass
* @param origin The origin for which Geolocation permissions are provided.
* @param allow Whether Geolocation permissions are allowed.
* @param remember Whether this decision should be remembered beyond the
* life of the current page.
*/
- private native void nativeGeolocationPermissionsProvide(String origin, boolean allow, boolean remember);
+ private native void nativeGeolocationPermissionsProvide(int nativeClass,
+ String origin, boolean allow, boolean remember);
/**
* Provide WebCore with the previously visted links from the history database
+ * @param nativeClass TODO
*/
- private native void nativeProvideVisitedHistory(String[] history);
+ private native void nativeProvideVisitedHistory(int nativeClass,
+ String[] history);
/**
* Modifies the current selection.
*
* Note: Accessibility support.
- *
+ * @param nativeClass Pointer to the C++ WebViewCore object mNativeClass
* @param direction The direction in which to alter the selection.
* @param granularity The granularity of the selection modification.
*
* @return The selection string.
*/
- private native String nativeModifySelection(int direction, int granularity);
+ private native String nativeModifySelection(int nativeClass, int direction,
+ int granularity);
// EventHub for processing messages
private final EventHub mEventHub;
@@ -677,6 +706,7 @@ public final class WebViewCore {
private static final int REDUCE_PRIORITY = 1;
private static final int RESUME_PRIORITY = 2;
+ @Override
public void run() {
Looper.prepare();
Assert.assertNull(sWebCoreHandler);
@@ -963,6 +993,8 @@ public final class WebViewCore {
static final int SET_BACKGROUND_COLOR = 126;
static final int SET_MOVE_FOCUS = 127;
static final int SAVE_DOCUMENT_STATE = 128;
+ static final int DELETE_SURROUNDING_TEXT = 129;
+
static final int WEBKIT_DRAW = 130;
static final int POST_URL = 132;
@@ -1128,14 +1160,14 @@ public final class WebViewCore {
break;
case REVEAL_SELECTION:
- nativeRevealSelection();
+ nativeRevealSelection(mNativeClass);
break;
case REQUEST_LABEL:
if (mWebView != null) {
int nodePointer = msg.arg2;
- String label = nativeRequestLabel(msg.arg1,
- nodePointer);
+ String label = nativeRequestLabel(mNativeClass,
+ msg.arg1, nodePointer);
if (label != null && label.length() > 0) {
Message.obtain(mWebView.mPrivateHandler,
WebView.RETURN_LABEL, nodePointer,
@@ -1145,7 +1177,7 @@ public final class WebViewCore {
break;
case UPDATE_FRAME_CACHE_IF_LOADING:
- nativeUpdateFrameCacheIfLoading();
+ nativeUpdateFrameCacheIfLoading(mNativeClass);
break;
case SCROLL_TEXT_INPUT:
@@ -1155,7 +1187,7 @@ public final class WebViewCore {
} else {
xPercent = ((Float) msg.obj).floatValue();
}
- nativeScrollFocusedTextInput(xPercent, msg.arg2);
+ nativeScrollFocusedTextInput(mNativeClass, xPercent, msg.arg2);
break;
case LOAD_URL: {
@@ -1190,7 +1222,8 @@ public final class WebViewCore {
!scheme.startsWith("ftp") &&
!scheme.startsWith("about") &&
!scheme.startsWith("javascript")) {
- nativeRegisterURLSchemeAsLocal(scheme);
+ nativeRegisterURLSchemeAsLocal(mNativeClass,
+ scheme);
}
}
}
@@ -1199,7 +1232,7 @@ public final class WebViewCore {
loadParams.mMimeType,
loadParams.mEncoding,
loadParams.mHistoryUrl);
- nativeContentInvalidateAll();
+ nativeContentInvalidateAll(mNativeClass);
break;
case STOP_LOADING:
@@ -1228,11 +1261,11 @@ public final class WebViewCore {
break;
case FAKE_CLICK:
- nativeClick(msg.arg1, msg.arg2, true);
+ nativeClick(mNativeClass, msg.arg1, msg.arg2, true);
break;
case CLICK:
- nativeClick(msg.arg1, msg.arg2, false);
+ nativeClick(mNativeClass, msg.arg1, msg.arg2, false);
break;
case VIEW_SIZE_CHANGED: {
@@ -1243,14 +1276,14 @@ public final class WebViewCore {
// note: these are in document coordinates
// (inv-zoom)
Point pt = (Point) msg.obj;
- nativeSetScrollOffset(msg.arg1, msg.arg2 == 1,
- pt.x, pt.y);
+ nativeSetScrollOffset(mNativeClass, msg.arg1,
+ msg.arg2 == 1, pt.x, pt.y);
break;
case SET_GLOBAL_BOUNDS:
Rect r = (Rect) msg.obj;
- nativeSetGlobalBounds(r.left, r.top, r.width(),
- r.height());
+ nativeSetGlobalBounds(mNativeClass, r.left, r.top,
+ r.width(), r.height());
break;
case GO_BACK_FORWARD:
@@ -1279,7 +1312,7 @@ public final class WebViewCore {
WebViewWorker.getHandler().sendEmptyMessage(
WebViewWorker.MSG_PAUSE_CACHE_TRANSACTION);
} else {
- nativeCloseIdleConnections();
+ nativeCloseIdleConnections(mNativeClass);
}
break;
@@ -1293,16 +1326,16 @@ public final class WebViewCore {
break;
case ON_PAUSE:
- nativePause();
+ nativePause(mNativeClass);
break;
case ON_RESUME:
- nativeResume();
+ nativeResume(mNativeClass);
break;
case FREE_MEMORY:
clearCache(false);
- nativeFreeMemory();
+ nativeFreeMemory(mNativeClass);
break;
case SET_NETWORK_STATE:
@@ -1335,9 +1368,9 @@ public final class WebViewCore {
case REPLACE_TEXT:
ReplaceTextData rep = (ReplaceTextData) msg.obj;
- nativeReplaceTextfieldText(msg.arg1, msg.arg2,
- rep.mReplace, rep.mNewStart, rep.mNewEnd,
- rep.mTextGeneration);
+ nativeReplaceTextfieldText(mNativeClass, msg.arg1,
+ msg.arg2, rep.mReplace, rep.mNewStart,
+ rep.mNewEnd, rep.mTextGeneration);
break;
case PASS_TO_JS: {
@@ -1346,19 +1379,19 @@ public final class WebViewCore {
int keyCode = evt.getKeyCode();
int keyValue = evt.getUnicodeChar();
int generation = msg.arg1;
- passToJs(generation,
+ passToJs(mNativeClass,
+ generation,
jsData.mCurrentText,
keyCode,
keyValue,
- evt.isDown(),
- evt.isShiftPressed(), evt.isAltPressed(),
- evt.isSymPressed());
+ evt.isDown(), evt.isShiftPressed(),
+ evt.isAltPressed(), evt.isSymPressed());
break;
}
case SAVE_DOCUMENT_STATE: {
CursorData cDat = (CursorData) msg.obj;
- nativeSaveDocumentState(cDat.mFrame);
+ nativeSaveDocumentState(mNativeClass, cDat.mFrame);
break;
}
@@ -1367,7 +1400,7 @@ public final class WebViewCore {
// FIXME: This will not work for connections currently in use, as
// they cache the certificate responses. See http://b/5324235.
SslCertLookupTable.getInstance().clear();
- nativeCloseIdleConnections();
+ nativeCloseIdleConnections(mNativeClass);
} else {
Network.getInstance(mContext).clearUserSslPrefTable();
}
@@ -1376,10 +1409,12 @@ public final class WebViewCore {
case TOUCH_UP:
TouchUpData touchUpData = (TouchUpData) msg.obj;
if (touchUpData.mNativeLayer != 0) {
- nativeScrollLayer(touchUpData.mNativeLayer,
+ nativeScrollLayer(mNativeClass,
+ touchUpData.mNativeLayer,
touchUpData.mNativeLayerRect);
}
- nativeTouchUp(touchUpData.mMoveGeneration,
+ nativeTouchUp(mNativeClass,
+ touchUpData.mMoveGeneration,
touchUpData.mFrame, touchUpData.mNode,
touchUpData.mX, touchUpData.mY);
break;
@@ -1394,11 +1429,13 @@ public final class WebViewCore {
yArray[c] = ted.mPoints[c].y;
}
if (ted.mNativeLayer != 0) {
- nativeScrollLayer(ted.mNativeLayer,
- ted.mNativeLayerRect);
+ nativeScrollLayer(mNativeClass,
+ ted.mNativeLayer, ted.mNativeLayerRect);
}
- ted.mNativeResult = nativeHandleTouchEvent(ted.mAction, ted.mIds,
- xArray, yArray, count, ted.mActionIndex, ted.mMetaState);
+ ted.mNativeResult = nativeHandleTouchEvent(
+ mNativeClass, ted.mAction, ted.mIds, xArray,
+ yArray, count, ted.mActionIndex,
+ ted.mMetaState);
Message.obtain(
mWebView.mPrivateHandler,
WebView.PREVENT_TOUCH_ID,
@@ -1409,7 +1446,7 @@ public final class WebViewCore {
}
case SET_ACTIVE:
- nativeSetFocusControllerActive(msg.arg1 == 1);
+ nativeSetFocusControllerActive(mNativeClass, msg.arg1 == 1);
break;
case ADD_JS_INTERFACE:
@@ -1435,39 +1472,39 @@ public final class WebViewCore {
case SET_MOVE_FOCUS:
CursorData focusData = (CursorData) msg.obj;
- nativeMoveFocus(focusData.mFrame, focusData.mNode);
+ nativeMoveFocus(mNativeClass, focusData.mFrame, focusData.mNode);
break;
case SET_MOVE_MOUSE:
CursorData cursorData = (CursorData) msg.obj;
- nativeMoveMouse(cursorData.mFrame,
- cursorData.mX, cursorData.mY);
+ nativeMoveMouse(mNativeClass,
+ cursorData.mFrame, cursorData.mX, cursorData.mY);
break;
case SET_MOVE_MOUSE_IF_LATEST:
CursorData cData = (CursorData) msg.obj;
- nativeMoveMouseIfLatest(cData.mMoveGeneration,
- cData.mFrame,
- cData.mX, cData.mY);
+ nativeMoveMouseIfLatest(mNativeClass,
+ cData.mMoveGeneration,
+ cData.mFrame, cData.mX, cData.mY);
if (msg.arg1 == 1) {
- nativeStopPaintingCaret();
+ nativeStopPaintingCaret(mNativeClass);
}
break;
case REQUEST_CURSOR_HREF: {
Message hrefMsg = (Message) msg.obj;
hrefMsg.getData().putString("url",
- nativeRetrieveHref(msg.arg1, msg.arg2));
+ nativeRetrieveHref(mNativeClass, msg.arg1, msg.arg2));
hrefMsg.getData().putString("title",
- nativeRetrieveAnchorText(msg.arg1, msg.arg2));
+ nativeRetrieveAnchorText(mNativeClass, msg.arg1, msg.arg2));
hrefMsg.getData().putString("src",
- nativeRetrieveImageSource(msg.arg1, msg.arg2));
+ nativeRetrieveImageSource(mNativeClass, msg.arg1, msg.arg2));
hrefMsg.sendToTarget();
break;
}
case UPDATE_CACHE_AND_TEXT_ENTRY:
- nativeUpdateFrameCache();
+ nativeUpdateFrameCache(mNativeClass);
// FIXME: this should provide a minimal rectangle
if (mWebView != null) {
mWebView.postInvalidate();
@@ -1485,17 +1522,23 @@ public final class WebViewCore {
case DELETE_SELECTION:
TextSelectionData deleteSelectionData
= (TextSelectionData) msg.obj;
- nativeDeleteSelection(deleteSelectionData.mStart,
- deleteSelectionData.mEnd, msg.arg1);
+ nativeDeleteSelection(mNativeClass,
+ deleteSelectionData.mStart, deleteSelectionData.mEnd, msg.arg1);
+ break;
+
+ case DELETE_SURROUNDING_TEXT:
+ nativeDeleteSurroundingText(mNativeClass,
+ msg.arg1, msg.arg2);
break;
case SET_SELECTION:
- nativeSetSelection(msg.arg1, msg.arg2);
+ nativeSetSelection(mNativeClass, msg.arg1, msg.arg2);
break;
case MODIFY_SELECTION:
- String modifiedSelectionString = nativeModifySelection(msg.arg1,
- msg.arg2);
+ String modifiedSelectionString =
+ nativeModifySelection(mNativeClass, msg.arg1,
+ msg.arg2);
mWebView.mPrivateHandler.obtainMessage(WebView.SELECTION_STRING_CHANGED,
modifiedSelectionString).sendToTarget();
break;
@@ -1508,36 +1551,36 @@ public final class WebViewCore {
for (int c = 0; c < choicesSize; c++) {
choicesArray[c] = choices.get(c);
}
- nativeSendListBoxChoices(choicesArray,
- choicesSize);
+ nativeSendListBoxChoices(mNativeClass,
+ choicesArray, choicesSize);
break;
case SINGLE_LISTBOX_CHOICE:
- nativeSendListBoxChoice(msg.arg1);
+ nativeSendListBoxChoice(mNativeClass, msg.arg1);
break;
case SET_BACKGROUND_COLOR:
- nativeSetBackgroundColor(msg.arg1);
+ nativeSetBackgroundColor(mNativeClass, msg.arg1);
break;
case DUMP_DOMTREE:
- nativeDumpDomTree(msg.arg1 == 1);
+ nativeDumpDomTree(mNativeClass, msg.arg1 == 1);
break;
case DUMP_RENDERTREE:
- nativeDumpRenderTree(msg.arg1 == 1);
+ nativeDumpRenderTree(mNativeClass, msg.arg1 == 1);
break;
case DUMP_NAVTREE:
- nativeDumpNavTree();
+ nativeDumpNavTree(mNativeClass);
break;
case SET_JS_FLAGS:
- nativeSetJsFlags((String)msg.obj);
+ nativeSetJsFlags(mNativeClass, (String)msg.obj);
break;
case CONTENT_INVALIDATE_ALL:
- nativeContentInvalidateAll();
+ nativeContentInvalidateAll(mNativeClass);
break;
case SAVE_WEBARCHIVE:
@@ -1552,12 +1595,12 @@ public final class WebViewCore {
case GEOLOCATION_PERMISSIONS_PROVIDE:
GeolocationPermissionsData data =
(GeolocationPermissionsData) msg.obj;
- nativeGeolocationPermissionsProvide(data.mOrigin,
- data.mAllow, data.mRemember);
+ nativeGeolocationPermissionsProvide(mNativeClass,
+ data.mOrigin, data.mAllow, data.mRemember);
break;
case SPLIT_PICTURE_SET:
- nativeSplitContent(msg.arg1);
+ nativeSplitContent(mNativeClass, msg.arg1);
mWebView.mPrivateHandler.obtainMessage(
WebView.REPLACE_BASE_CONTENT, msg.arg1, 0);
mSplitPictureIsScheduled = false;
@@ -1575,15 +1618,15 @@ public final class WebViewCore {
break;
case POPULATE_VISITED_LINKS:
- nativeProvideVisitedHistory((String[])msg.obj);
+ nativeProvideVisitedHistory(mNativeClass, (String[])msg.obj);
break;
case VALID_NODE_BOUNDS: {
MotionUpData motionUpData = (MotionUpData) msg.obj;
if (!nativeValidNodeAndBounds(
- motionUpData.mFrame, motionUpData.mNode,
- motionUpData.mBounds)) {
- nativeUpdateFrameCache();
+ mNativeClass, motionUpData.mFrame,
+ motionUpData.mNode, motionUpData.mBounds)) {
+ nativeUpdateFrameCache(mNativeClass);
}
Message message = mWebView.mPrivateHandler
.obtainMessage(WebView.DO_MOTION_UP,
@@ -1594,11 +1637,11 @@ public final class WebViewCore {
}
case HIDE_FULLSCREEN:
- nativeFullScreenPluginHidden(msg.arg1);
+ nativeFullScreenPluginHidden(mNativeClass, msg.arg1);
break;
case PLUGIN_SURFACE_READY:
- nativePluginSurfaceReady();
+ nativePluginSurfaceReady(mNativeClass);
break;
case NOTIFY_ANIMATION_STARTED:
@@ -1617,11 +1660,11 @@ public final class WebViewCore {
case GET_TOUCH_HIGHLIGHT_RECTS:
TouchHighlightData d = (TouchHighlightData) msg.obj;
if (d.mNativeLayer != 0) {
- nativeScrollLayer(d.mNativeLayer,
- d.mNativeLayerRect);
+ nativeScrollLayer(mNativeClass,
+ d.mNativeLayer, d.mNativeLayerRect);
}
ArrayList<Rect> rects = nativeGetTouchHighlightRects
- (d.mX, d.mY, d.mSlop);
+ (mNativeClass, d.mX, d.mY, d.mSlop);
mWebView.mPrivateHandler.obtainMessage(
WebView.SET_TOUCH_HIGHLIGHT_RECTS, rects)
.sendToTarget();
@@ -1632,7 +1675,7 @@ public final class WebViewCore {
break;
case AUTOFILL_FORM:
- nativeAutoFillForm(msg.arg1);
+ nativeAutoFillForm(mNativeClass, msg.arg1);
mWebView.mPrivateHandler.obtainMessage(WebView.AUTOFILL_COMPLETE, null)
.sendToTarget();
break;
@@ -1853,9 +1896,9 @@ public final class WebViewCore {
unicodeChar = evt.getCharacters().codePointAt(0);
}
- if (!nativeKey(keyCode, unicodeChar, evt.getRepeatCount(), evt.isShiftPressed(),
- evt.isAltPressed(), evt.isSymPressed(),
- isDown) && keyCode != KeyEvent.KEYCODE_ENTER) {
+ if (!nativeKey(mNativeClass, keyCode, unicodeChar, evt.getRepeatCount(),
+ evt.isShiftPressed(), evt.isAltPressed(),
+ evt.isSymPressed(), isDown) && keyCode != KeyEvent.KEYCODE_ENTER) {
if (keyCode >= KeyEvent.KEYCODE_DPAD_UP
&& keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) {
if (DebugFlags.WEB_VIEW_CORE) {
@@ -1901,9 +1944,9 @@ public final class WebViewCore {
float ratio = (heightWidthRatio > 0) ? heightWidthRatio : (float) h / w;
height = Math.round(ratio * width);
}
- nativeSetSize(width, height, textwrapWidth, scale, w,
- data.mActualViewHeight > 0 ? data.mActualViewHeight : h,
- data.mAnchorX, data.mAnchorY, data.mIgnoreHeight);
+ int screenHeight = data.mActualViewHeight > 0 ? data.mActualViewHeight : h;
+ nativeSetSize(mNativeClass, width, height, textwrapWidth, scale,
+ w, screenHeight, data.mAnchorX, data.mAnchorY, data.mIgnoreHeight);
// Remember the current width and height
boolean needInvalidate = (mCurrentViewWidth == 0);
mCurrentViewWidth = w;
@@ -2039,7 +2082,8 @@ public final class WebViewCore {
mDrawIsScheduled = false;
DrawData draw = new DrawData();
if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw start");
- draw.mBaseLayer = nativeRecordContent(draw.mInvalRegion, draw.mContentSize);
+ draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mInvalRegion,
+ draw.mContentSize);
if (draw.mBaseLayer == 0) {
if (mWebView != null && !mWebView.isPaused()) {
if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw abort, resending draw message");
@@ -2055,14 +2099,14 @@ public final class WebViewCore {
private void webkitDraw(DrawData draw) {
if (mWebView != null) {
- draw.mFocusSizeChanged = nativeFocusBoundsChanged();
+ draw.mFocusSizeChanged = nativeFocusBoundsChanged(mNativeClass);
draw.mViewSize = new Point(mCurrentViewWidth, mCurrentViewHeight);
if (mSettings.getUseWideViewPort()) {
draw.mMinPrefWidth = Math.max(
mViewportWidth == -1 ? WebView.DEFAULT_VIEWPORT_WIDTH
: (mViewportWidth == 0 ? mCurrentViewWidth
: mViewportWidth),
- nativeGetContentMinPrefWidth());
+ nativeGetContentMinPrefWidth(mNativeClass));
}
if (mInitialViewState != null) {
draw.mViewState = mInitialViewState;
@@ -2113,7 +2157,7 @@ public final class WebViewCore {
Log.w(LOGTAG, "Cannot pauseUpdatePicture, core destroyed or not initialized!");
return;
}
- core.nativeSetIsPaused(true);
+ core.nativeSetIsPaused(core.mNativeClass, true);
core.mDrawIsPaused = true;
}
}
@@ -2131,7 +2175,7 @@ public final class WebViewCore {
Log.w(LOGTAG, "Cannot resumeUpdatePicture, core destroyed!");
return;
}
- core.nativeSetIsPaused(false);
+ core.nativeSetIsPaused(core.mNativeClass, false);
core.mDrawIsPaused = false;
// always redraw on resume to reenable gif animations
core.mDrawIsScheduled = false;
@@ -2255,7 +2299,7 @@ public final class WebViewCore {
return mWebView;
}
- private native void setViewportSettingsFromNative();
+ private native void setViewportSettingsFromNative(int nativeClass);
// called by JNI
private void didFirstLayout(boolean standardLoad) {
@@ -2300,7 +2344,7 @@ public final class WebViewCore {
return;
}
// set the viewport settings from WebKit
- setViewportSettingsFromNative();
+ setViewportSettingsFromNative(mNativeClass);
// clamp initial scale
if (mViewportInitialScale > 0) {
@@ -2614,18 +2658,22 @@ public final class WebViewCore {
WebView.FIND_AGAIN).sendToTarget();
}
- private native void nativeUpdateFrameCacheIfLoading();
- private native void nativeRevealSelection();
- private native String nativeRequestLabel(int framePtr, int nodePtr);
+ private native void nativeUpdateFrameCacheIfLoading(int nativeClass);
+ private native void nativeRevealSelection(int nativeClass);
+ private native String nativeRequestLabel(int nativeClass, int framePtr,
+ int nodePtr);
/**
* Scroll the focused textfield to (xPercent, y) in document space
*/
- private native void nativeScrollFocusedTextInput(float xPercent, int y);
+ private native void nativeScrollFocusedTextInput(int nativeClass,
+ float xPercent, int y);
// these must be in document space (i.e. not scaled/zoomed).
- private native void nativeSetScrollOffset(int gen, boolean sendScrollEvent, int dx, int dy);
+ private native void nativeSetScrollOffset(int nativeClass, int gen,
+ boolean sendScrollEvent, int dx, int dy);
- private native void nativeSetGlobalBounds(int x, int y, int w, int h);
+ private native void nativeSetGlobalBounds(int nativeClass, int x, int y,
+ int w, int h);
// called by JNI
private void requestListBox(String[] array, int[] enabledArray,
@@ -2860,18 +2908,18 @@ public final class WebViewCore {
return mDeviceOrientationService;
}
- private native void nativeSetIsPaused(boolean isPaused);
- private native void nativePause();
- private native void nativeResume();
- private native void nativeFreeMemory();
- private native void nativeFullScreenPluginHidden(int npp);
- private native void nativePluginSurfaceReady();
- private native boolean nativeValidNodeAndBounds(int frame, int node,
- Rect bounds);
+ private native void nativeSetIsPaused(int nativeClass, boolean isPaused);
+ private native void nativePause(int nativeClass);
+ private native void nativeResume(int nativeClass);
+ private native void nativeFreeMemory(int nativeClass);
+ private native void nativeFullScreenPluginHidden(int nativeClass, int npp);
+ private native void nativePluginSurfaceReady(int nativeClass);
+ private native boolean nativeValidNodeAndBounds(int nativeClass, int frame,
+ int node, Rect bounds);
- private native ArrayList<Rect> nativeGetTouchHighlightRects(int x, int y,
- int slop);
+ private native ArrayList<Rect> nativeGetTouchHighlightRects(int nativeClass,
+ int x, int y, int slop);
- private native void nativeAutoFillForm(int queryId);
- private native void nativeScrollLayer(int layer, Rect rect);
+ private native void nativeAutoFillForm(int nativeClass, int queryId);
+ private native void nativeScrollLayer(int nativeClass, int layer, Rect rect);
}
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 12a93ac888dc..a452fecab66b 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -18,10 +18,10 @@ package android.widget;
import com.android.internal.R;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Comparator;
-import java.util.HashSet;
-import java.util.LinkedList;
+import java.util.HashMap;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -151,6 +151,15 @@ public class RelativeLayout extends ViewGroup {
private static final int VERB_COUNT = 16;
+
+ private static final int[] RULES_VERTICAL = {
+ ABOVE, BELOW, ALIGN_BASELINE, ALIGN_TOP, ALIGN_BOTTOM
+ };
+
+ private static final int[] RULES_HORIZONTAL = {
+ LEFT_OF, RIGHT_OF, ALIGN_LEFT, ALIGN_RIGHT
+ };
+
private View mBaselineView = null;
private boolean mHasBaselineAlignedChild;
@@ -284,14 +293,13 @@ public class RelativeLayout extends ViewGroup {
if (DEBUG_GRAPH) {
d(LOG_TAG, "=== Sorted vertical children");
- graph.log(getResources(), ABOVE, BELOW, ALIGN_BASELINE, ALIGN_TOP, ALIGN_BOTTOM);
+ graph.log(getResources(), RULES_VERTICAL);
d(LOG_TAG, "=== Sorted horizontal children");
- graph.log(getResources(), LEFT_OF, RIGHT_OF, ALIGN_LEFT, ALIGN_RIGHT);
+ graph.log(getResources(), RULES_HORIZONTAL);
}
- graph.getSortedViews(mSortedVerticalChildren, ABOVE, BELOW, ALIGN_BASELINE,
- ALIGN_TOP, ALIGN_BOTTOM);
- graph.getSortedViews(mSortedHorizontalChildren, LEFT_OF, RIGHT_OF, ALIGN_LEFT, ALIGN_RIGHT);
+ graph.getSortedViews(mSortedVerticalChildren, RULES_VERTICAL);
+ graph.getSortedViews(mSortedHorizontalChildren, RULES_HORIZONTAL);
if (DEBUG_GRAPH) {
d(LOG_TAG, "=== Ordered list of vertical children");
@@ -1216,7 +1224,7 @@ public class RelativeLayout extends ViewGroup {
* Temporary data structure used to build the list of roots
* for this graph.
*/
- private LinkedList<Node> mRoots = new LinkedList<Node>();
+ private ArrayDeque<Node> mRoots = new ArrayDeque<Node>();
/**
* Clears the graph.
@@ -1261,18 +1269,18 @@ public class RelativeLayout extends ViewGroup {
* @param rules The list of rules to take into account.
*/
void getSortedViews(View[] sorted, int... rules) {
- final LinkedList<Node> roots = findRoots(rules);
+ final ArrayDeque<Node> roots = findRoots(rules);
int index = 0;
- while (roots.size() > 0) {
- final Node node = roots.removeFirst();
+ Node node;
+ while ((node = roots.pollLast()) != null) {
final View view = node.view;
final int key = view.getId();
sorted[index++] = view;
- final HashSet<Node> dependents = node.dependents;
- for (Node dependent : dependents) {
+ final HashMap<Node, DependencyGraph> dependents = node.dependents;
+ for (Node dependent : dependents.keySet()) {
final SparseArray<Node> dependencies = dependent.dependencies;
dependencies.remove(key);
@@ -1297,7 +1305,7 @@ public class RelativeLayout extends ViewGroup {
*
* @return A list of node, each being a root of the graph
*/
- private LinkedList<Node> findRoots(int[] rulesFilter) {
+ private ArrayDeque<Node> findRoots(int[] rulesFilter) {
final SparseArray<Node> keyNodes = mKeyNodes;
final ArrayList<Node> nodes = mNodes;
final int count = nodes.size();
@@ -1330,20 +1338,20 @@ public class RelativeLayout extends ViewGroup {
continue;
}
// Add the current node as a dependent
- dependency.dependents.add(node);
+ dependency.dependents.put(node, this);
// Add a dependency to the current node
node.dependencies.put(rule, dependency);
}
}
}
- final LinkedList<Node> roots = mRoots;
+ final ArrayDeque<Node> roots = mRoots;
roots.clear();
// Finds all the roots in the graph: all nodes with no dependencies
for (int i = 0; i < count; i++) {
final Node node = nodes.get(i);
- if (node.dependencies.size() == 0) roots.add(node);
+ if (node.dependencies.size() == 0) roots.addLast(node);
}
return roots;
@@ -1356,7 +1364,7 @@ public class RelativeLayout extends ViewGroup {
* @param rules The list of rules to take into account.
*/
void log(Resources resources, int... rules) {
- final LinkedList<Node> roots = findRoots(rules);
+ final ArrayDeque<Node> roots = findRoots(rules);
for (Node node : roots) {
printNode(resources, node);
}
@@ -1382,7 +1390,7 @@ public class RelativeLayout extends ViewGroup {
if (node.dependents.size() == 0) {
printViewId(resources, node.view);
} else {
- for (Node dependent : node.dependents) {
+ for (Node dependent : node.dependents.keySet()) {
StringBuilder buffer = new StringBuilder();
appendViewId(resources, node, buffer);
printdependents(resources, dependent, buffer);
@@ -1397,7 +1405,7 @@ public class RelativeLayout extends ViewGroup {
if (node.dependents.size() == 0) {
d(LOG_TAG, buffer.toString());
} else {
- for (Node dependent : node.dependents) {
+ for (Node dependent : node.dependents.keySet()) {
StringBuilder subBuffer = new StringBuilder(buffer);
printdependents(resources, dependent, subBuffer);
}
@@ -1420,7 +1428,7 @@ public class RelativeLayout extends ViewGroup {
* The list of dependents for this node; a dependent is a node
* that needs this node to be processed first.
*/
- final HashSet<Node> dependents = new HashSet<Node>();
+ final HashMap<Node, DependencyGraph> dependents = new HashMap<Node, DependencyGraph>();
/**
* The list of dependencies for this node.
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 8e438ffe4678..64fdf3403350 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -380,7 +380,6 @@ public class VideoView extends SurfaceView implements MediaPlayerControl {
}
new AlertDialog.Builder(mContext)
- .setTitle(com.android.internal.R.string.VideoView_error_title)
.setMessage(messageId)
.setPositiveButton(com.android.internal.R.string.VideoView_error_button,
new DialogInterface.OnClickListener() {
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index e4d3aa8eb787..c00661532009 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -294,7 +294,7 @@ status_t AndroidRuntime::callMain(const char* className,
methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
if (methodId == NULL) {
- LOGE("ERROR: could not find method %s.main(String[])\n", className);
+ ALOGE("ERROR: could not find method %s.main(String[])\n", className);
return UNKNOWN_ERROR;
}
@@ -396,7 +396,7 @@ static void blockSigpipe()
sigemptyset(&mask);
sigaddset(&mask, SIGPIPE);
if (sigprocmask(SIG_BLOCK, &mask, NULL) != 0)
- LOGW("WARNING: SIGPIPE not blocked\n");
+ ALOGW("WARNING: SIGPIPE not blocked\n");
}
/*
@@ -703,7 +703,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
/* accept "all" to mean "all classes and packages" */
if (strcmp(enableAssertBuf+4, "all") == 0)
enableAssertBuf[3] = '\0';
- LOGI("Assertions enabled: '%s'\n", enableAssertBuf);
+ ALOGI("Assertions enabled: '%s'\n", enableAssertBuf);
opt.optionString = enableAssertBuf;
mOptions.add(opt);
} else {
@@ -711,7 +711,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
}
if (jniOptsBuf[10] != '\0') {
- LOGI("JNI options: '%s'\n", jniOptsBuf);
+ ALOGI("JNI options: '%s'\n", jniOptsBuf);
opt.optionString = jniOptsBuf;
mOptions.add(opt);
}
@@ -765,7 +765,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
* JNI calls.
*/
if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {
- LOGE("JNI_CreateJavaVM failed\n");
+ ALOGE("JNI_CreateJavaVM failed\n");
goto bail;
}
@@ -837,7 +837,7 @@ void AndroidRuntime::start(const char* className, const char* options)
* Register android functions.
*/
if (startReg(env) < 0) {
- LOGE("Unable to register all android natives\n");
+ ALOGE("Unable to register all android natives\n");
return;
}
@@ -868,13 +868,13 @@ void AndroidRuntime::start(const char* className, const char* options)
char* slashClassName = toSlashClassName(className);
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
- LOGE("JavaVM unable to locate class '%s'\n", slashClassName);
+ ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
/* keep going */
} else {
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
if (startMeth == NULL) {
- LOGE("JavaVM unable to find main() in '%s'\n", className);
+ ALOGE("JavaVM unable to find main() in '%s'\n", className);
/* keep going */
} else {
env->CallStaticVoidMethod(startClass, startMeth, strArray);
@@ -889,9 +889,9 @@ void AndroidRuntime::start(const char* className, const char* options)
ALOGD("Shutting down VM\n");
if (mJavaVM->DetachCurrentThread() != JNI_OK)
- LOGW("Warning: unable to detach main thread\n");
+ ALOGW("Warning: unable to detach main thread\n");
if (mJavaVM->DestroyJavaVM() != 0)
- LOGW("Warning: VM did not shut down cleanly\n");
+ ALOGW("Warning: VM did not shut down cleanly\n");
}
void AndroidRuntime::onExit(int code)
@@ -942,7 +942,7 @@ static int javaAttachThread(const char* threadName, JNIEnv** pEnv)
result = vm->AttachCurrentThread(pEnv, (void*) &args);
if (result != JNI_OK)
- LOGI("NOTE: attach of thread '%s' failed\n", threadName);
+ ALOGI("NOTE: attach of thread '%s' failed\n", threadName);
return result;
}
@@ -960,7 +960,7 @@ static int javaDetachThread(void)
result = vm->DetachCurrentThread();
if (result != JNI_OK)
- LOGE("ERROR: thread detach failed\n");
+ ALOGE("ERROR: thread detach failed\n");
return result;
}
diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp
index f118dc1eff7e..4aa13f9babea 100644
--- a/core/jni/android/graphics/Canvas.cpp
+++ b/core/jni/android/graphics/Canvas.cpp
@@ -762,7 +762,7 @@ public:
value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count,
contextCount, flags);
if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value for text = '%s'",
+ ALOGE("Cannot get TextLayoutCache value for text = '%s'",
String8(textArray + start, count).string());
return ;
}
@@ -779,15 +779,8 @@ public:
// TODO: need to suppress this code after the GL renderer is modified for not
// copying the paint
- // Save old text encoding
- SkPaint::TextEncoding oldEncoding = paint->getTextEncoding();
- // Define Glyph encoding
- paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-
+ // Beware: this needs Glyph encoding (already done on the Paint constructor)
canvas->drawText(glyphArray + index * 2, count * 2, x, y, *paint);
-
- // Get back old encoding
- paint->setTextEncoding(oldEncoding);
}
static void drawTextRun___CIIIIFFIPaint(
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 64bd20775ac1..47ffd948c6f0 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -40,7 +40,7 @@ void doThrowIOE(JNIEnv* env, const char* msg) {
bool GraphicsJNI::hasException(JNIEnv *env) {
if (env->ExceptionCheck() != 0) {
- LOGE("*** Uncaught exception returned from Java call!\n");
+ ALOGE("*** Uncaught exception returned from Java call!\n");
env->ExceptionDescribe();
return true;
}
diff --git a/core/jni/android/graphics/NinePatchImpl.cpp b/core/jni/android/graphics/NinePatchImpl.cpp
index 7aaca8a12ae5..1d0bb50613d1 100644
--- a/core/jni/android/graphics/NinePatchImpl.cpp
+++ b/core/jni/android/graphics/NinePatchImpl.cpp
@@ -297,7 +297,7 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds,
}
SkIRect idst;
dst.round(&idst);
- //LOGI("Adding trans rect: (%d,%d)-(%d,%d)\n",
+ //ALOGI("Adding trans rect: (%d,%d)-(%d,%d)\n",
// idst.fLeft, idst.fTop, idst.fRight, idst.fBottom);
(*outRegion)->op(idst, SkRegion::kUnion_Op);
}
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 19f53d769b23..9f3238abc9b5 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -54,8 +54,8 @@ static jclass gFontMetricsInt_class;
static JMetricsID gFontMetricsInt_fieldID;
static void defaultSettingsForAndroid(SkPaint* paint) {
- // utf16 is required for java
- paint->setTextEncoding(SkPaint::kUTF16_TextEncoding);
+ // GlyphID encoding is required because we are using Harfbuzz shaping
+ paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
}
class SkPaintGlue {
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index de2d8c48b662..3d350ed90452 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -112,7 +112,7 @@ JNIEnv* JNISurfaceTextureContext::getJNIEnv(bool* needsDetach) {
JavaVM* vm = AndroidRuntime::getJavaVM();
int result = vm->AttachCurrentThread(&env, (void*) &args);
if (result != JNI_OK) {
- LOGE("thread attach failed: %#x", result);
+ ALOGE("thread attach failed: %#x", result);
return NULL;
}
*needsDetach = true;
@@ -124,7 +124,7 @@ void JNISurfaceTextureContext::detachJNI() {
JavaVM* vm = AndroidRuntime::getJavaVM();
int result = vm->DetachCurrentThread();
if (result != JNI_OK) {
- LOGE("thread detach failed: %#x", result);
+ ALOGE("thread detach failed: %#x", result);
}
}
@@ -136,7 +136,7 @@ JNISurfaceTextureContext::~JNISurfaceTextureContext()
env->DeleteGlobalRef(mWeakThiz);
env->DeleteGlobalRef(mClazz);
} else {
- LOGW("leaking JNI object references");
+ ALOGW("leaking JNI object references");
}
if (needsDetach) {
detachJNI();
@@ -150,7 +150,7 @@ void JNISurfaceTextureContext::onFrameAvailable()
if (env != NULL) {
env->CallStaticVoidMethod(mClazz, fields.postEvent, mWeakThiz);
} else {
- LOGW("onFrameAvailable event will not posted");
+ ALOGW("onFrameAvailable event will not posted");
}
if (needsDetach) {
detachJNI();
@@ -164,14 +164,14 @@ static void SurfaceTexture_classInit(JNIEnv* env, jclass clazz)
fields.surfaceTexture = env->GetFieldID(clazz,
ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I");
if (fields.surfaceTexture == NULL) {
- LOGE("can't find android/graphics/SurfaceTexture.%s",
+ ALOGE("can't find android/graphics/SurfaceTexture.%s",
ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID);
}
fields.postEvent = env->GetStaticMethodID(clazz, "postEventFromNative",
"(Ljava/lang/Object;)V");
if (fields.postEvent == NULL) {
- LOGE("can't find android/graphics/SurfaceTexture.postEventFromNative");
+ ALOGE("can't find android/graphics/SurfaceTexture.postEventFromNative");
}
}
diff --git a/core/jni/android/graphics/TextLayout.cpp b/core/jni/android/graphics/TextLayout.cpp
index f88dcd6a4675..2d8385198f42 100644
--- a/core/jni/android/graphics/TextLayout.cpp
+++ b/core/jni/android/graphics/TextLayout.cpp
@@ -52,7 +52,7 @@ bool TextLayout::needsLayout(const jchar* text, jint len, jint bidiFlags) {
// This will draw if canvas is not null, otherwise path must be non-null and it will create
// a path representing the text that would have been drawn.
void TextLayout::handleText(SkPaint *paint, const jchar* text, jsize len,
- jint bidiFlags, jfloat x, jfloat y,SkCanvas *canvas, SkPath *path) {
+ jint bidiFlags, jfloat x, jfloat y, SkPath *path) {
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
// Return advances from the cache. Compute them if needed
@@ -64,17 +64,14 @@ void TextLayout::handleText(SkPaint *paint, const jchar* text, jsize len,
reinterpret_cast<const UChar*>(text), 0, len, len, bidiFlags);
#endif
if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value for text = '%s'",
+ ALOGE("Cannot get TextLayoutCache value for text = '%s'",
String8(text, len).string());
return ;
}
SkScalar x_ = SkFloatToScalar(x);
SkScalar y_ = SkFloatToScalar(y);
- if (canvas) {
- canvas->drawText(value->getGlyphs(), value->getGlyphsCount() * 2, x_, y_, *paint);
- } else {
- paint->getTextPath(value->getGlyphs(), value->getGlyphsCount() * 2, x_, y_, path);
- }
+ // Beware: this needs Glyph encoding (already done on the Paint constructor)
+ paint->getTextPath(value->getGlyphs(), value->getGlyphsCount() * 2, x_, y_, path);
}
void TextLayout::getTextRunAdvances(SkPaint* paint, const jchar* chars, jint start,
@@ -91,7 +88,7 @@ void TextLayout::getTextRunAdvances(SkPaint* paint, const jchar* chars, jint sta
reinterpret_cast<const UChar*>(chars), start, count, contextCount, dirFlags);
#endif
if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value for text = '%s'",
+ ALOGE("Cannot get TextLayoutCache value for text = '%s'",
String8(chars + start, count).string());
return ;
}
@@ -113,7 +110,7 @@ void TextLayout::getTextRunAdvancesICU(SkPaint* paint, const jchar* chars, jint
void TextLayout::getTextPath(SkPaint *paint, const jchar *text, jsize len,
jint bidiFlags, jfloat x, jfloat y, SkPath *path) {
- handleText(paint, text, len, bidiFlags, x, y, NULL, path);
+ handleText(paint, text, len, bidiFlags, x, y, path);
}
@@ -139,20 +136,12 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count,
reinterpret_cast<const UChar*>(text), 0, count, count, bidiFlags);
#endif
if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value for text = '%s'",
+ ALOGE("Cannot get TextLayoutCache value for text = '%s'",
String8(text, count).string());
return ;
}
-
- // Save old text encoding
- SkPaint::TextEncoding oldEncoding = paint->getTextEncoding();
- // Define Glyph encoding
- paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-
+ // Beware: this needs Glyph encoding (already done on the Paint constructor)
canvas->drawTextOnPathHV(value->getGlyphs(), value->getGlyphsCount() * 2, *path, h_, v_, *paint);
-
- // Get back old encoding
- paint->setTextEncoding(oldEncoding);
}
void TextLayout::computeAdvancesWithICU(SkPaint* paint, const UChar* chars,
diff --git a/core/jni/android/graphics/TextLayout.h b/core/jni/android/graphics/TextLayout.h
index 1dabe32cc6f0..a0f94024fcf8 100644
--- a/core/jni/android/graphics/TextLayout.h
+++ b/core/jni/android/graphics/TextLayout.h
@@ -81,7 +81,7 @@ private:
static bool needsLayout(const jchar* text, jint len, jint bidiFlags);
static void handleText(SkPaint* paint, const jchar* text, jsize len,
- int bidiFlags, jfloat x, jfloat y, SkCanvas* canvas, SkPath* path);
+ int bidiFlags, jfloat x, jfloat y, SkPath* path);
static void computeAdvancesWithICU(SkPaint* paint, const UChar* chars,
size_t start, size_t count, size_t contextCount, int dirFlags,
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 44ba68ed5200..1b7623d09fcd 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -176,7 +176,6 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
value->getElapsedTime() * 0.000001f,
String8(text + start, count).string());
}
- value.clear();
}
} else {
// This is a cache hit, just log timestamp and user infos
@@ -424,7 +423,7 @@ void TextLayoutEngine::computeValues(SkPaint* paint, const UChar* chars,
isRTL = (paraDir == 1);
useSingleRun = true;
} else if (!U_SUCCESS(status) || rc < 1) {
- LOGW("Need to force to single run -- string = '%s',"
+ ALOGW("Need to force to single run -- string = '%s',"
" status = %d, rc = %d",
String8(chars + start, count).string(), status, int(rc));
isRTL = (paraDir == 1);
@@ -439,7 +438,7 @@ void TextLayoutEngine::computeValues(SkPaint* paint, const UChar* chars,
if (startRun == -1 || lengthRun == -1) {
// Something went wrong when getting the visual run, need to clear
// already computed data before doing a single run pass
- LOGW("Visual run is not valid");
+ ALOGW("Visual run is not valid");
outGlyphs->clear();
outAdvances->clear();
*outTotalAdvance = 0;
@@ -476,13 +475,13 @@ void TextLayoutEngine::computeValues(SkPaint* paint, const UChar* chars,
}
}
} else {
- LOGW("Cannot set Para");
+ ALOGW("Cannot set Para");
useSingleRun = true;
isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL);
}
ubidi_close(bidi);
} else {
- LOGW("Cannot ubidi_open()");
+ ALOGW("Cannot ubidi_open()");
useSingleRun = true;
isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL);
}
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index 6a049e0cba95..929df540d43f 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -73,10 +73,10 @@ private:
static
void
print_poly(const char* label, Poly* pPoly) {
- LOGI("%s: %d verts", label, pPoly->n);
+ ALOGI("%s: %d verts", label, pPoly->n);
for(int i = 0; i < pPoly->n; i++) {
Poly_vert* pV = & pPoly->vert[i];
- LOGI("[%d] %g, %g, %g %g", i, pV->sx, pV->sy, pV->sz, pV->sw);
+ ALOGI("[%d] %g, %g, %g %g", i, pV->sx, pV->sy, pV->sz, pV->sw);
}
}
#endif
@@ -1062,7 +1062,7 @@ int register_android_opengl_classes(JNIEnv* env)
result = AndroidRuntime::registerNativeMethods(env,
cri->classPath, cri->methods, cri->methodCount);
if (result < 0) {
- LOGE("Failed to register %s: %d", cri->classPath, result);
+ ALOGE("Failed to register %s: %d", cri->classPath, result);
break;
}
}
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp
index 15bb543133d8..ac4fe5b1c6be 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -84,8 +84,8 @@ restart:
if (res == sizeof(work)) return;
- if (res < 0) LOGW("Failed writing to work fd: %s", strerror(errno));
- else LOGW("Truncated writing to work fd: %d", res);
+ if (res < 0) ALOGW("Failed writing to work fd: %s", strerror(errno));
+ else ALOGW("Truncated writing to work fd: %d", res);
}
static bool read_work(int fd, ActivityWork* outWork) {
@@ -93,8 +93,8 @@ static bool read_work(int fd, ActivityWork* outWork) {
// no need to worry about EINTR, poll loop will just come back again.
if (res == sizeof(ActivityWork)) return true;
- if (res < 0) LOGW("Failed reading work fd: %s", strerror(errno));
- else LOGW("Truncated reading work fd: %d", res);
+ if (res < 0) ALOGW("Failed reading work fd: %s", strerror(errno));
+ else ALOGW("Truncated reading work fd: %d", res);
return false;
}
@@ -108,7 +108,7 @@ AInputQueue::AInputQueue(const sp<InputChannel>& channel, int workWrite) :
mWorkWrite(workWrite), mConsumer(channel), mSeq(0) {
int msgpipe[2];
if (pipe(msgpipe)) {
- LOGW("could not create pipe: %s", strerror(errno));
+ ALOGW("could not create pipe: %s", strerror(errno));
mDispatchKeyRead = mDispatchKeyWrite = -1;
} else {
mDispatchKeyRead = msgpipe[0];
@@ -187,7 +187,7 @@ int32_t AInputQueue::getEvent(AInputEvent** outEvent) {
}
}
if (*outEvent == NULL) {
- LOGW("getEvent couldn't find inflight for seq %d", finish.seq);
+ ALOGW("getEvent couldn't find inflight for seq %d", finish.seq);
}
}
mLock.unlock();
@@ -203,7 +203,7 @@ int32_t AInputQueue::getEvent(AInputEvent** outEvent) {
int32_t res = mConsumer.receiveDispatchSignal();
if (res != android::OK) {
- LOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d",
+ ALOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d",
mConsumer.getChannel()->getName().string(), res);
return -1;
}
@@ -211,7 +211,7 @@ int32_t AInputQueue::getEvent(AInputEvent** outEvent) {
InputEvent* myEvent = NULL;
res = mConsumer.consume(this, &myEvent);
if (res != android::OK) {
- LOGW("channel '%s' ~ Failed to consume input event. status=%d",
+ ALOGW("channel '%s' ~ Failed to consume input event. status=%d",
mConsumer.getChannel()->getName().string(), res);
mConsumer.sendFinishedSignal(false);
return -1;
@@ -265,7 +265,7 @@ void AInputQueue::finishEvent(AInputEvent* event, bool handled, bool didDefaultH
if (inflight.doFinish) {
int32_t res = mConsumer.sendFinishedSignal(handled);
if (res != android::OK) {
- LOGW("Failed to send finished signal on channel '%s'. status=%d",
+ ALOGW("Failed to send finished signal on channel '%s'. status=%d",
mConsumer.getChannel()->getName().string(), res);
}
}
@@ -281,7 +281,7 @@ void AInputQueue::finishEvent(AInputEvent* event, bool handled, bool didDefaultH
}
mLock.unlock();
- LOGW("finishEvent called for unknown event: %p", event);
+ ALOGW("finishEvent called for unknown event: %p", event);
}
void AInputQueue::dispatchEvent(android::KeyEvent* event) {
@@ -398,7 +398,7 @@ bool AInputQueue::preDispatchKey(KeyEvent* keyEvent) {
}
}
- LOGW("preDispatchKey called for unknown event: %p", keyEvent);
+ ALOGW("preDispatchKey called for unknown event: %p", keyEvent);
return false;
}
@@ -412,8 +412,8 @@ restart:
if (res == sizeof(dummy)) return;
- if (res < 0) LOGW("Failed writing to dispatch fd: %s", strerror(errno));
- else LOGW("Truncated writing to dispatch fd: %d", res);
+ if (res < 0) ALOGW("Failed writing to dispatch fd: %s", strerror(errno));
+ else ALOGW("Truncated writing to dispatch fd: %d", res);
}
namespace android {
@@ -548,7 +548,7 @@ void android_NativeActivity_hideSoftInput(
static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
return true;
@@ -585,7 +585,7 @@ static int mainWorkCallback(int fd, int events, void* data) {
checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent");
code->env->DeleteLocalRef(inputEventObj);
} else {
- LOGE("Failed to obtain key event for dispatchUnhandledKeyEvent.");
+ ALOGE("Failed to obtain key event for dispatchUnhandledKeyEvent.");
handled = false;
}
code->nativeInputQueue->finishEvent(keyEvent, handled, true);
@@ -600,7 +600,7 @@ static int mainWorkCallback(int fd, int events, void* data) {
checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent");
code->env->DeleteLocalRef(inputEventObj);
} else {
- LOGE("Failed to obtain key event for preDispatchKeyEvent.");
+ ALOGE("Failed to obtain key event for preDispatchKeyEvent.");
}
}
} break;
@@ -629,7 +629,7 @@ static int mainWorkCallback(int fd, int events, void* data) {
checkAndClearExceptionFromCallback(code->env, "hideIme");
} break;
default:
- LOGW("Unknown work command: %d", work.cmd);
+ ALOGW("Unknown work command: %d", work.cmd);
break;
}
@@ -660,21 +660,21 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName
env->ReleaseStringUTFChars(funcName, funcStr);
if (code->createActivityFunc == NULL) {
- LOGW("ANativeActivity_onCreate not found");
+ ALOGW("ANativeActivity_onCreate not found");
delete code;
return 0;
}
code->looper = android_os_MessageQueue_getLooper(env, messageQueue);
if (code->looper == NULL) {
- LOGW("Unable to retrieve MessageQueue's Looper");
+ ALOGW("Unable to retrieve MessageQueue's Looper");
delete code;
return 0;
}
int msgpipe[2];
if (pipe(msgpipe)) {
- LOGW("could not create pipe: %s", strerror(errno));
+ ALOGW("could not create pipe: %s", strerror(errno));
delete code;
return 0;
}
@@ -690,7 +690,7 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName
code->ANativeActivity::callbacks = &code->callbacks;
if (env->GetJavaVM(&code->vm) < 0) {
- LOGW("NativeActivity GetJavaVM failed");
+ ALOGW("NativeActivity GetJavaVM failed");
delete code;
return 0;
}
diff --git a/core/jni/android_app_backup_FullBackup.cpp b/core/jni/android_app_backup_FullBackup.cpp
index 6ef62a9824f1..066a23e38e03 100644
--- a/core/jni/android_app_backup_FullBackup.cpp
+++ b/core/jni/android_app_backup_FullBackup.cpp
@@ -97,12 +97,12 @@ static int backupToTar(JNIEnv* env, jobject clazz, jstring packageNameObj,
// Validate
if (!writer) {
- LOGE("No output stream provided [%s]", path.string());
+ ALOGE("No output stream provided [%s]", path.string());
return -1;
}
if (path.length() < rootpath.length()) {
- LOGE("file path [%s] shorter than root path [%s]",
+ ALOGE("file path [%s] shorter than root path [%s]",
path.string(), rootpath.string());
return -1;
}
diff --git a/core/jni/android_backup_BackupHelperDispatcher.cpp b/core/jni/android_backup_BackupHelperDispatcher.cpp
index 1f188ff002ef..3e366778a721 100644
--- a/core/jni/android_backup_BackupHelperDispatcher.cpp
+++ b/core/jni/android_backup_BackupHelperDispatcher.cpp
@@ -58,7 +58,7 @@ readHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
int remainingHeader = flattenedHeader.headerSize - sizeof(flattenedHeader.headerSize);
if (flattenedHeader.headerSize < (int)sizeof(chunk_header_v1)) {
- LOGW("Skipping unknown header: %d bytes", flattenedHeader.headerSize);
+ ALOGW("Skipping unknown header: %d bytes", flattenedHeader.headerSize);
if (remainingHeader > 0) {
lseek(fd, remainingHeader, SEEK_CUR);
// >0 means skip this chunk
@@ -69,13 +69,13 @@ readHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
amt = read(fd, &flattenedHeader.version,
sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize));
if (amt <= 0) {
- LOGW("Failed reading chunk header");
+ ALOGW("Failed reading chunk header");
return -1;
}
remainingHeader -= sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize);
if (flattenedHeader.version != VERSION_1_HEADER) {
- LOGW("Skipping unknown header version: 0x%08x, %d bytes", flattenedHeader.version,
+ ALOGW("Skipping unknown header version: 0x%08x, %d bytes", flattenedHeader.version,
flattenedHeader.headerSize);
if (remainingHeader > 0) {
lseek(fd, remainingHeader, SEEK_CUR);
@@ -94,14 +94,14 @@ readHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
if (flattenedHeader.dataSize < 0 || flattenedHeader.nameLength < 0 ||
remainingHeader < flattenedHeader.nameLength) {
- LOGW("Malformed V1 header remainingHeader=%d dataSize=%d nameLength=%d", remainingHeader,
+ ALOGW("Malformed V1 header remainingHeader=%d dataSize=%d nameLength=%d", remainingHeader,
flattenedHeader.dataSize, flattenedHeader.nameLength);
return -1;
}
buf = keyPrefix.lockBuffer(flattenedHeader.nameLength);
if (buf == NULL) {
- LOGW("unable to allocate %d bytes", flattenedHeader.nameLength);
+ ALOGW("unable to allocate %d bytes", flattenedHeader.nameLength);
return -1;
}
diff --git a/core/jni/android_bluetooth_BluetoothAudioGateway.cpp b/core/jni/android_bluetooth_BluetoothAudioGateway.cpp
index 5aef2ad2db61..3b8fb7974140 100755
--- a/core/jni/android_bluetooth_BluetoothAudioGateway.cpp
+++ b/core/jni/android_bluetooth_BluetoothAudioGateway.cpp
@@ -127,7 +127,7 @@ static void initializeNativeDataNative(JNIEnv* env, jobject object) {
#ifdef HAVE_BLUETOOTH
native_data_t *nat = (native_data_t *)calloc(1, sizeof(native_data_t));
if (NULL == nat) {
- LOGE("%s: out of memory!", __FUNCTION__);
+ ALOGE("%s: out of memory!", __FUNCTION__);
return;
}
@@ -166,7 +166,7 @@ static void cleanupNativeDataNative(JNIEnv* env, jobject object) {
static int set_nb(int sk, bool nb) {
int flags = fcntl(sk, F_GETFL);
if (flags < 0) {
- LOGE("Can't get socket flags with fcntl(): %s (%d)",
+ ALOGE("Can't get socket flags with fcntl(): %s (%d)",
strerror(errno), errno);
close(sk);
return -1;
@@ -175,7 +175,7 @@ static int set_nb(int sk, bool nb) {
if (nb) flags |= O_NONBLOCK;
int status = fcntl(sk, F_SETFL, flags);
if (status < 0) {
- LOGE("Can't set socket to nonblocking mode with fcntl(): %s (%d)",
+ ALOGE("Can't set socket to nonblocking mode with fcntl(): %s (%d)",
strerror(errno), errno);
close(sk);
return -1;
@@ -198,7 +198,7 @@ static int do_accept(JNIEnv* env, jobject object, int ag_fd,
int alen = sizeof(raddr);
int nsk = accept(ag_fd, (struct sockaddr *) &raddr, &alen);
if (nsk < 0) {
- LOGE("Error on accept from socket fd %d: %s (%d).",
+ ALOGE("Error on accept from socket fd %d: %s (%d).",
ag_fd,
strerror(errno),
errno);
@@ -215,7 +215,7 @@ static int do_accept(JNIEnv* env, jobject object, int ag_fd,
get_bdaddr_as_string(&raddr.rc_bdaddr, addr);
env->SetObjectField(object, out_address, env->NewStringUTF(addr));
- LOGI("Successful accept() on AG socket %d: new socket %d, address %s, RFCOMM channel %d",
+ ALOGI("Successful accept() on AG socket %d: new socket %d, address %s, RFCOMM channel %d",
ag_fd,
nsk,
addr,
@@ -240,11 +240,11 @@ static inline int on_accept_set_fields(JNIEnv* env, jobject object,
out_fd, out_address, out_channel);
}
else {
- LOGI("fd = %d, FD_ISSET() = %d",
+ ALOGI("fd = %d, FD_ISSET() = %d",
ag_fd,
FD_ISSET(ag_fd, &rset));
if (ag_fd >= 0 && !FD_ISSET(ag_fd, &rset)) {
- LOGE("WTF???");
+ ALOGE("WTF???");
return -1;
}
}
@@ -265,32 +265,32 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
native_data_t *nat = get_native_data(env, object);
#if USE_ACCEPT_DIRECTLY
if (nat->hf_ag_rfcomm_channel > 0) {
- LOGI("Setting HF AG server socket to RFCOMM port %d!",
+ ALOGI("Setting HF AG server socket to RFCOMM port %d!",
nat->hf_ag_rfcomm_channel);
struct timeval tv;
int len = sizeof(tv);
if (getsockopt(nat->hf_ag_rfcomm_channel,
SOL_SOCKET, SO_RCVTIMEO, &tv, &len) < 0) {
- LOGE("getsockopt(%d, SOL_SOCKET, SO_RCVTIMEO): %s (%d)",
+ ALOGE("getsockopt(%d, SOL_SOCKET, SO_RCVTIMEO): %s (%d)",
nat->hf_ag_rfcomm_channel,
strerror(errno),
errno);
return JNI_FALSE;
}
- LOGI("Current HF AG server socket RCVTIMEO is (%d(s), %d(us))!",
+ ALOGI("Current HF AG server socket RCVTIMEO is (%d(s), %d(us))!",
(int)tv.tv_sec, (int)tv.tv_usec);
if (timeout_ms >= 0) {
tv.tv_sec = timeout_ms / 1000;
tv.tv_usec = 1000 * (timeout_ms % 1000);
if (setsockopt(nat->hf_ag_rfcomm_channel,
SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
- LOGE("setsockopt(%d, SOL_SOCKET, SO_RCVTIMEO): %s (%d)",
+ ALOGE("setsockopt(%d, SOL_SOCKET, SO_RCVTIMEO): %s (%d)",
nat->hf_ag_rfcomm_channel,
strerror(errno),
errno);
return JNI_FALSE;
}
- LOGI("Changed HF AG server socket RCVTIMEO to (%d(s), %d(us))!",
+ ALOGI("Changed HF AG server socket RCVTIMEO to (%d(s), %d(us))!",
(int)tv.tv_sec, (int)tv.tv_usec);
}
@@ -310,19 +310,19 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
FD_ZERO(&rset);
int cnt = 0;
if (nat->hf_ag_rfcomm_channel > 0) {
- LOGI("Setting HF AG server socket to RFCOMM port %d!",
+ ALOGI("Setting HF AG server socket to RFCOMM port %d!",
nat->hf_ag_rfcomm_channel);
cnt++;
FD_SET(nat->hf_ag_rfcomm_sock, &rset);
}
if (nat->hs_ag_rfcomm_channel > 0) {
- LOGI("Setting HS AG server socket to RFCOMM port %d!",
+ ALOGI("Setting HS AG server socket to RFCOMM port %d!",
nat->hs_ag_rfcomm_channel);
cnt++;
FD_SET(nat->hs_ag_rfcomm_sock, &rset);
}
if (cnt == 0) {
- LOGE("Neither HF nor HS listening sockets are open!");
+ ALOGE("Neither HF nor HS listening sockets are open!");
return JNI_FALSE;
}
@@ -339,16 +339,16 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
(timeout_ms < 0 ? NULL : &to));
if (timeout_ms > 0) {
jint remaining = to.tv_sec*1000 + to.tv_usec/1000;
- LOGI("Remaining time %ldms", (long)remaining);
+ ALOGI("Remaining time %ldms", (long)remaining);
env->SetIntField(object, field_mTimeoutRemainingMs,
remaining);
}
- LOGI("listening select() returned %d", n);
+ ALOGI("listening select() returned %d", n);
if (n <= 0) {
if (n < 0) {
- LOGE("listening select() on RFCOMM sockets: %s (%d)",
+ ALOGE("listening select() on RFCOMM sockets: %s (%d)",
strerror(errno),
errno);
}
@@ -372,7 +372,7 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
struct pollfd fds[2];
int cnt = 0;
if (nat->hf_ag_rfcomm_channel > 0) {
-// LOGI("Setting HF AG server socket %d to RFCOMM port %d!",
+// ALOGI("Setting HF AG server socket %d to RFCOMM port %d!",
// nat->hf_ag_rfcomm_sock,
// nat->hf_ag_rfcomm_channel);
fds[cnt].fd = nat->hf_ag_rfcomm_sock;
@@ -380,7 +380,7 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
cnt++;
}
if (nat->hs_ag_rfcomm_channel > 0) {
-// LOGI("Setting HS AG server socket %d to RFCOMM port %d!",
+// ALOGI("Setting HS AG server socket %d to RFCOMM port %d!",
// nat->hs_ag_rfcomm_sock,
// nat->hs_ag_rfcomm_channel);
fds[cnt].fd = nat->hs_ag_rfcomm_sock;
@@ -388,30 +388,30 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
cnt++;
}
if (cnt == 0) {
- LOGE("Neither HF nor HS listening sockets are open!");
+ ALOGE("Neither HF nor HS listening sockets are open!");
return JNI_FALSE;
}
n = poll(fds, cnt, timeout_ms);
if (n <= 0) {
if (n < 0) {
- LOGE("listening poll() on RFCOMM sockets: %s (%d)",
+ ALOGE("listening poll() on RFCOMM sockets: %s (%d)",
strerror(errno),
errno);
}
else {
env->SetIntField(object, field_mTimeoutRemainingMs, 0);
-// LOGI("listening poll() on RFCOMM socket timed out");
+// ALOGI("listening poll() on RFCOMM socket timed out");
}
return JNI_FALSE;
}
- //LOGI("listening poll() on RFCOMM socket returned %d", n);
+ //ALOGI("listening poll() on RFCOMM socket returned %d", n);
int err = 0;
for (cnt = 0; cnt < (int)(sizeof(fds)/sizeof(fds[0])); cnt++) {
- //LOGI("Poll on fd %d revent = %d.", fds[cnt].fd, fds[cnt].revents);
+ //ALOGI("Poll on fd %d revent = %d.", fds[cnt].fd, fds[cnt].revents);
if (fds[cnt].fd == nat->hf_ag_rfcomm_sock) {
if (fds[cnt].revents & (POLLIN | POLLPRI | POLLOUT)) {
- LOGI("Accepting HF connection.\n");
+ ALOGI("Accepting HF connection.\n");
err += do_accept(env, object, fds[cnt].fd,
field_mConnectingHandsfreeSocketFd,
field_mConnectingHandsfreeAddress,
@@ -421,7 +421,7 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
}
else if (fds[cnt].fd == nat->hs_ag_rfcomm_sock) {
if (fds[cnt].revents & (POLLIN | POLLPRI | POLLOUT)) {
- LOGI("Accepting HS connection.\n");
+ ALOGI("Accepting HS connection.\n");
err += do_accept(env, object, fds[cnt].fd,
field_mConnectingHeadsetSocketFd,
field_mConnectingHeadsetAddress,
@@ -432,7 +432,7 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object,
} /* for */
if (n != 0) {
- LOGI("Bogus poll(): %d fake pollfd entrie(s)!", n);
+ ALOGI("Bogus poll(): %d fake pollfd entrie(s)!", n);
return JNI_FALSE;
}
@@ -475,7 +475,7 @@ static int setup_listening_socket(int dev, int channel) {
sk = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (sk < 0) {
- LOGE("Can't create RFCOMM socket");
+ ALOGE("Can't create RFCOMM socket");
return -1;
}
@@ -486,7 +486,7 @@ static int setup_listening_socket(int dev, int channel) {
}
if (lm && setsockopt(sk, SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0) {
- LOGE("Can't set RFCOMM link mode");
+ ALOGE("Can't set RFCOMM link mode");
close(sk);
return -1;
}
@@ -497,7 +497,7 @@ static int setup_listening_socket(int dev, int channel) {
laddr.rc_channel = channel;
if (bind(sk, (struct sockaddr *)&laddr, sizeof(laddr)) < 0) {
- LOGE("Can't bind RFCOMM socket");
+ ALOGE("Can't bind RFCOMM socket");
close(sk);
return -1;
}
@@ -517,14 +517,14 @@ static void tearDownListeningSocketsNative(JNIEnv *env, jobject object) {
if (nat->hf_ag_rfcomm_sock > 0) {
if (close(nat->hf_ag_rfcomm_sock) < 0) {
- LOGE("Could not close HF server socket: %s (%d)\n",
+ ALOGE("Could not close HF server socket: %s (%d)\n",
strerror(errno), errno);
}
nat->hf_ag_rfcomm_sock = -1;
}
if (nat->hs_ag_rfcomm_sock > 0) {
if (close(nat->hs_ag_rfcomm_sock) < 0) {
- LOGE("Could not close HS server socket: %s (%d)\n",
+ ALOGE("Could not close HS server socket: %s (%d)\n",
strerror(errno), errno);
}
nat->hs_ag_rfcomm_sock = -1;
diff --git a/core/jni/android_bluetooth_HeadsetBase.cpp b/core/jni/android_bluetooth_HeadsetBase.cpp
index 71697a7096c9..a982182d50f2 100644
--- a/core/jni/android_bluetooth_HeadsetBase.cpp
+++ b/core/jni/android_bluetooth_HeadsetBase.cpp
@@ -69,12 +69,12 @@ static inline int write_error_check(int fd, const char* line, int len) {
errno = 0;
ret = write(fd, line, len);
if (ret < 0) {
- LOGE("%s: write() failed: %s (%d)", __FUNCTION__, strerror(errno),
+ ALOGE("%s: write() failed: %s (%d)", __FUNCTION__, strerror(errno),
errno);
return -1;
}
if (ret != len) {
- LOGE("%s: write() only wrote %d of %d bytes", __FUNCTION__, ret, len);
+ ALOGE("%s: write() only wrote %d of %d bytes", __FUNCTION__, ret, len);
return -1;
}
return 0;
@@ -117,7 +117,7 @@ again:
*err = errno = 0;
int ret = poll(&pfd, 1, timeout_ms);
if (ret < 0) {
- LOGE("poll() error\n");
+ ALOGE("poll() error\n");
*err = errno;
return NULL;
}
@@ -126,7 +126,7 @@ again:
}
if (pfd.revents & (POLLHUP | POLLERR | POLLNVAL)) {
- LOGW("RFCOMM poll() returned success (%d), "
+ ALOGW("RFCOMM poll() returned success (%d), "
"but with an unexpected revents bitmask: %#x\n", ret, pfd.revents);
errno = EIO;
*err = errno;
@@ -143,12 +143,12 @@ again:
if (rc < 0) {
if (errno == EBUSY) {
- LOGI("read() error %s (%d): repeating read()...",
+ ALOGI("read() error %s (%d): repeating read()...",
strerror(errno), errno);
goto again;
}
*err = errno;
- LOGE("read() error %s (%d)", strerror(errno), errno);
+ ALOGE("read() error %s (%d)", strerror(errno), errno);
return NULL;
}
@@ -195,7 +195,7 @@ static void initializeNativeDataNative(JNIEnv* env, jobject object,
#ifdef HAVE_BLUETOOTH
native_data_t *nat = (native_data_t *)calloc(1, sizeof(native_data_t));
if (NULL == nat) {
- LOGE("%s: out of memory!", __FUNCTION__);
+ ALOGE("%s: out of memory!", __FUNCTION__);
return;
}
@@ -208,7 +208,7 @@ static void initializeNativeDataNative(JNIEnv* env, jobject object,
nat->rfcomm_sock = socketFd;
nat->rfcomm_connected = socketFd >= 0;
if (nat->rfcomm_connected)
- LOGI("%s: ALREADY CONNECTED!", __FUNCTION__);
+ ALOGI("%s: ALREADY CONNECTED!", __FUNCTION__);
#endif
}
@@ -235,7 +235,7 @@ static jboolean connectNative(JNIEnv *env, jobject obj)
nat->rfcomm_sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (nat->rfcomm_sock < 0) {
- LOGE("%s: Could not create RFCOMM socket: %s\n", __FUNCTION__,
+ ALOGE("%s: Could not create RFCOMM socket: %s\n", __FUNCTION__,
strerror(errno));
return JNI_FALSE;
}
@@ -248,7 +248,7 @@ static jboolean connectNative(JNIEnv *env, jobject obj)
if (lm && setsockopt(nat->rfcomm_sock, SOL_RFCOMM, RFCOMM_LM, &lm,
sizeof(lm)) < 0) {
- LOGE("%s: Can't set RFCOMM link mode", __FUNCTION__);
+ ALOGE("%s: Can't set RFCOMM link mode", __FUNCTION__);
close(nat->rfcomm_sock);
return JNI_FALSE;
}
@@ -262,7 +262,7 @@ static jboolean connectNative(JNIEnv *env, jobject obj)
if (connect(nat->rfcomm_sock, (struct sockaddr *)&addr,
sizeof(addr)) < 0) {
if (errno == EINTR) continue;
- LOGE("%s: connect() failed: %s\n", __FUNCTION__, strerror(errno));
+ ALOGE("%s: connect() failed: %s\n", __FUNCTION__, strerror(errno));
close(nat->rfcomm_sock);
nat->rfcomm_sock = -1;
return JNI_FALSE;
@@ -293,7 +293,7 @@ static jint connectAsyncNative(JNIEnv *env, jobject obj) {
nat->rfcomm_sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (nat->rfcomm_sock < 0) {
- LOGE("%s: Could not create RFCOMM socket: %s\n", __FUNCTION__,
+ ALOGE("%s: Could not create RFCOMM socket: %s\n", __FUNCTION__,
strerror(errno));
return -1;
}
@@ -306,11 +306,11 @@ static jint connectAsyncNative(JNIEnv *env, jobject obj) {
if (lm && setsockopt(nat->rfcomm_sock, SOL_RFCOMM, RFCOMM_LM, &lm,
sizeof(lm)) < 0) {
- LOGE("%s: Can't set RFCOMM link mode", __FUNCTION__);
+ ALOGE("%s: Can't set RFCOMM link mode", __FUNCTION__);
close(nat->rfcomm_sock);
return -1;
}
- LOGI("Created RFCOMM socket fd %d.", nat->rfcomm_sock);
+ ALOGI("Created RFCOMM socket fd %d.", nat->rfcomm_sock);
}
memset(&addr, 0, sizeof(struct sockaddr_rc));
@@ -330,20 +330,20 @@ static jint connectAsyncNative(JNIEnv *env, jobject obj) {
if (rc >= 0) {
nat->rfcomm_connected = 1;
- LOGI("async connect successful");
+ ALOGI("async connect successful");
return 0;
}
else if (rc < 0) {
if (errno == EINPROGRESS || errno == EAGAIN)
{
- LOGI("async connect is in progress (%s)",
+ ALOGI("async connect is in progress (%s)",
strerror(errno));
nat->rfcomm_connected = -1;
return 0;
}
else
{
- LOGE("async connect error: %s (%d)", strerror(errno), errno);
+ ALOGE("async connect error: %s (%d)", strerror(errno), errno);
close(nat->rfcomm_sock);
nat->rfcomm_sock = -1;
return -errno;
@@ -365,19 +365,19 @@ static jint waitForAsyncConnectNative(JNIEnv *env, jobject obj,
env->SetIntField(obj, field_mTimeoutRemainingMs, timeout_ms);
if (nat->rfcomm_connected > 0) {
- LOGI("RFCOMM is already connected!");
+ ALOGI("RFCOMM is already connected!");
return 1;
}
if (nat->rfcomm_sock >= 0 && nat->rfcomm_connected == 0) {
- LOGI("Re-opening RFCOMM socket.");
+ ALOGI("Re-opening RFCOMM socket.");
close(nat->rfcomm_sock);
nat->rfcomm_sock = -1;
}
int ret = connectAsyncNative(env, obj);
if (ret < 0) {
- LOGI("Failed to re-open RFCOMM socket!");
+ ALOGI("Failed to re-open RFCOMM socket!");
return ret;
}
@@ -410,7 +410,7 @@ static jint waitForAsyncConnectNative(JNIEnv *env, jobject obj,
if (n <= 0) {
if (n < 0) {
- LOGE("select() on RFCOMM socket: %s (%d)",
+ ALOGE("select() on RFCOMM socket: %s (%d)",
strerror(errno),
errno);
return -errno;
@@ -433,7 +433,7 @@ static jint waitForAsyncConnectNative(JNIEnv *env, jobject obj,
respond... but one can't be paranoid enough.
*/
if (nr >= 0 || errno != EAGAIN) {
- LOGE("RFCOMM async connect() error: %s (%d), nr = %d\n",
+ ALOGE("RFCOMM async connect() error: %s (%d), nr = %d\n",
strerror(errno),
errno,
nr);
@@ -451,12 +451,12 @@ static jint waitForAsyncConnectNative(JNIEnv *env, jobject obj,
}
/* Restore the blocking properties of the socket. */
fcntl(nat->rfcomm_sock, F_SETFL, nat->rfcomm_sock_flags);
- LOGI("Successful RFCOMM socket connect.");
+ ALOGI("Successful RFCOMM socket connect.");
nat->rfcomm_connected = 1;
return 1;
}
}
- else LOGE("RFCOMM socket file descriptor %d is bad!",
+ else ALOGE("RFCOMM socket file descriptor %d is bad!",
nat->rfcomm_sock);
#endif
return -1;
diff --git a/core/jni/android_bluetooth_common.cpp b/core/jni/android_bluetooth_common.cpp
index c8dc9c275c8c..5cdaa6c7bc07 100644
--- a/core/jni/android_bluetooth_common.cpp
+++ b/core/jni/android_bluetooth_common.cpp
@@ -101,7 +101,7 @@ jfieldID get_field(JNIEnv *env, jclass clazz, const char *member,
const char *mtype) {
jfieldID field = env->GetFieldID(clazz, member, mtype);
if (field == NULL) {
- LOGE("Can't find member %s", member);
+ ALOGE("Can't find member %s", member);
}
return field;
}
@@ -158,13 +158,13 @@ static dbus_bool_t dbus_func_args_async_valist(JNIEnv *env,
msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC, path, ifc, func);
if (msg == NULL) {
- LOGE("Could not allocate D-Bus message object!");
+ ALOGE("Could not allocate D-Bus message object!");
goto done;
}
/* append arguments */
if (!dbus_message_append_args_valist(msg, first_arg_type, args)) {
- LOGE("Could not append argument to method call!");
+ ALOGE("Could not append argument to method call!");
goto done;
}
@@ -219,7 +219,7 @@ dbus_bool_t dbus_func_args_async(JNIEnv *env,
return ret;
}
-// If err is NULL, then any errors will be LOGE'd, and free'd and the reply
+// If err is NULL, then any errors will be ALOGE'd, and free'd and the reply
// will be NULL.
// If err is not NULL, then it is assumed that dbus_error_init was already
// called, and error's will be returned to the caller without logging. The
@@ -248,13 +248,13 @@ DBusMessage * dbus_func_args_timeout_valist(JNIEnv *env,
msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC, path, ifc, func);
if (msg == NULL) {
- LOGE("Could not allocate D-Bus message object!");
+ ALOGE("Could not allocate D-Bus message object!");
goto done;
}
/* append arguments */
if (!dbus_message_append_args_valist(msg, first_arg_type, args)) {
- LOGE("Could not append argument to method call!");
+ ALOGE("Could not append argument to method call!");
goto done;
}
@@ -587,7 +587,7 @@ int get_property(DBusMessageIter iter, Properties *properties,
dbus_message_iter_recurse(&iter, &prop_val);
type = properties[*prop_index].type;
if (dbus_message_iter_get_arg_type(&prop_val) != type) {
- LOGE("Property type mismatch in get_property: %d, expected:%d, index:%d",
+ ALOGE("Property type mismatch in get_property: %d, expected:%d, index:%d",
dbus_message_iter_get_arg_type(&prop_val), type, *prop_index);
return -1;
}
diff --git a/core/jni/android_bluetooth_common.h b/core/jni/android_bluetooth_common.h
index 1f4da3afdaca..daf4bb225f86 100644
--- a/core/jni/android_bluetooth_common.h
+++ b/core/jni/android_bluetooth_common.h
@@ -56,14 +56,14 @@ jfieldID get_field(JNIEnv *env,
const char *member,
const char *mtype);
-// LOGE and free a D-Bus error
+// ALOGE and free a D-Bus error
// Using #define so that __FUNCTION__ resolves usefully
#define LOG_AND_FREE_DBUS_ERROR_WITH_MSG(err, msg) \
- { LOGE("%s: D-Bus error in %s: %s (%s)", __FUNCTION__, \
+ { ALOGE("%s: D-Bus error in %s: %s (%s)", __FUNCTION__, \
dbus_message_get_member((msg)), (err)->name, (err)->message); \
dbus_error_free((err)); }
#define LOG_AND_FREE_DBUS_ERROR(err) \
- { LOGE("%s: D-Bus error: %s (%s)", __FUNCTION__, \
+ { ALOGE("%s: D-Bus error: %s (%s)", __FUNCTION__, \
(err)->name, (err)->message); \
dbus_error_free((err)); }
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index 9a87a10d83f5..f9270641fd90 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -71,7 +71,7 @@ static jint nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint cursor
CursorWindow* window;
status_t status = CursorWindow::create(name, cursorWindowSize, &window);
if (status || !window) {
- LOGE("Could not allocate CursorWindow '%s' of size %d due to error %d.",
+ ALOGE("Could not allocate CursorWindow '%s' of size %d due to error %d.",
name.string(), cursorWindowSize, status);
return 0;
}
@@ -86,7 +86,7 @@ static jint nativeCreateFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj)
CursorWindow* window;
status_t status = CursorWindow::createFromParcel(parcel, &window);
if (status || !window) {
- LOGE("Could not create CursorWindow from Parcel due to error %d.", status);
+ ALOGE("Could not create CursorWindow from Parcel due to error %d.", status);
return 0;
}
diff --git a/core/jni/android_database_SQLiteCompiledSql.cpp b/core/jni/android_database_SQLiteCompiledSql.cpp
index a916ef503c9e..857267a18da5 100644
--- a/core/jni/android_database_SQLiteCompiledSql.cpp
+++ b/core/jni/android_database_SQLiteCompiledSql.cpp
@@ -104,7 +104,7 @@ int register_android_database_SQLiteCompiledSql(JNIEnv * env)
clazz = env->FindClass("android/database/sqlite/SQLiteCompiledSql");
if (clazz == NULL) {
- LOGE("Can't find android/database/sqlite/SQLiteCompiledSql");
+ ALOGE("Can't find android/database/sqlite/SQLiteCompiledSql");
return -1;
}
@@ -112,7 +112,7 @@ int register_android_database_SQLiteCompiledSql(JNIEnv * env)
gStatementField = env->GetFieldID(clazz, "nStatement", "I");
if (gHandleField == NULL || gStatementField == NULL) {
- LOGE("Error locating fields");
+ ALOGE("Error locating fields");
return -1;
}
diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp
index 2966a7128dac..28c421de6768 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -79,7 +79,7 @@ static void sqlLogger(void *databaseName, int iErrCode, const char *zMsg) {
// skip printing this message if it is due to certain types of errors
if (iErrCode == 0 || iErrCode == SQLITE_CONSTRAINT) return;
// print databasename, errorcode and msg
- LOGI("sqlite returned: error code = %d, msg = %s, db=%s\n", iErrCode, zMsg, databaseName);
+ ALOGI("sqlite returned: error code = %d, msg = %s, db=%s\n", iErrCode, zMsg, databaseName);
}
// register the logging func on sqlite. needs to be done BEFORE any sqlite3 func is called.
@@ -92,7 +92,7 @@ static void registerLoggingFunc(const char *path) {
ALOGV("Registering sqlite logging func \n");
int err = sqlite3_config(SQLITE_CONFIG_LOG, &sqlLogger, (void *)createStr(path, 0));
if (err != SQLITE_OK) {
- LOGW("sqlite returned error = %d when trying to register logging func.\n", err);
+ ALOGW("sqlite returned error = %d when trying to register logging func.\n", err);
return;
}
loggingFuncSet = true;
@@ -121,7 +121,7 @@ static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags)
err = sqlite3_open_v2(path8, &handle, sqliteFlags, NULL);
if (err != SQLITE_OK) {
- LOGE("sqlite3_open_v2(\"%s\", &handle, %d, NULL) failed\n", path8, sqliteFlags);
+ ALOGE("sqlite3_open_v2(\"%s\", &handle, %d, NULL) failed\n", path8, sqliteFlags);
throw_sqlite3_exception(env, handle);
goto done;
}
@@ -134,7 +134,7 @@ static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags)
// Set the default busy handler to retry for 1000ms and then return SQLITE_BUSY
err = sqlite3_busy_timeout(handle, 1000 /* ms */);
if (err != SQLITE_OK) {
- LOGE("sqlite3_busy_timeout(handle, 1000) failed for \"%s\"\n", path8);
+ ALOGE("sqlite3_busy_timeout(handle, 1000) failed for \"%s\"\n", path8);
throw_sqlite3_exception(env, handle);
goto done;
}
@@ -143,7 +143,7 @@ static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags)
static const char* integritySql = "pragma integrity_check(1);";
err = sqlite3_prepare_v2(handle, integritySql, -1, &statement, NULL);
if (err != SQLITE_OK) {
- LOGE("sqlite_prepare_v2(handle, \"%s\") failed for \"%s\"\n", integritySql, path8);
+ ALOGE("sqlite_prepare_v2(handle, \"%s\") failed for \"%s\"\n", integritySql, path8);
throw_sqlite3_exception(env, handle);
goto done;
}
@@ -151,13 +151,13 @@ static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags)
// first is OK or error message
err = sqlite3_step(statement);
if (err != SQLITE_ROW) {
- LOGE("integrity check failed for \"%s\"\n", integritySql, path8);
+ ALOGE("integrity check failed for \"%s\"\n", integritySql, path8);
throw_sqlite3_exception(env, handle);
goto done;
} else {
const char *text = (const char*)sqlite3_column_text(statement, 0);
if (strcmp(text, "ok") != 0) {
- LOGE("integrity check failed for \"%s\": %s\n", integritySql, path8, text);
+ ALOGE("integrity check failed for \"%s\": %s\n", integritySql, path8, text);
jniThrowException(env, "android/database/sqlite/SQLiteDatabaseCorruptException", text);
goto done;
}
@@ -184,7 +184,7 @@ done:
static char *getDatabaseName(JNIEnv* env, sqlite3 * handle, jstring databaseName, short connNum) {
char const *path = env->GetStringUTFChars(databaseName, NULL);
if (path == NULL) {
- LOGE("Failure in getDatabaseName(). VM ran out of memory?\n");
+ ALOGE("Failure in getDatabaseName(). VM ran out of memory?\n");
return NULL; // VM would have thrown OutOfMemoryError
}
char *dbNameStr = createStr(path, 4);
@@ -197,7 +197,7 @@ static char *getDatabaseName(JNIEnv* env, sqlite3 * handle, jstring databaseName
}
static void sqlTrace(void *databaseName, const char *sql) {
- LOGI("sql_statement|%s|%s\n", (char *)databaseName, sql);
+ ALOGI("sql_statement|%s|%s\n", (char *)databaseName, sql);
}
/* public native void enableSqlTracing(); */
@@ -209,7 +209,7 @@ static void enableSqlTracing(JNIEnv* env, jobject object, jstring databaseName,
static void sqlProfile(void *databaseName, const char *sql, sqlite3_uint64 tm) {
double d = tm/1000000.0;
- LOGI("elapsedTime4Sql|%s|%.3f ms|%s\n", (char *)databaseName, d, sql);
+ ALOGI("elapsedTime4Sql|%s|%.3f ms|%s\n", (char *)databaseName, d, sql);
}
/* public native void enableSqlProfiling(); */
@@ -244,7 +244,7 @@ static void dbclose(JNIEnv* env, jobject object)
} else {
// This can happen if sub-objects aren't closed first. Make sure the caller knows.
throw_sqlite3_exception(env, handle);
- LOGE("sqlite3_close(%p) failed: %d\n", handle, result);
+ ALOGE("sqlite3_close(%p) failed: %d\n", handle, result);
}
}
}
@@ -277,7 +277,7 @@ static void native_setLocale(JNIEnv* env, jobject object, jstring localeString,
static const char *createSql ="CREATE TABLE IF NOT EXISTS " ANDROID_TABLE " (locale TEXT)";
err = sqlite3_exec(handle, createSql, NULL, NULL, NULL);
if (err != SQLITE_OK) {
- LOGE("CREATE TABLE " ANDROID_TABLE " failed\n");
+ ALOGE("CREATE TABLE " ANDROID_TABLE " failed\n");
throw_sqlite3_exception(env, handle);
goto done;
}
@@ -287,7 +287,7 @@ static void native_setLocale(JNIEnv* env, jobject object, jstring localeString,
static const char *selectSql = "SELECT locale FROM " ANDROID_TABLE " LIMIT 1";
err = sqlite3_get_table(handle, selectSql, &meta, &rowCount, &colCount, NULL);
if (err != SQLITE_OK) {
- LOGE("SELECT locale FROM " ANDROID_TABLE " failed\n");
+ ALOGE("SELECT locale FROM " ANDROID_TABLE " failed\n");
throw_sqlite3_exception(env, handle);
goto done;
}
@@ -312,21 +312,21 @@ static void native_setLocale(JNIEnv* env, jobject object, jstring localeString,
// need to update android_metadata and indexes atomically, so use a transaction...
err = sqlite3_exec(handle, "BEGIN TRANSACTION", NULL, NULL, NULL);
if (err != SQLITE_OK) {
- LOGE("BEGIN TRANSACTION failed setting locale\n");
+ ALOGE("BEGIN TRANSACTION failed setting locale\n");
throw_sqlite3_exception(env, handle);
goto done;
}
err = register_localized_collators(handle, locale8, UTF16_STORAGE);
if (err != SQLITE_OK) {
- LOGE("register_localized_collators() failed setting locale\n");
+ ALOGE("register_localized_collators() failed setting locale\n");
throw_sqlite3_exception(env, handle);
goto rollback;
}
err = sqlite3_exec(handle, "DELETE FROM " ANDROID_TABLE, NULL, NULL, NULL);
if (err != SQLITE_OK) {
- LOGE("DELETE failed setting locale\n");
+ ALOGE("DELETE failed setting locale\n");
throw_sqlite3_exception(env, handle);
goto rollback;
}
@@ -334,28 +334,28 @@ static void native_setLocale(JNIEnv* env, jobject object, jstring localeString,
static const char *sql = "INSERT INTO " ANDROID_TABLE " (locale) VALUES(?);";
err = sqlite3_prepare_v2(handle, sql, -1, &stmt, NULL);
if (err != SQLITE_OK) {
- LOGE("sqlite3_prepare_v2(\"%s\") failed\n", sql);
+ ALOGE("sqlite3_prepare_v2(\"%s\") failed\n", sql);
throw_sqlite3_exception(env, handle);
goto rollback;
}
err = sqlite3_bind_text(stmt, 1, locale8, -1, SQLITE_TRANSIENT);
if (err != SQLITE_OK) {
- LOGE("sqlite3_bind_text() failed setting locale\n");
+ ALOGE("sqlite3_bind_text() failed setting locale\n");
throw_sqlite3_exception(env, handle);
goto rollback;
}
err = sqlite3_step(stmt);
if (err != SQLITE_OK && err != SQLITE_DONE) {
- LOGE("sqlite3_step(\"%s\") failed setting locale\n", sql);
+ ALOGE("sqlite3_step(\"%s\") failed setting locale\n", sql);
throw_sqlite3_exception(env, handle);
goto rollback;
}
err = sqlite3_exec(handle, "REINDEX LOCALIZED", NULL, NULL, NULL);
if (err != SQLITE_OK) {
- LOGE("REINDEX LOCALIZED failed\n");
+ ALOGE("REINDEX LOCALIZED failed\n");
throw_sqlite3_exception(env, handle);
goto rollback;
}
@@ -363,7 +363,7 @@ static void native_setLocale(JNIEnv* env, jobject object, jstring localeString,
// all done, yay!
err = sqlite3_exec(handle, "COMMIT TRANSACTION", NULL, NULL, NULL);
if (err != SQLITE_OK) {
- LOGE("COMMIT TRANSACTION failed setting locale\n");
+ ALOGE("COMMIT TRANSACTION failed setting locale\n");
throw_sqlite3_exception(env, handle);
goto done;
}
@@ -399,7 +399,7 @@ static void native_finalize(JNIEnv* env, jobject object, jint statementId)
static void custom_function_callback(sqlite3_context * context, int argc, sqlite3_value ** argv) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
if (!env) {
- LOGE("custom_function_callback cannot call into Java on this thread");
+ ALOGE("custom_function_callback cannot call into Java on this thread");
return;
}
// get global ref to CustomFunction object from our user data
@@ -412,7 +412,7 @@ static void custom_function_callback(sqlite3_context * context, int argc, sqlite
for (int i = 0; i < argc; i++) {
char* arg = (char *)sqlite3_value_text(argv[i]);
if (!arg) {
- LOGE("NULL argument in custom_function_callback. This should not happen.");
+ ALOGE("NULL argument in custom_function_callback. This should not happen.");
return;
}
jobject obj = env->NewStringUTF(arg);
@@ -427,7 +427,7 @@ static void custom_function_callback(sqlite3_context * context, int argc, sqlite
done:
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by custom sqlite3 function.");
+ ALOGE("An exception was thrown by custom sqlite3 function.");
LOGE_EX(env);
env->ExceptionClear();
}
@@ -447,7 +447,7 @@ static jint native_addCustomFunction(JNIEnv* env, jobject object,
if (err == SQLITE_OK)
return (int)ref;
else {
- LOGE("sqlite3_create_function returned %d", err);
+ ALOGE("sqlite3_create_function returned %d", err);
env->DeleteGlobalRef(ref);
throw_sqlite3_exception(env, handle);
return 0;
@@ -484,30 +484,30 @@ int register_android_database_SQLiteDatabase(JNIEnv *env)
clazz = env->FindClass("android/database/sqlite/SQLiteDatabase");
if (clazz == NULL) {
- LOGE("Can't find android/database/sqlite/SQLiteDatabase\n");
+ ALOGE("Can't find android/database/sqlite/SQLiteDatabase\n");
return -1;
}
string_class = (jclass)env->NewGlobalRef(env->FindClass("java/lang/String"));
if (string_class == NULL) {
- LOGE("Can't find java/lang/String\n");
+ ALOGE("Can't find java/lang/String\n");
return -1;
}
offset_db_handle = env->GetFieldID(clazz, "mNativeHandle", "I");
if (offset_db_handle == NULL) {
- LOGE("Can't find SQLiteDatabase.mNativeHandle\n");
+ ALOGE("Can't find SQLiteDatabase.mNativeHandle\n");
return -1;
}
clazz = env->FindClass("android/database/sqlite/SQLiteDatabase$CustomFunction");
if (clazz == NULL) {
- LOGE("Can't find android/database/sqlite/SQLiteDatabase$CustomFunction\n");
+ ALOGE("Can't find android/database/sqlite/SQLiteDatabase$CustomFunction\n");
return -1;
}
method_custom_function_callback = env->GetMethodID(clazz, "callback", "([Ljava/lang/String;)V");
if (method_custom_function_callback == NULL) {
- LOGE("Can't find method SQLiteDatabase.CustomFunction.callback\n");
+ ALOGE("Can't find method SQLiteDatabase.CustomFunction.callback\n");
return -1;
}
diff --git a/core/jni/android_database_SQLiteDebug.cpp b/core/jni/android_database_SQLiteDebug.cpp
index 873b2a1ba5af..20ff00be63d7 100644
--- a/core/jni/android_database_SQLiteDebug.cpp
+++ b/core/jni/android_database_SQLiteDebug.cpp
@@ -201,25 +201,25 @@ int register_android_database_SQLiteDebug(JNIEnv *env)
clazz = env->FindClass("android/database/sqlite/SQLiteDebug$PagerStats");
if (clazz == NULL) {
- LOGE("Can't find android/database/sqlite/SQLiteDebug$PagerStats");
+ ALOGE("Can't find android/database/sqlite/SQLiteDebug$PagerStats");
return -1;
}
gMemoryUsedField = env->GetFieldID(clazz, "memoryUsed", "I");
if (gMemoryUsedField == NULL) {
- LOGE("Can't find memoryUsed");
+ ALOGE("Can't find memoryUsed");
return -1;
}
gLargestMemAllocField = env->GetFieldID(clazz, "largestMemAlloc", "I");
if (gLargestMemAllocField == NULL) {
- LOGE("Can't find largestMemAlloc");
+ ALOGE("Can't find largestMemAlloc");
return -1;
}
gPageCacheOverfloField = env->GetFieldID(clazz, "pageCacheOverflo", "I");
if (gPageCacheOverfloField == NULL) {
- LOGE("Can't find pageCacheOverflo");
+ ALOGE("Can't find pageCacheOverflo");
return -1;
}
diff --git a/core/jni/android_database_SQLiteProgram.cpp b/core/jni/android_database_SQLiteProgram.cpp
index c247bbd96ab4..2e34c0030df9 100644
--- a/core/jni/android_database_SQLiteProgram.cpp
+++ b/core/jni/android_database_SQLiteProgram.cpp
@@ -176,7 +176,7 @@ int register_android_database_SQLiteProgram(JNIEnv * env)
clazz = env->FindClass("android/database/sqlite/SQLiteProgram");
if (clazz == NULL) {
- LOGE("Can't find android/database/sqlite/SQLiteProgram");
+ ALOGE("Can't find android/database/sqlite/SQLiteProgram");
return -1;
}
@@ -184,7 +184,7 @@ int register_android_database_SQLiteProgram(JNIEnv * env)
gStatementField = env->GetFieldID(clazz, "nStatement", "I");
if (gHandleField == NULL || gStatementField == NULL) {
- LOGE("Error locating fields");
+ ALOGE("Error locating fields");
return -1;
}
diff --git a/core/jni/android_database_SQLiteQuery.cpp b/core/jni/android_database_SQLiteQuery.cpp
index ea4200a59231..da7ccf02907e 100644
--- a/core/jni/android_database_SQLiteQuery.cpp
+++ b/core/jni/android_database_SQLiteQuery.cpp
@@ -122,7 +122,7 @@ static CopyRowResult copyRow(JNIEnv* env, CursorWindow* window,
LOG_WINDOW("%d,%d is NULL", startPos + addedRows, i);
} else {
// Unknown data
- LOGE("Unknown column type when filling database window");
+ ALOGE("Unknown column type when filling database window");
throw_sqlite3_exception(env, "Unknown column type when filling window");
result = CPR_ERROR;
break;
@@ -153,7 +153,7 @@ static jlong nativeFillWindow(JNIEnv* env, jclass clazz, jint databasePtr,
startPos = requiredPos;
int err = sqlite3_bind_int(statement, offsetParam, startPos);
if (err != SQLITE_OK) {
- LOGE("Unable to bind offset position, offsetParam = %d", offsetParam);
+ ALOGE("Unable to bind offset position, offsetParam = %d", offsetParam);
throw_sqlite3_exception(env, database);
return 0;
}
@@ -167,7 +167,7 @@ static jlong nativeFillWindow(JNIEnv* env, jclass clazz, jint databasePtr,
int numColumns = sqlite3_column_count(statement);
status_t status = window->setNumColumns(numColumns);
if (status) {
- LOGE("Failed to change column count from %d to %d", window->getNumColumns(), numColumns);
+ ALOGE("Failed to change column count from %d to %d", window->getNumColumns(), numColumns);
jniThrowException(env, "java/lang/IllegalStateException", "numColumns mismatch");
return 0;
}
@@ -216,7 +216,7 @@ static jlong nativeFillWindow(JNIEnv* env, jclass clazz, jint databasePtr,
// The table is locked, retry
LOG_WINDOW("Database locked, retrying");
if (retryCount > 50) {
- LOGE("Bailing on database busy retry");
+ ALOGE("Bailing on database busy retry");
throw_sqlite3_exception(env, database, "retrycount exceeded");
gotException = true;
} else {
@@ -237,7 +237,7 @@ static jlong nativeFillWindow(JNIEnv* env, jclass clazz, jint databasePtr,
// Report the total number of rows on request.
if (startPos > totalRows) {
- LOGE("startPos %d > actual rows %d", startPos, totalRows);
+ ALOGE("startPos %d > actual rows %d", startPos, totalRows);
}
jlong result = jlong(startPos) << 32 | jlong(totalRows);
return result;
diff --git a/core/jni/android_database_SQLiteStatement.cpp b/core/jni/android_database_SQLiteStatement.cpp
index 05ffbb1d97af..e376258f52d1 100644
--- a/core/jni/android_database_SQLiteStatement.cpp
+++ b/core/jni/android_database_SQLiteStatement.cpp
@@ -169,7 +169,7 @@ static jobject create_ashmem_region_with_data(JNIEnv * env,
// Create ashmem area
int fd = ashmem_create_region(NULL, length);
if (fd < 0) {
- LOGE("ashmem_create_region failed: %s", strerror(errno));
+ ALOGE("ashmem_create_region failed: %s", strerror(errno));
jniThrowIOException(env, errno);
return NULL;
}
@@ -179,7 +179,7 @@ static jobject create_ashmem_region_with_data(JNIEnv * env,
void * ashmem_ptr =
mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ashmem_ptr == MAP_FAILED) {
- LOGE("mmap failed: %s", strerror(errno));
+ ALOGE("mmap failed: %s", strerror(errno));
jniThrowIOException(env, errno);
close(fd);
return NULL;
@@ -190,7 +190,7 @@ static jobject create_ashmem_region_with_data(JNIEnv * env,
// munmap ashmem area
if (munmap(ashmem_ptr, length) < 0) {
- LOGE("munmap failed: %s", strerror(errno));
+ ALOGE("munmap failed: %s", strerror(errno));
jniThrowIOException(env, errno);
close(fd);
return NULL;
@@ -199,7 +199,7 @@ static jobject create_ashmem_region_with_data(JNIEnv * env,
// Make ashmem area read-only
if (ashmem_set_prot_region(fd, PROT_READ) < 0) {
- LOGE("ashmem_set_prot_region failed: %s", strerror(errno));
+ ALOGE("ashmem_set_prot_region failed: %s", strerror(errno));
jniThrowIOException(env, errno);
close(fd);
return NULL;
@@ -267,7 +267,7 @@ int register_android_database_SQLiteStatement(JNIEnv * env)
clazz = env->FindClass("android/database/sqlite/SQLiteStatement");
if (clazz == NULL) {
- LOGE("Can't find android/database/sqlite/SQLiteStatement");
+ ALOGE("Can't find android/database/sqlite/SQLiteStatement");
return -1;
}
@@ -275,7 +275,7 @@ int register_android_database_SQLiteStatement(JNIEnv * env)
gStatementField = env->GetFieldID(clazz, "nStatement", "I");
if (gHandleField == NULL || gStatementField == NULL) {
- LOGE("Error locating fields");
+ ALOGE("Error locating fields");
return -1;
}
diff --git a/core/jni/android_debug_JNITest.cpp b/core/jni/android_debug_JNITest.cpp
index f14201ed5412..914728457ee4 100644
--- a/core/jni/android_debug_JNITest.cpp
+++ b/core/jni/android_debug_JNITest.cpp
@@ -39,20 +39,20 @@ static jint android_debug_JNITest_part1(JNIEnv* env, jobject object,
jint arrayVal;
int result = -2;
- LOGI("JNI test: in part1, intArg=%d, doubleArg=%.3f\n", intArg, doubleArg);
+ ALOGI("JNI test: in part1, intArg=%d, doubleArg=%.3f\n", intArg, doubleArg);
/* find "int part2(double doubleArg, int fromArray, String stringArg)" */
clazz = env->GetObjectClass(object);
part2id = env->GetMethodID(clazz,
"part2", "(DILjava/lang/String;)I");
if (part2id == NULL) {
- LOGE("JNI test: unable to find part2\n");
+ ALOGE("JNI test: unable to find part2\n");
return -1;
}
/* get the length of the array */
arrayLen = env->GetArrayLength(arrayArg);
- LOGI(" array size is %d\n", arrayLen);
+ ALOGI(" array size is %d\n", arrayLen);
/*
* Get the last element in the array.
@@ -60,7 +60,7 @@ static jint android_debug_JNITest_part1(JNIEnv* env, jobject object,
* to multiple elements.
*/
arrayVal = (int) env->GetObjectArrayElement(arrayArg, arrayLen-1);
- LOGI(" array val is %d\n", arrayVal);
+ ALOGI(" array val is %d\n", arrayVal);
/* call this->part2 */
result = env->CallIntMethod(object, part2id,
@@ -79,11 +79,11 @@ static jint android_debug_JNITest_part3(JNIEnv* env, jclass clazz,
const char* utfChars;
jboolean isCopy;
- LOGI("JNI test: in part3\n");
+ ALOGI("JNI test: in part3\n");
utfChars = env->GetStringUTFChars(stringArg, &isCopy);
- LOGI(" String is '%s', isCopy=%d\n", (const char*) utfChars, isCopy);
+ ALOGI(" String is '%s', isCopy=%d\n", (const char*) utfChars, isCopy);
env->ReleaseStringUTFChars(stringArg, utfChars);
diff --git a/core/jni/android_emoji_EmojiFactory.cpp b/core/jni/android_emoji_EmojiFactory.cpp
index 81dae88c1e11..a658561b059f 100644
--- a/core/jni/android_emoji_EmojiFactory.cpp
+++ b/core/jni/android_emoji_EmojiFactory.cpp
@@ -60,7 +60,7 @@ FAIL:
error_str = "unknown reason";
}
- LOGE("%s: %s", error_msg, error_str);
+ ALOGE("%s: %s", error_msg, error_str);
if (m_handle != NULL) {
dlclose(m_handle);
m_handle = NULL;
@@ -109,7 +109,7 @@ static jobject create_java_EmojiFactory(
jobject obj = env->NewObject(gEmojiFactory_class, gEmojiFactory_constructorMethodID,
static_cast<jint>(reinterpret_cast<uintptr_t>(factory)), name);
if (env->ExceptionCheck() != 0) {
- LOGE("*** Uncaught exception returned from Java call!\n");
+ ALOGE("*** Uncaught exception returned from Java call!\n");
env->ExceptionDescribe();
}
return obj;
@@ -172,14 +172,14 @@ static jobject android_emoji_EmojiFactory_getBitmapFromAndroidPua(
SkBitmap *bitmap = new SkBitmap;
if (!SkImageDecoder::DecodeMemory(bytes, size, bitmap)) {
- LOGE("SkImageDecoder::DecodeMemory() failed.");
+ ALOGE("SkImageDecoder::DecodeMemory() failed.");
return NULL;
}
jobject obj = env->NewObject(gBitmap_class, gBitmap_constructorMethodID,
static_cast<jint>(reinterpret_cast<uintptr_t>(bitmap)), NULL, false, NULL, -1);
if (env->ExceptionCheck() != 0) {
- LOGE("*** Uncaught exception returned from Java call!\n");
+ ALOGE("*** Uncaught exception returned from Java call!\n");
env->ExceptionDescribe();
}
return obj;
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 953da7972700..b89273b6adec 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -173,7 +173,7 @@ void JNICameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2)
// VM pointer will be NULL if object is released
Mutex::Autolock _l(mLock);
if (mCameraJObjectWeak == NULL) {
- LOGW("callback on dead camera object");
+ ALOGW("callback on dead camera object");
return;
}
JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -208,7 +208,7 @@ jbyteArray JNICameraContext::getCallbackBuffer(
if (obj != NULL) {
jsize bufferLength = env->GetArrayLength(obj);
if ((int)bufferLength < (int)bufferSize) {
- LOGE("Callback buffer was too small! Expected %d bytes, but got %d bytes!",
+ ALOGE("Callback buffer was too small! Expected %d bytes, but got %d bytes!",
bufferSize, bufferLength);
env->DeleteLocalRef(obj);
return NULL;
@@ -254,13 +254,13 @@ void JNICameraContext::copyAndPost(JNIEnv* env, const sp<IMemory>& dataPtr, int
}
if (obj == NULL) {
- LOGE("Couldn't allocate byte array for JPEG data");
+ ALOGE("Couldn't allocate byte array for JPEG data");
env->ExceptionClear();
} else {
env->SetByteArrayRegion(obj, 0, size, data);
}
} else {
- LOGE("image heap is NULL");
+ ALOGE("image heap is NULL");
}
}
@@ -279,7 +279,7 @@ void JNICameraContext::postData(int32_t msgType, const sp<IMemory>& dataPtr,
Mutex::Autolock _l(mLock);
JNIEnv *env = AndroidRuntime::getJNIEnv();
if (mCameraJObjectWeak == NULL) {
- LOGW("callback on dead camera object");
+ ALOGW("callback on dead camera object");
return;
}
@@ -331,7 +331,7 @@ void JNICameraContext::postMetadata(JNIEnv *env, int32_t msgType, camera_frame_m
obj = (jobjectArray) env->NewObjectArray(metadata->number_of_faces,
mFaceClass, NULL);
if (obj == NULL) {
- LOGE("Couldn't allocate face metadata array");
+ ALOGE("Couldn't allocate face metadata array");
return;
}
@@ -419,7 +419,7 @@ void JNICameraContext::addCallbackBuffer(
}
}
} else {
- LOGE("Null byte array!");
+ ALOGE("Null byte array!");
}
}
@@ -899,13 +899,13 @@ static int find_fields(JNIEnv *env, field *fields, int count)
field *f = &fields[i];
jclass clazz = env->FindClass(f->class_name);
if (clazz == NULL) {
- LOGE("Can't find %s", f->class_name);
+ ALOGE("Can't find %s", f->class_name);
return -1;
}
jfieldID field = env->GetFieldID(clazz, f->field_name, f->field_type);
if (field == NULL) {
- LOGE("Can't find %s.%s", f->class_name, f->field_name);
+ ALOGE("Can't find %s.%s", f->class_name, f->field_name);
return -1;
}
@@ -940,21 +940,21 @@ int register_android_hardware_Camera(JNIEnv *env)
fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
"(Ljava/lang/Object;IIILjava/lang/Object;)V");
if (fields.post_event == NULL) {
- LOGE("Can't find android/hardware/Camera.postEventFromNative");
+ ALOGE("Can't find android/hardware/Camera.postEventFromNative");
return -1;
}
clazz = env->FindClass("android/graphics/Rect");
fields.rect_constructor = env->GetMethodID(clazz, "<init>", "()V");
if (fields.rect_constructor == NULL) {
- LOGE("Can't find android/graphics/Rect.Rect()");
+ ALOGE("Can't find android/graphics/Rect.Rect()");
return -1;
}
clazz = env->FindClass("android/hardware/Camera$Face");
fields.face_constructor = env->GetMethodID(clazz, "<init>", "()V");
if (fields.face_constructor == NULL) {
- LOGE("Can't find android/hardware/Camera$Face.Face()");
+ ALOGE("Can't find android/hardware/Camera$Face.Face()");
return -1;
}
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp
index f53e2f7e5e71..923781ed3310 100644
--- a/core/jni/android_hardware_UsbDeviceConnection.cpp
+++ b/core/jni/android_hardware_UsbDeviceConnection.cpp
@@ -53,7 +53,7 @@ android_hardware_UsbDeviceConnection_open(JNIEnv *env, jobject thiz, jstring dev
if (device) {
env->SetIntField(thiz, field_context, (int)device);
} else {
- LOGE("usb_device_open failed for %s", deviceNameStr);
+ ALOGE("usb_device_open failed for %s", deviceNameStr);
close(fd);
}
@@ -77,7 +77,7 @@ android_hardware_UsbDeviceConnection_get_fd(JNIEnv *env, jobject thiz)
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_get_fd");
+ ALOGE("device is closed in native_get_fd");
return -1;
}
return usb_device_get_fd(device);
@@ -110,7 +110,7 @@ android_hardware_UsbDeviceConnection_claim_interface(JNIEnv *env, jobject thiz,
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_claim_interface");
+ ALOGE("device is closed in native_claim_interface");
return -1;
}
@@ -128,7 +128,7 @@ android_hardware_UsbDeviceConnection_release_interface(JNIEnv *env, jobject thiz
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_release_interface");
+ ALOGE("device is closed in native_release_interface");
return -1;
}
int ret = usb_device_release_interface(device, interfaceID);
@@ -146,7 +146,7 @@ android_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz,
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_control_request");
+ ALOGE("device is closed in native_control_request");
return -1;
}
@@ -174,7 +174,7 @@ android_hardware_UsbDeviceConnection_bulk_request(JNIEnv *env, jobject thiz,
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_control_request");
+ ALOGE("device is closed in native_control_request");
return -1;
}
@@ -200,7 +200,7 @@ android_hardware_UsbDeviceConnection_request_wait(JNIEnv *env, jobject thiz)
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_request_wait");
+ ALOGE("device is closed in native_request_wait");
return NULL;
}
@@ -216,7 +216,7 @@ android_hardware_UsbDeviceConnection_get_serial(JNIEnv *env, jobject thiz)
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
- LOGE("device is closed in native_request_wait");
+ ALOGE("device is closed in native_request_wait");
return NULL;
}
char* serial = usb_device_get_serial(device);
@@ -249,12 +249,12 @@ int register_android_hardware_UsbDeviceConnection(JNIEnv *env)
{
jclass clazz = env->FindClass("android/hardware/usb/UsbDeviceConnection");
if (clazz == NULL) {
- LOGE("Can't find android/hardware/usb/UsbDeviceConnection");
+ ALOGE("Can't find android/hardware/usb/UsbDeviceConnection");
return -1;
}
field_context = env->GetFieldID(clazz, "mNativeContext", "I");
if (field_context == NULL) {
- LOGE("Can't find UsbDeviceConnection.mNativeContext");
+ ALOGE("Can't find UsbDeviceConnection.mNativeContext");
return -1;
}
diff --git a/core/jni/android_hardware_UsbRequest.cpp b/core/jni/android_hardware_UsbRequest.cpp
index 6e1d4431b16b..1398968b043d 100644
--- a/core/jni/android_hardware_UsbRequest.cpp
+++ b/core/jni/android_hardware_UsbRequest.cpp
@@ -46,7 +46,7 @@ android_hardware_UsbRequest_init(JNIEnv *env, jobject thiz, jobject java_device,
struct usb_device* device = get_device_from_object(env, java_device);
if (!device) {
- LOGE("device null in native_init");
+ ALOGE("device null in native_init");
return false;
}
@@ -82,7 +82,7 @@ android_hardware_UsbRequest_queue_array(JNIEnv *env, jobject thiz,
{
struct usb_request* request = get_request_from_object(env, thiz);
if (!request) {
- LOGE("request is closed in native_queue");
+ ALOGE("request is closed in native_queue");
return false;
}
@@ -119,7 +119,7 @@ android_hardware_UsbRequest_dequeue_array(JNIEnv *env, jobject thiz,
{
struct usb_request* request = get_request_from_object(env, thiz);
if (!request) {
- LOGE("request is closed in native_dequeue");
+ ALOGE("request is closed in native_dequeue");
return;
}
@@ -138,7 +138,7 @@ android_hardware_UsbRequest_queue_direct(JNIEnv *env, jobject thiz,
{
struct usb_request* request = get_request_from_object(env, thiz);
if (!request) {
- LOGE("request is closed in native_queue");
+ ALOGE("request is closed in native_queue");
return false;
}
@@ -168,7 +168,7 @@ android_hardware_UsbRequest_dequeue_direct(JNIEnv *env, jobject thiz)
{
struct usb_request* request = get_request_from_object(env, thiz);
if (!request) {
- LOGE("request is closed in native_dequeue");
+ ALOGE("request is closed in native_dequeue");
return;
}
// all we need to do is delete our global ref
@@ -180,7 +180,7 @@ android_hardware_UsbRequest_cancel(JNIEnv *env, jobject thiz)
{
struct usb_request* request = get_request_from_object(env, thiz);
if (!request) {
- LOGE("request is closed in native_cancel");
+ ALOGE("request is closed in native_cancel");
return false;
}
return (usb_request_cancel(request) == 0);
@@ -202,12 +202,12 @@ int register_android_hardware_UsbRequest(JNIEnv *env)
{
jclass clazz = env->FindClass("android/hardware/usb/UsbRequest");
if (clazz == NULL) {
- LOGE("Can't find android/hardware/usb/UsbRequest");
+ ALOGE("Can't find android/hardware/usb/UsbRequest");
return -1;
}
field_context = env->GetFieldID(clazz, "mNativeContext", "I");
if (field_context == NULL) {
- LOGE("Can't find UsbRequest.mNativeContext");
+ ALOGE("Can't find UsbRequest.mNativeContext");
return -1;
}
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index ca13c1887347..305255355ff5 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -134,7 +134,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
// sampleRateInHertz, audioFormat, channels, buffSizeInBytes);
if (!audio_is_input_channel(channels)) {
- LOGE("Error creating AudioRecord: channel count is not 1 or 2.");
+ ALOGE("Error creating AudioRecord: channel count is not 1 or 2.");
return AUDIORECORD_ERROR_SETUP_INVALIDCHANNELMASK;
}
uint32_t nbChannels = popcount(channels);
@@ -142,7 +142,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
// compare the format against the Java constants
if ((audioFormat != javaAudioRecordFields.PCM16)
&& (audioFormat != javaAudioRecordFields.PCM8)) {
- LOGE("Error creating AudioRecord: unsupported audio format.");
+ ALOGE("Error creating AudioRecord: unsupported audio format.");
return AUDIORECORD_ERROR_SETUP_INVALIDFORMAT;
}
@@ -151,25 +151,25 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
AUDIO_FORMAT_PCM_16_BIT : AUDIO_FORMAT_PCM_8_BIT;
if (buffSizeInBytes == 0) {
- LOGE("Error creating AudioRecord: frameCount is 0.");
+ ALOGE("Error creating AudioRecord: frameCount is 0.");
return AUDIORECORD_ERROR_SETUP_ZEROFRAMECOUNT;
}
int frameSize = nbChannels * bytesPerSample;
size_t frameCount = buffSizeInBytes / frameSize;
if (source >= AUDIO_SOURCE_CNT) {
- LOGE("Error creating AudioRecord: unknown source.");
+ ALOGE("Error creating AudioRecord: unknown source.");
return AUDIORECORD_ERROR_SETUP_INVALIDSOURCE;
}
if (jSession == NULL) {
- LOGE("Error creating AudioRecord: invalid session ID pointer");
+ ALOGE("Error creating AudioRecord: invalid session ID pointer");
return AUDIORECORD_ERROR;
}
jint* nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
if (nSession == NULL) {
- LOGE("Error creating AudioRecord: Error retrieving session id pointer");
+ ALOGE("Error creating AudioRecord: Error retrieving session id pointer");
return AUDIORECORD_ERROR;
}
int sessionId = nSession[0];
@@ -182,7 +182,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
// create an uninitialized AudioRecord object
lpRecorder = new AudioRecord();
if(lpRecorder == NULL) {
- LOGE("Error creating AudioRecord instance.");
+ ALOGE("Error creating AudioRecord instance.");
return AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED;
}
@@ -190,7 +190,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
// this data will be passed with every AudioRecord callback
jclass clazz = env->GetObjectClass(thiz);
if (clazz == NULL) {
- LOGE("Can't find %s when setting up callback.", kClassPathName);
+ ALOGE("Can't find %s when setting up callback.", kClassPathName);
goto native_track_failure;
}
lpCallbackData = new audiorecord_callback_cookie;
@@ -211,13 +211,13 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
sessionId);
if(lpRecorder->initCheck() != NO_ERROR) {
- LOGE("Error creating AudioRecord instance: initialization check failed.");
+ ALOGE("Error creating AudioRecord instance: initialization check failed.");
goto native_init_failure;
}
nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
if (nSession == NULL) {
- LOGE("Error creating AudioRecord: Error retrieving session id pointer");
+ ALOGE("Error creating AudioRecord: Error retrieving session id pointer");
goto native_init_failure;
}
// read the audio session ID back from AudioTrack in case a new session was created during set()
@@ -332,12 +332,12 @@ static jint android_media_AudioRecord_readInByteArray(JNIEnv *env, jobject thiz
lpRecorder =
(AudioRecord *)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj);
if (lpRecorder == NULL) {
- LOGE("Unable to retrieve AudioRecord object, can't record");
+ ALOGE("Unable to retrieve AudioRecord object, can't record");
return 0;
}
if (!javaAudioData) {
- LOGE("Invalid Java array to store recorded audio, can't record");
+ ALOGE("Invalid Java array to store recorded audio, can't record");
return 0;
}
@@ -349,7 +349,7 @@ static jint android_media_AudioRecord_readInByteArray(JNIEnv *env, jobject thiz
recordBuff = (jbyte *)env->GetByteArrayElements(javaAudioData, NULL);
if (recordBuff == NULL) {
- LOGE("Error retrieving destination for recorded audio data, can't record");
+ ALOGE("Error retrieving destination for recorded audio data, can't record");
return 0;
}
@@ -390,13 +390,13 @@ static jint android_media_AudioRecord_readInDirectBuffer(JNIEnv *env, jobject t
long capacity = env->GetDirectBufferCapacity(jBuffer);
if(capacity == -1) {
// buffer direct access is not supported
- LOGE("Buffer direct access is not supported, can't record");
+ ALOGE("Buffer direct access is not supported, can't record");
return 0;
}
//ALOGV("capacity = %ld", capacity);
jbyte* nativeFromJavaBuf = (jbyte*) env->GetDirectBufferAddress(jBuffer);
if(nativeFromJavaBuf==NULL) {
- LOGE("Buffer direct access is not supported, can't record");
+ ALOGE("Buffer direct access is not supported, can't record");
return 0;
}
@@ -555,7 +555,7 @@ int register_android_media_AudioRecord(JNIEnv *env)
// Get the AudioRecord class
jclass audioRecordClass = env->FindClass(kClassPathName);
if (audioRecordClass == NULL) {
- LOGE("Can't find %s", kClassPathName);
+ ALOGE("Can't find %s", kClassPathName);
return -1;
}
// Get the postEvent method
@@ -563,7 +563,7 @@ int register_android_media_AudioRecord(JNIEnv *env)
audioRecordClass,
JAVA_POSTEVENT_CALLBACK_NAME, "(Ljava/lang/Object;IIILjava/lang/Object;)V");
if (javaAudioRecordFields.postNativeEventInJava == NULL) {
- LOGE("Can't find AudioRecord.%s", JAVA_POSTEVENT_CALLBACK_NAME);
+ ALOGE("Can't find AudioRecord.%s", JAVA_POSTEVENT_CALLBACK_NAME);
return -1;
}
@@ -573,7 +573,7 @@ int register_android_media_AudioRecord(JNIEnv *env)
env->GetFieldID(audioRecordClass,
JAVA_NATIVERECORDERINJAVAOBJ_FIELD_NAME, "I");
if (javaAudioRecordFields.nativeRecorderInJavaObj == NULL) {
- LOGE("Can't find AudioRecord.%s", JAVA_NATIVERECORDERINJAVAOBJ_FIELD_NAME);
+ ALOGE("Can't find AudioRecord.%s", JAVA_NATIVERECORDERINJAVAOBJ_FIELD_NAME);
return -1;
}
// mNativeCallbackCookie
@@ -581,7 +581,7 @@ int register_android_media_AudioRecord(JNIEnv *env)
audioRecordClass,
JAVA_NATIVECALLBACKINFO_FIELD_NAME, "I");
if (javaAudioRecordFields.nativeCallbackCookie == NULL) {
- LOGE("Can't find AudioRecord.%s", JAVA_NATIVECALLBACKINFO_FIELD_NAME);
+ ALOGE("Can't find AudioRecord.%s", JAVA_NATIVECALLBACKINFO_FIELD_NAME);
return -1;
}
@@ -589,7 +589,7 @@ int register_android_media_AudioRecord(JNIEnv *env)
jclass audioFormatClass = NULL;
audioFormatClass = env->FindClass(JAVA_AUDIOFORMAT_CLASS_NAME);
if (audioFormatClass == NULL) {
- LOGE("Can't find %s", JAVA_AUDIOFORMAT_CLASS_NAME);
+ ALOGE("Can't find %s", JAVA_AUDIOFORMAT_CLASS_NAME);
return -1;
}
if ( !android_media_getIntConstantFromClass(env, audioFormatClass,
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 2573aa6d7582..40673249baf9 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -176,11 +176,11 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
int afFrameCount;
if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) {
- LOGE("Error creating AudioTrack: Could not get AudioSystem frame count.");
+ ALOGE("Error creating AudioTrack: Could not get AudioSystem frame count.");
return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM;
}
if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) {
- LOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate.");
+ ALOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate.");
return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM;
}
@@ -189,7 +189,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
uint32_t nativeChannelMask = ((uint32_t)javaChannelMask) >> 2;
if (!audio_is_output_channel(nativeChannelMask)) {
- LOGE("Error creating AudioTrack: invalid channel mask.");
+ ALOGE("Error creating AudioTrack: invalid channel mask.");
return AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK;
}
@@ -214,14 +214,14 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
} else if (streamType == javaAudioTrackFields.STREAM_DTMF) {
atStreamType = AUDIO_STREAM_DTMF;
} else {
- LOGE("Error creating AudioTrack: unknown stream type.");
+ ALOGE("Error creating AudioTrack: unknown stream type.");
return AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE;
}
// check the format.
// This function was called from Java, so we compare the format against the Java constants
if ((audioFormat != javaAudioTrackFields.PCM16) && (audioFormat != javaAudioTrackFields.PCM8)) {
- LOGE("Error creating AudioTrack: unsupported audio format.");
+ ALOGE("Error creating AudioTrack: unsupported audio format.");
return AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT;
}
@@ -250,7 +250,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
// this data will be passed with every AudioTrack callback
jclass clazz = env->GetObjectClass(thiz);
if (clazz == NULL) {
- LOGE("Can't find %s when setting up callback.", kClassPathName);
+ ALOGE("Can't find %s when setting up callback.", kClassPathName);
delete lpJniStorage;
return AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED;
}
@@ -261,14 +261,14 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
lpJniStorage->mStreamType = atStreamType;
if (jSession == NULL) {
- LOGE("Error creating AudioTrack: invalid session ID pointer");
+ ALOGE("Error creating AudioTrack: invalid session ID pointer");
delete lpJniStorage;
return AUDIOTRACK_ERROR;
}
jint* nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
if (nSession == NULL) {
- LOGE("Error creating AudioTrack: Error retrieving session id pointer");
+ ALOGE("Error creating AudioTrack: Error retrieving session id pointer");
delete lpJniStorage;
return AUDIOTRACK_ERROR;
}
@@ -279,7 +279,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
// create the native AudioTrack object
AudioTrack* lpTrack = new AudioTrack();
if (lpTrack == NULL) {
- LOGE("Error creating uninitialized AudioTrack");
+ ALOGE("Error creating uninitialized AudioTrack");
goto native_track_failure;
}
@@ -303,7 +303,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
// AudioTrack is using shared memory
if (!lpJniStorage->allocSharedMem(buffSizeInBytes)) {
- LOGE("Error creating AudioTrack in static mode: error creating mem heap base");
+ ALOGE("Error creating AudioTrack in static mode: error creating mem heap base");
goto native_init_failure;
}
@@ -322,13 +322,13 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
}
if (lpTrack->initCheck() != NO_ERROR) {
- LOGE("Error initializing AudioTrack");
+ ALOGE("Error initializing AudioTrack");
goto native_init_failure;
}
nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
if (nSession == NULL) {
- LOGE("Error creating AudioTrack: Error retrieving session id pointer");
+ ALOGE("Error creating AudioTrack: Error retrieving session id pointer");
goto native_init_failure;
}
// read the audio session ID back from AudioTrack in case we create a new session
@@ -544,11 +544,11 @@ static jint android_media_AudioTrack_native_write(JNIEnv *env, jobject thiz,
if (javaAudioData) {
cAudioData = (jbyte *)env->GetByteArrayElements(javaAudioData, NULL);
if (cAudioData == NULL) {
- LOGE("Error retrieving source of audio data to play, can't play");
+ ALOGE("Error retrieving source of audio data to play, can't play");
return 0; // out of memory or no data to load
}
} else {
- LOGE("NULL java array of audio data to play, can't play");
+ ALOGE("NULL java array of audio data to play, can't play");
return 0;
}
@@ -785,7 +785,7 @@ static jint android_media_AudioTrack_get_output_sample_rate(JNIEnv *env, jobjec
}
if (AudioSystem::getOutputSamplingRate(&afSamplingRate, nativeStreamType) != NO_ERROR) {
- LOGE("AudioSystem::getOutputSamplingRate() for stream type %d failed in AudioTrack JNI",
+ ALOGE("AudioSystem::getOutputSamplingRate() for stream type %d failed in AudioTrack JNI",
nativeStreamType);
return DEFAULT_OUTPUT_SAMPLE_RATE;
} else {
@@ -913,7 +913,7 @@ bool android_media_getIntConstantFromClass(JNIEnv* pEnv, jclass theClass, const
*constVal = pEnv->GetStaticIntField(theClass, javaConst);
return true;
} else {
- LOGE("Can't find %s.%s", className, constName);
+ ALOGE("Can't find %s.%s", className, constName);
return false;
}
}
@@ -928,7 +928,7 @@ int register_android_media_AudioTrack(JNIEnv *env)
// Get the AudioTrack class
jclass audioTrackClass = env->FindClass(kClassPathName);
if (audioTrackClass == NULL) {
- LOGE("Can't find %s", kClassPathName);
+ ALOGE("Can't find %s", kClassPathName);
return -1;
}
@@ -937,7 +937,7 @@ int register_android_media_AudioTrack(JNIEnv *env)
audioTrackClass,
JAVA_POSTEVENT_CALLBACK_NAME, "(Ljava/lang/Object;IIILjava/lang/Object;)V");
if (javaAudioTrackFields.postNativeEventInJava == NULL) {
- LOGE("Can't find AudioTrack.%s", JAVA_POSTEVENT_CALLBACK_NAME);
+ ALOGE("Can't find AudioTrack.%s", JAVA_POSTEVENT_CALLBACK_NAME);
return -1;
}
@@ -947,7 +947,7 @@ int register_android_media_AudioTrack(JNIEnv *env)
audioTrackClass,
JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME, "I");
if (javaAudioTrackFields.nativeTrackInJavaObj == NULL) {
- LOGE("Can't find AudioTrack.%s", JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME);
+ ALOGE("Can't find AudioTrack.%s", JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME);
return -1;
}
// jniData;
@@ -955,7 +955,7 @@ int register_android_media_AudioTrack(JNIEnv *env)
audioTrackClass,
JAVA_JNIDATA_FIELD_NAME, "I");
if (javaAudioTrackFields.jniData == NULL) {
- LOGE("Can't find AudioTrack.%s", JAVA_JNIDATA_FIELD_NAME);
+ ALOGE("Can't find AudioTrack.%s", JAVA_JNIDATA_FIELD_NAME);
return -1;
}
@@ -974,7 +974,7 @@ int register_android_media_AudioTrack(JNIEnv *env)
jclass audioFormatClass = NULL;
audioFormatClass = env->FindClass(JAVA_AUDIOFORMAT_CLASS_NAME);
if (audioFormatClass == NULL) {
- LOGE("Can't find %s", JAVA_AUDIOFORMAT_CLASS_NAME);
+ ALOGE("Can't find %s", JAVA_AUDIOFORMAT_CLASS_NAME);
return -1;
}
if ( !android_media_getIntConstantFromClass(env, audioFormatClass,
@@ -991,7 +991,7 @@ int register_android_media_AudioTrack(JNIEnv *env)
jclass audioManagerClass = NULL;
audioManagerClass = env->FindClass(JAVA_AUDIOMANAGER_CLASS_NAME);
if (audioManagerClass == NULL) {
- LOGE("Can't find %s", JAVA_AUDIOMANAGER_CLASS_NAME);
+ ALOGE("Can't find %s", JAVA_AUDIOMANAGER_CLASS_NAME);
return -1;
}
if ( !android_media_getIntConstantFromClass(env, audioManagerClass,
diff --git a/core/jni/android_media_JetPlayer.cpp b/core/jni/android_media_JetPlayer.cpp
index 66421a98d391..85c0a9c66af1 100644
--- a/core/jni/android_media_JetPlayer.cpp
+++ b/core/jni/android_media_JetPlayer.cpp
@@ -66,7 +66,7 @@ jetPlayerEventCallback(int what, int arg1=0, int arg2=0, void* javaTarget = NULL
env->ExceptionClear();
}
} else {
- LOGE("JET jetPlayerEventCallback(): No JNI env for JET event callback, can't post event.");
+ ALOGE("JET jetPlayerEventCallback(): No JNI env for JET event callback, can't post event.");
return;
}
}
@@ -90,7 +90,7 @@ android_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this,
env->SetIntField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (int)lpJet);
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result);
+ ALOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result);
delete lpJet;
env->SetIntField(weak_this, javaJetPlayerFields.nativePlayerInJavaObj, 0);
return JNI_FALSE;
@@ -140,7 +140,7 @@ android_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path)
const char *pathStr = env->GetStringUTFChars(path, NULL);
if (pathStr == NULL) { // Out of memory
- LOGE("android_media_JetPlayer_openFile(): aborting, out of memory");
+ ALOGE("android_media_JetPlayer_openFile(): aborting, out of memory");
return JNI_FALSE;
}
@@ -152,7 +152,7 @@ android_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path)
//ALOGV("android_media_JetPlayer_openFile(): file successfully opened");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_openFile(): failed to open file with EAS error %d",
+ ALOGE("android_media_JetPlayer_openFile(): failed to open file with EAS error %d",
(int)result);
return JNI_FALSE;
}
@@ -182,7 +182,7 @@ android_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz,
ALOGV("android_media_JetPlayer_openFileDescr(): file successfully opened");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d",
+ ALOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d",
(int)result);
return JNI_FALSE;
}
@@ -204,7 +204,7 @@ android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz)
//ALOGV("android_media_JetPlayer_closeFile(): file successfully closed");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_closeFile(): failed to close file");
+ ALOGE("android_media_JetPlayer_closeFile(): failed to close file");
return JNI_FALSE;
}
}
@@ -226,7 +226,7 @@ android_media_JetPlayer_play(JNIEnv *env, jobject thiz)
//ALOGV("android_media_JetPlayer_play(): play successful");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_play(): failed to play with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_play(): failed to play with EAS error code %ld",
result);
return JNI_FALSE;
}
@@ -253,7 +253,7 @@ android_media_JetPlayer_pause(JNIEnv *env, jobject thiz)
ALOGV("android_media_JetPlayer_pause(): paused with an empty queue");
return JNI_TRUE;
} else
- LOGE("android_media_JetPlayer_pause(): failed to pause with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_pause(): failed to pause with EAS error code %ld",
result);
return JNI_FALSE;
}
@@ -279,7 +279,7 @@ android_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz,
//ALOGV("android_media_JetPlayer_queueSegment(): segment successfully queued");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_queueSegment(): failed with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_queueSegment(): failed with EAS error code %ld",
result);
return JNI_FALSE;
}
@@ -304,7 +304,7 @@ android_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz,
jboolean *muteTracks = NULL;
muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
if (muteTracks == NULL) {
- LOGE("android_media_JetPlayer_queueSegment(): failed to read track mute mask.");
+ ALOGE("android_media_JetPlayer_queueSegment(): failed to read track mute mask.");
return JNI_FALSE;
}
@@ -325,7 +325,7 @@ android_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz,
//ALOGV("android_media_JetPlayer_queueSegmentMuteArray(): segment successfully queued");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_queueSegmentMuteArray(): failed with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_queueSegmentMuteArray(): failed with EAS error code %ld",
result);
return JNI_FALSE;
}
@@ -350,7 +350,7 @@ android_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz,
//ALOGV("android_media_JetPlayer_setMuteFlags(): mute flags successfully updated");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_setMuteFlags(): failed with EAS error code %ld", result);
+ ALOGE("android_media_JetPlayer_setMuteFlags(): failed with EAS error code %ld", result);
return JNI_FALSE;
}
}
@@ -373,7 +373,7 @@ android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz,
jboolean *muteTracks = NULL;
muteTracks = env->GetBooleanArrayElements(muteArray, NULL);
if (muteTracks == NULL) {
- LOGE("android_media_JetPlayer_setMuteArray(): failed to read track mute mask.");
+ ALOGE("android_media_JetPlayer_setMuteArray(): failed to read track mute mask.");
return JNI_FALSE;
}
@@ -394,7 +394,7 @@ android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz,
//ALOGV("android_media_JetPlayer_setMuteArray(): mute flags successfully updated");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_setMuteArray(): \
+ ALOGE("android_media_JetPlayer_setMuteArray(): \
failed to update mute flags with EAS error code %ld", result);
return JNI_FALSE;
}
@@ -420,7 +420,7 @@ android_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz,
//ALOGV("android_media_JetPlayer_setMuteFlag(): mute flag successfully updated for track %d", trackId);
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_setMuteFlag(): failed to update mute flag for track %d with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_setMuteFlag(): failed to update mute flag for track %d with EAS error code %ld",
trackId, result);
return JNI_FALSE;
}
@@ -444,7 +444,7 @@ android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId)
//ALOGV("android_media_JetPlayer_triggerClip(): triggerClip successful for clip %d", clipId);
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_triggerClip(): triggerClip for clip %d failed with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_triggerClip(): triggerClip for clip %d failed with EAS error code %ld",
clipId, result);
return JNI_FALSE;
}
@@ -467,7 +467,7 @@ android_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz)
//ALOGV("android_media_JetPlayer_clearQueue(): clearQueue successful");
return JNI_TRUE;
} else {
- LOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld",
+ ALOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld",
result);
return JNI_FALSE;
}
@@ -513,7 +513,7 @@ int register_android_media_JetPlayer(JNIEnv *env)
// Get the JetPlayer java class
jetPlayerClass = env->FindClass(kClassPathName);
if (jetPlayerClass == NULL) {
- LOGE("Can't find %s", kClassPathName);
+ ALOGE("Can't find %s", kClassPathName);
return -1;
}
javaJetPlayerFields.jetClass = (jclass)env->NewGlobalRef(jetPlayerClass);
@@ -523,7 +523,7 @@ int register_android_media_JetPlayer(JNIEnv *env)
jetPlayerClass,
JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "I");
if (javaJetPlayerFields.nativePlayerInJavaObj == NULL) {
- LOGE("Can't find AudioTrack.%s", JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME);
+ ALOGE("Can't find AudioTrack.%s", JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME);
return -1;
}
@@ -531,7 +531,7 @@ int register_android_media_JetPlayer(JNIEnv *env)
javaJetPlayerFields.postNativeEventInJava = env->GetStaticMethodID(javaJetPlayerFields.jetClass,
JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME, "(Ljava/lang/Object;III)V");
if (javaJetPlayerFields.postNativeEventInJava == NULL) {
- LOGE("Can't find Jet.%s", JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME);
+ ALOGE("Can't find Jet.%s", JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME);
return -1;
}
diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp
index 965afae297cc..49be1c71ffe0 100644
--- a/core/jni/android_media_ToneGenerator.cpp
+++ b/core/jni/android_media_ToneGenerator.cpp
@@ -86,14 +86,14 @@ static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz,
ALOGV("android_media_ToneGenerator_native_setup jobject: %x\n", (int)thiz);
if (lpToneGen == NULL) {
- LOGE("ToneGenerator creation failed \n");
+ ALOGE("ToneGenerator creation failed \n");
jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
return;
}
ALOGV("ToneGenerator lpToneGen: %x\n", (unsigned int)lpToneGen);
if (!lpToneGen->isInited()) {
- LOGE("ToneGenerator init failed \n");
+ ALOGE("ToneGenerator init failed \n");
jniThrowRuntimeException(env, "Init failed");
return;
}
@@ -133,13 +133,13 @@ int register_android_media_ToneGenerator(JNIEnv *env) {
clazz = env->FindClass("android/media/ToneGenerator");
if (clazz == NULL) {
- LOGE("Can't find %s", "android/media/ToneGenerator");
+ ALOGE("Can't find %s", "android/media/ToneGenerator");
return -1;
}
fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
if (fields.context == NULL) {
- LOGE("Can't find ToneGenerator.mNativeContext");
+ ALOGE("Can't find ToneGenerator.mNativeContext");
return -1;
}
ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %x", (unsigned int)fields.context);
diff --git a/core/jni/android_net_LocalSocketImpl.cpp b/core/jni/android_net_LocalSocketImpl.cpp
index c8add7066d7c..1426b2cd376b 100644
--- a/core/jni/android_net_LocalSocketImpl.cpp
+++ b/core/jni/android_net_LocalSocketImpl.cpp
@@ -957,7 +957,7 @@ int register_android_net_LocalSocketImpl(JNIEnv *env)
"android/net/LocalSocketImpl", gMethods, NELEM(gMethods));
error:
- LOGE("Error registering android.net.LocalSocketImpl");
+ ALOGE("Error registering android.net.LocalSocketImpl");
return -1;
}
diff --git a/core/jni/android_net_TrafficStats.cpp b/core/jni/android_net_TrafficStats.cpp
index 7a6143226265..0ab659b2382f 100644
--- a/core/jni/android_net_TrafficStats.cpp
+++ b/core/jni/android_net_TrafficStats.cpp
@@ -47,13 +47,13 @@ static jlong readNumber(char const* filename) {
char buf[80];
int fd = open(filename, O_RDONLY);
if (fd < 0) {
- if (errno != ENOENT) LOGE("Can't open %s: %s", filename, strerror(errno));
+ if (errno != ENOENT) ALOGE("Can't open %s: %s", filename, strerror(errno));
return -1;
}
int len = read(fd, buf, sizeof(buf) - 1);
if (len < 0) {
- LOGE("Can't read %s: %s", filename, strerror(errno));
+ ALOGE("Can't read %s: %s", filename, strerror(errno));
close(fd);
return -1;
}
@@ -101,7 +101,7 @@ static jlong readTotal(char const* suffix) {
char filename[PATH_MAX] = "/sys/class/net/";
DIR *dir = opendir(filename);
if (dir == NULL) {
- LOGE("Can't list %s: %s", filename, strerror(errno));
+ ALOGE("Can't list %s: %s", filename, strerror(errno));
return -1;
}
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index f8dc6183c92f..9586717218a0 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -184,7 +184,7 @@ static void read_mapinfo(FILE *fp, stats_t* stats)
}
}
- //LOGI("native=%d dalvik=%d sqlite=%d: %s\n", isNativeHeap, isDalvikHeap,
+ //ALOGI("native=%d dalvik=%d sqlite=%d: %s\n", isNativeHeap, isDalvikHeap,
// isSqliteHeap, line);
while (true) {
@@ -517,14 +517,14 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz,
/* dup() the descriptor so we don't close the original with fclose() */
int fd = dup(origFd);
if (fd < 0) {
- LOGW("dup(%d) failed: %s\n", origFd, strerror(errno));
+ ALOGW("dup(%d) failed: %s\n", origFd, strerror(errno));
jniThrowRuntimeException(env, "dup() failed");
return;
}
FILE* fp = fdopen(fd, "w");
if (fp == NULL) {
- LOGW("fdopen(%d) failed: %s\n", fd, strerror(errno));
+ ALOGW("fdopen(%d) failed: %s\n", fd, strerror(errno));
close(fd);
jniThrowRuntimeException(env, "fdopen() failed");
return;
diff --git a/core/jni/android_os_StatFs.cpp b/core/jni/android_os_StatFs.cpp
index c658aa587ec6..79d8fef12862 100644
--- a/core/jni/android_os_StatFs.cpp
+++ b/core/jni/android_os_StatFs.cpp
@@ -91,7 +91,7 @@ android_os_StatFs_native_restat(JNIEnv *env, jobject thiz, jstring path)
// note that stat will contain the new file data corresponding to
// pathstr
if (statfs(pathstr, stat) != 0) {
- LOGE("statfs %s failed, errno: %d", pathstr, errno);
+ ALOGE("statfs %s failed, errno: %d", pathstr, errno);
delete stat;
env->SetIntField(thiz, fields.context, 0);
jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
@@ -146,13 +146,13 @@ int register_android_os_StatFs(JNIEnv *env)
clazz = env->FindClass("android/os/StatFs");
if (clazz == NULL) {
- LOGE("Can't find android/os/StatFs");
+ ALOGE("Can't find android/os/StatFs");
return -1;
}
fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
if (fields.context == NULL) {
- LOGE("Can't find StatFs.mNativeContext");
+ ALOGE("Can't find StatFs.mNativeContext");
return -1;
}
diff --git a/core/jni/android_os_UEventObserver.cpp b/core/jni/android_os_UEventObserver.cpp
index 7f31b00270ae..5639f4f8a01f 100644
--- a/core/jni/android_os_UEventObserver.cpp
+++ b/core/jni/android_os_UEventObserver.cpp
@@ -59,7 +59,7 @@ int register_android_os_UEventObserver(JNIEnv *env)
clazz = env->FindClass("android/os/UEventObserver");
if (clazz == NULL) {
- LOGE("Can't find android/os/UEventObserver");
+ ALOGE("Can't find android/os/UEventObserver");
return -1;
}
diff --git a/core/jni/android_server_BluetoothA2dpService.cpp b/core/jni/android_server_BluetoothA2dpService.cpp
index 2bab4b565cde..d065a9e1ecaf 100644
--- a/core/jni/android_server_BluetoothA2dpService.cpp
+++ b/core/jni/android_server_BluetoothA2dpService.cpp
@@ -65,7 +65,7 @@ static bool initNative(JNIEnv* env, jobject object) {
#ifdef HAVE_BLUETOOTH
nat = (native_data_t *)calloc(1, sizeof(native_data_t));
if (NULL == nat) {
- LOGE("%s: out of memory!", __FUNCTION__);
+ ALOGE("%s: out of memory!", __FUNCTION__);
return false;
}
env->GetJavaVM( &(nat->vm) );
@@ -77,7 +77,7 @@ static bool initNative(JNIEnv* env, jobject object) {
dbus_threads_init_default();
nat->conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
- LOGE("Could not get onto the system bus: %s", err.message);
+ ALOGE("Could not get onto the system bus: %s", err.message);
dbus_error_free(&err);
return false;
}
@@ -117,7 +117,7 @@ static jobjectArray getSinkPropertiesNative(JNIEnv *env, jobject object,
LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, reply);
return NULL;
} else if (!reply) {
- LOGE("DBus reply is NULL in function %s", __FUNCTION__);
+ ALOGE("DBus reply is NULL in function %s", __FUNCTION__);
return NULL;
}
DBusMessageIter iter;
@@ -268,7 +268,7 @@ DBusHandlerResult a2dp_event_filter(DBusMessage *msg, JNIEnv *env) {
ALOGV("... ignored");
}
if (env->ExceptionCheck()) {
- LOGE("VM Exception occurred while handling %s.%s (%s) in %s,"
+ ALOGE("VM Exception occurred while handling %s.%s (%s) in %s,"
" leaving for VM",
dbus_message_get_interface(msg), dbus_message_get_member(msg),
dbus_message_get_path(msg), __FUNCTION__);
@@ -326,7 +326,7 @@ static JNINativeMethod sMethods[] = {
int register_android_server_BluetoothA2dpService(JNIEnv *env) {
jclass clazz = env->FindClass("android/server/BluetoothA2dpService");
if (clazz == NULL) {
- LOGE("Can't find android/server/BluetoothA2dpService");
+ ALOGE("Can't find android/server/BluetoothA2dpService");
return -1;
}
diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp
index 100fca4c62bf..9292fc02113c 100644
--- a/core/jni/android_server_BluetoothEventLoop.cpp
+++ b/core/jni/android_server_BluetoothEventLoop.cpp
@@ -161,7 +161,7 @@ static void initializeNativeDataNative(JNIEnv* env, jobject object) {
#ifdef HAVE_BLUETOOTH
native_data_t *nat = (native_data_t *)calloc(1, sizeof(native_data_t));
if (NULL == nat) {
- LOGE("%s: out of memory!", __FUNCTION__);
+ ALOGE("%s: out of memory!", __FUNCTION__);
return;
}
memset(nat, 0, sizeof(native_data_t));
@@ -176,7 +176,7 @@ static void initializeNativeDataNative(JNIEnv* env, jobject object) {
dbus_threads_init_default();
nat->conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
- LOGE("%s: Could not get onto the system bus!", __FUNCTION__);
+ ALOGE("%s: Could not get onto the system bus!", __FUNCTION__);
dbus_error_free(&err);
}
dbus_connection_set_exit_on_disconnect(nat->conn, FALSE);
@@ -321,7 +321,7 @@ const char * get_adapter_path(DBusConnection *conn) {
msg = dbus_message_new_method_call("org.bluez", "/",
"org.bluez.Manager", "DefaultAdapter");
if (!msg) {
- LOGE("%s: Can't allocate new method call for get_adapter_path!",
+ ALOGE("%s: Can't allocate new method call for get_adapter_path!",
__FUNCTION__);
return NULL;
}
@@ -346,7 +346,7 @@ const char * get_adapter_path(DBusConnection *conn) {
}
}
if (attempt == 1000) {
- LOGE("Time out while trying to get Adapter path, is bluetoothd up ?");
+ ALOGE("Time out while trying to get Adapter path, is bluetoothd up ?");
goto failed;
}
@@ -375,7 +375,7 @@ static int register_agent(native_data_t *nat,
if (!dbus_connection_register_object_path(nat->conn, agent_path,
&agent_vtable, nat)) {
- LOGE("%s: Can't register object path %s for agent!",
+ ALOGE("%s: Can't register object path %s for agent!",
__FUNCTION__, agent_path);
return -1;
}
@@ -387,7 +387,7 @@ static int register_agent(native_data_t *nat,
msg = dbus_message_new_method_call("org.bluez", nat->adapter,
"org.bluez.Adapter", "RegisterAgent");
if (!msg) {
- LOGE("%s: Can't allocate new method call for agent!",
+ ALOGE("%s: Can't allocate new method call for agent!",
__FUNCTION__);
return -1;
}
@@ -400,7 +400,7 @@ static int register_agent(native_data_t *nat,
dbus_message_unref(msg);
if (!reply) {
- LOGE("%s: Can't register agent!", __FUNCTION__);
+ ALOGE("%s: Can't register agent!", __FUNCTION__);
if (dbus_error_is_set(&err)) {
LOG_AND_FREE_DBUS_ERROR(&err);
}
@@ -442,7 +442,7 @@ static void tearDownEventLoop(native_data_t *nat) {
}
dbus_message_unref(msg);
} else {
- LOGE("%s: Can't create new method call!", __FUNCTION__);
+ ALOGE("%s: Can't create new method call!", __FUNCTION__);
}
dbus_connection_flush(nat->conn);
@@ -629,7 +629,7 @@ static void handleWatchRemove(native_data_t *nat) {
return;
}
}
- LOGW("WatchRemove given with unknown watch");
+ ALOGW("WatchRemove given with unknown watch");
}
static void *eventLoopMain(void *ptr) {
@@ -717,7 +717,7 @@ static jboolean startEventLoopNative(JNIEnv *env, jobject object) {
nat->running = false;
if (nat->pollData) {
- LOGW("trying to start EventLoop a second time!");
+ ALOGW("trying to start EventLoop a second time!");
pthread_mutex_unlock( &(nat->thread_mutex) );
return JNI_FALSE;
}
@@ -725,14 +725,14 @@ static jboolean startEventLoopNative(JNIEnv *env, jobject object) {
nat->pollData = (struct pollfd *)malloc(sizeof(struct pollfd) *
DEFAULT_INITIAL_POLLFD_COUNT);
if (!nat->pollData) {
- LOGE("out of memory error starting EventLoop!");
+ ALOGE("out of memory error starting EventLoop!");
goto done;
}
nat->watchData = (DBusWatch **)malloc(sizeof(DBusWatch *) *
DEFAULT_INITIAL_POLLFD_COUNT);
if (!nat->watchData) {
- LOGE("out of memory error starting EventLoop!");
+ ALOGE("out of memory error starting EventLoop!");
goto done;
}
@@ -744,7 +744,7 @@ static jboolean startEventLoopNative(JNIEnv *env, jobject object) {
nat->pollMemberCount = 1;
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, &(nat->controlFdR))) {
- LOGE("Error getting BT control socket");
+ ALOGE("Error getting BT control socket");
goto done;
}
nat->pollData[0].fd = nat->controlFdR;
@@ -756,7 +756,7 @@ static jboolean startEventLoopNative(JNIEnv *env, jobject object) {
nat->me = env->NewGlobalRef(object);
if (setUpEventLoop(nat) != JNI_TRUE) {
- LOGE("failure setting up Event Loop!");
+ ALOGE("failure setting up Event Loop!");
goto done;
}
@@ -1097,7 +1097,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
ALOGV("%s: not interested (not a method call).", __FUNCTION__);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
- LOGI("%s: Received method %s:%s", __FUNCTION__,
+ ALOGI("%s: Received method %s:%s", __FUNCTION__,
dbus_message_get_interface(msg), dbus_message_get_member(msg));
if (nat == NULL) return DBUS_HANDLER_RESULT_HANDLED;
@@ -1111,7 +1111,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
// reply
DBusMessage *reply = dbus_message_new_method_return(msg);
if (!reply) {
- LOGE("%s: Cannot create message reply\n", __FUNCTION__);
+ ALOGE("%s: Cannot create message reply\n", __FUNCTION__);
goto failure;
}
dbus_connection_send(nat->conn, reply, NULL);
@@ -1126,7 +1126,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_STRING, &uuid,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for Authorize() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for Authorize() method", __FUNCTION__);
goto failure;
}
@@ -1145,7 +1145,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for OutOfBandData available() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for OutOfBandData available() method", __FUNCTION__);
goto failure;
}
@@ -1160,7 +1160,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
if (available) {
DBusMessage *reply = dbus_message_new_method_return(msg);
if (!reply) {
- LOGE("%s: Cannot create message reply\n", __FUNCTION__);
+ ALOGE("%s: Cannot create message reply\n", __FUNCTION__);
goto failure;
}
dbus_connection_send(nat->conn, reply, NULL);
@@ -1169,7 +1169,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
DBusMessage *reply = dbus_message_new_error(msg,
"org.bluez.Error.DoesNotExist", "OutofBand data not available");
if (!reply) {
- LOGE("%s: Cannot create message reply\n", __FUNCTION__);
+ ALOGE("%s: Cannot create message reply\n", __FUNCTION__);
goto failure;
}
dbus_connection_send(nat->conn, reply, NULL);
@@ -1182,7 +1182,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for RequestPinCode() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for RequestPinCode() method", __FUNCTION__);
goto failure;
}
@@ -1197,7 +1197,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for RequestPasskey() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for RequestPasskey() method", __FUNCTION__);
goto failure;
}
@@ -1212,7 +1212,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for RequestOobData() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for RequestOobData() method", __FUNCTION__);
goto failure;
}
@@ -1229,7 +1229,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_UINT32, &passkey,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for RequestPasskey() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for RequestPasskey() method", __FUNCTION__);
goto failure;
}
@@ -1247,7 +1247,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_UINT32, &passkey,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for RequestConfirmation() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for RequestConfirmation() method", __FUNCTION__);
goto failure;
}
@@ -1263,7 +1263,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &object_path,
DBUS_TYPE_INVALID)) {
- LOGE("%s: Invalid arguments for RequestPairingConsent() method", __FUNCTION__);
+ ALOGE("%s: Invalid arguments for RequestPairingConsent() method", __FUNCTION__);
goto failure;
}
@@ -1277,7 +1277,7 @@ DBusHandlerResult agent_event_filter(DBusConnection *conn,
// reply
DBusMessage *reply = dbus_message_new_method_return(msg);
if (!reply) {
- LOGE("%s: Cannot create message reply\n", __FUNCTION__);
+ ALOGE("%s: Cannot create message reply\n", __FUNCTION__);
goto failure;
}
dbus_connection_send(nat->conn, reply, NULL);
@@ -1354,7 +1354,7 @@ void onCreatePairedDeviceResult(DBusMessage *msg, void *user, void *n) {
ALOGV("... error = %s (%s)\n", err.name, err.message);
result = BOND_RESULT_AUTH_TIMEOUT;
} else {
- LOGE("%s: D-Bus error: %s (%s)\n", __FUNCTION__, err.name, err.message);
+ ALOGE("%s: D-Bus error: %s (%s)\n", __FUNCTION__, err.name, err.message);
result = BOND_RESULT_ERROR;
}
}
@@ -1445,7 +1445,7 @@ void onGetDeviceServiceChannelResult(DBusMessage *msg, void *user, void *n) {
!dbus_message_get_args(msg, &err,
DBUS_TYPE_INT32, &channel,
DBUS_TYPE_INVALID)) {
- LOGE("%s: D-Bus error: %s (%s)\n", __FUNCTION__, err.name, err.message);
+ ALOGE("%s: D-Bus error: %s (%s)\n", __FUNCTION__, err.name, err.message);
dbus_error_free(&err);
}
diff --git a/core/jni/android_server_BluetoothService.cpp b/core/jni/android_server_BluetoothService.cpp
index 9dbe77422f8a..c475261ef010 100644
--- a/core/jni/android_server_BluetoothService.cpp
+++ b/core/jni/android_server_BluetoothService.cpp
@@ -89,7 +89,7 @@ static inline native_data_t * get_native_data(JNIEnv *env, jobject object) {
native_data_t *nat =
(native_data_t *)(env->GetIntField(object, field_mNativeData));
if (nat == NULL || nat->conn == NULL) {
- LOGE("Uninitialized native data\n");
+ ALOGE("Uninitialized native data\n");
return NULL;
}
return nat;
@@ -113,7 +113,7 @@ static bool initializeNativeDataNative(JNIEnv* env, jobject object) {
#ifdef HAVE_BLUETOOTH
native_data_t *nat = (native_data_t *)calloc(1, sizeof(native_data_t));
if (NULL == nat) {
- LOGE("%s: out of memory!", __FUNCTION__);
+ ALOGE("%s: out of memory!", __FUNCTION__);
return false;
}
nat->env = env;
@@ -124,7 +124,7 @@ static bool initializeNativeDataNative(JNIEnv* env, jobject object) {
dbus_threads_init_default();
nat->conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
- LOGE("Could not get onto the system bus: %s", err.message);
+ ALOGE("Could not get onto the system bus: %s", err.message);
dbus_error_free(&err);
return false;
}
@@ -162,7 +162,7 @@ static jboolean setupNativeDataNative(JNIEnv* env, jobject object) {
if (!dbus_connection_register_object_path(nat->conn, device_agent_path,
&agent_vtable, event_nat)) {
- LOGE("%s: Can't register object path %s for remote device agent!",
+ ALOGE("%s: Can't register object path %s for remote device agent!",
__FUNCTION__, device_agent_path);
return JNI_FALSE;
}
@@ -332,7 +332,7 @@ static jbyteArray readAdapterOutOfBandDataNative(JNIEnv *env, jobject object) {
env->SetByteArrayRegion(byteArray, 16, 16, randomizer);
}
} else {
- LOGE("readAdapterOutOfBandDataNative: Hash len = %d, R len = %d",
+ ALOGE("readAdapterOutOfBandDataNative: Hash len = %d, R len = %d",
hash_len, r_len);
}
} else {
@@ -466,7 +466,7 @@ static jboolean cancelDeviceCreationNative(JNIEnv *env, jobject object,
if (dbus_error_is_set(&err)) {
LOG_AND_FREE_DBUS_ERROR(&err);
} else
- LOGE("DBus reply is NULL in function %s", __FUNCTION__);
+ ALOGE("DBus reply is NULL in function %s", __FUNCTION__);
return JNI_FALSE;
} else {
result = JNI_TRUE;
@@ -540,7 +540,7 @@ static jboolean setPairingConfirmationNative(JNIEnv *env, jobject object,
}
if (!reply) {
- LOGE("%s: Cannot create message reply to RequestPasskeyConfirmation or"
+ ALOGE("%s: Cannot create message reply to RequestPasskeyConfirmation or"
"RequestPairingConsent to D-Bus\n", __FUNCTION__);
dbus_message_unref(msg);
return JNI_FALSE;
@@ -564,7 +564,7 @@ static jboolean setPasskeyNative(JNIEnv *env, jobject object, jstring address,
DBusMessage *msg = (DBusMessage *)nativeData;
DBusMessage *reply = dbus_message_new_method_return(msg);
if (!reply) {
- LOGE("%s: Cannot create message reply to return Passkey code to "
+ ALOGE("%s: Cannot create message reply to return Passkey code to "
"D-Bus\n", __FUNCTION__);
dbus_message_unref(msg);
return JNI_FALSE;
@@ -593,7 +593,7 @@ static jboolean setRemoteOutOfBandDataNative(JNIEnv *env, jobject object, jstrin
jbyte *h_ptr = env->GetByteArrayElements(hash, NULL);
jbyte *r_ptr = env->GetByteArrayElements(randomizer, NULL);
if (!reply) {
- LOGE("%s: Cannot create message reply to return remote OOB data to "
+ ALOGE("%s: Cannot create message reply to return remote OOB data to "
"D-Bus\n", __FUNCTION__);
dbus_message_unref(msg);
return JNI_FALSE;
@@ -631,7 +631,7 @@ static jboolean setAuthorizationNative(JNIEnv *env, jobject object, jstring addr
"org.bluez.Error.Rejected", "Authorization rejected");
}
if (!reply) {
- LOGE("%s: Cannot create message reply D-Bus\n", __FUNCTION__);
+ ALOGE("%s: Cannot create message reply D-Bus\n", __FUNCTION__);
dbus_message_unref(msg);
return JNI_FALSE;
}
@@ -654,7 +654,7 @@ static jboolean setPinNative(JNIEnv *env, jobject object, jstring address,
DBusMessage *msg = (DBusMessage *)nativeData;
DBusMessage *reply = dbus_message_new_method_return(msg);
if (!reply) {
- LOGE("%s: Cannot create message reply to return PIN code to "
+ ALOGE("%s: Cannot create message reply to return PIN code to "
"D-Bus\n", __FUNCTION__);
dbus_message_unref(msg);
return JNI_FALSE;
@@ -685,7 +685,7 @@ static jboolean cancelPairingUserInputNative(JNIEnv *env, jobject object,
DBusMessage *reply = dbus_message_new_error(msg,
"org.bluez.Error.Canceled", "Pairing User Input was canceled");
if (!reply) {
- LOGE("%s: Cannot create message reply to return cancelUserInput to"
+ ALOGE("%s: Cannot create message reply to return cancelUserInput to"
"D-BUS\n", __FUNCTION__);
dbus_message_unref(msg);
return JNI_FALSE;
@@ -722,7 +722,7 @@ static jobjectArray getDevicePropertiesNative(JNIEnv *env, jobject object,
if (dbus_error_is_set(&err)) {
LOG_AND_FREE_DBUS_ERROR(&err);
} else
- LOGE("DBus reply is NULL in function %s", __FUNCTION__);
+ ALOGE("DBus reply is NULL in function %s", __FUNCTION__);
return NULL;
}
env->PushLocalFrame(PROPERTIES_NREFS);
@@ -756,7 +756,7 @@ static jobjectArray getAdapterPropertiesNative(JNIEnv *env, jobject object) {
if (dbus_error_is_set(&err)) {
LOG_AND_FREE_DBUS_ERROR(&err);
} else
- LOGE("DBus reply is NULL in function %s", __FUNCTION__);
+ ALOGE("DBus reply is NULL in function %s", __FUNCTION__);
return NULL;
}
env->PushLocalFrame(PROPERTIES_NREFS);
@@ -788,7 +788,7 @@ static jboolean setAdapterPropertyNative(JNIEnv *env, jobject object, jstring ke
get_adapter_path(env, object),
DBUS_ADAPTER_IFACE, "SetProperty");
if (!msg) {
- LOGE("%s: Can't allocate new method call for GetProperties!",
+ ALOGE("%s: Can't allocate new method call for GetProperties!",
__FUNCTION__);
env->ReleaseStringUTFChars(key, c_key);
return JNI_FALSE;
@@ -856,7 +856,7 @@ static jboolean setDevicePropertyNative(JNIEnv *env, jobject object, jstring pat
msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
c_path, DBUS_DEVICE_IFACE, "SetProperty");
if (!msg) {
- LOGE("%s: Can't allocate new method call for device SetProperty!", __FUNCTION__);
+ ALOGE("%s: Can't allocate new method call for device SetProperty!", __FUNCTION__);
env->ReleaseStringUTFChars(key, c_key);
env->ReleaseStringUTFChars(path, c_path);
return JNI_FALSE;
@@ -985,7 +985,7 @@ static jintArray extract_handles(JNIEnv *env, DBusMessage *reply) {
if (handleArray) {
env->SetIntArrayRegion(handleArray, 0, len, handles);
} else {
- LOGE("Null array in extract_handles");
+ ALOGE("Null array in extract_handles");
}
} else {
LOG_AND_FREE_DBUS_ERROR(&err);
@@ -1169,7 +1169,7 @@ static jboolean setBluetoothTetheringNative(JNIEnv *env, jobject object, jboolea
const char *c_role = env->GetStringUTFChars(src_role, NULL);
const char *c_bridge = env->GetStringUTFChars(bridge, NULL);
if (value) {
- LOGE("setBluetoothTetheringNative true");
+ ALOGE("setBluetoothTetheringNative true");
reply = dbus_func_args(env, nat->conn,
get_adapter_path(env, object),
DBUS_NETWORKSERVER_IFACE,
@@ -1178,7 +1178,7 @@ static jboolean setBluetoothTetheringNative(JNIEnv *env, jobject object, jboolea
DBUS_TYPE_STRING, &c_bridge,
DBUS_TYPE_INVALID);
} else {
- LOGE("setBluetoothTetheringNative false");
+ ALOGE("setBluetoothTetheringNative false");
reply = dbus_func_args(env, nat->conn,
get_adapter_path(env, object),
DBUS_NETWORKSERVER_IFACE,
@@ -1198,7 +1198,7 @@ static jboolean connectPanDeviceNative(JNIEnv *env, jobject object, jstring path
jstring dstRole) {
ALOGV("%s", __FUNCTION__);
#ifdef HAVE_BLUETOOTH
- LOGE("connectPanDeviceNative");
+ ALOGE("connectPanDeviceNative");
native_data_t *nat = get_native_data(env, object);
jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
struct event_loop_native_data_t *eventLoopNat =
@@ -1230,7 +1230,7 @@ static jboolean disconnectPanDeviceNative(JNIEnv *env, jobject object,
jstring path) {
ALOGV("%s", __FUNCTION__);
#ifdef HAVE_BLUETOOTH
- LOGE("disconnectPanDeviceNative");
+ ALOGE("disconnectPanDeviceNative");
native_data_t *nat = get_native_data(env, object);
jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
struct event_loop_native_data_t *eventLoopNat =
@@ -1260,7 +1260,7 @@ static jboolean disconnectPanServerDeviceNative(JNIEnv *env, jobject object,
jstring iface) {
ALOGV("%s", __FUNCTION__);
#ifdef HAVE_BLUETOOTH
- LOGE("disconnectPanServerDeviceNative");
+ ALOGE("disconnectPanServerDeviceNative");
native_data_t *nat = get_native_data(env, object);
jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
struct event_loop_native_data_t *eventLoopNat =
@@ -1316,7 +1316,7 @@ static jstring registerHealthApplicationNative(JNIEnv *env, jobject object,
"CreateApplication");
if (msg == NULL) {
- LOGE("Could not allocate D-Bus message object!");
+ ALOGE("Could not allocate D-Bus message object!");
return NULL;
}
@@ -1379,7 +1379,7 @@ static jstring registerSinkHealthApplicationNative(JNIEnv *env, jobject object,
"CreateApplication");
if (msg == NULL) {
- LOGE("Could not allocate D-Bus message object!");
+ ALOGE("Could not allocate D-Bus message object!");
return NULL;
}
@@ -1487,7 +1487,7 @@ static jboolean createChannelNative(JNIEnv *env, jobject object,
static jboolean destroyChannelNative(JNIEnv *env, jobject object, jstring devicePath,
jstring channelPath, jint code) {
- LOGE("%s", __FUNCTION__);
+ ALOGE("%s", __FUNCTION__);
#ifdef HAVE_BLUETOOTH
native_data_t *nat = get_native_data(env, object);
jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
@@ -1517,7 +1517,7 @@ static jboolean destroyChannelNative(JNIEnv *env, jobject object, jstring device
}
static jstring getMainChannelNative(JNIEnv *env, jobject object, jstring devicePath) {
- LOGE("%s", __FUNCTION__);
+ ALOGE("%s", __FUNCTION__);
#ifdef HAVE_BLUETOOTH
native_data_t *nat = get_native_data(env, object);
if (nat) {
@@ -1551,7 +1551,7 @@ static jstring getMainChannelNative(JNIEnv *env, jobject object, jstring deviceP
}
static jstring getChannelApplicationNative(JNIEnv *env, jobject object, jstring channelPath) {
- LOGE("%s", __FUNCTION__);
+ ALOGE("%s", __FUNCTION__);
#ifdef HAVE_BLUETOOTH
native_data_t *nat = get_native_data(env, object);
if (nat) {
@@ -1647,7 +1647,7 @@ static jobject getChannelFdNative(JNIEnv *env, jobject object, jstring channelPa
int flags = fcntl(fd, F_GETFL);
if (flags < 0) {
- LOGE("Can't get flags with fcntl(): %s (%d)",
+ ALOGE("Can't get flags with fcntl(): %s (%d)",
strerror(errno), errno);
releaseChannelFdNative(env, object, channelPath);
close(fd);
@@ -1657,7 +1657,7 @@ static jobject getChannelFdNative(JNIEnv *env, jobject object, jstring channelPa
flags &= ~O_NONBLOCK;
int status = fcntl(fd, F_SETFL, flags);
if (status < 0) {
- LOGE("Can't set flags with fcntl(): %s (%d)",
+ ALOGE("Can't set flags with fcntl(): %s (%d)",
strerror(errno), errno);
releaseChannelFdNative(env, object, channelPath);
close(fd);
diff --git a/core/jni/android_server_NetworkManagementSocketTagger.cpp b/core/jni/android_server_NetworkManagementSocketTagger.cpp
index c279cedc40e6..12beff7463e0 100644
--- a/core/jni/android_server_NetworkManagementSocketTagger.cpp
+++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp
@@ -36,7 +36,7 @@ static jint QTagUid_tagSocketFd(JNIEnv* env, jclass,
int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
if (env->ExceptionOccurred() != NULL) {
- LOGE("Can't get FileDescriptor num");
+ ALOGE("Can't get FileDescriptor num");
return (jint)-1;
}
@@ -52,7 +52,7 @@ static int QTagUid_untagSocketFd(JNIEnv* env, jclass,
int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
if (env->ExceptionOccurred() != NULL) {
- LOGE("Can't get FileDescriptor num");
+ ALOGE("Can't get FileDescriptor num");
return (jint)-1;
}
diff --git a/core/jni/android_server_Watchdog.cpp b/core/jni/android_server_Watchdog.cpp
index 9e0ed478ee66..6726c14a26e2 100644
--- a/core/jni/android_server_Watchdog.cpp
+++ b/core/jni/android_server_Watchdog.cpp
@@ -48,7 +48,7 @@ static void dumpOneStack(int tid, int outFd) {
write(outFd, "\n", 1);
close(stackFd);
} else {
- LOGE("Unable to open stack of tid %d : %d (%s)", tid, errno, strerror(errno));
+ ALOGE("Unable to open stack of tid %d : %d (%s)", tid, errno, strerror(errno));
}
}
@@ -56,7 +56,7 @@ static void dumpKernelStacks(JNIEnv* env, jobject clazz, jstring pathStr) {
char buf[128];
DIR* taskdir;
- LOGI("dumpKernelStacks");
+ ALOGI("dumpKernelStacks");
if (!pathStr) {
jniThrowException(env, "java/lang/IllegalArgumentException", "Null path");
return;
@@ -67,7 +67,7 @@ static void dumpKernelStacks(JNIEnv* env, jobject clazz, jstring pathStr) {
int outFd = open(path, O_WRONLY | O_APPEND | O_CREAT,
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (outFd < 0) {
- LOGE("Unable to open stack dump file: %d (%s)", errno, strerror(errno));
+ ALOGE("Unable to open stack dump file: %d (%s)", errno, strerror(errno));
goto done;
}
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 9e3d04a18dbe..990a617e723f 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -194,8 +194,8 @@ static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
if ((tagstr == NULL) || (msgstr == NULL)) {
env->ExceptionClear(); /* assume exception (OOM?) was thrown */
- LOGE("Unable to call Log.e()\n");
- LOGE("%s", msg);
+ ALOGE("Unable to call Log.e()\n");
+ ALOGE("%s", msg);
goto bail;
}
@@ -203,7 +203,7 @@ static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
gLogOffsets.mClass, gLogOffsets.mLogE, tagstr, msgstr, excep);
if (env->ExceptionCheck()) {
/* attempting to log the failure has failed */
- LOGW("Failed trying to log exception, msg='%s'\n", msg);
+ ALOGW("Failed trying to log exception, msg='%s'\n", msg);
env->ExceptionClear();
}
@@ -221,7 +221,7 @@ static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
env->Throw(excep);
vm->DetachCurrentThread();
sleep(60);
- LOGE("Forcefully exiting");
+ ALOGE("Forcefully exiting");
exit(1);
*((int *) 1) = 1;
}
@@ -463,11 +463,11 @@ public:
(jstring) env->CallObjectMethod(objClassRef.get(), gClassOffsets.mGetName));
ScopedUtfChars nameUtf(env, nameRef.get());
if (nameUtf.c_str() != NULL) {
- LOGW("BinderProxy is being destroyed but the application did not call "
+ ALOGW("BinderProxy is being destroyed but the application did not call "
"unlinkToDeath to unlink all of its death recipients beforehand. "
"Releasing leaked death recipient: %s", nameUtf.c_str());
} else {
- LOGW("BinderProxy being destroyed; unable to get DR object name");
+ ALOGW("BinderProxy being destroyed; unable to get DR object name");
env->ExceptionClear();
}
}
@@ -476,7 +476,7 @@ public:
protected:
virtual ~JavaDeathRecipient()
{
- //LOGI("Removing death ref: recipient=%p\n", mObject);
+ //ALOGI("Removing death ref: recipient=%p\n", mObject);
android_atomic_dec(&gNumDeathRefs);
JNIEnv* env = javavm_to_jnienv(mVM);
if (mObject != NULL) {
@@ -630,7 +630,7 @@ sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj)
env->GetIntField(obj, gBinderProxyOffsets.mObject);
}
- LOGW("ibinderForJavaObject: %p is not a Binder object", obj);
+ ALOGW("ibinderForJavaObject: %p is not a Binder object", obj);
return NULL;
}
@@ -699,7 +699,7 @@ static void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code");
break;
case FAILED_TRANSACTION:
- LOGE("!!! FAILED BINDER TRANSACTION !!!");
+ ALOGE("!!! FAILED BINDER TRANSACTION !!!");
// TransactionTooLargeException is a checked exception, only throw from certain methods.
// FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION
// but it is not the only one. The Binder driver can return BR_FAILED_REPLY
@@ -715,7 +715,7 @@ static void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
"Not allowed to write file descriptors here");
break;
default:
- LOGE("Unknown binder error code. 0x%x", err);
+ ALOGE("Unknown binder error code. 0x%x", err);
String8 msg;
msg.appendFormat("Unknown binder error code. 0x%x", err);
// RemoteException is a checked exception, only throw from certain methods.
@@ -976,7 +976,7 @@ static bool push_eventlog_string(char** pos, const char* end, const char* str) {
jint len = strlen(str);
int space_needed = 1 + sizeof(len) + len;
if (end - *pos < space_needed) {
- LOGW("not enough space for string. remain=%d; needed=%d",
+ ALOGW("not enough space for string. remain=%d; needed=%d",
(end - *pos), space_needed);
return false;
}
@@ -992,7 +992,7 @@ static bool push_eventlog_string(char** pos, const char* end, const char* str) {
static bool push_eventlog_int(char** pos, const char* end, jint val) {
int space_needed = 1 + sizeof(val);
if (end - *pos < space_needed) {
- LOGW("not enough space for int. remain=%d; needed=%d",
+ ALOGW("not enough space for int. remain=%d; needed=%d",
(end - *pos), space_needed);
return false;
}
@@ -1117,7 +1117,7 @@ static void android_os_BinderProxy_linkToDeath(JNIEnv* env, jobject obj,
IBinder* target = (IBinder*)
env->GetIntField(obj, gBinderProxyOffsets.mObject);
if (target == NULL) {
- LOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient);
+ ALOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient);
assert(false);
}
@@ -1149,7 +1149,7 @@ static jboolean android_os_BinderProxy_unlinkToDeath(JNIEnv* env, jobject obj,
IBinder* target = (IBinder*)
env->GetIntField(obj, gBinderProxyOffsets.mObject);
if (target == NULL) {
- LOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient);
+ ALOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient);
return JNI_FALSE;
}
@@ -1635,7 +1635,7 @@ static void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jobject clazz, jo
int fd = jniGetFDFromFileDescriptor(env, object);
if (fd >= 0) {
jniSetFileDescriptorOfFD(env, object, -1);
- //LOGI("Closing ParcelFileDescriptor %d\n", fd);
+ //ALOGI("Closing ParcelFileDescriptor %d\n", fd);
close(fd);
}
}
@@ -1658,7 +1658,7 @@ static void android_os_Parcel_freeBuffer(JNIEnv* env, jobject clazz)
if (own) {
Parcel* parcel = parcelForJavaObject(env, clazz);
if (parcel != NULL) {
- //LOGI("Parcel.freeBuffer() called for C++ Parcel %p\n", parcel);
+ //ALOGI("Parcel.freeBuffer() called for C++ Parcel %p\n", parcel);
parcel->freeData();
}
}
@@ -1669,17 +1669,17 @@ static void android_os_Parcel_init(JNIEnv* env, jobject clazz, jint parcelInt)
Parcel* parcel = (Parcel*)parcelInt;
int own = 0;
if (!parcel) {
- //LOGI("Initializing obj %p: creating new Parcel\n", clazz);
+ //ALOGI("Initializing obj %p: creating new Parcel\n", clazz);
own = 1;
parcel = new Parcel;
} else {
- //LOGI("Initializing obj %p: given existing Parcel %p\n", clazz, parcel);
+ //ALOGI("Initializing obj %p: given existing Parcel %p\n", clazz, parcel);
}
if (parcel == NULL) {
jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
return;
}
- //LOGI("Initializing obj %p from C++ Parcel %p, own=%d\n", clazz, parcel, own);
+ //ALOGI("Initializing obj %p from C++ Parcel %p, own=%d\n", clazz, parcel, own);
env->SetIntField(clazz, gParcelOffsets.mOwnObject, own);
env->SetIntField(clazz, gParcelOffsets.mObject, (int)parcel);
}
@@ -1690,11 +1690,11 @@ static void android_os_Parcel_destroy(JNIEnv* env, jobject clazz)
if (own) {
Parcel* parcel = parcelForJavaObject(env, clazz);
env->SetIntField(clazz, gParcelOffsets.mObject, 0);
- //LOGI("Destroying obj %p: deleting C++ Parcel %p\n", clazz, parcel);
+ //ALOGI("Destroying obj %p: deleting C++ Parcel %p\n", clazz, parcel);
delete parcel;
} else {
env->SetIntField(clazz, gParcelOffsets.mObject, 0);
- //LOGI("Destroying obj %p: leaving C++ Parcel %p\n", clazz);
+ //ALOGI("Destroying obj %p: leaving C++ Parcel %p\n", clazz);
}
}
diff --git a/core/jni/android_util_EventLog.cpp b/core/jni/android_util_EventLog.cpp
index 5d51110c3d33..a3981ce8ec00 100644
--- a/core/jni/android_util_EventLog.cpp
+++ b/core/jni/android_util_EventLog.cpp
@@ -267,7 +267,7 @@ int register_android_util_EventLog(JNIEnv* env) {
for (int i = 0; i < NELEM(gClasses); ++i) {
jclass clazz = env->FindClass(gClasses[i].name);
if (clazz == NULL) {
- LOGE("Can't find class: %s\n", gClasses[i].name);
+ ALOGE("Can't find class: %s\n", gClasses[i].name);
return -1;
}
*gClasses[i].clazz = (jclass) env->NewGlobalRef(clazz);
@@ -277,7 +277,7 @@ int register_android_util_EventLog(JNIEnv* env) {
*gFields[i].id = env->GetFieldID(
*gFields[i].c, gFields[i].name, gFields[i].ft);
if (*gFields[i].id == NULL) {
- LOGE("Can't find field: %s\n", gFields[i].name);
+ ALOGE("Can't find field: %s\n", gFields[i].name);
return -1;
}
}
@@ -286,7 +286,7 @@ int register_android_util_EventLog(JNIEnv* env) {
*gMethods[i].id = env->GetMethodID(
*gMethods[i].c, gMethods[i].name, gMethods[i].mt);
if (*gMethods[i].id == NULL) {
- LOGE("Can't find method: %s\n", gMethods[i].name);
+ ALOGE("Can't find method: %s\n", gMethods[i].name);
return -1;
}
}
diff --git a/core/jni/android_util_FileObserver.cpp b/core/jni/android_util_FileObserver.cpp
index 65e71304e8b6..0327d8c491d9 100644
--- a/core/jni/android_util_FileObserver.cpp
+++ b/core/jni/android_util_FileObserver.cpp
@@ -67,7 +67,7 @@ static void android_os_fileobserver_observe(JNIEnv* env, jobject object, jint fd
if (errno == EINTR)
continue;
- LOGE("***** ERROR! android_os_fileobserver_observe() got a short event!");
+ ALOGE("***** ERROR! android_os_fileobserver_observe() got a short event!");
return;
}
@@ -148,14 +148,14 @@ int register_android_os_FileObserver(JNIEnv* env)
if (clazz == NULL)
{
- LOGE("Can't find android/os/FileObserver$ObserverThread");
+ ALOGE("Can't find android/os/FileObserver$ObserverThread");
return -1;
}
method_onEvent = env->GetMethodID(clazz, "onEvent", "(IILjava/lang/String;)V");
if (method_onEvent == NULL)
{
- LOGE("Can't find FileObserver.onEvent(int, int, String)");
+ ALOGE("Can't find FileObserver.onEvent(int, int, String)");
return -1;
}
diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp
index 2c7bb8466b41..a57aad72db52 100644
--- a/core/jni/android_util_Log.cpp
+++ b/core/jni/android_util_Log.cpp
@@ -139,7 +139,7 @@ int register_android_util_Log(JNIEnv* env)
jclass clazz = env->FindClass("android/util/Log");
if (clazz == NULL) {
- LOGE("Can't find android/util/Log");
+ ALOGE("Can't find android/util/Log");
return -1;
}
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index bc7e47c7917d..2c494ac82ae2 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -227,7 +227,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin
t_pid = atoi(de->d_name);
if (!t_pid) {
- LOGE("Error getting pid for '%s'\n", de->d_name);
+ ALOGE("Error getting pid for '%s'\n", de->d_name);
continue;
}
@@ -274,7 +274,7 @@ void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz,
if (pid == androidGetTid()) {
void* bgOk = pthread_getspecific(gBgKey);
if (bgOk == ((void*)0xbaad)) {
- LOGE("Thread marked fg-only put self in background!");
+ ALOGE("Thread marked fg-only put self in background!");
jniThrowException(env, "java/lang/SecurityException", "May not put this thread into background");
return;
}
@@ -291,7 +291,7 @@ void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz,
}
}
- //LOGI("Setting priority of %d: %d, getpriority returns %d\n",
+ //ALOGI("Setting priority of %d: %d, getpriority returns %d\n",
// pid, pri, getpriority(PRIO_PROCESS, pid));
}
@@ -310,7 +310,7 @@ jint android_os_Process_getThreadPriority(JNIEnv* env, jobject clazz,
if (errno != 0) {
signalExceptionForPriorityError(env, clazz, errno);
}
- //LOGI("Returning priority of %d: %d\n", pid, pri);
+ //ALOGI("Returning priority of %d: %d\n", pid, pri);
return pri;
}
@@ -362,7 +362,7 @@ jint android_os_Process_setGid(JNIEnv* env, jobject clazz, jint uid)
static int pid_compare(const void* v1, const void* v2)
{
- //LOGI("Compare %d vs %d\n", *((const jint*)v1), *((const jint*)v2));
+ //ALOGI("Compare %d vs %d\n", *((const jint*)v1), *((const jint*)v2));
return *((const jint*)v1) - *((const jint*)v2);
}
@@ -371,7 +371,7 @@ static jlong android_os_Process_getFreeMemory(JNIEnv* env, jobject clazz)
int fd = open("/proc/meminfo", O_RDONLY);
if (fd < 0) {
- LOGW("Unable to open /proc/meminfo");
+ ALOGW("Unable to open /proc/meminfo");
return -1;
}
@@ -380,7 +380,7 @@ static jlong android_os_Process_getFreeMemory(JNIEnv* env, jobject clazz)
close(fd);
if (len < 0) {
- LOGW("Unable to read /proc/meminfo");
+ ALOGW("Unable to read /proc/meminfo");
return -1;
}
buffer[len] = 0;
@@ -420,7 +420,7 @@ static jlong android_os_Process_getFreeMemory(JNIEnv* env, jobject clazz)
void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileStr,
jobjectArray reqFields, jlongArray outFields)
{
- //LOGI("getMemInfo: %p %p", reqFields, outFields);
+ //ALOGI("getMemInfo: %p %p", reqFields, outFields);
if (fileStr == NULL || reqFields == NULL || outFields == NULL) {
jniThrowNullPointerException(env, NULL);
@@ -447,7 +447,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt
jobject obj = env->GetObjectArrayElement(reqFields, i);
if (obj != NULL) {
const char* str8 = env->GetStringUTFChars((jstring)obj, NULL);
- //LOGI("String at %d: %p = %s", i, obj, str8);
+ //ALOGI("String at %d: %p = %s", i, obj, str8);
if (str8 == NULL) {
jniThrowNullPointerException(env, "Element in reqFields");
return;
@@ -465,7 +465,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt
return;
}
- //LOGI("Clearing %d sizes", count);
+ //ALOGI("Clearing %d sizes", count);
for (i=0; i<count; i++) {
sizesArray[i] = 0;
}
@@ -479,7 +479,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt
close(fd);
if (len < 0) {
- LOGW("Unable to read %s", file.string());
+ ALOGW("Unable to read %s", file.string());
len = 0;
}
buffer[len] = 0;
@@ -489,7 +489,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt
char* p = buffer;
while (*p && foundCount < count) {
bool skipToEol = true;
- //LOGI("Parsing at: %s", p);
+ //ALOGI("Parsing at: %s", p);
for (i=0; i<count; i++) {
const String8& field = fields[i];
if (strncmp(p, field.string(), field.length()) == 0) {
@@ -504,7 +504,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt
}
char* end;
sizesArray[i] = strtoll(num, &end, 10);
- //LOGI("Field %s = %d", field.string(), sizesArray[i]);
+ //ALOGI("Field %s = %d", field.string(), sizesArray[i]);
foundCount++;
break;
}
@@ -521,10 +521,10 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt
free(buffer);
} else {
- LOGW("Unable to open %s", file.string());
+ ALOGW("Unable to open %s", file.string());
}
- //LOGI("Done!");
+ //ALOGI("Done!");
env->ReleaseLongArrayElements(outFields, sizesArray, 0);
}
@@ -570,7 +570,7 @@ jintArray android_os_Process_getPids(JNIEnv* env, jobject clazz,
char* end;
int pid = strtol(entry->d_name, &end, 10);
- //LOGI("File %s pid=%d\n", entry->d_name, pid);
+ //ALOGI("File %s pid=%d\n", entry->d_name, pid);
if (curPos >= curCount) {
jsize newCount = (curCount == 0) ? 10 : (curCount*2);
jintArray newArray = env->NewIntArray(newCount);
@@ -693,7 +693,7 @@ jboolean android_os_Process_parseProcLineArray(JNIEnv* env, jobject clazz,
}
}
- //LOGI("Field %d: %d-%d dest=%d mode=0x%x\n", i, start, end, di, mode);
+ //ALOGI("Field %d: %d-%d dest=%d mode=0x%x\n", i, start, end, di, mode);
if ((mode&(PROC_OUT_FLOAT|PROC_OUT_LONG|PROC_OUT_STRING)) != 0) {
char c = buffer[end];
@@ -759,7 +759,7 @@ jboolean android_os_Process_readProcFile(JNIEnv* env, jobject clazz,
env->ReleaseStringUTFChars(file, file8);
if (fd < 0) {
- //LOGW("Unable to open process file: %s\n", file8);
+ //ALOGW("Unable to open process file: %s\n", file8);
return JNI_FALSE;
}
@@ -768,7 +768,7 @@ jboolean android_os_Process_readProcFile(JNIEnv* env, jobject clazz,
close(fd);
if (len < 0) {
- //LOGW("Unable to open process file: %s fd=%d\n", file8, fd);
+ //ALOGW("Unable to open process file: %s fd=%d\n", file8, fd);
return JNI_FALSE;
}
buffer[len] = 0;
@@ -792,7 +792,7 @@ void android_os_Process_setApplicationObject(JNIEnv* env, jobject clazz,
void android_os_Process_sendSignal(JNIEnv* env, jobject clazz, jint pid, jint sig)
{
if (pid > 0) {
- LOGI("Sending signal. PID: %d SIG: %d", pid, sig);
+ ALOGI("Sending signal. PID: %d SIG: %d", pid, sig);
kill(pid, sig);
}
}
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index f61795d6ed45..25397b5d078f 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -84,7 +84,7 @@ NativeDisplayEventReceiver::~NativeDisplayEventReceiver() {
status_t NativeDisplayEventReceiver::initialize() {
status_t result = mReceiver.initCheck();
if (result) {
- LOGW("Failed to initialize display event receiver, status=%d", result);
+ ALOGW("Failed to initialize display event receiver, status=%d", result);
return result;
}
@@ -103,13 +103,13 @@ status_t NativeDisplayEventReceiver::scheduleVsync() {
}
if (n < 0) {
- LOGW("Failed to drain events from display event receiver, status=%d", status_t(n));
+ ALOGW("Failed to drain events from display event receiver, status=%d", status_t(n));
return status_t(n);
}
status_t status = mReceiver.requestNextVsync();
if (status) {
- LOGW("Failed to request next vsync, status=%d", status);
+ ALOGW("Failed to request next vsync, status=%d", status);
return status;
}
@@ -131,14 +131,14 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events,
sp<NativeDisplayEventReceiver> r = static_cast<NativeDisplayEventReceiver*>(data);
if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
- LOGE("Display event receiver pipe was closed or an error occurred. "
+ ALOGE("Display event receiver pipe was closed or an error occurred. "
"events=0x%x", events);
r->mFdCallbackRegistered = false;
return 0; // remove the callback
}
if (!(events & ALOOPER_EVENT_INPUT)) {
- LOGW("Received spurious callback for unhandled poll event. "
+ ALOGW("Received spurious callback for unhandled poll event. "
"events=0x%x", events);
return 1; // keep the callback
}
@@ -177,7 +177,7 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events,
ALOGV("receiver %p ~ Returned from vsync handler.", this);
if (env->ExceptionCheck()) {
- LOGE("An exception occurred while dispatching a vsync event.");
+ ALOGE("An exception occurred while dispatching a vsync event.");
LOGE_EX(env);
env->ExceptionClear();
}
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 383d5ae7fcf1..23ad15453bb2 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -491,7 +491,7 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
#if USE_TEXT_LAYOUT_CACHE
value = TextLayoutCache::getInstance().getValue(paint, text, 0, count, count, flags);
if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value for text = '%s'",
+ ALOGE("Cannot get TextLayoutCache value for text = '%s'",
String8(text, count).string());
return;
}
@@ -513,7 +513,7 @@ static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
#if USE_TEXT_LAYOUT_CACHE
value = TextLayoutCache::getInstance().getValue(paint, text, start, count, contextCount, flags);
if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value for text = '%s'",
+ ALOGE("Cannot get TextLayoutCache value for text = '%s'",
String8(text + start, count).string());
return;
}
diff --git a/core/jni/android_view_InputChannel.cpp b/core/jni/android_view_InputChannel.cpp
index 5fcf8faa3473..fce432bf5d0d 100644
--- a/core/jni/android_view_InputChannel.cpp
+++ b/core/jni/android_view_InputChannel.cpp
@@ -101,7 +101,7 @@ void android_view_InputChannel_setDisposeCallback(JNIEnv* env, jobject inputChan
NativeInputChannel* nativeInputChannel =
android_view_InputChannel_getNativeInputChannel(env, inputChannelObj);
if (nativeInputChannel == NULL) {
- LOGW("Cannot set dispose callback because input channel object has not been initialized.");
+ ALOGW("Cannot set dispose callback because input channel object has not been initialized.");
} else {
nativeInputChannel->setDisposeCallback(callback, data);
}
@@ -161,7 +161,7 @@ static void android_view_InputChannel_nativeDispose(JNIEnv* env, jobject obj, jb
android_view_InputChannel_getNativeInputChannel(env, obj);
if (nativeInputChannel) {
if (finalized) {
- LOGW("Input channel object '%s' was finalized without being disposed!",
+ ALOGW("Input channel object '%s' was finalized without being disposed!",
nativeInputChannel->getInputChannel()->getName().string());
}
@@ -202,17 +202,17 @@ static void android_view_InputChannel_nativeReadFromParcel(JNIEnv* env, jobject
int32_t parcelAshmemFd = parcel->readFileDescriptor();
int32_t ashmemFd = dup(parcelAshmemFd);
if (ashmemFd < 0) {
- LOGE("Error %d dup ashmem fd %d.", errno, parcelAshmemFd);
+ ALOGE("Error %d dup ashmem fd %d.", errno, parcelAshmemFd);
}
int32_t parcelReceivePipeFd = parcel->readFileDescriptor();
int32_t receivePipeFd = dup(parcelReceivePipeFd);
if (receivePipeFd < 0) {
- LOGE("Error %d dup receive pipe fd %d.", errno, parcelReceivePipeFd);
+ ALOGE("Error %d dup receive pipe fd %d.", errno, parcelReceivePipeFd);
}
int32_t parcelSendPipeFd = parcel->readFileDescriptor();
int32_t sendPipeFd = dup(parcelSendPipeFd);
if (sendPipeFd < 0) {
- LOGE("Error %d dup send pipe fd %d.", errno, parcelSendPipeFd);
+ ALOGE("Error %d dup send pipe fd %d.", errno, parcelSendPipeFd);
}
if (ashmemFd < 0 || receivePipeFd < 0 || sendPipeFd < 0) {
if (ashmemFd >= 0) ::close(ashmemFd);
diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp
index c8f1f51fe0dc..ed0acce699b9 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -95,7 +95,7 @@ NativeInputEventReceiver::~NativeInputEventReceiver() {
status_t NativeInputEventReceiver::initialize() {
status_t result = mInputConsumer.initialize();
if (result) {
- LOGW("Failed to initialize input consumer for input channel '%s', status=%d",
+ ALOGW("Failed to initialize input consumer for input channel '%s', status=%d",
getInputChannelName(), result);
return result;
}
@@ -114,12 +114,12 @@ status_t NativeInputEventReceiver::finishInputEvent(bool handled) {
status_t status = mInputConsumer.sendFinishedSignal(handled);
if (status) {
- LOGW("Failed to send finished signal on channel '%s'. status=%d",
+ ALOGW("Failed to send finished signal on channel '%s'. status=%d",
getInputChannelName(), status);
}
return status;
} else {
- LOGW("Ignoring attempt to finish input event while no event is in progress.");
+ ALOGW("Ignoring attempt to finish input event while no event is in progress.");
return OK;
}
}
@@ -128,26 +128,26 @@ int NativeInputEventReceiver::handleReceiveCallback(int receiveFd, int events, v
sp<NativeInputEventReceiver> r = static_cast<NativeInputEventReceiver*>(data);
if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
- LOGE("channel '%s' ~ Publisher closed input channel or an error occurred. "
+ ALOGE("channel '%s' ~ Publisher closed input channel or an error occurred. "
"events=0x%x", r->getInputChannelName(), events);
return 0; // remove the callback
}
if (!(events & ALOOPER_EVENT_INPUT)) {
- LOGW("channel '%s' ~ Received spurious callback for unhandled poll event. "
+ ALOGW("channel '%s' ~ Received spurious callback for unhandled poll event. "
"events=0x%x", r->getInputChannelName(), events);
return 1;
}
status_t status = r->mInputConsumer.receiveDispatchSignal();
if (status) {
- LOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d",
+ ALOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d",
r->getInputChannelName(), status);
return 0; // remove the callback
}
if (r->mEventInProgress) {
- LOGW("channel '%s' ~ Publisher sent spurious dispatch signal.",
+ ALOGW("channel '%s' ~ Publisher sent spurious dispatch signal.",
r->getInputChannelName());
return 1;
}
@@ -155,7 +155,7 @@ int NativeInputEventReceiver::handleReceiveCallback(int receiveFd, int events, v
InputEvent* inputEvent;
status = r->mInputConsumer.consume(&r->mInputEventFactory, &inputEvent);
if (status) {
- LOGW("channel '%s' ~ Failed to consume input event. status=%d",
+ ALOGW("channel '%s' ~ Failed to consume input event. status=%d",
r->getInputChannelName(), status);
r->mInputConsumer.sendFinishedSignal(false);
return 1;
@@ -188,7 +188,7 @@ int NativeInputEventReceiver::handleReceiveCallback(int receiveFd, int events, v
}
if (!inputEventObj) {
- LOGW("channel '%s' ~ Failed to obtain event object.",
+ ALOGW("channel '%s' ~ Failed to obtain event object.",
r->getInputChannelName());
r->mInputConsumer.sendFinishedSignal(false);
return 1;
@@ -206,7 +206,7 @@ int NativeInputEventReceiver::handleReceiveCallback(int receiveFd, int events, v
#endif
if (env->ExceptionCheck()) {
- LOGE("channel '%s' ~ An exception occurred while dispatching an event.",
+ ALOGE("channel '%s' ~ An exception occurred while dispatching an event.",
r->getInputChannelName());
LOGE_EX(env);
env->ExceptionClear();
diff --git a/core/jni/android_view_KeyEvent.cpp b/core/jni/android_view_KeyEvent.cpp
index 4b04b8b3db2f..27469a22f06f 100644
--- a/core/jni/android_view_KeyEvent.cpp
+++ b/core/jni/android_view_KeyEvent.cpp
@@ -63,7 +63,7 @@ jobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) {
event->getSource(),
NULL);
if (env->ExceptionCheck()) {
- LOGE("An exception occurred while obtaining a key event.");
+ ALOGE("An exception occurred while obtaining a key event.");
LOGE_EX(env);
env->ExceptionClear();
return NULL;
@@ -93,7 +93,7 @@ status_t android_view_KeyEvent_toNative(JNIEnv* env, jobject eventObj,
status_t android_view_KeyEvent_recycle(JNIEnv* env, jobject eventObj) {
env->CallVoidMethod(eventObj, gKeyEventClassInfo.recycle);
if (env->ExceptionCheck()) {
- LOGW("An exception occurred while recycling a key event.");
+ ALOGW("An exception occurred while recycling a key event.");
LOGW_EX(env);
env->ExceptionClear();
return UNKNOWN_ERROR;
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index fef06b2561c6..2def1d14b7f3 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -80,7 +80,7 @@ jobject android_view_MotionEvent_obtainAsCopy(JNIEnv* env, const MotionEvent* ev
jobject eventObj = env->CallStaticObjectMethod(gMotionEventClassInfo.clazz,
gMotionEventClassInfo.obtain);
if (env->ExceptionCheck() || !eventObj) {
- LOGE("An exception occurred while obtaining a motion event.");
+ ALOGE("An exception occurred while obtaining a motion event.");
LOGE_EX(env);
env->ExceptionClear();
return NULL;
@@ -99,7 +99,7 @@ jobject android_view_MotionEvent_obtainAsCopy(JNIEnv* env, const MotionEvent* ev
status_t android_view_MotionEvent_recycle(JNIEnv* env, jobject eventObj) {
env->CallVoidMethod(eventObj, gMotionEventClassInfo.recycle);
if (env->ExceptionCheck()) {
- LOGW("An exception occurred while recycling a motion event.");
+ ALOGW("An exception occurred while recycling a motion event.");
LOGW_EX(env);
env->ExceptionClear();
return UNKNOWN_ERROR;
diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp
index 091341a3c3fc..8b6dc60e1c7e 100644
--- a/core/jni/android_view_PointerIcon.cpp
+++ b/core/jni/android_view_PointerIcon.cpp
@@ -43,7 +43,7 @@ jobject android_view_PointerIcon_getSystemIcon(JNIEnv* env, jobject contextObj,
jobject pointerIconObj = env->CallStaticObjectMethod(gPointerIconClassInfo.clazz,
gPointerIconClassInfo.getSystemIcon, contextObj, style);
if (env->ExceptionCheck()) {
- LOGW("An exception occurred while getting a pointer icon with style %d.", style);
+ ALOGW("An exception occurred while getting a pointer icon with style %d.", style);
LOGW_EX(env);
env->ExceptionClear();
return NULL;
@@ -62,7 +62,7 @@ status_t android_view_PointerIcon_load(JNIEnv* env, jobject pointerIconObj, jobj
jobject loadedPointerIconObj = env->CallObjectMethod(pointerIconObj,
gPointerIconClassInfo.load, contextObj);
if (env->ExceptionCheck() || !loadedPointerIconObj) {
- LOGW("An exception occurred while loading a pointer icon.");
+ ALOGW("An exception occurred while loading a pointer icon.");
LOGW_EX(env);
env->ExceptionClear();
return UNKNOWN_ERROR;
diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp
index 516e4215a679..0da90d7c66c7 100644
--- a/core/jni/android_view_VelocityTracker.cpp
+++ b/core/jni/android_view_VelocityTracker.cpp
@@ -154,7 +154,7 @@ static void android_view_VelocityTracker_nativeAddMovement(JNIEnv* env, jclass c
jobject eventObj) {
const MotionEvent* event = android_view_MotionEvent_getNativePtr(env, eventObj);
if (!event) {
- LOGW("nativeAddMovement failed because MotionEvent was finalized.");
+ ALOGW("nativeAddMovement failed because MotionEvent was finalized.");
return;
}
diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
index 62ea27747a68..79be2b2d938b 100644
--- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
+++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
@@ -216,18 +216,18 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr
if (strlcpy(localTmpFileName + nativeLibPath.size(), TMP_FILE_PATTERN,
TMP_FILE_PATTERN_LEN - nativeLibPath.size()) != TMP_FILE_PATTERN_LEN) {
- LOGI("Couldn't allocate temporary file name for library");
+ ALOGI("Couldn't allocate temporary file name for library");
return INSTALL_FAILED_INTERNAL_ERROR;
}
int fd = mkstemp(localTmpFileName);
if (fd < 0) {
- LOGI("Couldn't open temporary file name: %s: %s\n", localTmpFileName, strerror(errno));
+ ALOGI("Couldn't open temporary file name: %s: %s\n", localTmpFileName, strerror(errno));
return INSTALL_FAILED_CONTAINER_ERROR;
}
if (!zipFile->uncompressEntry(zipEntry, fd)) {
- LOGI("Failed uncompressing %s to %s\n", fileName, localTmpFileName);
+ ALOGI("Failed uncompressing %s to %s\n", fileName, localTmpFileName);
close(fd);
unlink(localTmpFileName);
return INSTALL_FAILED_CONTAINER_ERROR;
@@ -241,7 +241,7 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr
times[1].tv_sec = modTime;
times[0].tv_usec = times[1].tv_usec = 0;
if (utimes(localTmpFileName, times) < 0) {
- LOGI("Couldn't change modification time on %s: %s\n", localTmpFileName, strerror(errno));
+ ALOGI("Couldn't change modification time on %s: %s\n", localTmpFileName, strerror(errno));
unlink(localTmpFileName);
return INSTALL_FAILED_CONTAINER_ERROR;
}
@@ -249,14 +249,14 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr
// Set the mode to 755
static const mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
if (chmod(localTmpFileName, mode) < 0) {
- LOGI("Couldn't change permissions on %s: %s\n", localTmpFileName, strerror(errno));
+ ALOGI("Couldn't change permissions on %s: %s\n", localTmpFileName, strerror(errno));
unlink(localTmpFileName);
return INSTALL_FAILED_CONTAINER_ERROR;
}
// Finally, rename it to the final name.
if (rename(localTmpFileName, localFileName) < 0) {
- LOGI("Couldn't rename %s to %s: %s\n", localTmpFileName, localFileName, strerror(errno));
+ ALOGI("Couldn't rename %s to %s: %s\n", localTmpFileName, localFileName, strerror(errno));
unlink(localTmpFileName);
return INSTALL_FAILED_CONTAINER_ERROR;
}
@@ -276,7 +276,7 @@ iterateOverNativeFiles(JNIEnv *env, jstring javaFilePath, jstring javaCpuAbi, js
ZipFileRO zipFile;
if (zipFile.open(filePath.c_str()) != NO_ERROR) {
- LOGI("Couldn't open APK %s\n", filePath.c_str());
+ ALOGI("Couldn't open APK %s\n", filePath.c_str());
return INSTALL_FAILED_INVALID_APK;
}
diff --git a/core/res/res/drawable-large-nodpi/default_wallpaper.jpg b/core/res/res/drawable-large-nodpi/default_wallpaper.jpg
index 7d7cdbbd5134..355286e3e6fc 100644
--- a/core/res/res/drawable-large-nodpi/default_wallpaper.jpg
+++ b/core/res/res/drawable-large-nodpi/default_wallpaper.jpg
Binary files differ
diff --git a/core/res/res/drawable-nodpi/default_wallpaper.jpg b/core/res/res/drawable-nodpi/default_wallpaper.jpg
index 5ba522f57ba6..7e92243809ef 100644
--- a/core/res/res/drawable-nodpi/default_wallpaper.jpg
+++ b/core/res/res/drawable-nodpi/default_wallpaper.jpg
Binary files differ
diff --git a/core/res/res/drawable-xlarge-nodpi/default_wallpaper.jpg b/core/res/res/drawable-xlarge-nodpi/default_wallpaper.jpg
index 7d7cdbbd5134..355286e3e6fc 100644
--- a/core/res/res/drawable-xlarge-nodpi/default_wallpaper.jpg
+++ b/core/res/res/drawable-xlarge-nodpi/default_wallpaper.jpg
Binary files differ
diff --git a/docs/html/guide/topics/fundamentals/activities.jd b/docs/html/guide/topics/fundamentals/activities.jd
index cb453da68827..3b311997e4b5 100644
--- a/docs/html/guide/topics/fundamentals/activities.jd
+++ b/docs/html/guide/topics/fundamentals/activities.jd
@@ -19,9 +19,10 @@ page.title=Activities
</li>
<li><a href="#StartingAnActivity">Starting an Activity</a>
<ol>
- <li><a href="#StartingAnActivityForResult">Starting an Activity for a Result</a></li>
+ <li><a href="#StartingAnActivityForResult">Starting an activity for a result</a></li>
</ol>
</li>
+ <li><a href="#ShuttingDown">Shutting Down an Activity</a></li>
<li><a href="#Lifecycle">Managing the Activity Lifecycle</a>
<ol>
<li><a href="#ImplementingLifecycleCallbacks">Implementing the lifecycle callbacks</a></li>
@@ -612,17 +613,9 @@ that
when an activity is paused or stopped, the state of the activity is retained. This is true because
the {@link android.app.Activity} object is still held in memory when it is paused or
stopped&mdash;all information about its members and current state is still alive. Thus, any changes
-the user made within the activity are retained in memory, so that when the activity returns to the
+the user made within the activity are retained so that when the activity returns to the
foreground (when it "resumes"), those changes are still there.</p>
-<div class="figure" style="width:615px">
-<img src="{@docRoot}images/fundamentals/restore_instance.png" alt="" />
-<p class="img-caption"><strong>Figure 2.</strong> The two ways in which an activity returns to user
-focus with its state intact: either the activity is stopped, then resumed and the activity state
-remains intact (left), or the activity is destroyed, then recreated and the activity must restore
-the previous activity state (right).</p>
-</div>
-
<p>However, when the system destroys an activity in order to recover memory, the {@link
android.app.Activity} object is destroyed, so the system cannot simply resume it with its state
intact. Instead, the system must recreate the {@link android.app.Activity} object if the user
@@ -630,26 +623,35 @@ navigates back to it. Yet, the user is unaware
that the system destroyed the activity and recreated it and, thus, probably
expects the activity to be exactly as it was. In this situation, you can ensure that
important information about the activity state is preserved by implementing an additional
-callback method that allows you to save information about the state of your activity and then
-restore it when the the system recreates the activity.</p>
+callback method that allows you to save information about the state of your activity: {@link
+android.app.Activity#onSaveInstanceState onSaveInstanceState()}.</p>
-<p>The callback method in which you can save information about the current state of your activity is
-{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}. The system calls this method
-before making the activity vulnerable to being destroyed and passes it
-a {@link android.os.Bundle} object. The {@link android.os.Bundle} is where you can store
+<p>The system calls {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
+before making the activity vulnerable to destruction. The system passes this method
+a {@link android.os.Bundle} in which you can save
state information about the activity as name-value pairs, using methods such as {@link
-android.os.Bundle#putString putString()}. Then, if the system kills your activity's
-process and the user navigates back to your activity, the system passes the {@link
-android.os.Bundle} to {@link android.app.Activity#onCreate onCreate()} so you can restore the
-activity state you saved during {@link android.app.Activity#onSaveInstanceState
-onSaveInstanceState()}. If there is no state information to restore, then the {@link
-android.os.Bundle} passed to {@link android.app.Activity#onCreate onCreate()} is null.</p>
+android.os.Bundle#putString putString()} and {@link
+android.os.Bundle#putInt putInt()}. Then, if the system kills your application
+process and the user navigates back to your activity, the system recreates the activity and passes
+the {@link android.os.Bundle} to both {@link android.app.Activity#onCreate onCreate()} and {@link
+android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}. Using either of these
+methods, you can extract your saved state from the {@link android.os.Bundle} and restore the
+activity state. If there is no state information to restore, then the {@link
+android.os.Bundle} passed to you is null (which is the case when the activity is created for
+the first time).</p>
+
+<img src="{@docRoot}images/fundamentals/restore_instance.png" alt="" />
+<p class="img-caption"><strong>Figure 2.</strong> The two ways in which an activity returns to user
+focus with its state intact: either the activity is destroyed, then recreated and the activity must restore
+the previously saved state, or the activity is stopped, then resumed and the activity state
+remains intact.</p>
<p class="note"><strong>Note:</strong> There's no guarantee that {@link
android.app.Activity#onSaveInstanceState onSaveInstanceState()} will be called before your
activity is destroyed, because there are cases in which it won't be necessary to save the state
(such as when the user leaves your activity using the BACK key, because the user is explicitly
-closing the activity). If the method is called, it is always called before {@link
+closing the activity). If the system calls {@link android.app.Activity#onSaveInstanceState
+onSaveInstanceState()}, it does so before {@link
android.app.Activity#onStop onStop()} and possibly before {@link android.app.Activity#onPause
onPause()}.</p>
@@ -657,17 +659,17 @@ onPause()}.</p>
android.app.Activity#onSaveInstanceState onSaveInstanceState()}, some of the activity state is
restored by the {@link android.app.Activity} class's default implementation of {@link
android.app.Activity#onSaveInstanceState onSaveInstanceState()}. Specifically, the default
-implementation calls {@link
-android.view.View#onSaveInstanceState onSaveInstanceState()} for every {@link android.view.View}
-in the layout, which allows each view to provide information about itself
+implementation calls the corresponding {@link
+android.view.View#onSaveInstanceState onSaveInstanceState()} method for every {@link
+android.view.View} in the layout, which allows each view to provide information about itself
that should be saved. Almost every widget in the Android framework implements this method as
appropriate, such that any visible changes to the UI are automatically saved and restored when your
activity is recreated. For example, the {@link android.widget.EditText} widget saves any text
entered by the user and the {@link android.widget.CheckBox} widget saves whether it's checked or
not. The only work required by you is to provide a unique ID (with the <a
href="{@docRoot}guide/topics/resources/layout-resource.html#idvalue">{@code android:id}</a>
-attribute) for each widget you want to save its state. If a widget does not have an ID, then it
-cannot save its state.</p>
+attribute) for each widget you want to save its state. If a widget does not have an ID, then the
+system cannot save its state.</p>
<div class="sidebox-wrapper">
<div class="sidebox">
@@ -689,7 +691,9 @@ restored, by default).</p>
android.app.Activity#onSaveInstanceState onSaveInstanceState()} helps save the state of the UI, if
you override the method in order to save additional state information, you should always call the
superclass implementation of {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
-before doing any work.</p>
+before doing any work. Likewise, you should also call the supercall implementation of {@link
+android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} if you override it, so the
+default implementation can restore view states.</p>
<p class="note"><strong>Note:</strong> Because {@link android.app.Activity#onSaveInstanceState
onSaveInstanceState()} is not guaranteed
@@ -701,7 +705,7 @@ to a database) when the user leaves the activity.</p>
<p>A good way to test your application's ability to restore its state is to simply rotate the
device so that the screen orientation changes. When the screen orientation changes, the system
destroys and recreates the activity in order to apply alternative resources that might be available
-for the new orientation. For this reason alone, it's very important that your activity
+for the new screen configuration. For this reason alone, it's very important that your activity
completely restores its state when it is recreated, because users regularly rotate the screen while
using applications.</p>
@@ -709,22 +713,25 @@ using applications.</p>
<h3 id="ConfigurationChanges">Handling configuration changes</h3>
<p>Some device configurations can change during runtime (such as screen orientation, keyboard
-availability, and language). When such a change occurs, Android restarts the running Activity
-({@link android.app.Activity#onDestroy} is called, followed immediately by {@link
-android.app.Activity#onCreate onCreate()}). The restart behavior is
+availability, and language). When such a change occurs, Android recreates the running activity
+(the system calls {@link android.app.Activity#onDestroy}, then immediately calls {@link
+android.app.Activity#onCreate onCreate()}). This behavior is
designed to help your application adapt to new configurations by automatically reloading your
-application with alternative resources that you've provided. If you design your activity to
-properly handle this event, it will be more resilient to unexpected events in the activity
-lifecycle.</p>
+application with alternative resources that you've provided (such as different layouts for
+different screen orientations and sizes).</p>
+
+<p>If you properly design your activity to handle a restart due to a screen orientation change and
+restore the activity state as described above, your application will be more resilient to other
+unexpected events in the activity lifecycle.</p>
-<p>The best way to handle a configuration change, such as a change in the screen orientation, is
- to simply preserve the state of your application using {@link
+<p>The best way to handle such a restart is
+ to save and restore the state of your activity using {@link
android.app.Activity#onSaveInstanceState onSaveInstanceState()} and {@link
android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} (or {@link
android.app.Activity#onCreate onCreate()}), as discussed in the previous section.</p>
-<p>For a detailed discussion about configuration changes that happen at runtime and how you should
-handle them, read <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling
+<p>For more information about configuration changes that happen at runtime and how you can handle
+them, read the guide to <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling
Runtime Changes</a>.</p>
diff --git a/docs/html/guide/topics/fundamentals/fragments.jd b/docs/html/guide/topics/fundamentals/fragments.jd
index d6ba646e5e8a..e8f6cd888ef8 100644
--- a/docs/html/guide/topics/fundamentals/fragments.jd
+++ b/docs/html/guide/topics/fundamentals/fragments.jd
@@ -33,7 +33,7 @@ parent.link=activities.html
</li>
<li><a href="#Lifecycle">Handling the Fragment Lifecycle</a>
<ol>
- <li><a href="#CoordinadingWithActivity">Coordinating with the activity lifecycle</a></li>
+ <li><a href="#CoordinatingWithActivity">Coordinating with the activity lifecycle</a></li>
</ol>
</li>
<li><a href="#Example">Example</a></li>
@@ -143,7 +143,7 @@ href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets an
<h2 id="Creating">Creating a Fragment</h2>
-<div class="figure" style="width:314px">
+<div class="figure" style="width:327px">
<img src="{@docRoot}images/fragment_lifecycle.png" alt="" />
<p class="img-caption"><strong>Figure 2.</strong> The lifecycle of a fragment (while its
activity is running).</p>
@@ -657,7 +657,7 @@ href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guides.
<h2 id="Lifecycle">Handling the Fragment Lifecycle</h2>
-<div class="figure" style="width:403px">
+<div class="figure" style="width:350px">
<img src="{@docRoot}images/activity_fragment_lifecycle.png" alt=""/>
<p class="img-caption"><strong>Figure 3.</strong> The activity lifecycle's affect on the fragment
lifecycle.</p>
diff --git a/docs/html/guide/topics/fundamentals/tasks-and-back-stack.jd b/docs/html/guide/topics/fundamentals/tasks-and-back-stack.jd
index 216420c4e2fc..5a1f7a288558 100644
--- a/docs/html/guide/topics/fundamentals/tasks-and-back-stack.jd
+++ b/docs/html/guide/topics/fundamentals/tasks-and-back-stack.jd
@@ -72,7 +72,7 @@ order in which each activity is opened.</p>
suppose you have a two-pane layout using fragments, one of which is a list view (fragment A) and the
other being a layout to display an item from the list (fragment B). When the user selects an item
from the list, fragment B is replaced by a new fragment (fragment C). In this case, it might be
-desireable for the user to navigate back to reveal fragment B, using the BACK key.</p>
+desireable for the user to navigate back to reveal fragment B, using the BACK button.</p>
<p>In order to add fragment B to the back stack so that this is possible, you must call {@link
android.app.FragmentTransaction#addToBackStack addToBackStack()} before you {@link
android.app.FragmentTransaction#commit()} the transaction that replaces fragment B with fragment
@@ -93,17 +93,17 @@ is created and the "main" activity for that application opens as the root activi
<p>When the current activity starts another, the new activity is pushed on the top of the stack and
takes focus. The previous activity remains in the stack, but is stopped. When an activity
stops, the system retains the current state of its user interface. When the user presses the BACK
-key, the current activity is popped from the top of the stack (the activity is destroyed) and the
+button, the current activity is popped from the top of the stack (the activity is destroyed) and the
previous activity resumes (the previous state of its UI is restored). Activities in the stack are
never rearranged, only pushed and popped from the stack&mdash;pushed onto the stack when started by
-the current activity and popped off when the user leaves it using the BACK key. As such, the back
+the current activity and popped off when the user leaves it using the BACK button. As such, the back
stack operates as a "last in, first out" object structure. Figure 1 visualizes
this behavior with a timeline showing the progress between activities along with the current back
stack at each point in time.</p>
<img src="{@docRoot}images/fundamentals/diagram_backstack.png" alt="" />
<p class="img-caption"><strong>Figure 1.</strong> A representation of how each new activity in a
-task adds an item to the back stack. When the user presses the BACK key, the current activity is
+task adds an item to the back stack. When the user presses the BACK button, the current activity is
destroyed and the previous activity resumes.</p>
@@ -111,22 +111,22 @@ destroyed and the previous activity resumes.</p>
previous one, until the user returns to the Home screen (or to whichever activity was running when
the task began). When all activities are removed from the stack, the task no longer exists.</p>
-<div class="figure" style="width:369px">
+<div class="figure" style="width:287px">
<img src="{@docRoot}images/fundamentals/diagram_multitasking.png" alt="" /> <p
-class="img-caption"><strong>Figure 2.</strong> Two tasks: Task A is in the background, waiting
-to be resumed, while Task B receives user interaction in the foreground.</p>
+class="img-caption"><strong>Figure 2.</strong> Two tasks: Task B receives user interaction
+in the foreground, while Task A is in the background, waiting to be resumed.</p>
</div>
-<div class="figure" style="width:178px">
+<div class="figure" style="width:215px">
<img src="{@docRoot}images/fundamentals/diagram_multiple_instances.png" alt="" /> <p
class="img-caption"><strong>Figure 3.</strong> A single activity is instantiated multiple times.</p>
</div>
<p>A task is a cohesive unit that can move to the "background" when users begin a new task or go
-to the Home screen, via the HOME key. While in the background, all the activities in the task are
+to the Home screen, via the HOME button. While in the background, all the activities in the task are
stopped, but the back stack for the task remains intact&mdash;the task has simply lost focus while
another task takes place, as shown in figure 2. A task can then return to the "foreground" so users
can pick up where they left off. Suppose, for example, that the current task (Task A) has three
-activities in its stack&mdash;two under the current activity. The user presses the HOME key, then
+activities in its stack&mdash;two under the current activity. The user presses the HOME button, then
starts a new application from the application launcher. When the Home screen appears, Task A goes
into the background. When the new application starts, the system starts a task for that application
(Task B) with its own stack of activities. After interacting with
@@ -135,7 +135,7 @@ started Task A. Now, Task A comes to the
foreground&mdash;all three activities in its stack are intact and the activity at the top of the
stack resumes. At
this point, the user can also switch back to Task B by going Home and selecting the application icon
-that started that task (or by touching and holding the HOME key to reveal recent tasks and selecting
+that started that task (or by touching and holding the HOME button to reveal recent tasks and selecting
one). This is an example of multitasking on Android.</p>
<p class="note"><strong>Note:</strong> Multiple tasks can be held in the background at once.
@@ -148,7 +148,7 @@ users to start a particular activity from more than one activity, a new instance
that activity is created and popped onto the stack (rather than bringing any previous instance of
the activity to the top). As such, one activity in your application might be instantiated multiple
times (even from different tasks), as shown in figure 3. As such, if the user navigates backward
-using the BACK key, each instance of the activity is revealed in the order they were opened (each
+using the BACK button, each instance of the activity is revealed in the order they were opened (each
with their own UI state). However, you can modify this behavior if you do not want an activity to be
instantiated more than once. How to do so is discussed in the later section about <a
href="#ManagingTasks">Managing Tasks</a>.</p>
@@ -159,13 +159,13 @@ href="#ManagingTasks">Managing Tasks</a>.</p>
<ul>
<li>When Activity A starts Activity B, Activity A is stopped, but the system retains its state
(such as scroll position and text entered into forms).
-If the user presses the BACK key while in Activity B, Activity A resumes with its state
+If the user presses the BACK button while in Activity B, Activity A resumes with its state
restored.</li>
- <li>When the user leaves a task by pressing the HOME key, the current activity is stopped and
+ <li>When the user leaves a task by pressing the HOME button, the current activity is stopped and
its task goes into the background. The system retains the state of every activity in the task. If
the user later resumes the task by selecting the launcher icon that began the task, the task comes
to the foreground and resumes the activity at the top of the stack.</li>
- <li>If the user presses the BACK key, the current activity is popped from the stack and
+ <li>If the user presses the BACK button, the current activity is popped from the stack and
destroyed. The previous activity in the stack is resumed. When an activity is destroyed, the system
<em>does not</em> retain the activity's state.</li>
<li>Activities can be instantiated multiple times, even from other tasks.</li>
@@ -247,7 +247,7 @@ flags to define how activities are associated with tasks and how the behave in t
<p class="caution"><strong>Caution:</strong> Most applications should not interrupt the default
behavior for activities and tasks. If you determine that it's necessary for your activity to modify
the default behaviors, use caution and be sure to test the usability of the activity during
-launch and when navigating back to it from other activities and tasks with the BACK key. Be sure
+launch and when navigating back to it from other activities and tasks with the BACK button. Be sure
to test for navigation behaviors that might conflict with the user's expected behavior.</p>
@@ -311,8 +311,8 @@ android.app.Activity#onNewIntent onNewIntent()}, because it's at the top of the
stack remains A-B-C-D. However, if an intent arrives for an activity of type B, then a new
instance of B is added to the stack, even if its launch mode is {@code "singleTop"}.</p>
<p class="note"><strong>Note:</strong> When a new instance of an activity is created,
-the user can press the BACK key to return to the previous activity. But when an existing instance of
-an activity handles a new intent, the user cannot press the BACK key to return to the state of
+the user can press the BACK button to return to the previous activity. But when an existing instance of
+an activity handles a new intent, the user cannot press the BACK button to return to the state of
the activity before the new intent arrived in {@link android.app.Activity#onNewIntent
onNewIntent()}.</p>
</dd>
@@ -324,7 +324,7 @@ intent to the existing instance through a call to its {@link
android.app.Activity#onNewIntent onNewIntent()} method, rather than creating a new instance. Only
one instance of the activity can exist at a time.
<p class="note"><strong>Note:</strong> Although the activity starts in a new task, the
-BACK key still returns the user to the previous activity.</p></dd>
+BACK button still returns the user to the previous activity.</p></dd>
<dt>{@code "singleInstance"}.</dt>
<dd>Same as {@code "singleTask"}, except that the system doesn't launch any other activities into
the task holding the instance. The activity is always the single and only member of its task;
@@ -342,19 +342,17 @@ already has a task running in the background, that task is brought forward to ha
intent.</p>
<p>Regardless of whether an activity starts in a new task or in the same task as the activity that
-started it, the BACK key always takes the user to the previous activity. However, if you
-start an activity from your task (Task A) that specifies the {@code singleTask} launch mode, then
-that activity might have an instance in the background that belongs to a task with its own back
-stack (Task B). In this
-case, when Task B is brought forward to handle a new intent, the BACK key first navigates
-backward through the activities in Task B before returning to
-the top-most activity in Task A. Figure 4 visualizes this type of scenario.</p>
+started it, the BACK button always takes the user to the previous activity. However, if you
+start an activity that specifies the {@code singleTask} launch mode, then if an instance of
+that activity exists in a background task, that whole task is brought to the foreground. At this
+point, the back stack now includes all activities from the task brought forward, at the top of the
+stack. Figure 4 illustrates this type of scenario.</p>
<img src="{@docRoot}images/fundamentals/diagram_backstack_singletask_multiactivity.png" alt="" />
<p class="img-caption"><strong>Figure 4.</strong> A representation of how an activity with
launch mode "singleTask" is added to the back stack. If the activity is already a part of a
-background task with its own back stack (Task B), then the entire back stack also comes
-forward, on top of the current task (Task A).</p>
+background task with its own back stack, then the entire back stack also comes
+forward, on top of the current task.</p>
<p>For more information about using launch modes in the manifest file, see the
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
@@ -447,7 +445,7 @@ flag, the system looks for a different task to house the new activity. Often, it
However, it doesn't have to be. If there's already an existing task with the same affinity as the
new activity, the activity is launched into that task. If not, it begins a new task.</p>
-<p>If this flag causes an activity to begin a new task and the user presses the HOME key to leave
+<p>If this flag causes an activity to begin a new task and the user presses the HOME button to leave
it, there must be some way for the user to navigate back to the task. Some entities (such as the
notification manager) always start activities in an external task, never as part of their own, so
they always put {@code FLAG_ACTIVITY_NEW_TASK} in the intents they pass to {@link
@@ -549,9 +547,9 @@ android.content.Intent#ACTION_MAIN}
and a {@link android.content.Intent#CATEGORY_LAUNCHER}
filter. Imagine, for example, what could happen if the filter is missing: An intent launches a
{@code "singleTask"} activity, initiating a new task, and the user spends some time working in
-that task. The user then presses the HOME key. The task is now sent to the background and not
-visible. Because it is not represented in the application launcher, the user has no way to return to
-the task.
+that task. The user then presses the HOME button. The task is now sent to the background and is
+not visible. Now the user has no way to return to the task, because it is not represented in the
+application launcher.
</p>
<p>For those cases where you don't want the user to be able to return to an activity, set the
diff --git a/docs/html/guide/topics/resources/index.jd b/docs/html/guide/topics/resources/index.jd
index 84eac735e32d..3f0f1eeb9611 100644
--- a/docs/html/guide/topics/resources/index.jd
+++ b/docs/html/guide/topics/resources/index.jd
@@ -28,18 +28,18 @@ to provide compatibility with different configurations, you must organize resour
project's {@code res/} directory, using various sub-directories that group resources by type and
configuration.</p>
-<div class="figure" style="width:421px">
-<img src="{@docRoot}images/resources/resource_devices_diagram1.png" height="137" alt="" />
+<div class="figure" style="width:429px">
+<img src="{@docRoot}images/resources/resource_devices_diagram1.png" height="167" alt="" />
<p class="img-caption">
-<strong>Figure 1.</strong> Two different devices, both using default
-resources.</p>
+<strong>Figure 1.</strong> Two different devices, each using the default layout
+(the app provides no alternative layouts).</p>
</div>
-<div class="figure" style="width:421px">
-<img src="{@docRoot}images/resources/resource_devices_diagram2.png" height="137" alt="" />
+<div class="figure" style="width:429px">
+<img src="{@docRoot}images/resources/resource_devices_diagram2.png" height="167" alt="" />
<p class="img-caption">
-<strong>Figure 2.</strong> Two different devices, one using alternative
-resources.</p>
+<strong>Figure 2.</strong> Two different devices, each using a different layout provided
+for different screen sizes.</p>
</div>
<p>For any type of resource, you can specify <em>default</em> and multiple
@@ -54,18 +54,16 @@ append an appropriate configuration qualifier to the directory name.</li>
</ul>
<p>For example, while your default UI
-layout is saved in the {@code res/layout/} directory, you might specify a different UI layout to
+layout is saved in the {@code res/layout/} directory, you might specify a different layout to
be used when the screen is in landscape orientation, by saving it in the {@code res/layout-land/}
directory. Android automatically applies the appropriate resources by matching the
device's current configuration to your resource directory names.</p>
-<p>Figure 1 demonstrates how a collection of default resources from an application are applied
-to two different devices when there are no alternative resources available. Figure 2 shows
-the same application with a set of alternative resources that qualify for one of the device
-configurations, thus, the two devices uses different resources.</p>
+<p>Figure 1 illustrates how the system applies the same layout for
+two different devices when there are no alternative resources available. Figure 2 shows
+the same application when it adds an alternative layout resource for larger screens.</p>
-<p>The information above is just an introduction to how application resources work on Android.
-The following documents provide a complete guide to how you can organize your application resources,
+<p>The following documents provide a complete guide to how you can organize your application resources,
specify alternative resources, access them in your application, and more:</p>
<dl>
diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd
index 252c153a6b3d..3a176e63de28 100644
--- a/docs/html/guide/topics/resources/providing-resources.jd
+++ b/docs/html/guide/topics/resources/providing-resources.jd
@@ -207,10 +207,10 @@ resources.</p>
<h2 id="AlternativeResources">Providing Alternative Resources</h2>
-<div class="figure" style="width:421px">
-<img src="{@docRoot}images/resources/resource_devices_diagram2.png" height="137" alt="" />
+<div class="figure" style="width:429px">
+<img src="{@docRoot}images/resources/resource_devices_diagram2.png" height="167" alt="" />
<p class="img-caption">
-<strong>Figure 1.</strong> Two different devices, one using alternative resources.</p>
+<strong>Figure 1.</strong> Two different devices, each using different layout resources.</p>
</div>
<p>Almost every application should provide alternative resources to support specific device
@@ -1021,8 +1021,8 @@ drawables from {@code drawable-en-port}.</p>
logic:</p>
-<div class="figure" style="width:280px">
-<img src="{@docRoot}images/resources/res-selection-flowchart.png" alt="" height="590" />
+<div class="figure" style="width:371px">
+<img src="{@docRoot}images/resources/res-selection-flowchart.png" alt="" height="471" />
<p class="img-caption"><strong>Figure 2.</strong> Flowchart of how Android finds the
best-matching resource.</p>
</div>
diff --git a/docs/html/images/activity_fragment_lifecycle.png b/docs/html/images/activity_fragment_lifecycle.png
index 156aa40edfe4..bab957960df1 100644
--- a/docs/html/images/activity_fragment_lifecycle.png
+++ b/docs/html/images/activity_fragment_lifecycle.png
Binary files differ
diff --git a/docs/html/images/activity_lifecycle.graffle b/docs/html/images/activity_lifecycle.graffle
new file mode 100644
index 000000000000..7475c67d70c3
--- /dev/null
+++ b/docs/html/images/activity_lifecycle.graffle
@@ -0,0 +1,9886 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>138.9.0.117994</string>
+ </array>
+ <key>CreationDate</key>
+ <string>2007-11-06 13:31:34 -0800</string>
+ <key>Creator</key>
+ <string>mcleron</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2011-12-29 11:59:46 -0800</string>
+ <key>Modifier</key>
+ <string>Scott Main</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>12</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>12</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>12</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>12</string>
+ </array>
+ </dict>
+ <key>QuickLookPreview</key>
+ <data>
+ JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9XMuSXLeR3eMrsGwuWLzAfS9leTwx
+ XlkmHbMYeyGXKVOeboruJu3Qz/pbfPJx8qKqblU3FTEjhoJIFB6JfCEzkZd/z9/lv+cO
+ f8ZlyfO05Mf3+b/zx/zm26eSj0+56J+nY37dHcYs/zcDf8hvfvf+8fj+0+cv39+nxx+x
+ VKmrLjdh4rocpq4ueRrGQ126NR8f8pv/eij51z/ptntjhzIfpqWvycbWW2PHeigY2t9Y
+ t8dqXZ2XLOsOSz1bVw5faznMee7KYVn6OT/kvhsO/dZxn/syHLq5G7a+vtY8rd0BJ5uT
+ AvN0mFeQ8JgVnOphHes2cxqxSRmKLx7g0bdnR7rPtZTDWtcpsy9XbD35itreNlPQEdlm
+ 8jDp7GxHZW3terBRVq+CUSlrRrtMa8P9ja3Z2KpMfV1ynfo8+f7Ko7cfSn76AH5eEaSS
+ fwsR+psJ1LdvIUJ93y/jgMYwVzAHjbUfS01vvxX54UadSiOkwM4wTYdSpr4P/kRHwx/2
+ KUvm+dCPQw+Sg1krDtuVMjt/SjceumHZ+IO1IaKTs4eQcycRbpjDLmEAV5N2s5GAgQS5
+ mojj+bmO+S1ICLWronZdhso11GjJLuL+q3fQNCdVza8hwtPcL31+3ad3ULLflEMHUr77
+ If9PvvvmlShvzXdHNj7/+ApUR88/2MOOzz+zJ79Kf8rvfpv/453pKvmygwlW7zow8t3x
+ FKkJrJ6XFRJ2htTd/fdfPh4/vP/Lq/zub7YD7Y0Iw1JUPNCoE6yJ9HTzKBSp3ZymHqiD
+ VVBUSC4hSEGFPo6YwC5VxLoc1gE2yYBZZ7qOdlVVEiqnP8IAdOMs4uLrjOvqOisaQkCR
+ 2ECIBGSpFznjkKRKyeUMsK0gfSfgdcAHVkVYjIKYAJ4lduRJQZY49TF/EDIF/JB/AAnn
+ ruvn2RrjPCTtqXXI15QOKxQYT9gsJzShhtDepdpW+pXkq7kMWB8zjdBlEvM/ZaNzgQI4
+ R5zOZVpM98qa2DYqE2qIzC4hSCxlgO1ilPM9lRXcf2eU42n0jSMEfXlmETu2SV/CD8/r
+ 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
+ MT7kwX+9RHGWPritBzC8+NIFpdw7rjwKU7uyAr89PbiVPQghiazl9s4dYh7hOnUkBOla
+ XqHINXEVW7hETCtclhFzj69OK6SvfMFuwxP6wsIwsVuJL/V4pdMUn3zWMc3I3CjjNpbF
+ v1qwU3MRqT28RBTMFe/rLAbc4xsQsCf763xLdy/kmxs50nSHb0nefeOfnzhHeUfUGuad
+ VgnJR6jc6KuZd1p+YIY37O0mklz/xDR992/IoA7aCmVuZHN0cmVhbQplbmRvYmoKNiAw
+ IG9iago1MzA3CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAw
+ IFIgL1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAg
+ NTg4IDE1MzZdCj4+CmVuZG9iago3IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4
+ dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9Db2xvclNwYWNlIDw8IC9DczIgMTQg
+ MCBSCi9DczEgOCAwIFIgPj4gL0V4dEdTdGF0ZSA8PCAvR3M0IDIwIDAgUiAvR3MzIDIx
+ IDAgUiAvR3MyIDIyIDAgUiAvR3MxIDIzIDAgUgo+PiAvRm9udCA8PCAvRjEuMCAxNSAw
+ IFIgL0YyLjAgMTYgMCBSID4+IC9YT2JqZWN0IDw8IC9JbTEgOSAwIFIgL0ltMiAxMSAw
+ IFIKPj4gL1NoYWRpbmcgPDwgL1NoMSAxMyAwIFIgL1NoMyAxOCAwIFIgL1NoNCAxOSAw
+ IFIgL1NoMiAxNyAwIFIgPj4gPj4KZW5kb2JqCjEzIDAgb2JqCjw8IC9Db2xvclNwYWNl
+ IDI0IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNTkuNSAtMjUuNTg0ODUgNTku
+ NDk5OTggMjUuNTg0ODcKXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZh
+ bHNlIF0gL0Z1bmN0aW9uIDI1IDAgUiA+PgplbmRvYmoKMTggMCBvYmoKPDwgL0NvbG9y
+ U3BhY2UgMjQgMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyA1OS41IC0yNS41ODQ4
+ NSA1OS40OTk5OCAyNS41ODQ4NwpdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFs
+ c2UgZmFsc2UgXSAvRnVuY3Rpb24gMjYgMCBSID4+CmVuZG9iagoxOSAwIG9iago8PCAv
+ Q29sb3JTcGFjZSAyNCAwIFIgL1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDU5LjUgLTI1
+ LjU4NDg1IDU5LjQ5OTk4IDI1LjU4NDg3Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQg
+ WyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAyNyAwIFIgPj4KZW5kb2JqCjE3IDAgb2Jq
+ Cjw8IC9Db2xvclNwYWNlIDI0IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNTku
+ NSAtMjUuNTg0ODUgNTkuNDk5OTggMjUuNTg0ODcKXSAvRG9tYWluIFsgMCAxIF0gL0V4
+ dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDI4IDAgUiA+PgplbmRvYmoKOSAw
+ IG9iago8PCAvTGVuZ3RoIDEwIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
+ Z2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JT
+ cGFjZSAyOSAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sgMzAgMCBSIC9CaXRz
+ UGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCB
+ AAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQPvAwNw6wABCmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKNDM0
+ CmVuZG9iagoxMSAwIG9iago8PCAvTGVuZ3RoIDEyIDAgUiAvVHlwZSAvWE9iamVjdCAv
+ U3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAvSW50ZXJwb2xhdGUK
+ dHJ1ZSAvQ29sb3JTcGFjZSAyOSAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sg
+ MzIgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngB7dCBAAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQPvAwNw6wABCmVuZHN0cmVhbQplbmRvYmoK
+ MTIgMCBvYmoKNDM0CmVuZG9iagozMiAwIG9iago8PCAvTGVuZ3RoIDMzIDAgUiAvVHlw
+ ZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAv
+ Q29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNv
+ bXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1dZ1viQBA2
+ IE2aAQGR3gUMiAgiVXrvoOf//yM3swEUCEXvPpiV/XCgcnkyL++0zezM2dlpnRA4IXBC
+ 4ITACYHjEGAYiUQiFcuSSBjmOLmO+xRILz2XyRVKpUocS6lQyGXnUsl/QoGRnMsUKrVG
+ p79kWYMYFste6rSaC6X8v4DASM8VKo2evTJf39jsDqcIlsNht1ktJuOlVg0g/CMRGKlM
+ caEzmG4cHn8oEuVisfiPX7EYdxcNB30u+/XVpUb1TxgA/0F+47XTd8slUplsvlAUxSrk
+ c8/pZDwa9NjMrFYlk37XHgABVDqj1RW8e3jKlyq1RrPVFsVqNZv1armYTd1HfA4zq1F8
+ TxWQAGrW4gpyj7lSrdnp9QfD0WgshjUaDQf9brtRKWQeoj67SX8h/wYNGAkQ4Mruv3vM
+ lRud/nA8nc3m8/mrGBbc52w6GQ96rVopkwh7rAa14ssQAAAXeovrNvH80ugOxlMQ/e3t
+ D6z3H7/wLv+8vb3OZ5NRv10rpLmA/UqrPJccF/wsPsVI5WrW6r1LFWqdwWQmGulXX88C
+ hOm436pkE7dOs+5rECAABps/lik3++PZnP/2xfD9rxB4f19iMOzWC48Rt0Wv+gILGAkC
+ ELzPVjtD4D+y/9OlRfIWbpoow2zcb5bSd56vQAA2AAFI5GrdEa8AIhF64zZ5DF7nk0G7
+ /MR5LXrl+ZGBARhBFgDI13tjAACus3Fl8fzI02A+HQIEwALdkR6BOVdd3gQQgAmvAeJF
+ AL4rognTYQcgcJu0R0HASBW6a188VwMAxOIA97ESrcHrDFiQjjiv1LLDPhGsoNbk4Z6r
+ 3TFhwL6Li+JvRBNep8NW6TFkN1wcNgVgBIyOSLrS4W2AKITcf5MLCAbNQiJg1SsPBYeM
+ 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
+ VyxX6zDEovXjx1jALTabjVr1pfD8GA977eZL9TdnWAAhQBPkMMfE4vCG7u4f08+5fKHw
+ 80eZFGCMSTaTeohFAm6bidUovz/HhMdAcaFlTVa72xcMR+44DsbZ/PDFwSibSCjgddos
+ Rj3MsvnXwU7IA5VaxxpNFisONBLBstttN1bzlUGvvVDI/lV+tI0w0ksmV15otGSoFQvr
+ B8+1wtuDkVZ6nVZ9ofg/M60QAwQB5pqJZbCZcjnW7B/HWRHRP/5hRDTcDqbw/efZdh84
+ nN6dEDghcEKARgT+AgHb0MwKZW5kc3RyZWFtCmVuZG9iagozMyAwIG9iagoyNjI4CmVu
+ ZG9iagozMCAwIG9iago8PCAvTGVuZ3RoIDMxIDAgUiAvVHlwZSAvWE9iamVjdCAvU3Vi
+ dHlwZSAvSW1hZ2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAvQ29sb3JTcGFjZQovRGV2
+ aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0
+ ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1dZ1viQBA2IE2aAQGRDgICBkQ6iEjv
+ HfT8/3/kZjaAAqHo3Qezsh8OVC5P5uWdtpmdOTs7rRMCJwROCJwQOCFwHAIMI5FIpGJZ
+ EgnDHCfXcZ8C6aXnMrlCqVSJYykVCrnsXCr5TygwknOZQqXW6PSXLGsQw2LZS51Wc6GU
+ /xcQGOm5QqXRs1fm6xub3eEUwXI47DarxWS81KoBhH8kAiOVKS50BtONw3MbDEe4aDT2
+ 41c0yt1HQgGfy359dalR/RMGwH+Q33jt9N1x8VQ2/1R8FsUqPhVy6UQsEvDYzKxWJZN+
+ 1x4AAVQ6o9UVuH/MPJUqtUaz1RbFajWb9Wr5OZ96CPscZlaj+J4qIAHUrMUV4JKFUq3Z
+ 6fUHw9FoLIY1Gg0H/W67USlmHyM+u0l/If8GDRgJEODKfnufLJQbnf5wPJ3N5vP5qxgW
+ 3OdsOhkPeq1aKRsPeawGteLLEAAAF3qL6y6ee2l0B+MpiP729gfW+49feJd/3t5e57PJ
+ qN+uFdOc336lVZ5Ljgt+Fp9ipHI1a/Xep4q1zmAyE430q69nAcJ03G9V8vE7p1n3NQgQ
+ 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
+ QQOgT2nrBVu1QsPeQ1ZwqQl8q1Z/LFdpDxadOsUXGfDyQzIw7jVKqciXAECHIFOzNz4u
+ 89LsQb9q8dGAiE8aV0+GndpTIuT6cstmtAXXnkgSe1ZDz2ax6QLhPyjAdNRrlnPxoMP0
+ xZ7VhAUqvdkZfMiV6oDBdAnCzzcJC/aTvuXDXrtaTHG3NiN28F8q+ZGv0LxfqTXafJFE
+ /qXe7g3HE0AB109vXk9ucga960eDbrP6nHm4c12z6iPd4Do4OL/g0uL0c4l8qdpod2F+
+ AQww+PETDOAWcXxBr9Oql4uZeNhru9J9d4wFzrDQGq6d/kg8XXguV+swxKL148dYwC02
+ m41a9aWYS8ZCXrv5Uv3NGRZACNAEOcwxsTi8wfuHZDpXeCoWf/4okyKMMclnU4/RsN9t
+ M7Ea5ffnmPAYKC60rMlqd/sCofA9x8E4mx++OBhlEw76vU6bxaiHWTb/OtgJeaBS61ij
+ yWLFgUYiWHa77cZqvjLotRcK2b/Kj7YRRnrJ5MoLjZYMtWJh/eC5Vnh7MNJKr9OqLxT/
+ Z6YVYoAgwFwzsQw2Uy7Hmv3jOCsi+sc/jIiG28EUvv882+4Dh9O7EwInBE4I0IjAXxMa
+ 0M0KZW5kc3RyZWFtCmVuZG9iagozMSAwIG9iagoyNjI4CmVuZG9iagoyMCAwIG9iago8
+ PCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAwLjY1ID4+CmVuZG9iagoyMSAwIG9iago8PCAv
+ VHlwZSAvRXh0R1N0YXRlIC9jYSAxID4+CmVuZG9iagoyMiAwIG9iago8PCAvVHlwZSAv
+ RXh0R1N0YXRlIC9jYSAwLjcgPj4KZW5kb2JqCjIzIDAgb2JqCjw8IC9UeXBlIC9FeHRH
+ U3RhdGUgL0NBIDAuNyA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL0xlbmd0aCAzNSAwIFIg
+ L04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngB1XlnWBTLs3fPbF52l5zTknPOOYMkiRKVnDNLDiIgIEFBQBEBRUFFRAVR
+ oiRRUMSDiIIKBoJIEBUDgoLyDnrO+d/3ufd+e7+8/Tzb+5uq6uqaqe6eqhoAOFe8o6LC
+ YAYAwiNiafZmhlQXVzcqbgoQAQ+gB7xA0ds3JsrA1tYK/K/t2wSAdpiPZXZ0/a9i/zOD
+ 0c8/xhcAyBZh+/jF+IYj+AYAsKFvFC0WANQGQh9NiI1CMPoeglloiIEIfrGDA//g1R3s
+ 8xtj0L9lHO2NAMBwAIAneXvTAgEgCyN0arxvIKKHbAwAlinCLzgCAGYXBOv6Bnn7AcBZ
+ jshIh4dH7uA7CBb3+S96Av8L9vb2+Vent3fgv/jPvSAjkYmNg2OiwryTfl/8v+zCw+KQ
+ 5/W7MSE9KSJs945v2JDfop+3sSXyz4P8fkWF/fYZIgNx+UfscUBoO1g6wme3zd9YN4Bm
+ ao9gZCxkGxVruIORZwYFRMXaOv5NT0sOMtqNYBJCP+YfY/KPnjMh3hY7PqMg9GZanP0e
+ BAsjuC8m3sEEwciKgt4kBzk6/y3z1c/f+G86DAcEm5r/kYGZgmPNd+ZiQXwuGBppuWMD
+ MhesCixBGPAHcYCG9BFABlgBI2D8dy8DAoA3wolHeDEgFLxFcDgyIhIZE4lg6t9yRv+N
+ Yvp7XCAy7v/WSAW+iGzcv3P+mY2KzPmPzmDgh+B/6N7IHDu8HetiPIMz/zPnPxI7+n5b
+ I98gvyS/9Y9NaFG0IloFbYjWQeuiNQAVzYbmAjJoZbQ62gCth9ZCeBrAFLxBNAf+Y+OO
+ /vDmgPjyyCRNpyCEu3PvPv9wgdNv6eB/r/+bBSB4ZKVt5R8LAIj1T0T2AQBGkVFJtODA
+ oFiqAbJz/aWp5hG+stJURXkFhR32/zdt58z6Y+wX+99nEcT28D+0SORmNHbOmIP/oXl9
+ AKAtBNmmTP+hibYBQK8IwNAJ3zha/B996J0/DHIa0iMrlBPwASEgjjxnRaAKtIA+MAEW
+ wAY4AlfggayfIGQN0kACSAUZIAcUgKPgOKgA1aAWXARXQDNoA13gFhgEw2AUjIMpMA3m
+ wTuwCr6BTQiCcBAZYoY4IX5IBJKCFCF1SBcygawge8gV8oICoQgoDkqFDkIFUAlUAZ2F
+ 6qFrUAd0CxqCHkHPoRloCfoM/YBRMAlmgXlhUVgOVocNYEvYEd4HB8LRcDKcBRfC5XAN
+ fBluhW/Bw/A4PA2/g9dQAEWHYkMJoGRQ6igjlA3KDRWAoqHSUPmoMlQN6iqqE3UX9Rg1
+ jVpBfUdj0cxoKloGWae70HvQvuhodBr6MLoCfRHdir6DfoyeQa+if2HIGB6MFEYTY45x
+ wQRiEjA5mDLMBUwLZgAzjpnHfMNisWxYMawadhfWFRuCTcEexp7CNmL7sI+wc9g1HA7H
+ iZPC6eBscN64WFwO7iTuMq4XN4abx23g6fD8eEW8Kd4NH4HPxJfhL+F78GP4BfwmgYEg
+ QtAk2BD8CEmEIsI5QifhIWGesElkJIoRdYiOxBBiBrGceJU4QHxB/EJHRydIp0FnRxdM
+ l05XTtdEd49uhu47iYkkSTIi7SXFkQpJdaQ+0nPSFzKZLErWJ7uRY8mF5HrybfIr8gaF
+ mSJLMaf4UQ5QKimtlDHKB3oCvQi9Ab0HfTJ9Gf11+of0KwwEBlEGIwZvhjSGSoYOhqcM
+ a4zMjAqMNozhjIcZLzEOMS4y4ZhEmUyY/JiymGqZbjPNMaOYhZiNmH2ZDzKfYx5gnmfB
+ soixmLOEsBSwXGEZYVllZWJVZnViTWStZO1mnWZDsYmymbOFsRWxNbNNsP1g52U3YPdn
+ z2O/yj7Gvs7BzaHP4c+Rz9HIMc7xg5PKacIZylnM2cb5kgvNJcllx5XAdZprgGuFm4Vb
+ i9uXO5+7mXuSB+aR5LHnSeGp5XnAs8bLx2vGG8V7kvc27wofG58+XwjfMb4eviV+Zn5d
+ /mD+Y/y9/MtUVqoBNYxaTr1DXRXgEdglECdwVmBEYFNQTHCPYKZgo+BLIaKQulCA0DGh
+ fqFVYX5ha+FU4QbhSRGCiLpIkMgJkbsi66Jios6ih0TbRBfFOMTMxZLFGsReiJPF9cSj
+ xWvEn0hgJdQlQiVOSYxKwpIqkkGSlZIPpWApValgqVNSj6Qx0hrSEdI10k9lSDIGMvEy
+ DTIzsmyyVrKZsm2yH+SE5dzkiuXuyv2SV5EPkz8nP6XApGChkKnQqfBZUVLRV7FS8YkS
+ WclU6YBSu9InZSllf+XTys9UmFWsVQ6p9Kv8VFVTpaleVV1SE1bzUqtSe6rOom6rflj9
+ ngZGw1DjgEaXxndNVc1YzWbNj1oyWqFal7QWtcW0/bXPac/pCOp465zVmdal6nrpntGd
+ 1hPQ89ar0ZvVF9L307+gv2AgYRBicNngg6G8Ic2wxXDdSNNov1GfMcrYzDjfeMSEyWSP
+ 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
+ lru+2FLXFtwh0/m5q7Mns8+qn/323EDT3dQhi2HOB6Mjex7OPUp+zPdkZKLgmcOk6Avo
+ 5ezrwZmGuaJ52oLDEvdy9YrY+2sfdVdHPnt++biWvk6/cfIH32b1T65fRb/9zw4MQBRS
+ OXoIthHfB0AnoQHoCywI2yM1nDZ4BanVuCD7fQiNQmqIyeg29BpGBROP6cZisDbYSuwy
+ Tgt3FLeIN8afI+AJUYQXRCtiH50a4mlD0gOyK3mZkkbPSt/EYMPwibGMSZdpifkUiwMr
+ mfU+Wx67FQcTxyTneS4atwEPM8873kG+c/w51FABR0EDIUVhMRF+UW4xLnGqhJSkhpSl
+ tLdMqmyFXLf8G0WKkrYyTeWq6kd1FY0MzTFtcZ0s3bf6VgZtRlLG50wFzGrNJSxarIyt
+ n9lE2ZHsmxzdkf3a7Rrvrrx3w6PP64iPh59qACnweXBFqHnYUkRS5FZ0LG0+1jbuegJj
+ Ii3pSYpm6tk0ugOJ6QuZLgcfZBvmdOYq57UW6BweKnQtelecVsp4rKZM7kTHSd2K3irt
+ U63VmDNWZ4/XvD4neT7hwsBF1vqAS52XKVf8rnY1sV6Lah6+IY5kPu/b7TrabvJ15XR/
+ 6HXuu9Uvdfv4ne3BkLtPhvTvNzxg+ytm5P4o96OgscuPl8eFJpyfZj67+Pz+5PzU1kuG
+ V/yvpaZVZjRndef03+jP677VXFBbVFiSXBZ8R3m3tNLxPuGDyoeVj+dXXT8RP3V9DvjC
+ 8KX96941sFbzzfDb7PqBDZ6Nju97vq/+OLwpttm/5bG18bP0l9yvoW2/Hf/HBCghdUik
+ QSRDpPz4anv7iyiSVJQA8LN4e3uzZnv7Zy2SbCDfQPrC/nyv2BHGIjX3qms76H9q/we0
+ 8H6NCmVuZHN0cmVhbQplbmRvYmoKMzUgMCBvYmoKNTk2MwplbmRvYmoKMjkgMCBvYmoK
+ WyAvSUNDQmFzZWQgMzQgMCBSIF0KZW5kb2JqCjM2IDAgb2JqCjw8IC9MZW5ndGggMzcg
+ MCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
+ ID4+CnN0cmVhbQp4AYVUz2sTQRT+Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQ
+ ZDNJ1m426+4mtaWI5OLRKt5F7aEH/4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z
+ 3jfvfW923wANctI09YAE5A3HUqIRaWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+B
+ W1bDe/t3snetmtK2mgeE/UDgR5rZKrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUP
+ Kz3EWSJ8QDUtzn9NuFPNJdNAg0g4lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO
+ 9g6QvZ30fk6z3j7CIcILGa0/RriNnvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBN
+ J6JUcdkuDfGYrv1W8kqCcJA4ymRhgHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3v
+ RdoCrzAOHQwaDJoNSFAQRQRhmLBQQIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23
+ UaTdPP4oInGUQ7UIkvxB/iqvyU/lefnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58
+ ldR2k1dHlqx5erya7Bo/7FeXMeaCNY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/
+ Oz3iLs8utdZzrYmLN1abl2f9akj77qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS
+ 2EurC+JgbccInZWGKdJtkfok1WBgmrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v
+ +o/bx/wX5PeK558oAi9s4MiZum1Tce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1
+ nyC8ARx2h3oe6CmY05aWzTlShyyfk7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4c
+ oTlC98SnSmWT+q/xEbD9sFL5+axS2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2Jq
+ CjM3IDAgb2JqCjczNwplbmRvYmoKMjQgMCBvYmoKWyAvSUNDQmFzZWQgMzYgMCBSIF0K
+ ZW5kb2JqCjM4IDAgb2JqCjw8IC9MZW5ndGggMzkgMCBSIC9OIDMgL0FsdGVybmF0ZSAv
+ RGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVUz2sTQRT+
+ Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQZDNJ1m426+4mtaWI5OLRKt5F7aEH
+ /4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z3jfvfW923wANctI09YAE5A3HUqIR
+ aWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+BW1bDe/t3snetmtK2mgeE/UDgR5rZ
+ KrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUPKz3EWSJ8QDUtzn9NuFPNJdNAg0g4
+ lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO9g6QvZ30fk6z3j7CIcILGa0/RriN
+ nvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBNJ6JUcdkuDfGYrv1W8kqCcJA4ymRh
+ gHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3vRdoCrzAOHQwaDJoNSFAQRQRhmLBQ
+ QIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23UaTdPP4oInGUQ7UIkvxB/iqvyU/l
+ efnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58ldR2k1dHlqx5erya7Bo/7FeXMeaC
+ NY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/Oz3iLs8utdZzrYmLN1abl2f9akj7
+ 7qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS2EurC+JgbccInZWGKdJtkfok1WBg
+ mrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v+o/bx/wX5PeK558oAi9s4MiZum1T
+ ce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1nyC8ARx2h3oe6CmY05aWzTlShyyf
+ k7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4coTlC98SnSmWT+q/xEbD9sFL5+axS
+ 2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2JqCjM5IDAgb2JqCjczNwplbmRvYmoK
+ OCAwIG9iagpbIC9JQ0NCYXNlZCAzOCAwIFIgXQplbmRvYmoKNDAgMCBvYmoKPDwgL0xl
+ bmd0aCA0MSAwIFIgL04gMSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0ZXIgL0Zs
+ YXRlRGVjb2RlID4+CnN0cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSmsrKDadnVZ
+ lW1bldKiGGffuqOzM9Ob2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo+83s6iiE
+ b3k73/v9/X7fe0RtnabvOylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx67mSv7vX
+ 1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6sGvAjogMP
+ mrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3RKG8D65E
+ Gc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT4/j2EKU+
+ yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YXrlPge4Q9
+ NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeAO2EfWapm
+ CrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnc
+ zSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y163DmuvZ0b
+ VWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+
+ LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2evva8h5t
+ yqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+
+ G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHy
+ tFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2JqCjQxIDAgb2JqCjcwNAplbmRvYmoKMTQg
+ MCBvYmoKWyAvSUNDQmFzZWQgNDAgMCBSIF0KZW5kb2JqCjQzIDAgb2JqCjw8IC9MZW5n
+ dGggNDQgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ac2cSZMdx3GA
+ 7/0r+ghEGM3el6NFWQ7rJBmwdbB8oIcAIQkgqRmIDv57f7lWvWXePFPhCMcEAp3ZteZW
+ mVnZ76/t79u/tj1/y763wzKt7eP79g/t9+1XXz8N7cNTO+jf00P7pu+WVv7VLT+0X/3u
+ /ePD+x+//O2bT83jnxhsGA8dcB3acVi7tR8ZeF62rp/29uFz+9W/fB7aX/+gE19t2+9j
+ 1x9rY23HW23Xve/mfRxPx5UtjdPRbWxomLp1HprP7TSO3ZSI9lM7TUyz9XPBTXMP0I/d
+ 3E+tAvO+d8uytg8ObnO39UdTus7r1M3bEKMH+BDzB+JTO45Hd4zHCi28zziOzTDbkLwe
+ eZPTKRhLKV19OzF6gA/tH5rvGWKAOww/dgdLGoajXYZuWI91T6YWZrXGLGXVG1i108Pn
+ V8q//bi0Tx/h0nMCMrS/RTT+bILy9VtEY5qmfZl5mLcRtvNwTMswNm+/FrGImYTGiBnc
+ NR4JX5ajH9rgUSIqHgWuEbZMU7ccW78oU+atm2fmdR6tQzce/cq7YO82dsu4r4fzKMAm
+ eBQIRCIJnTjhQw4pQDWdgLGUJrvGSs9399C+hZRoFcL6BC3QqIoo5+T/1Tv0yCk2tm+m
+ uev7DRa9mdp3qNBvhg4ytu8+tP/RvvrNayg9tq8eX4uO8vBNPHz3ulHE50C8j4fvvc+X
+ 1h/+5P8/RQte/Gf77rftP70zTQ32XVlpz+Jg97uHkzUPW7eu+4FEstCTNb/65ttv33/7
+ un33ZxtdTE0jREFe9kEliIcRlimm35BEuDWKcM9zN5isTKh3gCIpe7cudAmcSgrA2G3L
+ 7uo7ow50Dm3GOi0YKzqL4s/D3O2bsDRHwnjQAHWXqQygsy3EQRGaqZvmSdTHcaq8MZwD
+ OpXInOq5z/w8EA19xTKL2AffTUyJ+XB6nBDnof3oi0xqfYCUW99P22YPyyZ6CmYc51b0
+ s7mmn1D8GLr9wG6JdkKGBCuKJ07IeEzdOI/zpOQ/oKh2dooPhxjLKSiOvRrGvaY4yqMN
+ lOIOKNFgfbyrKR44pU4Mp0BM5YR0EDWFjPHuBLCGuWKjeOymMDk2y0gVcYLi8RZqvazt
+ 494h7RjC5kzbRzRnO5Dl2RSHcyqV/YfQTzTYtP0fv4Qu6/9NUf+Hj9Hmj6/++LrW5zjc
+ b2qcbnGYoMExbs7/BCv+J07VaDqwt/tsOjUdzDBusNDerSu2fgn+T+vcrQfKmRo3cTRK
+ A+V/AMIZ+O9gU/M/mignYzgHbCrn/+Qz1+9MGOJNNLQV62GAqMRuQuMEY/SwNRnA/lzj
+ 4u3n9kNt3qszT62YeB5TkBSlFqhQFLU2lNklPIwBZ8qARds6PdcD5ybJuQ3d1HPoF3Jy
+ jPHe7Jc9h/lyqKalo5RCMZQCPosSqMGd0DnrN/Wzk3G2dZoWDbNvoVDRNmgS5ptNGjp8
+ hwpNG6Z6xqBfqhAvth0v6C4V+jr05PH96+bsDA3tyqPzbl3i7OUYq0+via1tSzI+wMJ5
+ xMubmL5g/tkez80wiUNL31ClYekGHAL6yuE16dGD1hVVGkZtYKrkgHBnYSwHa/YHTpkZ
+ wzlgU4WG+My8k5Hs3dWGvmIXgsk2U2QgtmqaZPuuNClpdUuT1EBjKe10GgIsFG0Sp3TC
+ vquvacDKWUVnI+k49tjjcAfYEEeReA5BUVk471Wb/Nm1KaCKnIESuuRQBtgspk0xZ/2m
+ fnaSH75Qp2RsQiYxz8P3bfoUREiFCsQ9GsXZM6/bFY2Ce+uOo/5/oFH/jvNpWpdK9t+B
+ OdG2Rh1oDUtvnlx2YIycxsuWshFgLRuBU3EgbuhGIhMDJBSjs6vbyFGFBx7qNhJjTXJM
+ has4EiTw3kytAy4dQ4CVeCROmA2go/mzTfRgp1PMe/LuBHARGX29LiKxlxCRhkjbqKHa
+ FkCKSCBunlsj7uQ8ajCNK+hQdW4lSig4cgRs64x3pwBiNYbnPXK8HAcnnjqJ4yYh+lGd
+ WyMxsbwX0xXPss0loYqU3kDJlUMJhWIWI1BA9Zv62VtJeMcOjYq5haBiblDXYtSAy3b2
+ Bz1OtKy5GuiNGwrNBomBz1w/AvZ+ELNzcW41r664fg9xOqUG/ZRP8ern+nRTPatcxGiU
+ ikdYZqp4ongWuV5XvMtjbpxRpHENoxxgUTxE3puYrqFG+64pF+R02rRzKB5H1UpI6Ofc
+ OKD4x1ZrXo9DQgMLGRxQaWEsBytxSZwpkQ/ngE1lojCMPjPvGKkALN6BaOgrDtXz3aTQ
+ 5GaRGkbynYfYJOK26h1o0zaFMRsdRFDTBgXOFO7YumGQaFa079its9F00mMDS240nUZ8
+ tV7DXLdm04jvPNNAaJqA0rSAFU2ziZAxhzNATihGMlLlzCfvTgBrmCtWmjZj7CZpmptV
+ TQziBE3z7YkuatKlOU+6EAB3x3xFFZVK5CIvVbENVWxeZRT2NjQpky+Pgfk7NGnYiZjX
+ MTQpwIrrQ+BUkwZOAcn7ATS8WbWzaxIxBNF4KNKwymEnNjaOsGFBC43ngz8byx06Cby8
+ gbBuiKEc0FmMjbxSqH7DM0szfLTyhboCxSaS2blHYXYCzmzZZxDphqc4zWRgyC45KROs
+ SBk4yzFyEuw7qSuh6zQf1tkViPOJN64+m5xzpFiTkiRZ5DXK0/ij0dGBWnGspZBnimEM
+ 0AmMPJPOpuebPYpDSfu6SazPKDjF2pOCsTU5RNmekyLUJRGX6lIHsZr5G2TeTdO3v3qH
+ NatylBNHl5ici6Mr9aUt+vKvcc74ydO8evpboD7naXSuOnJR0Uu+6qt/5nbiu6d6eRlj
+ N7JQolnL+pJmBtzFc5F4EArJW3LxJKbEn9O34o8Y6GkbO+o4vfX8ZrZRZpO2pNxW7KUI
+ 0kiag5sNcdh04E0vOgLEK6iacwNBDo6UeU/KvLJBuWpbSKzLBt/LukYGDxBNtMERfFu3
+ MS4y8s8Onzk0I8pAihyGrYwn29blTtjSXdM9trueoMfopLtL0HdXmuvuINiN3Q0cfYPm
+ PXRsnV3yHrI3W4tAQTdtC9lkaS/vzLMXvjHYvcyzGDvdFIRDJ8SACUd2OZOE9WXTuHKr
+ xuW2sEUcgbKyBGPT1vw+lg743TKdi0tOrpsOqPGRs+1dm5aja8La66YRQqRw5KYAu6M7
+ rTHyCipUbQzjHQAwNlymIU5HwQWmsWG1y0mby17no5zDks09nUeZVI+6yhJO2hjGdyeA
+ DGK7saV5g2p/lxiC2uzlWzyHxXJUY1z0WAhhKrHBhSdHYPQXrYc+Axk4wQkHSE6d4Ojq
+ bC4dX7YJDel0TJnbm7I6W0tOIhwylM1ReqUoNTdUM8Is0x+uy3AFuNIwjRkR050Lg4Cw
+ ENtcGw2ZjCg2ZHxc0F1ApQHucoKx/Wx+h9EQWsnkpj/jrpP70AXyTVvbe42G+a2kVisF
+ miacJqJW3atSm5jeUGI8/Fm1qQAqWAVM4S09Tb5zqEoJztvEMEUFosVlJ9VzV51oVVaJ
+ ZTgB6lXaO5Mm71mEP4bSDidtisJEm9SYQJROutt1QkEqnVFzqB4tptbGxmE9ugmcyssF
+ TlmLlye2UTu+rDM4bBh0mVmlpmxBcLVqyqJ9hSZBVUfRm6qSYBBHGdMTt9SDIxgur5oD
+ p07jMGguzTzIgVfdOhBn2LueLW/k2UrXXhI4EoWReKROwUGxWVbJEAiIlJUEgROHcIgh
+ FfDpxNqqi+5LKV1jOz56gFQSUPvhlQQyPIGhXJhlJUET5SG3Kwlyu1z8vv24Xq8kiLHi
+ dNdbKa0kwFebern+XfaVAJmHgctd7pifKSXgFJByj4k4EQOcPAq4YlGgxK2fe0g+Hcah
+ Wei+Lwck03dIxjjh+SSHZskNbeQAjUMJBocSUTjUJE64MMeQCvh0wmB5F0tJDsVCT3bG
+ 4kQsb1YRVKQ/Sy6dVhE091cRQH/KCm5WEVihAcknbXpfFcHzK6V2oEd9kLzmtHSAcocM
+ sB8iXvgS0/4UGAKIUrwQQUNzK2gwU2nxWB4HhFk72aieCqA8DwquMpjWimylHBEBwNnw
+ YhLnGKLFGDgwTWKy35VWl/0KpvQrY8my9YDIsabAEOrbGgSTy5YLpmLTvUHsNPeuXcSs
+ JkZqpLxfhbvAXIx00W9Gf+28yEtqYqbLMEyCieU4OOv9IJFMxIxCY6PZtTlfJzj3Prwj
+ RuLGQSIlUEoVwiFZUTWLUA2UR3yFCHOPxQoXT+Ii6/eWSws4cKOwBbGcNLoku0EUis3D
+ JHm5RYAlTdFkEzFTB6ciaWq4KwDxoHY2E3asJPaGuLM45Gqdy43I9xxcOvBWbyz8WW0R
+ a7A3QsW4YAqUmCofyB5tBlhPVifmq9/Uz9qqLFKGZ7TYQJnL96yXWbnZyFUkQtgXB8ft
+ 2hbouzTP5ApYAwWNej8dNA+okDwbCJGJK7mHnUfNEi3kAmZEwQi+bDCaPDY9paGEpBPS
+ mCRfuOmQ95JWjWchytIEVJE8UEKkHMoAm8XIGXNWbzRVFHhv5es0mscWmNovEGPPNTWg
+ uLIg3r2cHDownxOlk5fXGlLRQkEX55zZc0TvRkXL79LEZ0ro6UpKqNHStLQSN3VMNnbA
+ Oa4Zgs8JFkY3iVN1QixwDzSbSmcymdLZdYsTasoc4MEtOHcQGNHULorJeG/aZc+hXQ5V
+ rD4cpfoQQxlgsygTm8PnrN/Uz8bqXKjrV2wieR17NP0KmqR+BeLmdcSC1pLrcyvlkHrC
+ nk2OBqoIKPS8YkQNkLylRNYCrQPtMym9cgPv9w42TLNS0yXvRWPiWba5JFSRMRoITXIo
+ BWwWd4ZjzuoNI0qZp63FNYZLdlmna0xsIajYxAZVY5waQcN4d4fG4MpTyiqnzZmvhmaq
+ B3RXMjUvH36I8pUfwxM6z6Dery67XLpsW1z3BijWLaQ8ccJLSj27nSoVZewu5KOz85ny
+ WwrBF5EQabluXLloNO3islOexXvlczwbnwOq+OwoNXM5lHDQZ1FFK1D9pn42PsdCJSqU
+ IWITwWgwRgaVugSC1Ym4qi7qRYiwQrB9TMuTYEXKxKlaSKJ09ZovCpy0swcmq1SyUVVr
+ pOTioesX4rPkyQqp5b2qjD+7yjj0Ccq53Y/GsvUcygCbxYgUc9ZvqudQLF+o68wamyiz
+ BRlUgQMIUgYFPHtzK8bhYob8lJy7F3qD+eI6g+sYURxCnNsnza9DTfJ4eYpbu8e8bv+Z
+ +hSvCstm1+tTLDRjWbdqmRuvZd6VAJLYElYFVIlEoFRluGOe9978PMpwkAhyCeqDcEnV
+ jYtkT7QhV97LsVRHEb30vc7iz65bDhXdaqKxcHePoRTwWVxrHKrf1M/aqol1umrFFlIe
+ YoMiDvEc0hCw6tVzxcmr6mYUGgRUkTBQqlTcgqMp5rhR+Yx9kuBDXm0k0rd5dxJyI4Lv
+ zu1B6tSG/yLvhYTxrCRsAiokzAZCjxzKAJvFSBhzVm/UogXeW/k6jYQUy+oWsEWhwE4B
+ 1Sh/hoR6tsfmXz6GsE1yv3lFnSa5vBjQpnv8tvu0SU+kpoTn959IG/mocoXrUO11RAPl
+ KWEa9e6mMRtpY+np7ObuG+EOdi9HN0jqPNjdbHysJO+V3f6s7G7jTc1ub6B8jKEUsFnc
+ OG4+Z/VGD5zAO7t9ncZuClhtC8HuJjYo7I7n0JiAr55EwlrtRBJr5bj4rJ7p5lClMYFS
+ EhJOE/kRz4uOkMWXnk5CrqvJyBoJm416pl1uQoKE7Ub8Le+VhP7sJHSoJqGjoE0ZSgnl
+ szhxHKrf1M/eytcppxwKGFsIEoIxCtTUSBIGdU6zbGKxqztVyQtQi8M3alK8f+G44ens
+ /bpevwb3cyTLRi5VJs6fjIGeqeKXtIL+vXAb3sr1y9KzHjan+UskIVDI67T1cgGcKIL/
+ fcMW1KipI7NCRR3dNu5cWvmCTfqBkfsyUsSBEWk/x+lQnFEbtzjRTltR9IdlYayFWjjp
+ lgjcOr7/K7gFO7RYyiWaLfLplaI8I2rH7kWuyNuTNqEEwDIrI1f2OtXA2gUpK0RQznEk
+ jGK2qvcHLrlvXeNHF+JBXaCQ2+cra47pmoKqZitd8/LuuXt1KdvmKzso6+zFfSo456+o
+ abSTjwr5AE9Vt8btI1lOacU3G1O7cNGvkkEQ220DZjQwYgAucDI+kjBzaZ7tJmrrFskQ
+ CoYIeW8qDJeVUvEnY0WrZHGFqlmc6OCF7pQWMkfFyanfLnAfyzzRG78r8391UVgpyMgJ
+ Czu0Ll73lNKX0zkn0aVqttLVOMkNsXzLFik/qaahpKnncggDxQNhrn6By3e1fCmoH8V5
+ +/ms3GXk8yHpKmW2dL00RLjffA0CR94Qxl74wv8Wnm/JrDzGt4BpndIGlarS76zfrRLS
+ p2c/HXxpyVSEmO18M136G/8VK85VPfwl3fDEPWYBa+wmY2LZX3E7aoP+0rqI0tcNk5/3
+ EXVU8cHvPB5zDU4jbkwyXkiShnlv/dPMLNf95VTDcvUjt5jYmUuq8UWLF/R+zoDmp8Ql
+ sb6KTeSrHyPm+RQD5P4eshH9C0XDkRMZP5FyCq9OpfxAyuXyz6Q8v4dFK86lXL4RuS3l
+ 8VkCUn65+3e+rfwQLlce0vEs95rb3LN7rpe5d7qBK4kezDYfoZcve2vRSoonn/IhP1RK
+ TOwoJCzZff7iGjHs+u6aij2nNKcbu2J/UJp+WMj5xiVevbMMs3OLD3/5B2fWS+utqm5/
+ 8eL+v+hM3GBU1igPoEa8D24n/NZA/AiFpQRGMtHioanPxO08BY2jZSsTRY7EUJw8Teim
+ uYx2AllJY7Q/uCLYOJLTXTnaA79FUOkdJUoPuZy9dM0TtfaXc0PVermpksWVyZol1+u+
+ EbtKVPpGgoyuN30j0TQ9wCv6OVzo5yf8UNGvoGLyRuZJdNmr+wJDRSb3BWpU+gIgjcK4
+ LS+QKScre83JCk1isopy1WSl600yaVwYIuAJdBaYrF3FzxGvuRK2lfzIgctxgiJSVJTM
+ lr35+JvPVTcdUF1gBAjvDNSJTCWqYrN3rb20S5nS/GqunvIKWUORKW4BYlkpUwVVTbZa
+ V9b5IrGSN3Hb4GImxX+FWOHqgktiVT1jVSeSVXaczHZiSYrDnFqEqCJWjli63ilZje8Y
+ YuVkhTI5WUFVklW6KrEa+xWQawasCELkmWvJEv3SPHaIS8P3hWeodqVIjCs4iTQlMiHO
+ WVFf6TcuFF9KtWogCBcJzB2SiDagjUR6gFRzGKhySosdNxn/2SvFAPlURkA6EPQEaPbu
+ tPkLpNbpuU3Q+dg3teIrfpCAsjgGD5C5kEVZbWl+txw2hbQpDviqTscKRVq4l6/xiPD4
+ OFDIZvSfuHwkhBLKKYKwe55krcEeLVvqMQGB4tdWWn6fwMYzwOaTnrwiXfhJnhr5Toqo
+ yCB+DIjbPSFtDjhq0dOk88UzESEKTeWiv0P0+bjhaAqsSkNsTV0a9Vn6tSpSLI0EgZmh
+ rM57gZj4NRpFIMEnne4ww9o+Jo45RgJd25TNSXWQwCohNkPpYVw884blJwLId3MHNnDj
+ dXAJWkV8+ML2yeAVX3iGdqLpclF2Ge5xJ2Df51q4x2/E4G+ROLffiPk7HOESxlSOF05m
+ cfwr3X9xjdNCNoSfsbn01UukEh5s3v4/ZvgkUZJWmEWbjO7OX9Re7i9ZqqTxFn6K4pr3
+ ehkS/Zzedi46VhgLs0ijeVUulj7Hq2j6v1zzxe+GkB4nDSS5tMsfDnnGt7dyvS8ejVbe
+ eM3gUga7cYnTkwFEG7RONWAULn9vyZro3dTGt4Ukhi2BjDXQijHLIMtdBnkoqYYBL7/D
+ tVJ1Tp4IjA6dIJ9Ca3VnIjCfUQKbOEn25pCa+S3TKWgrISmMoZCf4YqV29gB1fWvMvYs
+ 66nrX6/8kpb/7JlmHv2XtLacXOtft+v1rzFWBAHipDda/wrduCBH0vmBk4HFclmFKceC
+ PlcA61XCG0SFhMGeJuCaPd5Ecvo7JlkJLs/cAXGccgmk3Nrh4i6WM9jT7JjYXpmp7EmQ
+ c1fZk4iKPYkTFsSQmpivptN3vpLCHl+ms8ehs/LXa4n5ivJnJRWn5a8XP6JlIfC1H9Ey
+ i3Oz/NWaRB3qU+ROUPCrtkdO+1pGzlaK27py1cRXUfLTWWeFugT8qrSZyshi2y+5eKyR
+ tvk5cjfeuHlF77KiOy8QZLF+RSOOjHw+R26R+3f3svSeasjPrTYitN5AOQCfDz1lJC7B
+ j32RIhPxkDZCJAE5wMVDqkDzkKI5An7D/dKwQJeJsZKF+OBlXTp4AX1w7k+9ebpft76Z
+ 4SqE2stdR2cnUu4gRS0sXTdGXtZuyAwkzQMIxWTsICL/e20pNGU0AX3rBYzVwVFrrlu/
+ /andJmlhmd63jjbHaoSuBdTBm6q5LO/3/wOSVm5vCmVuZHN0cmVhbQplbmRvYmoKNDQg
+ MCBvYmoKNjI2MgplbmRvYmoKNDIgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCA0
+ IDAgUiAvUmVzb3VyY2VzIDQ1IDAgUiAvQ29udGVudHMgNDMgMCBSIC9NZWRpYUJveApb
+ MCAwIDU4OCAxNTM2XSA+PgplbmRvYmoKNDUgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERG
+ IC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0Nz
+ MiAxNCAwIFIKL0NzMSA4IDAgUiA+PiAvRXh0R1N0YXRlIDw8IC9HczUgNDkgMCBSIC9H
+ czQgMjAgMCBSIC9HczMgMjEgMCBSIC9HczIgMjIgMCBSCi9HczEgMjMgMCBSID4+IC9G
+ b250IDw8IC9GMS4wIDE1IDAgUiAvRjIuMCAxNiAwIFIgPj4gL1hPYmplY3QgPDwgL0lt
+ MSA5IDAgUgovSW0yIDExIDAgUiA+PiAvU2hhZGluZyA8PCAvU2g2IDQ3IDAgUiAvU2g3
+ IDQ4IDAgUiAvU2g1IDQ2IDAgUiA+PiA+PgplbmRvYmoKNDcgMCBvYmoKPDwgL0NvbG9y
+ U3BhY2UgMjQgMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyA1OS41IC0yNS41ODQ4
+ NSA1OS40OTk5OCAyNS41ODQ4NwpdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFs
+ c2UgZmFsc2UgXSAvRnVuY3Rpb24gNTAgMCBSID4+CmVuZG9iago0OCAwIG9iago8PCAv
+ Q29sb3JTcGFjZSAyNCAwIFIgL1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDU5LjUgLTI1
+ LjU4NDg1IDU5LjQ5OTk4IDI1LjU4NDg3Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQg
+ WyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA1MSAwIFIgPj4KZW5kb2JqCjQ2IDAgb2Jq
+ Cjw8IC9Db2xvclNwYWNlIDI0IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNTku
+ NSAtMjUuNTg0ODUgNTkuNDk5OTggMjUuNTg0ODcKXSAvRG9tYWluIFsgMCAxIF0gL0V4
+ dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDUyIDAgUiA+PgplbmRvYmoKNDkg
+ MCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvQ0EgMSA+PgplbmRvYmoKNTQgMCBvYmoK
+ PDwgL0xlbmd0aCA1NSAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
+ rVtJkx1HEb73r+jj6OB219bL0QhMhE8YKeBgc4DxIoPGYI0w4X/Pl8uXXW/emzcPB5pQ
+ TGXWkntVVnbNT+OX40/jjJ+2beO6bOOHb8c/jz+On75+TOP945j05/F+/GSe2ij/u4Hf
+ ybAsw+YBQz79/WMdv3/EgkmX/ASTtx1TlnWd0p728f5h/M3bMWXvzuMnOU2ltnWs49uH
+ 8dPP8zQPaXz73fjVePf6lRDN492Hb9n6KxsfX4EXdEXPN6/Gv4xvvxh/91YlesJAXepw
+ TjvtoF3X0hEH50b8DSkEyQ/EfPtqML6u0yxlm/JSL8k8g+6+JKU7qNBB9w9B79+U9fFW
+ Iec8pZIvCJrbtKzbagRNy0HwjyQTVB6D8sNlUefRjF2eGntPMPZayjRfEhv6mFOGqQc1
+ dZrmYOIzMnHPxscf3MI/E0PEx1+IGV8N6gRvPobSPkKKi35QKtz7Oc7aOs15btDPOWuf
+ Ox8fSDVofe89D+wJDf6oPcPdx9GHhCvH5Pfew99/czgGhCb+YcsPd4+9aLTB5YDLa5nK
+ vlzyvTyVVlqmqAi4sEL4/D8p0b/OGiFj7/zDWcTnuUwtb5cYWJ8GfND/LSUNIo+MuQ/B
+ 0i/R2XOANb7A/7/bvvX6DXaHpcy1NHiINQIzvnnd71Cz7nrYHFJexrxih1uW8WGsrQb0
+ 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
+ OK4VHwhiZhG2OUXOdoAnkuqAE0wVQ5xg+g8EXEuYfDrqDGMf6I61GtKLKBcLOiFvkwfC
+ kvGhtmsjE55BV7lri4D6BQpbuuLWhExGjf908osxZBOa/H2QZkekpqoD6uSDgagdNx3h
+ oKN2TL7F3xbcjyoSJIsubCtT2XCiWkAtcOW94eMIQcS3gQywhAvUXKsHWNK/G7LabBsP
+ yALBx94UYAvuF0rKImwpQVlCtwNt6W64cPblfwEzmCZMCmVuZHN0cmVhbQplbmRvYmoK
+ NTUgMCBvYmoKNDE2NgplbmRvYmoKNTMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVu
+ dCA0IDAgUiAvUmVzb3VyY2VzIDU2IDAgUiAvQ29udGVudHMgNTQgMCBSIC9NZWRpYUJv
+ eApbMCAwIDU4OCAxNTM2XSA+PgplbmRvYmoKNTYgMCBvYmoKPDwgL1Byb2NTZXQgWyAv
+ UERGIC9UZXh0IF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNCAwIFIgL0NzMSA4IDAgUiA+
+ PiAvRXh0R1N0YXRlCjw8IC9HczUgNDkgMCBSIC9HczQgMjAgMCBSIC9HczMgMjEgMCBS
+ IC9HczIgMjIgMCBSIC9HczEgMjMgMCBSID4+IC9Gb250IDw8Ci9GMi4wIDE2IDAgUiAv
+ RjEuMCAxNSAwIFIgPj4gPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9N
+ ZWRpYUJveCBbMCAwIDYxMiA3OTJdIC9Db3VudCAzIC9LaWRzIFsgMyAwIFIgNDIgMCBS
+ IDUzIDAgUgpdID4+CmVuZG9iago1NyAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvT3V0
+ bGluZXMgMiAwIFIgL1BhZ2VzIDQgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjUy
+ IDAgb2JqCjw8IC9MZW5ndGggNTggMCBSIC9PcmRlciAxIC9FbmNvZGUgWyAwIDEzNjQg
+ XSAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAg
+ MSAwIDEgXSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6
+ ZSBbIDEzNjUKXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlwoVSQlEA
+ QMG/tru7u7HpBhUDA1uxA+tTjjEy+PDFjZ1NfpC0mPjg+7vi+DvF34gLj71h95WY7egr
+ El+IGkdeUJwjkiOsPZQj9Kw++IzhE0GZgSfsPhKw7X9E9AP+f30PqLzH99N7j2bPHTrd
+ dxje4pa5eovlG1adrtwg9JoVs8vXSL9iOX/pCs2LWXQuZCm8ZEHy/CXmL5gX6LpA6Dku
+ s3PnSD9jLn/2DK2nzOidPuX3CdPyp04wf8yUwMljnB8xaXHiCLmHTPw5foj6DOMZxvSO
+ Zvh9wKj8kQNM7jMidngfh3sMWx/aQ+IuQ8aDu6hPM5hmQG9/mu87ivt2KL5Nn/DebRxu
+ 0Wu9ZwuJm/QYd2+iOEX3z64UOjtTdG6o79ig+DodwtvXsbtGu+22NUQnafu3NYnKBK35
+ LQl0NidojqtvimMYo0lmYwzLURqdNkQRGqHBbH0ElWHq8+vC6KwNobMmRGGQGsnVQSwH
+ qHZaFUConyqzlX6k+6j8s8KHei/lesu8FHook1zqwbybUoElbr5+Al7liFUKZW5kc3Ry
+ ZWFtCmVuZG9iago1OCAwIG9iago0MTAKZW5kb2JqCjUxIDAgb2JqCjw8IC9MZW5ndGgg
+ NTkgMCBSIC9PcmRlciAxIC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBlIDAg
+ L0JpdHNQZXJTYW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAvRG9tYWluIFsg
+ MCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmlsdGVy
+ IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGNwgk3VHEYB+AvJhKJRCKRkpKSkhKJRCIZ
+ Y8asZgxjZuz7vu9bX+v9vZ3rmNO943/vfZ/z8N8E24zzpXCML01exNhwjC8ko3yhex5l
+ 06N8LjnCZ8IRPjN5GmHDYT6VDPOp7kmYTYf4RPA4xMdDskE+NnkUZMMAHwn7+Sj50M+m
+ fXwoeODjA6+4hw9U9z1sOMj7wm7eT95zs1UX713Hnkt914XdAXEndlV3nEjdjx1JB3au
+ bjtgsw/bdrf6oP0j24st1c1epP6NTeEebPZgw3Y3Nuyud0P7S7YL66prXUj9E2vCnVjr
+ xKrtDqzaXemA9od4O1ZuXG5H6u9YFm7DchuWJFuxZHmxFdpv4i1YNF5ogfpXLEg2Y6EZ
+ 85JNmLc814TrXzAn2Yg549lGqH/GrPAnzEg2YMbydAOuf8S0cD2mdafqof4BU8LvMSlZ
+ h0nzE3X4/x0mhGsxoTteC/W3GBd+g4RwDRKKlKihuP5rigtXU1w3Vk2mX1FM8iWNCVfR
+ mMloFRm+oKhkJUV1RyvJ9HMalR15RqIVNGIyUkGGTykiXE6R5OFyMl1Gw4LhMgo/ES+l
+ sGqolAwfU0i4hELJQyVktZiG7AaLKfhIvIiCqoEiMnxIAeFCCiT7C8lqAfnt+grI90A8
+ n3yq3nxKfZ+8knnkverJI5u55LE7mEvae7I5NKjqzqHUd8ktnE3ubHLZziKX3YEs0t4R
+ z6SBG52ZlPo2OYUzyJlB/ZLp1G/ZkU7aW+Jp5Ej7B4pzCpwKZW5kc3RyZWFtCmVuZG9i
+ ago1OSAwIG9iago1NzIKZW5kb2JqCjUwIDAgb2JqCjw8IC9MZW5ndGggNjAgMCBSIC9P
+ cmRlciAxIC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJT
+ YW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAvRG9tYWluIFsgMCAxIF0gL1Jh
+ bmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAG1wolWAVEAANDvMvvqS7NFlsggknUGoZTKki1LKcIXdOrk
+ OKMx5s28d88tbeylY5WNHfjarhgtKmtVeS0euRJleIsrUfVLLCK6FItLsQC5UFj+XggF
+ rfmFAOGnkDc29ymA/RByFmY/BL1zIauXz87BZub87jufQfeNz7zx1yjO+OvD0zPecC49
+ +3fKpUFeTTmAE+7K2tSE0z7mUggmx9zPV81s8hXGEZvcvhyxMA/ZS92JIWv+gE0Ajg/Y
+ bSY+0N1n4pbH+ozGHhNDU+ox0gvKXUb6S0tdOgp3h47qvujQJrfpC/CRNm1oi44ApyKt
+ /eEWpfGZCqN5/kQh/Eidq4ceKWibZOjYYJM084EMmhp4II+/JwOQ+u/J/Q3SbyjhbwA/
+ uyNQvSXOtPpuCQjrhM9Yb50wFvfWt2u41+zTGq63ip9C7aniuze4B90K7qng7oMxd8Xs
+ MuY+0FXGrC5hLsOdJQysgjktdCjYts2hqMs2B+wnsu1v0XYC8hsKr7WjCmVuZHN0cmVh
+ bQplbmRvYmoKNjAgMCBvYmoKMzg0CmVuZG9iagoyOCAwIG9iago8PCAvTGVuZ3RoIDYx
+ IDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1bmN0aW9uVHlwZSAwIC9C
+ aXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAxIF0gL0RvbWFpbiBbIDAg
+ MSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAxMzY1Cl0gL0ZpbHRlciAv
+ RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBtcKJVgFRAADQ7zL76kuzRZbIIJJ1BqGUypIt
+ SynCF3Tq5DijMebNvHfPLW3spWOVjR342q4YLSprVXktHrkSZXiLK1H1SywiuhSLS7EA
+ uVBY/l4IBa35hQDhp5A3NvcpgP0QchZmPwS9cyGrl8/OwWbm/O47n0H3jc+88dcozvjr
+ w9Mz3nAuPft3yqVBXk05gBPuytrUhNM+5lIIJsfcz1fNbPIVxhGb3L4csTAP2UvdiSFr
+ /oBNAI4P2G0mPtDdZ+KWx/qMxh4TQ1PqMdILyl1G+ktLXToKd4eO6r7o0Ca36QvwkTZt
+ aIuOAKcirf3hFqXxmQqjef5EIfxInauHHilom2To2GCTNPOBDJoaeCCPvycDkPrvyf0N
+ 0m8o4W8AP7sjUL0lzrT6bgkI64TPWG+dMBb31rdruNfs0xqut4qfQu2p4rs3uAfdCu6p
+ 4O6DMXfF7DLmPtBVxqwuYS7DnSUMrII5LXQo2LbNoajLNgfsJ7Ltb9F2AvIbCq+1owpl
+ bmRzdHJlYW0KZW5kb2JqCjYxIDAgb2JqCjM4NAplbmRvYmoKMjcgMCBvYmoKPDwgL0xl
+ bmd0aCA2MiAwIFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5
+ cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21h
+ aW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9G
+ aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AY3CCTdUcRgH4C8mEolEIpGSkpKS
+ EolEIhljxqxmDGNm7Pu+71tf6/29neuY073jf+99n/Pw3wTbjPOlcIwvTV7E2HCMLySj
+ fKF7HmXTo3wuOcJnwhE+M3kaYcNhPpUM86nuSZhNh/hE8DjEx0OyQT42eRRkwwAfCfv5
+ KPnQz6Z9fCh44OMDr7iHD1T3PWw4yPvCbt5P3nOzVRfvXceeS33Xhd0BcSd2VXecSN2P
+ HUkHdq5uO2CzD9t2t/qg/SPbiy3VzV6k/o1N4R5s9mDDdjc27K53Q/tLtgvrqmtdSP0T
+ a8KdWOvEqu0OrNpd6YD2h3g7Vm5cbkfq71gWbsNyG5YkW7FkebEV2m/iLVg0XmiB+lcs
+ SDZjoRnzkk2YtzzXhOtfMCfZiDnj2Uaof8as8CfMSDZgxvJ0A65/xLRwPaZ1p+qh/gFT
+ wu8xKVmHSfMTdfj/HSaEazGhO14L9bcYF36DhHANEoqUqKG4/muKC1dTXDdWTaZfUUzy
+ JY0JV9GYyWgVGb6gqGQlRXVHK8n0cxqVHXlGohU0YjJSQYZPKSJcTpHk4XIyXUbDguEy
+ Cj8RL6WwaqiUDB9TSLiEQslDJWS1mIbsBosp+Ei8iIKqgSIyfEgB4UIKJPsLyWoB+e36
+ Csj3QDyffKrefEp9n7ySeeS96skjm7nksTuYS9p7sjk0qOrOodR3yS2cTe5sctnOIpfd
+ gSzS3hHPpIEbnZmU+jY5hTPImUH9kunUb9mRTtpb4mnkSPsHinMKnAplbmRzdHJlYW0K
+ ZW5kb2JqCjYyIDAgb2JqCjU3MgplbmRvYmoKMjYgMCBvYmoKPDwgL0xlbmd0aCA2MyAw
+ IFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0
+ c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEg
+ XSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0Zs
+ YXRlRGVjb2RlID4+CnN0cmVhbQp4AY3CCTdUcRgH4C8mEolEIpGSkpKSEolEIhljxqxm
+ DGNm7Pu+71tf6/29neuY073jf+99n/Pw3wTbjPOlcIwvTV7E2HCMLySjfKF7HmXTo3wu
+ OcJnwhE+M3kaYcNhPpUM86nuSZhNh/hE8DjEx0OyQT42eRRkwwAfCfv5KPnQz6Z9fCh4
+ 4OMDr7iHD1T3PWw4yPvCbt5P3nOzVRfvXceeS33Xhd0BcSd2VXecSN2PHUkHdq5uO2Cz
+ D9t2t/qg/SPbiy3VzV6k/o1N4R5s9mDDdjc27K53Q/tLtgvrqmtdSP0Ta8KdWOvEqu0O
+ rNpd6YD2h3g7Vm5cbkfq71gWbsNyG5YkW7FkebEV2m/iLVg0XmiB+lcsSDZjoRnzkk2Y
+ tzzXhOtfMCfZiDnj2Uaof8as8CfMSDZgxvJ0A65/xLRwPaZ1p+qh/gFTwu8xKVmHSfMT
+ dfj/HSaEazGhO14L9bcYF36DhHANEoqUqKG4/muKC1dTXDdWTaZfUUzyJY0JV9GYyWgV
+ Gb6gqGQlRXVHK8n0cxqVHXlGohU0YjJSQYZPKSJcTpHk4XIyXUbDguEyCj8RL6WwaqiU
+ DB9TSLiEQslDJWS1mIbsBosp+Ei8iIKqgSIyfEgB4UIKJPsLyWoB+e36Csj3QDyffKre
+ fEp9n7ySeeS96skjm7nksTuYS9p7sjk0qOrOodR3yS2cTe5sctnOIpfdgSzS3hHPpIEb
+ nZmU+jY5hTPImUH9kunUb9mRTtpb4mnkSPsHinMKnAplbmRzdHJlYW0KZW5kb2JqCjYz
+ IDAgb2JqCjU3MgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCA2NCAwIFIgL09yZGVy
+ IDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBs
+ ZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2Ug
+ WyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
+ ID4+CnN0cmVhbQp4AaXChVJCUQBAwb+2u7u7sekGFQMDW7ED61OOMTL48MWNnU1+kLSY
+ +OD7u+L4O8XfiAuPvWH3lZjt6CsSX4gaR15QnCOSI6w9lCP0rD74jOETQZmBJ+w+ErDt
+ f0T0A/5/fQ+ovMf303uPZs8dOt13GN7ilrl6i+UbVp2u3CD0mhWzy9dIv2I5f+kKzYtZ
+ dC5kKbxkQfL8JeYvmBfoukDoOS6zc+dIP2Muf/YMrafM6J0+5fcJ0/KnTjB/zJTAyWOc
+ HzFpceIIuYdM/Dl+iPoM4xnG9I5m+H3AqPyRA0zuMyJ2eB+HewxbH9pD4i5DxoO7qE8z
+ mGZAb3+a7zuK+3Yovk2f8N5tHG7Ra71nC4mb9Bh3b6I4RffPrhQ6O1N0bqjv2KD4Oh3C
+ 29exu0a77bY1RCdp+7c1icoErfktCXQ2J2iOq2+KYxijSWZjDMtRGp02RBEaocFsfQSV
+ Yerz68LorA2hsyZEYZAaydVBLAeodloVQKifKrOVfqT7qPyzwod6L+V6y7wUeiiTXOrB
+ vJtSgSVuvn4CXuWIVQplbmRzdHJlYW0KZW5kb2JqCjY0IDAgb2JqCjQxMAplbmRvYmoK
+ MiAwIG9iago8PCAvTGFzdCA2NSAwIFIgL0ZpcnN0IDY2IDAgUiA+PgplbmRvYmoKNjYg
+ MCBvYmoKPDwgL1BhcmVudCA2NyAwIFIgL1RpdGxlIChDYW52YXMgMSkgL0NvdW50IDAg
+ L0Rlc3QgWyAzIDAgUiAvWFlaIDAgMTUzNiAwIF0KL05leHQgNjggMCBSID4+CmVuZG9i
+ ago2OCAwIG9iago8PCAvUGFyZW50IDY5IDAgUiAvUHJldiA3MCAwIFIgL0NvdW50IDAg
+ L1RpdGxlIChDYW52YXMgMykgL0Rlc3QgWyA0MiAwIFIgL1hZWgowIDE1MzYgMCBdIC9O
+ ZXh0IDcxIDAgUiA+PgplbmRvYmoKNzEgMCBvYmoKPDwgL1BhcmVudCA3MiAwIFIgL1By
+ ZXYgNzMgMCBSIC9Db3VudCAwIC9EZXN0IFsgNTMgMCBSIC9YWVogMCAxNTM2IDAgXSAv
+ VGl0bGUKKENhbnZhcyA0KSA+PgplbmRvYmoKNzMgMCBvYmoKPDwgL1BhcmVudCA2OSAw
+ IFIgPj4KZW5kb2JqCjcyIDAgb2JqCjw8ID4+CmVuZG9iago3MCAwIG9iago8PCAvUGFy
+ ZW50IDY3IDAgUiA+PgplbmRvYmoKNjkgMCBvYmoKPDwgPj4KZW5kb2JqCjY3IDAgb2Jq
+ Cjw8ID4+CmVuZG9iago2NSAwIG9iago8PCAvUGFyZW50IDcyIDAgUiAvUHJldiA3MyAw
+ IFIgL0NvdW50IDAgL0Rlc3QgWyA1MyAwIFIgL1hZWiAwIDE1MzYgMCBdIC9UaXRsZQoo
+ Q2FudmFzIDQpID4+CmVuZG9iago3NCAwIG9iago8PCAvTGVuZ3RoIDc1IDAgUiAvTGVu
+ Z3RoMSAxMTE3MiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9Wgt4U1W2
+ 3vs8k5OkTdK82zRJkzR9pWkLTRso9LT0BW2gtLS0tZUWKFMQsGAtr4GpgBYKKs4MD5E7
+ vnAG8To3LQ4GvXC5DiqDMqPIXF/4GhF1sIM6VVTIyV3npFToN3c+v+/6zTlZWft19l77
+ 32uvvfY+p2fl7Z1IhfoQiWpbOroXIelK34wQYV+wrKM7Fk/ggb+8oLfHHovTaQiRdy3q
+ /smyWFwWQohz/WTpmtHndWUI6Y53dXYsjOWjq8D9XZAQi+OJwF1dy3pWx+Las8CXLr11
+ wWi+TgnxwmUdq0fbR+cgbl/esawzVj69FXha96239YzGKeBN3Ss7R8vjJpDvTwhDaiJa
+ guRoKZIhAqnhhifZTzgXoiBXzAcq8TY8NC++6CukkUnVPeLJ7hMDLzj+89vL5656FBvk
+ FVBOLpUXM+AZJl1IR0iJIf9txYaxHDFXvBLDqC4zjKqApgJNBMrIHJTxz+AdSNc2wsux
+ jUIK2xvmvx3D2YD/Bek/hLN5pQrJF2wqsi3YtKkqvUSOq1EBhZENlyOXxMuGXE/Ywnjq
+ kMsJbEqMEUMFVoghXl7gskUK5tuuFoRlmE+0feP6he0y0NeuYttXrlzbq1DulYJK2+kS
+ yB+yvZQRJoCdcoUpzMfbTrrusP2uIN32VMFk25AH0oZsgyXADtv2F9xhe3SzlPJIhsQe
+ doXx3iHbQyI7bHsQ6t+1ScrYGXtwY4x1b5YauvWQxJYfChNPHLYtc6Xa5sODmFfY2lxL
+ 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
+ 07+hn6ZPkh/jy1hO2inKo4U1lrBj7NFCFQxBw2dTDElwMgIWnzBWDpE0zBTlYcrMdop4
+ m68/xDGrXzBJhlE8vRk7uIEFdezMBsJin1eIniq4GdiRQLpxnrBKeE1Yg/kPqdIrx6jS
+ q+egH3Gw9jmgH0oUEL/+QmFE+8JIBoSASCDO9wyMC5zigRo/A6vYtZByNJSTix2JYhvS
+ SVAC0Y8dvz6I04UTwttPPCm8IfwR5x2Exi6RmivHSMvVCxD+MjYX9UIlVQtjnQCnfG/y
+ 3R6ukVvE7eT2c69x4HRghkliNSova1dNYXNV1WwbK64gq9g1KpUx3q/ql29R7FGEFYxO
+ p5SpCLtS6dEqFBzDEjaZzAPnZWJQxemVCjh5YeXIRmQl2NTxOtYASh2nUigB30OQwQHn
+ lQk/l5k79YbHY9rdO3MkeN50FfZwIo0emYERCp6PnIcFVzo1AzgwHJrR4M3UrV77/IRR
+ 8MWwePrhuzYAcKzhL5iKPTGUCHGn7sGDrowaizmTErrxlL99AKdjA0s3HE3NzsYbXyUI
+ TqtZqqRWXj1Huq68IpzaiUlGJ9ou6YqKX4P8oysREknwNVLBl/DDNy3lqAK+H6mCT7Oq
+ 4TubmWgWeBGzUR2qhy9UGtFc+K6kGc6AxW8UMfgkWKqSEc+KS+rKp8+pyqzqXNrb2bN4
+ QYe39NalC8VS164eCPQB7QB6CCgEdBzoFaD3gT6PFcZq4HagHCAeqBaoHagbqA9oB9BD
+ QCGg40CvAL0P9Hmss4Q6OnohuMbCGFbCG+Ml4+KSqb+ufMW4/Ppx8Y5x8fnj4gvGxQGM
+ G+SRxuO69n4yLr9rXHzxuPgt4+JLx8Wl71evq3/5uPxbx8W7x8VXjovfNi4ujuf1+N4+
+ Lt47Lr5qXHyNGP9fv6WqEAplbmRzdHJlYW0KZW5kb2JqCjc1IDAgb2JqCjczMTgKZW5k
+ b2JqCjc2IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAv
+ Q2FwSGVpZ2h0IDcyMCAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy0x
+ MDE4IC00ODEgMTQzNiAxMTU5XSAvRm9udE5hbWUgL0FSRUlUSCtIZWx2ZXRpY2EtQm9s
+ ZCAvSXRhbGljQW5nbGUKMCAvU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2
+ NDQgL0ZvbnRGaWxlMiA3NCAwIFIgPj4KZW5kb2JqCjc3IDAgb2JqClsgMjc4IDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCA3MjIKMCA3MjIgMCAwIDYxMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2
+ NjcgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgNjExCjU1NiA2MTEgNTU2IDAg
+ NjExIDYxMSAyNzggMCA1NTYgMjc4IDg4OSA2MTEgNjExIDYxMSAwIDM4OSA1NTYgMzMz
+ IDYxMSA1NTYKNzc4IDAgNTU2IF0KZW5kb2JqCjE1IDAgb2JqCjw8IC9UeXBlIC9Gb250
+ IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL0FSRUlUSCtIZWx2ZXRpY2EtQm9s
+ ZCAvRm9udERlc2NyaXB0b3IKNzYgMCBSIC9XaWR0aHMgNzcgMCBSIC9GaXJzdENoYXIg
+ MzIgL0xhc3RDaGFyIDEyMSAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5k
+ b2JqCjc4IDAgb2JqCjw8IC9MZW5ndGggNzkgMCBSIC9MZW5ndGgxIDE0NDM2IC9GaWx0
+ ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AdV7eXhU1dn4Oeeus2Qy+75mMjOZ7DuE
+ BDKErEAQCEKCBBMgEBAqYAxihS8qCERE2RGsggsEUDOEVAYQSymKWKu4oVK1+onW+plP
+ 2x/aVsjM9547IUJq+/hHnz7Pb27O8p5zl/e8593vTdvS21tQAupADJo4vXnxXCT9CloR
+ IldmL2peHId14xHC22a3t7njMJeCELNw7uJ5i+KwuAUhuWPewuUD1xvyEXLtbm1pnhOf
+ R1egLWyFgTiMYR4lty5quyMOa3uh3bHw1tkD8/qLAE9Y1HzHwPPRBwC7f9a8qCV+fkE5
+ tMmLb72tLQ7nvw3t4sVLWwbOx/WA3+sIw6gf3Ypk6BYkIILUcDQiJHwhdyAWZuk8/Oak
+ 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
+ WpPJzGFMmdsML+UoaWgjQgtUyMleQvOQOI9niEAkpVhAA+HCYaPwMKAMw3jO+O+dVfZI
+ xyP+oDMrVZ2bpeZGqaJtr8JLAzZrXnRj9Ktno3N7efHJBN5jFrcksxOAFe+hfhLEt8wd
+ Unxrg1iyOVRo+8yCfohzHRDoujRyD6zV5gyaXf8Q7ro9b3rmDWRUBlXieYh5B7xXcOqp
+ XqRBb2kfzsn+Z3GvD97TCuBz/0P8S3S98PvHKNj16qtnLp+XdCVU8GV+C3w//mM/cM5g
+ nfSLiUSQumTw4AMQWBagQjQMvqkvQuWoAlVKX6nXwD9m0G/RJ6AbpK/lJ8MX8DeiqWga
+ qkcNaDqagU5KD6DSi6UeD99aoClVVQ2jx6dVtyxsb2mbP7sZZuKz9JTdUJ6G8jwUGm3R
+ tMJXUK7ASUooQH+cDqUEyngoM6AshHIXlPVQHoHyNJTnobwK5QMoX0G5AoyuhGKHkg6l
+ BMp4KDOgLIRyF5T1UB6B8jSU56G8CuUDKF/FBn6ABxrsY+QeAqcMgYND4PQhMAjfdfcb
+ PQSGl+TXzZcPgScOgScPgeuGwFOGwDcOgacOgenOXLveWUPg2UPgOUNgib+uodfcIfPz
+ hsCtQ+D5Q+BbhsALh8DS/9td8zwazV6L/61D4MVD4KVD4NuGwG1D4NuHwO1D4GVD4OXX
+ w5clrv8/G7R8JAplbmRzdHJlYW0KZW5kb2JqCjc5IDAgb2JqCjk0NzAKZW5kb2JqCjgw
+ IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVp
+ Z2h0IDcxNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4
+ MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvVEdHWUFMK0hlbHZldGljYSAvSXRhbGljQW5n
+ bGUgMAovU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2MzcgL0ZvbnRGaWxl
+ MiA3OCAwIFIgPj4KZW5kb2JqCjgxIDAgb2JqClsgMjc4IDAgMCAwIDAgMCAwIDAgMzMz
+ IDMzMyAwIDAgMjc4IDAgMCAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAK
+ MCAwIDY2NyAwIDcyMiA3MjIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDY2NyAwIDcyMiA2
+ NjcgNjExIDcyMiA2NjcgMCAwIDAgMAowIDAgMCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYg
+ NTU2IDI3OCA1NTYgNTU2IDIyMiAwIDUwMCAyMjIgODMzIDU1NiA1NTYgNTU2CjAgMzMz
+ IDUwMCAyNzggNTU2IDUwMCA3MjIgMCA1MDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwCjAgMCAwIDAgMCA1MDAgXQplbmRvYmoKMTYgMCBvYmoKPDwgL1R5
+ cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvVEdHWUFMK0hlbHZl
+ dGljYSAvRm9udERlc2NyaXB0b3IKODAgMCBSIC9XaWR0aHMgODEgMCBSIC9GaXJzdENo
+ YXIgMzIgL0xhc3RDaGFyIDIyMiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4K
+ ZW5kb2JqCjgyIDAgb2JqCihVbnRpdGxlZCkKZW5kb2JqCjgzIDAgb2JqCihNYWMgT1Mg
+ WCAxMC42LjggUXVhcnR6IFBERkNvbnRleHQpCmVuZG9iago4NCAwIG9iagooU2NvdHQg
+ TWFpbikKZW5kb2JqCjg1IDAgb2JqCihPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwpCmVu
+ ZG9iago4NiAwIG9iagooRDoyMDExMTIyOTIwMDQwOVowMCcwMCcpCmVuZG9iagoxIDAg
+ b2JqCjw8IC9UaXRsZSA4MiAwIFIgL0F1dGhvciA4NCAwIFIgL1Byb2R1Y2VyIDgzIDAg
+ UiAvQ3JlYXRvciA4NSAwIFIgL0NyZWF0aW9uRGF0ZQo4NiAwIFIgL01vZERhdGUgODYg
+ MCBSID4+CmVuZG9iagp4cmVmCjAgODcKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDU4
+ ODUwIDAwMDAwIG4gCjAwMDAwMzk0NzQgMDAwMDAgbiAKMDAwMDAwNTQyMyAwMDAwMCBu
+ IAowMDAwMDM0MzQ4IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNTQw
+ MyAwMDAwMCBuIAowMDAwMDA1NTI4IDAwMDAwIG4gCjAwMDAwMjE1NzMgMDAwMDAgbiAK
+ MDAwMDAwNjQ3NCAwMDAwMCBuIAowMDAwMDA3MTI4IDAwMDAwIG4gCjAwMDAwMDcxNDgg
+ MDAwMDAgbiAKMDAwMDAwNzgwMyAwMDAwMCBuIAowMDAwMDA1ODQyIDAwMDAwIG4gCjAw
+ MDAwMjI0MzcgMDAwMDAgbiAKMDAwMDA0ODAxOSAwMDAwMCBuIAowMDAwMDU4NDgyIDAw
+ MDAwIG4gCjAwMDAwMDYzMTYgMDAwMDAgbiAKMDAwMDAwNjAwMCAwMDAwMCBuIAowMDAw
+ MDA2MTU4IDAwMDAwIG4gCjAwMDAwMTM1MDUgMDAwMDAgbiAKMDAwMDAxMzU1MyAwMDAw
+ MCBuIAowMDAwMDEzNTk4IDAwMDAwIG4gCjAwMDAwMTM2NDUgMDAwMDAgbiAKMDAwMDAy
+ MDY3NiAwMDAwMCBuIAowMDAwMDM4ODI5IDAwMDAwIG4gCjAwMDAwMzgwMjIgMDAwMDAg
+ biAKMDAwMDAzNzIxNSAwMDAwMCBuIAowMDAwMDM2NTk2IDAwMDAwIG4gCjAwMDAwMTk3
+ NzkgMDAwMDAgbiAKMDAwMDAxMDY2NCAwMDAwMCBuIAowMDAwMDEzNDg0IDAwMDAwIG4g
+ CjAwMDAwMDc4MjMgMDAwMDAgbiAKMDAwMDAxMDY0MyAwMDAwMCBuIAowMDAwMDEzNjky
+ IDAwMDAwIG4gCjAwMDAwMTk3NTggMDAwMDAgbiAKMDAwMDAxOTgxNiAwMDAwMCBuIAow
+ MDAwMDIwNjU2IDAwMDAwIG4gCjAwMDAwMjA3MTMgMDAwMDAgbiAKMDAwMDAyMTU1MyAw
+ MDAwMCBuIAowMDAwMDIxNjA5IDAwMDAwIG4gCjAwMDAwMjI0MTcgMDAwMDAgbiAKMDAw
+ MDAyODgzMyAwMDAwMCBuIAowMDAwMDIyNDc0IDAwMDAwIG4gCjAwMDAwMjg4MTIgMDAw
+ MDAgbiAKMDAwMDAyODk0MSAwMDAwMCBuIAowMDAwMDI5NTcyIDAwMDAwIG4gCjAwMDAw
+ MjkyNTYgMDAwMDAgbiAKMDAwMDAyOTQxNCAwMDAwMCBuIAowMDAwMDI5NzMwIDAwMDAw
+ IG4gCjAwMDAwMzU5NzcgMDAwMDAgbiAKMDAwMDAzNTE3MCAwMDAwMCBuIAowMDAwMDM0
+ NTI1IDAwMDAwIG4gCjAwMDAwMzQwMzggMDAwMDAgbiAKMDAwMDAyOTc3NSAwMDAwMCBu
+ IAowMDAwMDM0MDE3IDAwMDAwIG4gCjAwMDAwMzQxNDYgMDAwMDAgbiAKMDAwMDAzNDQ0
+ NSAwMDAwMCBuIAowMDAwMDM1MTUwIDAwMDAwIG4gCjAwMDAwMzU5NTcgMDAwMDAgbiAK
+ MDAwMDAzNjU3NiAwMDAwMCBuIAowMDAwMDM3MTk1IDAwMDAwIG4gCjAwMDAwMzgwMDIg
+ MDAwMDAgbiAKMDAwMDAzODgwOSAwMDAwMCBuIAowMDAwMDM5NDU0IDAwMDAwIG4gCjAw
+ MDAwMzk5OTggMDAwMDAgbiAKMDAwMDAzOTUyMiAwMDAwMCBuIAowMDAwMDM5OTc2IDAw
+ MDAwIG4gCjAwMDAwMzk2MjkgMDAwMDAgbiAKMDAwMDAzOTk1NCAwMDAwMCBuIAowMDAw
+ MDM5OTE3IDAwMDAwIG4gCjAwMDAwMzk3NTAgMDAwMDAgbiAKMDAwMDAzOTg5NSAwMDAw
+ MCBuIAowMDAwMDM5ODU4IDAwMDAwIG4gCjAwMDAwNDAxMDYgMDAwMDAgbiAKMDAwMDA0
+ NzUxNSAwMDAwMCBuIAowMDAwMDQ3NTM2IDAwMDAwIG4gCjAwMDAwNDc3NjcgMDAwMDAg
+ biAKMDAwMDA0ODE5OSAwMDAwMCBuIAowMDAwMDU3NzYwIDAwMDAwIG4gCjAwMDAwNTc3
+ ODEgMDAwMDAgbiAKMDAwMDA1ODAwNiAwMDAwMCBuIAowMDAwMDU4NjU3IDAwMDAwIG4g
+ CjAwMDAwNTg2ODQgMDAwMDAgbiAKMDAwMDA1ODczNiAwMDAwMCBuIAowMDAwMDU4NzY1
+ IDAwMDAwIG4gCjAwMDAwNTg4MDggMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA4NyAv
+ Um9vdCA1NyAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPDA0ZjlmMDRhNjk0OTdlYjNhMjU0
+ OGI4YjdiZWM0OTE4Pgo8MDRmOWYwNGE2OTQ5N2ViM2EyNTQ4YjhiN2JlYzQ5MTg+IF0g
+ Pj4Kc3RhcnR4cmVmCjU4OTcwCiUlRU9GCjMgMCBvYmoKPDwvVHlwZSAvUGFnZSAvQ29u
+ dGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNTg4IDc2OF0gL1BhcmVudCA0IDAgUiAv
+ UmVzb3VyY2VzIDcgMCBSID4+CmVuZG9iago0MiAwIG9iago8PC9UeXBlIC9QYWdlIC9D
+ b250ZW50cyA0MyAwIFIgL01lZGlhQm94IFswIDAgNTg4IDE1MzZdIC9QYXJlbnQgNCAw
+ IFIgL1Jlc291cmNlcyA0NSAwIFIgPj4KZW5kb2JqCjUzIDAgb2JqCjw8L1R5cGUgL1Bh
+ Z2UgL0NvbnRlbnRzIDU0IDAgUiAvTWVkaWFCb3ggWzAgMCA1ODggNzY4XSAvUGFyZW50
+ IDQgMCBSIC9SZXNvdXJjZXMgNTYgMCBSID4+CmVuZG9iagoxIDAgb2JqCjw8L0F1dGhv
+ ciAobWNsZXJvblxuU2NvdHQgTWFpbikvQ3JlYXRpb25EYXRlIChEOjIwMDcxMTA2MjEz
+ MTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMikvTW9kRGF0
+ ZSAoRDoyMDExMTIyOTE5NTkwMFopL1Byb2R1Y2VyIDgzIDAgUiAvVGl0bGUgKGFjdGl2
+ aXR5X2xpZmVjeWNsZS5ncmFmZmxlKT4+CmVuZG9iagp4cmVmCjEgMQowMDAwMDYxMTg0
+ IDAwMDAwIG4gCjMgMQowMDAwMDYwODY4IDAwMDAwIG4gCjQyIDEKMDAwMDA2MDk3MSAw
+ MDAwMCBuIAo1MyAxCjAwMDAwNjEwNzggMDAwMDAgbiAKdHJhaWxlcgo8PC9JRCBbPDA0
+ ZjlmMDRhNjk0OTdlYjNhMjU0OGI4YjdiZWM0OTE4PiA8MDRmOWYwNGE2OTQ5N2ViM2Ey
+ NTQ4YjhiN2JlYzQ5MTg+XSAvSW5mbyAxIDAgUiAvUHJldiA1ODk3MCAvUm9vdCA1NyAw
+ IFIgL1NpemUgODc+PgpzdGFydHhyZWYKNjEzODUKJSVFT0YK
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ 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
+ QlIAAAAYAAABZnB0UFQAAAAWAAABfnpoQ04AAAAMAAABlGVzRVMAAAASAAABoGphSlAA
+ AAAOAAABsnJ1UlUAAAAkAAABwHN2U0UAAAAQAAAB5HpoVFcAAAAOAAAB9GRlREUAAAAQ
+ AAACAmZpRkkAAAAQAAACEml0SVQAAAAUAAACImtvS1IAAAAMAAACNgBLAGwAZQB1AHIA
+ ZQBuAC0ATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtAEsAbwBsAG8AcgAg
+ AEwAQwBEAEMAbwBsAG8AcgAgAEwAQwBEAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAA
+ YwBvAHUAbABlAHUAcgBMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBMAEMARAAgAGEAIABD
+ AG8AcgBlAHNfaYJyACAATABDAEQATABDAEQAIABjAG8AbABvAHIwqzDpMPwAIABMAEMA
+ RAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEEPwQ7BDUEOQBGAOQAcgBnAC0ATABD
+ AERfaYJybbJmdphveTpWaABGAGEAcgBiAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwA
+ QwBEACAAYwBvAGwAbwByAGnO7LfsACAATABDAEQAAHRleHQAAAAAQ29weXJpZ2h0IEFw
+ cGxlLCBJbmMuLCAyMDExAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81IAAQAA
+ AAEWz1hZWiAAAAAAAABvMQAAOWMAAAGDWFlaIAAAAAAAAGDuAAC3agAACBJYWVogAAAA
+ AAAAJrcAAA8yAADJl2N1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANgA7
+ AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcA
+ vADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFM
+ AVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwC
+ FAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML
+ AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsE
+ SARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1
+ BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EH
+ dAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlk
+ CXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gL
+ sAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4u
+ DkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPUR
+ ExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQn
+ FEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kX
+ rhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtj
+ G4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kf
+ lB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPw
+ JB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo
+ 1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3h
+ LhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0Yz
+ fzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlC
+ OX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/
+ oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYi
+ RmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJN
+ Sk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP
+ VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVc
+ hlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSU
+ ZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQht
+ YG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+
+ dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/
+ 5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZ
+ if6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aU
+ IJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6u
+ nx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamq
+ HKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WK
+ tgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB
+ 48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42
+ zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvb
+ gNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui8
+ 6Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32
+ +/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJmZgAA
+ 8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAAAAwEAAAIAAAAHAB4ASgCLAOMBKgFuAcAC
+ GQJ0AtoDSQPDBEcE1AVtBhEGwgd8CD4JBwndCrkLnAyPDacO3BAQEUsSiRPJFREWXBes
+ GQQaYRu9HSAejB/4IWQi2iROJcknLyiOKesrSSyfLfYvQzCNMdAzDTRCNXM2nDfAOOA5
+ /TsXPCs9OT5FP1JAY0FzQoRDl0SrRb9G00fpSP9KFUssTENNW05pT3ZQhVGSUp9Tq1S3
+ VcJWy1fSWNlZ31rjW+hc7V3oXtxfzmC/Ya9inmONZHplZmZRZztoJGkOafZq32vGbKlt
+ jW5wb1NwN3Eacfxy3nPAdKN1hXZmd0l4K3kKeep6zHuwfJh9hH53f3GAcoF6goqDoYS9
+ hd+HCYg8iXCKo4vWjQqOPI9tkJ6RzpL9lCyVW5aKl7aY4JoLmzWcX52JnrKf26EEoi2j
+ VqR/paim0af4qSCqTKt8rLKt8a86sI+x77NbtM+2T7fUuTy6dLupvNy+C78zwFbBccKF
+ w5HElsWWxpHHiMiDyYfKjcuNzIXNdM5Xzy7P+9DA0XvSNtL209fUudWa1n3XX9hC2SXa
+ Cdrt29Hctd2a3n3fYOBE4SniEOL54+bk1uXJ5sHnu+i56bnqpeuO7HbtXu5F7yvwEPD1
+ 8dryvvOh9IX1aPZL9y/4E/j3+dz6wPui/IT9Zf5E/yL//wAAAAYAGgBAAHgAxQETAUwB
+ kAHfAjMCjgLzA18D1gRVBN0FcAYOBrcHZQgaCNoJnApnC0IMPQ1UDmgPgBCgEcES6RQV
+ FUQWeRevGO8aLhtyHLweCx9WIKoh/yNBJIElvyb8KDcpaiqdK8ss8i4VLzMwSDFbMmcz
+ cTR5NX02ejdqOFs5TDo9OzA8Ij0VPgg++j/tQOFB1ULKQ75Es0WnRphHiEh3SWhKWUtI
+ TDhNJ04VTwRP9FDiUdFSwFOwVJ5ViFZzV15YSVkzWh1bBlvuXNZdvV6jX4pgb2FUYjRj
+ DGPiZLllj2ZmZzxoEWjmabtqkWtlbDptD23jbrdviHBZcStx/HLOc6B0cnVDdhV253e5
+ eIx5XnowewJ713yvfYt+bX9VgESBOoI5gz2ESIVYhm6Hh4ilicOK4Yv+jRyOOY9WkHOR
+ kJKsk8mU5pYClxyYNplRmm2bi5ysndCe9qAioVCig6O5pPGmLqdxqLSp96s5rHytvq8A
+ sEGxg7LFtAW1R7aIt8e5B7pFu4K8vb30vybAU8F7wp7Du8TVxenG98gEyRPKIcsvzD3N
+ TM5az2jQd9GG0pXTotSv1bzWydfW2OXZ9NsD3BTdJd4430zgZ+Gj4unkJ+Va5obnqujH
+ 6eHq+OwO7SXuP+9b8IDx0PMz9JP18/dS+LT6GPuF/Pj+d///AAAABAARACoATgCAAMAB
+ BwE6AXQBtwICAk0CoAL7A14DygQ8BLYFOAXCBlAG4wd7CBsIxwmNCmMLPAwbDP4N4g7L
+ D7UQpRGYEo4TiBSFFYYWixeTGJ8Zqxq4G70cvR2+Hr8fviC7IbUiqyOdJIsldSZcJ0Ao
+ IikAKdsqtyuLLFYtIC3qLrUvgDBLMRYx4TKrM3U0PzUJNdM2nTdoODQ4+Dm+OoU7SzwS
+ PNo9oj5qPzI//EDGQZFCXUMqQ/dEw0WPRltHJ0fySL5JikpWSyFL60y2TYBOTE8WT+FQ
+ q1FzUjtTAlPKVJJVWlYgVudXrlh1WTtaAlrJW49cU10WXdlem19dYB1g3WGdYl1jHGPa
+ ZJhlVmYTZs9ni2hFaQBpu2p2azFr7GynbWJuHG7Xb5NwTnEIccFyenMzc+x0pXVedhd2
+ z3eHeD94+Hmweml7IHvZfJR9VH4ZfuV/uICUgXmCZoNchFmFW4Zlh3WIhYmWiqaLtozG
+ jdWO5Y/0kQOSE5MilDCVOpZDl0qYUZlZmmKbb5x/nZOerJ/LoO+iJaN5pNCmJ6d+qNaq
+ LauErNuuMa+IsN6yNrOLtN+2M7eHuNy6M7uKvOK+PL+YwPbCVMO1xSfGpMgtycXLa80k
+ zuzQx9Kx1KnWsNjB2t3dAN8w4afkhueK6rfuD/GI9Rj4tfxX//8AAG5kaW4AAAAAAAAG
+ NgAApeMAAFahAABRWwAApysAACWbAAAOFAAAUA0AAFQ5AAJCjwAB2ZkAAUeuAAMBAAAC
+ AAAADQAnAEYAZgCHAKgAyQDrAQ4BMQFVAXoBnQG8AdsB/AIdAj8CYgKGAqoCzwL0AxsD
+ QQNoA5ADuQPiBAsENQRgBIwEuATkBRIFPwVuBaEF1QYKBkEGeAayBuwHKAdnB6cH6Qgu
+ CHUIvwkLCVoJrAoBClgKsgsOC24L0gw4DKANCA1yDd4OSg65DygPmhANEIEQ9xFvEegS
+ YxLfE2IT5xRtFPYVgRYOFp0XLxfDGFsY9RmRGjEa0xt3HB0c0B2HHkIfAB/BIIUhTSIZ
+ IugjuySRJWomRiclKAwo9SniKtIrxCy6LbMusC+vMLIxuDLAM8s03jXxNwQ4FTkjOi07
+ MTwwPSo+ID8SQAJA70HbQr9DokSIRW9GWEdCSC9JHkoPSwNL+EzwTepO5U/iUOFR5FLr
+ U/NU/VYJVxdYJ1k5Wk1bY1x7XZVesF/OYO1iDmMzZFllf2ajZ8Vo42n9axJsIW0qbi5v
+ LXApcSJyFnMJc/p06XYad014hHm/ev58RX2TfuuATYG7gzSEuYZJh+OJh4shjK6OQI/g
+ kZGTWJU9l0mZd5vFnhugDqICo/ml8qfuqeyr7K3vr/Wx/bQIthu4L7pEvFm+acB2wn7E
+ gMZ9yHbKbMxgzovQuNLq1SHXXdmf2+beMeCB4tXlK+eI6efsR+6q8RDze/Xt+Gb65/1w
+ //8AAAAPAC4AUQB1AJoAvwDkAQsBMgFbAYQBqQHLAe8CFAI6AmACiAKwAtkDAwMtA1kD
+ hQOxA98EDQQ8BGsEmwTNBP4FMQVkBZwF1QYPBkwGiQbIBwoHTQeSB9oIJQhyCMIJFgls
+ CcYKIwqCCuULSgu6DCsMnw0VDYwOBg6CDwAPgRADEIgRDhGXEiISrxNAE9UUbRUGFaIW
+ QRbiF4YYLRjWGYEaMBrgG5McSB0EHcIegx9GIAwg1iGiInMjRiQeJPgl1ia3J6AolymR
+ Ko4rjiySLZoupi+1MMgx3jL3NBU1OjZjN444vTnvOyU8Xz2bPttAHkFkQq9D+0VFRotH
+ y0kFSjdLYkyGTaZOwU/aUPBSBFMWVCpVQFZZV3NYj1muWs5b8V0WXj1fZmCRYb5i7mQj
+ ZVhmj2fGaP1qNGtpbJ5t0W8CcDJxYHKOc7t06HYPdzd4YHmLerh7530Xfkl/fYCygeqD
+ I4RdhZqG2IgXiVmKnovkjS2OeI/GkRiSb5PMlTCWm5gOmYmbDJyVniefx6FpowyksqZa
+ qASpsKtfrRCuw7B4si+z6LWnt2m5LbryvLq+gsBMwhfD48Wwx3zJSssZzNDOVc/j0XrT
+ HtTO1ovYU9om3AHd4t/G4avjj+Vy51PpG+qf7Cftse8+8M7yX/Pv9YD3D/iZ+h77n/0a
+ /o///wAAABcAQQBwAJ8AzwD/ATIBZgGZAcUB8wIiAlIChAK3AuwDIQNYA5ADyQQDBD4E
+ egS3BPUFNQV2Bb0GBQZPBpsG6gc7B5AH6AhECKQJCAlwCdwKTArACzcLugxCDMwNWQ3q
+ Dn4PFQ+wEE8Q8RGWEj4S6ROdFFMVDRXKFokXTBgSGNoZpRpyG0EcExzrHcYepB+GIGsh
+ VCJBIzIkJyUfJhsnGiggKSsqOStLLGEtfC6aL70w5DIOMzw0cjWuNu84NTmBOtI8KD2E
+ PuZATEG3QytEpEYhR6NJKUq1TERN2E9wUQxSsFRbVglXvVl2WzRc+F7AYI1iXmQ2Zgxn
+ 2Wmaa0ls6W55b/xxdHLldFB1s3cReHJ51Hs6fKF+C394gOeCWIPMhUKGuog0ibaLPYzJ
+ jlmP65F+kxGUopYvl7mZPpq/nDydtp8FoEyhlaLfpCqld6bFqBWpZqq6rA6tZK68sBWx
+ cLLLtCi1irbtuFG5t7sevIa97r9XwMHCK8OVxP/GasfUyUDKq8wWzXPOytAb0WjSrNPq
+ 1SPWV9eC2KjZytrl2/zdEN4f3yvgNeE64j7jQORA5T7mOuc36DHpKuoi6w7r6ey57Xfu
+ Ne7s76XwWfEK8bzyZvMQ87j0XPUA9aL2Qvbi93/4HPi5+VX58PqM+yf7wvxe/Pj9k/4v
+ /sn/ZP//AABzZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADA
+ bG1tb2QAAAAAAAAGEAAAnLEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>Sheets</key>
+ <array>
+ <dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {588, 768}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{429.333, 473.825}, {91, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>Position</key>
+ <real>0.40094965696334839</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKx5Vc2VyIG5hdmln
+ YXRlcwp0byB0aGUgYWN0aXZpdHmG
+ hAJpSQEekoSEhAxOU0RpY3Rpb25h
+ cnkAlIQBaQOShJaWB05TQ29sb3KG
+ koSEhAdOU0NvbG9yAJSEAWMDhAJm
+ ZgCDZmYmP4aShJaWBk5TRm9udIaS
+ hISEBk5TRm9udB6UmRyEBVsyOGNd
+ BgAAABQAAAD//kgAZQBsAHYAZQB0
+ AGkAYwBhAIQBZgybAJsBmwCbAIaS
+ hJaWEE5TUGFyYWdyYXBoU3R5bGWG
+ koSEhBBOU1BhcmFncmFwaFN0eWxl
+ AJSEBENDQFMCAISEhAdOU0FycmF5
+ AJSZDJKEhIQJTlNUZXh0VGFiAJSE
+ AkNmAByGkoSlpAA4hpKEpaQAVIaS
+ hKWkAHCGkoSlpACBjACGkoSlpACB
+ qACGkoSlpACBxACGkoSlpACB4ACG
+ koSlpACB/ACGkoSlpACBGAGGkoSl
+ pACBNAGGkoSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 User navigates\
+to the activity}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{58.5, 236.825}, {91, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>228</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>Offset</key>
+ <real>-2</real>
+ <key>Position</key>
+ <real>0.15748642385005951</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKx5Vc2VyIG5hdmln
+ YXRlcwp0byB0aGUgYWN0aXZpdHmG
+ hAJpSQEekoSEhAxOU0RpY3Rpb25h
+ cnkAlIQBaQOShJaWB05TQ29sb3KG
+ koSEhAdOU0NvbG9yAJSEAWMDhAJm
+ ZgCDZmYmP4aShJaWBk5TRm9udIaS
+ hISEBk5TRm9udB6UmRyEBVsyOGNd
+ BgAAABQAAAD//kgAZQBsAHYAZQB0
+ AGkAYwBhAIQBZgybAJsBmwCbAIaS
+ hJaWEE5TUGFyYWdyYXBoU3R5bGWG
+ koSEhBBOU1BhcmFncmFwaFN0eWxl
+ AJSEBENDQFMCAISEhAdOU0FycmF5
+ AJSZDJKEhIQJTlNUZXh0VGFiAJSE
+ AkNmAByGkoSlpAA4hpKEpaQAVIaS
+ hKWkAHCGkoSlpACBjACGkoSlpACB
+ qACGkoSlpACBxACGkoSlpACB4ACG
+ koSlpACB/ACGkoSlpACBGAGGkoSl
+ pACBNAGGkoSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 User navigates\
+to the activity}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ <key>Info</key>
+ <integer>4</integer>
+ </dict>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{102, 293.915}</string>
+ <string>{204, 153}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Info</key>
+ <integer>6</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{31, 406.546}, {142, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>226</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>Position</key>
+ <real>0.70940077304840088</real>
+ <key>RotationType</key>
+ <integer>4</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKyZBcHBzIHdpdGgg
+ aGlnaGVyIHByaW9yaXR5IApuZWVk
+ IG1lbW9yeYaEAmlJASaShISEDE5T
+ RGljdGlvbmFyeQCUhAFpA5KElpYH
+ TlNDb2xvcoaShISEB05TQ29sb3IA
+ lIQBYwOEAmZmAINmZiY/hpKElpYG
+ TlNGb250hpKEhIQGTlNGb250HpSZ
+ HIQFWzI4Y10GAAAAFAAAAP/+SABl
+ AGwAdgBlAHQAaQBjAGEAhAFmDJsA
+ mwGbAJsAhpKElpYQTlNQYXJhZ3Jh
+ cGhTdHlsZYaShISEEE5TUGFyYWdy
+ YXBoU3R5bGUAlIQEQ0NAUwIAhISE
+ B05TQXJyYXkAlJkMkoSEhAlOU1Rl
+ eHRUYWIAlIQCQ2YAHIaShKWkADiG
+ koSlpABUhpKEpaQAcIaShKWkAIGM
+ AIaShKWkAIGoAIaShKWkAIHEAIaS
+ hKWkAIHgAIaShKWkAIH8AIaShKWk
+ AIEYAYaShKWkAIE0AYaShKWkAIFQ
+ AYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Apps with higher priority \
+need memory}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>226</integer>
+ </dict>
+ <key>ID</key>
+ <integer>225</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{203.5, 426.026}</string>
+ <string>{173, 425.546}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>200</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{204, 523.454}</string>
+ <string>{102, 344.085}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Info</key>
+ <integer>4</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{43, 293.915}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 App process killed}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>221</integer>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 636.168}</string>
+ <string>{263, 659.214}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 659.214}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>221</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Activity\
+ shut down}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{359.5, 377.305}, {81, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>220</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>219</integer>
+ <key>Position</key>
+ <real>0.33032712340354919</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKxxVc2VyIHJldHVy
+ bnMKdG8gdGhlIGFjdGl2aXR5hoQC
+ aUkBHJKEhIQMTlNEaWN0aW9uYXJ5
+ AJSEAWkDkoSWlgdOU0NvbG9yhpKE
+ hIQHTlNDb2xvcgCUhAFjA4QCZmYA
+ g2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYA
+ AAAUAAAA//5IAGUAbAB2AGUAdABp
+ AGMAYQCEAWYMmwCbAZsAmwCGkoSW
+ lhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJD
+ ZgAchpKEpaQAOIaShKWkAFSGkoSl
+ pABwhpKEpaQAgYwAhpKEpaQAgagA
+ hpKEpaQAgcQAhpKEpaQAgeAAhpKE
+ paQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 User returns\
+to the activity}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>219</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{322, 426.026}</string>
+ <string>{400, 343.883}</string>
+ <string>{322, 257}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>216</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{322, 523.454}</string>
+ <string>{474.833, 220.286}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>217</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{415.833, 205}</string>
+ <string>{322, 205}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>216</integer>
+ <key>Info</key>
+ <integer>4</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{415.833, 189.714}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>216</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onRestart()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 293.714}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Activity running}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{176.5, 549.527}, {173, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>211</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>208</integer>
+ <key>Position</key>
+ <real>0.44555199146270752</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKzpUaGUgYWN0aXZp
+ dHkgaXMgZmluaXNoaW5nIG9yCmJl
+ aW5nIGRlc3Ryb3llZCBieSB0aGUg
+ c3lzdGVthoQCaUkBOpKEhIQMTlNE
+ aWN0aW9uYXJ5AJSEAWkDkoSWlgdO
+ U0NvbG9yhpKEhIQHTlNDb2xvcgCU
+ hAFjA4QCZmYAg2ZmJj+GkoSWlgZO
+ U0ZvbnSGkoSEhAZOU0ZvbnQelJkc
+ hAVbMjhjXQYAAAAUAAAA//5IAGUA
+ bAB2AGUAdABpAGMAYQCEAWYMmwCb
+ AZsAmwCGkoSWlhBOU1BhcmFncmFw
+ aFN0eWxlhpKEhIQQTlNQYXJhZ3Jh
+ cGhTdHlsZQCUhARDQ0BTAgCEhIQH
+ TlNBcnJheQCUmQyShISECU5TVGV4
+ dFRhYgCUhAJDZgAchpKEpaQAOIaS
+ hKWkAFSGkoSlpABwhpKEpaQAgYwA
+ hpKEpaQAgagAhpKEpaQAgcQAhpKE
+ paQAgeAAhpKEpaQAgfwAhpKEpaQA
+ gRgBhpKEpaQAgTQBhpKEpaQAgVAB
+ hoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 The activity is finishing or\
+being destroyed by the system}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{214.5, 451.089}, {97, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Position</key>
+ <real>0.43043658137321472</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKyJUaGUgYWN0aXZp
+ dHkgaXMgCm5vIGxvbmdlciB2aXNp
+ YmxlhoQCaUkBIpKEhIQMTlNEaWN0
+ aW9uYXJ5AJSEAWkDkoSWlgdOU0Nv
+ bG9yhpKEhIQHTlNDb2xvcgCUhAFj
+ A4QCZmYAg2ZmJj+GkoSWlgZOU0Zv
+ bnSGkoSEhAZOU0ZvbnQelJkchAVb
+ MjhjXQYAAAAUAAAA//5IAGUAbAB2
+ AGUAdABpAGMAYQCEAWYMmwCbAZsA
+ mwCGkoSWlhBOU1BhcmFncmFwaFN0
+ eWxlhpKEhIQQTlNQYXJhZ3JhcGhT
+ dHlsZQCUhARDQ0BTAgCEhIQHTlNB
+ cnJheQCUmQyShISECU5TVGV4dFRh
+ YgCUhAJDZgAchpKEpaQAOIaShKWk
+ AFSGkoSlpABwhpKEpaQAgYwAhpKE
+ paQAgagAhpKEpaQAgcQAhpKEpaQA
+ geAAhpKEpaQAgfwAhpKEpaQAgRgB
+ hpKEpaQAgTQBhpKEpaQAgVABhoYA
+ hoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 The activity is \
+no longer visible}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{197.5, 354.367}, {131, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>214</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>213</integer>
+ <key>Position</key>
+ <real>0.4409976601600647</real>
+ <key>RotationType</key>
+ <integer>4</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKypBbm90aGVyIGFj
+ dGl2aXR5IGNvbWVzCmludG8gdGhl
+ IGZvcmVncm91bmSGhAJpSQEqkoSE
+ hAxOU0RpY3Rpb25hcnkAlIQBaQOS
+ hJaWB05TQ29sb3KGkoSEhAdOU0Nv
+ bG9yAJSEAWMDhAJmZgCDZmYmP4aS
+ hJaWBk5TRm9udIaShISEBk5TRm9u
+ dB6UmRyEBVsyOGNdBgAAABQAAAD/
+ /kgAZQBsAHYAZQB0AGkAYwBhAIQB
+ ZgybAJsBmwCbAIaShJaWEE5TUGFy
+ YWdyYXBoU3R5bGWGkoSEhBBOU1Bh
+ cmFncmFwaFN0eWxlAJSEBENDQFMC
+ AISEhAdOU0FycmF5AJSZDJKEhIQJ
+ TlNUZXh0VGFiAJSEAkNmAByGkoSl
+ pAA4hpKEpaQAVIaShKWkAHCGkoSl
+ pACBjACGkoSlpACBqACGkoSlpACB
+ xACGkoSlpACB4ACGkoSlpACB/ACG
+ koSlpACBGAGGkoSlpACBNAGGkoSl
+ pACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Another activity comes\
+into the foreground}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>208</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 538.74}</string>
+ <string>{263, 605.596}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>201</integer>
+ </dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 441.312}</string>
+ <string>{263, 508.168}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>200</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>213</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 343.884}</string>
+ <string>{263, 410.74}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>4</integer>
+ </dict>
+ <key>ID</key>
+ <integer>215</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 272.286}</string>
+ <string>{263, 293.714}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>204</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 220.286}</string>
+ <string>{263, 241.714}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>203</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 168.286}</string>
+ <string>{263, 189.714}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{263, 116.286}</string>
+ <string>{263, 137.714}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 605.596}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 508.168}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStop()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 410.74}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onPause()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 241.714}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onResume()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 189.714}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStart()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 137.714}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>192</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{204, 66.1163}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Activity launched}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OutlineStyle</key>
+ <string>Basic</string>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>VPages</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {588, 1536}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>209</integer>
+ </dict>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 728.248}</string>
+ <string>{281, 747.619}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>208</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>222</integer>
+ </dict>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 778.191}</string>
+ <string>{281, 798.915}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>209</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 798.915}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Fragment is destroyed}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{394, 603.395}, {90, 66}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>221</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKzZUaGUgZnJhZ21l
+ bnQKcmV0dXJucyB0byB0aGUKbGF5
+ b3V0IGZyb20gdGhlCmJhY2sgc3Rh
+ Y2uGhAJpSQE2koSEhAxOU0RpY3Rp
+ b25hcnkAlIQBaQOShJaWB05TQ29s
+ b3KGkoSEhAdOU0NvbG9yAJSEAWMD
+ hAJmZgCDZmYmP4aShJaWBk5TRm9u
+ dIaShISEBk5TRm9udB6UmRyEBVsy
+ OGNdBgAAABQAAAD//kgAZQBsAHYA
+ ZQB0AGkAYwBhAIQBZgybAJsBmwCb
+ AIaShJaWEE5TUGFyYWdyYXBoU3R5
+ bGWGkoSEhBBOU1BhcmFncmFwaFN0
+ eWxlAJSEBENDQFMCAISEhAdOU0Fy
+ cmF5AJSZDJKEhIQJTlNUZXh0VGFi
+ AJSEAkNmAByGkoSlpAA4hpKEpaQA
+ VIaShKWkAHCGkoSlpACBjACGkoSl
+ pACBqACGkoSlpACBxACGkoSlpACB
+ 4ACGkoSlpACB/ACGkoSlpACBGAGG
+ koSlpACBNAGGkoSlpACBUAGGhgCG
+ hoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 The fragment\
+returns to the\
+layout from the\
+back stack}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>220</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{310.5, 669.395}</string>
+ <string>{438, 618}</string>
+ <string>{340, 208.533}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>208</integer>
+ </dict>
+ <key>ID</key>
+ <integer>219</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{251.5, 669.395}</string>
+ <string>{281, 697.176}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Info</key>
+ <integer>9</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>218</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{310.5, 621.689}</string>
+ <string>{310.5, 638.823}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>217</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{251.5, 621.689}</string>
+ <string>{251.5, 638.823}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Info</key>
+ <integer>9</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>216</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{310.5, 573.983}</string>
+ <string>{310.5, 591.117}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>215</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{251.5, 573.983}</string>
+ <string>{251.5, 591.117}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Info</key>
+ <integer>9</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{288, 457.277}, {109, 66}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>214</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBK0FUaGUgZnJhZ21l
+ bnQgaXMgCmFkZGVkIHRvIHRoZSBi
+ YWNrIApzdGFjaywgdGhlbiAKcmVt
+ b3ZlZC9yZXBsYWNlZIaEAmlJAUGS
+ hISEDE5TRGljdGlvbmFyeQCUhAFp
+ A5KElpYHTlNDb2xvcoaShISEB05T
+ Q29sb3IAlIQBYwOEAmZmAINmZiY/
+ hpKElpYGTlNGb250hpKEhIQGTlNG
+ b250HpSZHIQFWzI4Y10GAAAAFAAA
+ AP/+SABlAGwAdgBlAHQAaQBjAGEA
+ hAFmDJsAmwGbAJsAhpKElpYQTlNQ
+ YXJhZ3JhcGhTdHlsZYaShISEEE5T
+ UGFyYWdyYXBoU3R5bGUAlIQEQ0NA
+ UwIAhISEB05TQXJyYXkAlJkMkoSE
+ hAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hKWkADiGkoSlpABUhpKEpaQAcIaS
+ hKWkAIGMAIaShKWkAIGoAIaShKWk
+ AIHEAIaShKWkAIHgAIaShKWkAIH8
+ AIaShKWkAIEYAYaShKWkAIE0AYaS
+ hKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 The fragment is \
+added to the back \
+stack, then \
+removed/replaced}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{175, 457.277}, {107, 66}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>213</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKzpVc2VyIG5hdmln
+ YXRlcyAKYmFja3dhcmQgb3IgCmZy
+ YWdtZW50IGlzIApyZW1vdmVkL3Jl
+ cGxhY2VkhoQCaUkBOpKEhIQMTlNE
+ aWN0aW9uYXJ5AJSEAWkDkoSWlgdO
+ U0NvbG9yhpKEhIQHTlNDb2xvcgCU
+ hAFjA4QCZmYAg2ZmJj+GkoSWlgZO
+ U0ZvbnSGkoSEhAZOU0ZvbnQelJkc
+ hAVbMjhjXQYAAAAUAAAA//5IAGUA
+ bAB2AGUAdABpAGMAYQCEAWYMmwCb
+ AZsAmwCGkoSWlhBOU1BhcmFncmFw
+ aFN0eWxlhpKEhIQQTlNQYXJhZ3Jh
+ cGhTdHlsZQCUhARDQ0BTAgCEhIQH
+ TlNBcnJheQCUmQyShISECU5TVGV4
+ dFRhYgCUhAJDZgAchpKEpaQAOIaS
+ hKWkAFSGkoSlpABwhpKEpaQAgYwA
+ hpKEpaQAgagAhpKEpaQAgcQAhpKE
+ paQAgeAAhpKEpaQAgfwAhpKEpaQA
+ gRgBhpKEpaQAgTQBhpKEpaQAgVAB
+ hoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 User navigates \
+backward or \
+fragment is \
+removed/replaced}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>212</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>44</real>
+ <key>Points</key>
+ <array>
+ <string>{312.935, 447.471}</string>
+ <string>{310.5, 543.411}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Info</key>
+ <integer>15</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>211</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{250.506, 447.471}</string>
+ <string>{251.5, 543.411}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Info</key>
+ <integer>16</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 747.619}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>209</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDetach()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 697.176}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>208</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 638.823}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.596285, -1.19257}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.596285, -1.19257}</string>
+ <string>{1.19257, -0.596285}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.19257, 0.596285}</string>
+ <string>{0.596285, 1.19257}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.596285, 1.19257}</string>
+ <string>{-1.19257, 0.596285}</string>
+ <string>{-1.33333, 0}</string>
+ <string>{-1.19257, -0.596285}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroyView()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 591.117}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.596285, -1.19257}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.596285, -1.19257}</string>
+ <string>{1.19257, -0.596285}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.19257, 0.596285}</string>
+ <string>{0.596285, 1.19257}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.596285, 1.19257}</string>
+ <string>{-1.19257, 0.596285}</string>
+ <string>{-1.33333, 0}</string>
+ <string>{-1.19257, -0.596285}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStop()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 543.411}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.596287, -1.19257}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.596287, -1.19257}</string>
+ <string>{1.19257, -0.596281}</string>
+ <string>{1.33333, 5.08626e-06}</string>
+ <string>{1.19257, 0.596288}</string>
+ <string>{0.596283, 1.19257}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.596283, 1.19257}</string>
+ <string>{-1.19257, 0.596289}</string>
+ <string>{-1.33333, 5.08627e-06}</string>
+ <string>{-1.19257, -0.596281}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onPause()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Info</key>
+ <integer>6</integer>
+ </dict>
+ <key>ID</key>
+ <integer>204</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 377.11}</string>
+ <string>{281, 397.301}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 397.301}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Fragment is active}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ <key>ID</key>
+ <integer>203</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 326.346}</string>
+ <string>{281, 346.538}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>196</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>196</integer>
+ </dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 274.993}</string>
+ <string>{281, 295.774}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>195</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>195</integer>
+ </dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 224.319}</string>
+ <string>{281, 244.421}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 172.645}</string>
+ <string>{281, 193.247}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 122.471}</string>
+ <string>{281, 142.073}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ </dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{281, 72.5287}</string>
+ <string>{281, 91.8993}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 346.538}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onResume()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 295.774}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStart()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 244.421}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>195</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onActivityCreated()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 193.247}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreateView()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 142.073}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 91.8993}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>192</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onAttach()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222, 22.359}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Fragment is added}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OutlineStyle</key>
+ <string>Basic</string>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 3</string>
+ <key>UniqueID</key>
+ <integer>3</integer>
+ <key>VPages</key>
+ <integer>2</integer>
+ </dict>
+ <dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {588, 768}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>209</integer>
+ </dict>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 624.485}</string>
+ <string>{348, 644.856}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>208</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>208</integer>
+ </dict>
+ <key>ID</key>
+ <integer>219</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 573.06}</string>
+ <string>{348, 593.413}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>207</integer>
+ </dict>
+ <key>ID</key>
+ <integer>217</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 507.942}</string>
+ <string>{348, 542.488}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ </dict>
+ <key>ID</key>
+ <integer>215</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 444.736}</string>
+ <string>{348, 476.87}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Info</key>
+ <integer>8</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 644.856}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>209</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDetach()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 593.413}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>208</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 542.488}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.596285, -1.19257}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.596285, -1.19257}</string>
+ <string>{1.19257, -0.596285}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.19257, 0.596285}</string>
+ <string>{0.596285, 1.19257}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.596285, 1.19257}</string>
+ <string>{-1.19257, 0.596285}</string>
+ <string>{-1.33333, 0}</string>
+ <string>{-1.19257, -0.596285}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroyView()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 476.87}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.596285, -1.19257}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.596285, -1.19257}</string>
+ <string>{1.19257, -0.596285}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.19257, 0.596285}</string>
+ <string>{0.596285, 1.19257}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.596285, 1.19257}</string>
+ <string>{-1.19257, 0.596285}</string>
+ <string>{-1.33333, 0}</string>
+ <string>{-1.19257, -0.596285}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStop()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 414.164}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.596287, -1.19257}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.596287, -1.19257}</string>
+ <string>{1.19257, -0.596281}</string>
+ <string>{1.33333, 5.08626e-06}</string>
+ <string>{1.19257, 0.596288}</string>
+ <string>{0.596283, 1.19257}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.596283, 1.19257}</string>
+ <string>{-1.19257, 0.596289}</string>
+ <string>{-1.33333, 5.08627e-06}</string>
+ <string>{-1.19257, -0.596281}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onPause()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>205</integer>
+ </dict>
+ <key>ID</key>
+ <integer>204</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 381.913}</string>
+ <string>{348, 414.164}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ <key>ID</key>
+ <integer>203</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 318.47}</string>
+ <string>{348, 351.341}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>196</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>196</integer>
+ </dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 252.689}</string>
+ <string>{348, 287.898}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>195</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>195</integer>
+ </dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 201.911}</string>
+ <string>{348, 222.117}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>194</integer>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 150.748}</string>
+ <string>{348, 170.839}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{348, 99.5}</string>
+ <string>{348, 120.176}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 351.341}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onResume()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 287.898}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStart()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 222.117}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>195</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onActivityCreated()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 170.839}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>194</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreateView()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 120.176}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{289, 68.428}, {118, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>192</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onAttach()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>169</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 53.048}</string>
+ <string>{454, 53.048}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>168</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 690.302}</string>
+ <string>{454, 690.302}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>170</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 524.465}</string>
+ <string>{454, 524.465}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>171</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 459.302}</string>
+ <string>{454, 459.302}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>172</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 396.302}</string>
+ <string>{454, 396.302}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>153</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 333.434}</string>
+ <string>{454, 333.434}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>152</integer>
+ <key>Points</key>
+ <array>
+ <string>{126, 270.566}</string>
+ <string>{454, 270.566}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.630435</string>
+ <key>g</key>
+ <string>0.630435</string>
+ <key>r</key>
+ <string>0.630435</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{157, 557.472}, {65, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>149</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwlEZXN0cm95ZWSG
+ hAJpSQEJkoSEhAxOU0RpY3Rpb25h
+ cnkAlIQBaQOShJaWB05TQ29sb3KG
+ koSEhAdOU0NvbG9yAJSEAWMDhAJm
+ ZgCDZmYmP4aShJaWBk5TRm9udIaS
+ hISEBk5TRm9udB6UmRyEBVsyOGNd
+ BgAAABQAAAD//kgAZQBsAHYAZQB0
+ AGkAYwBhAIQBZgybAJsBmwCbAIaS
+ hJaWEE5TUGFyYWdyYXBoU3R5bGWG
+ koSEhBBOU1BhcmFncmFwaFN0eWxl
+ AJSEBENDQFMCAISEhAdOU0FycmF5
+ AJSZDJKEhIQJTlNUZXh0VGFiAJSE
+ AkNmAByGkoSlpAA4hpKEpaQAVIaS
+ hKWkAHCGkoSlpACBjACGkoSlpACB
+ qACGkoSlpACBxACGkoSlpACB4ACG
+ koSlpACB/ACGkoSlpACBGAGGkoSl
+ pACBNAGGkoSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Destroyed}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{162, 487.604}, {55, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>148</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwdTdG9wcGVkhoQC
+ aUkBB5KEhIQMTlNEaWN0aW9uYXJ5
+ AJSEAWkDkoSWlgdOU0NvbG9yhpKE
+ hIQHTlNDb2xvcgCUhAFjA4QCZmYA
+ g2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYA
+ AAAUAAAA//5IAGUAbAB2AGUAdABp
+ AGMAYQCEAWYMmwCbAZsAmwCGkoSW
+ lhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJD
+ ZgAchpKEpaQAOIaShKWkAFSGkoSl
+ pABwhpKEpaQAgYwAhpKEpaQAgagA
+ hpKEpaQAgcQAhpKEpaQAgeAAhpKE
+ paQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Stopped}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{285.5, 27.96}, {125, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>144</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs24 \cf0 Fragment Callbacks}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{148, 27.96}, {87, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>143</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs24 \cf0 Activity State}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{158.5, 358.868}, {62, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>142</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwdSZXN1bWVkhoQC
+ aUkBB5KEhIQMTlNEaWN0aW9uYXJ5
+ AJSEAWkDkoSWlgdOU0NvbG9yhpKE
+ hIQHTlNDb2xvcgCUhAFjA4QCZmYA
+ g2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYA
+ AAAUAAAA//5IAGUAbAB2AGUAdABp
+ AGMAYQCEAWYMmwCbAZsAmwCGkoSW
+ lhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJD
+ ZgAchpKEpaQAOIaShKWkAFSGkoSl
+ pABwhpKEpaQAgYwAhpKEpaQAgagA
+ hpKEpaQAgcQAhpKEpaQAgeAAhpKE
+ paQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Resumed}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{164, 422.736}, {51, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>137</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwZQYXVzZWSGhAJp
+ SQEGkoSEhAxOU0RpY3Rpb25hcnkA
+ lIQBaQOShJaWB05TQ29sb3KGkoSE
+ hAdOU0NvbG9yAJSEAWMDhAJmZgCD
+ ZmYmP4aShJaWBk5TRm9udIaShISE
+ Bk5TRm9udB6UmRyEBVsyOGNdBgAA
+ ABQAAAD//kgAZQBsAHYAZQB0AGkA
+ YwBhAIQBZgybAJsBmwCbAIaShJaW
+ EE5TUGFyYWdyYXBoU3R5bGWGkoSE
+ hBBOU1BhcmFncmFwaFN0eWxlAJSE
+ BENDQFMCAISEhAdOU0FycmF5AJSZ
+ DJKEhIQJTlNUZXh0VGFiAJSEAkNm
+ AByGkoSlpAA4hpKEpaQAVIaShKWk
+ AHCGkoSlpACBjACGkoSlpACBqACG
+ koSlpACBxACGkoSlpACB4ACGkoSl
+ pACB/ACGkoSlpACBGAGGkoSlpACB
+ NAGGkoSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Paused}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{165, 297}, {49, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>136</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwdTdGFydGVkhoQC
+ aUkBB5KEhIQMTlNEaWN0aW9uYXJ5
+ AJSEAWkDkoSWlgdOU0NvbG9yhpKE
+ hIQHTlNDb2xvcgCUhAFjA4QCZmYA
+ g2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYA
+ AAAUAAAA//5IAGUAbAB2AGUAdABp
+ AGMAYQCEAWYMmwCbAZsAmwCGkoSW
+ lhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJD
+ ZgAchpKEpaQAOIaShKWkAFSGkoSl
+ pABwhpKEpaQAgYwAhpKEpaQAgagA
+ hpKEpaQAgcQAhpKEpaQAgeAAhpKE
+ paQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Started}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{163, 83.8081}, {53, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>135</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwdDcmVhdGVkhoQC
+ aUkBB5KEhIQMTlNEaWN0aW9uYXJ5
+ AJSEAWkDkoSWlgdOU0NvbG9yhpKE
+ hIQHTlNDb2xvcgCUhAFjA4QCZmYA
+ g2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYA
+ AAAUAAAA//5IAGUAbAB2AGUAdABp
+ AGMAYQCEAWYMmwCbAZsAmwCGkoSW
+ lhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJD
+ ZgAchpKEpaQAOIaShKWkAFSGkoSl
+ pABwhpKEpaQAgYwAhpKEpaQAgagA
+ hpKEpaQAgcQAhpKEpaQAgeAAhpKE
+ paQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Created}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OutlineStyle</key>
+ <string>Basic</string>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 4</string>
+ <key>UniqueID</key>
+ <integer>4</integer>
+ <key>VPages</key>
+ <integer>1</integer>
+ </dict>
+ </array>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UseEntirePage</key>
+ <true/>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array/>
+ <key>Frame</key>
+ <string>{{284, -4}, {869, 866}}</string>
+ <key>ListView</key>
+ <false/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>Sidebar</key>
+ <false/>
+ <key>SidebarWidth</key>
+ <integer>138</integer>
+ <key>VisibleRegion</key>
+ <string>{{-132, 11}, {855, 757}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1.0099999904632568</real>
+ </array>
+ <array>
+ <string>Canvas 3</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ <array>
+ <string>Canvas 4</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
diff --git a/docs/html/images/activity_lifecycle.png b/docs/html/images/activity_lifecycle.png
index aafe49320409..357349c44254 100644
--- a/docs/html/images/activity_lifecycle.png
+++ b/docs/html/images/activity_lifecycle.png
Binary files differ
diff --git a/docs/html/images/fragment_lifecycle.png b/docs/html/images/fragment_lifecycle.png
index ce9d395bfdec..d207db42514f 100644
--- a/docs/html/images/fragment_lifecycle.png
+++ b/docs/html/images/fragment_lifecycle.png
Binary files differ
diff --git a/docs/html/images/fundamentals/diagram_backstack.png b/docs/html/images/fundamentals/diagram_backstack.png
index 2c6e33fe2697..bdb689304741 100644
--- a/docs/html/images/fundamentals/diagram_backstack.png
+++ b/docs/html/images/fundamentals/diagram_backstack.png
Binary files differ
diff --git a/docs/html/images/fundamentals/diagram_backstack_singletask_multiactivity.png b/docs/html/images/fundamentals/diagram_backstack_singletask_multiactivity.png
index d6a21d773e18..aab324ddd5fd 100644
--- a/docs/html/images/fundamentals/diagram_backstack_singletask_multiactivity.png
+++ b/docs/html/images/fundamentals/diagram_backstack_singletask_multiactivity.png
Binary files differ
diff --git a/docs/html/images/fundamentals/diagram_multiple_instances.png b/docs/html/images/fundamentals/diagram_multiple_instances.png
index 380e7788d424..64b476ff436e 100644
--- a/docs/html/images/fundamentals/diagram_multiple_instances.png
+++ b/docs/html/images/fundamentals/diagram_multiple_instances.png
Binary files differ
diff --git a/docs/html/images/fundamentals/diagram_multitasking.png b/docs/html/images/fundamentals/diagram_multitasking.png
index b8c7b45a192a..e21959992bd6 100644
--- a/docs/html/images/fundamentals/diagram_multitasking.png
+++ b/docs/html/images/fundamentals/diagram_multitasking.png
Binary files differ
diff --git a/docs/html/images/fundamentals/restore_instance.graffle b/docs/html/images/fundamentals/restore_instance.graffle
new file mode 100644
index 000000000000..7489aebd804d
--- /dev/null
+++ b/docs/html/images/fundamentals/restore_instance.graffle
@@ -0,0 +1,3096 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>138.9.0.117994</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {1152, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2010-09-28 12:06:26 -0700</string>
+ <key>Creator</key>
+ <string>Scott Main</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{45.9963, 468.692}, {218, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>296</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBK1MqQWN0aXZpdHkgaW5zdGFuY2UgaXMgZGVz
+ dHJveWVkLCBidXQgdGhlIApzdGF0ZSBmcm9tIG9uU2F2
+ ZUluc3RhbmNlU3RhdGUoKSBpcyBzYXZlZIaEAmlJAVOS
+ hISEDE5TRGljdGlvbmFyeQCUhAFpA5KElpYGTlNGb250
+ hpKEhIQGTlNGb250HpSZHIQFWzI4Y10GAAAAFAAAAP/+
+ SABlAGwAdgBlAHQAaQBjAGEAhAFmC4QBYwCdAZ0AnQCG
+ koSWlgdOU0NvbG9yhpKEhIQHTlNDb2xvcgCUnQOEAmZm
+ AINmZiY/hpKElpYQTlNQYXJhZ3JhcGhTdHlsZYaShISE
+ EE5TUGFyYWdyYXBoU3R5bGUAlIQEQ0NAUwIAhISEB05T
+ QXJyYXkAlJkMkoSEhAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hKWkADiGkoSlpABUhpKEpaQAcIaShKWkAIGMAIaShKWk
+ AIGoAIaShKWkAIHEAIaShKWkAIHgAIaShKWkAIH8AIaS
+ hKWkAIEYAYaShKWkAIE0AYaShKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs22 \cf2 *Activity instance is destroyed, but the \
+state from onSaveInstanceState() is saved}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Info</key>
+ <integer>8</integer>
+ </dict>
+ <key>ID</key>
+ <integer>295</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{116.49, 219.787}</string>
+ <string>{328.785, 192.997}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>292</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{40.449, 219.787}, {152.083, 67.3685}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>292</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-LightOblique;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate() or\
+onRestoreInstanceState()\
+\
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f1 \cf0 \kerning1\expnd0\expndtw0 Restore your activity state}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{64.4905, 349.815}, {104, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>291</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>290</integer>
+ <key>Position</key>
+ <real>0.29431623220443726</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKx5Vc2VyIG5hdmlnYXRlcyB0bwp0aGUgYWN0
+ aXZpdHmGhAJpSQEekoSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWB05TQ29sb3KGkoSEhAdOU0NvbG9yAJSEAWMD
+ hAJmZgCDZmYmP4aShJaWBk5TRm9udIaShISEBk5TRm9u
+ dB6UmRyEBVsyOGNdBgAAABQAAAD//kgAZQBsAHYAZQB0
+ AGkAYwBhAIQBZgybAJsBmwCbAIaShJaWEE5TUGFyYWdy
+ YXBoU3R5bGWGkoSEhBBOU1BhcmFncmFwaFN0eWxlAJSE
+ BENDQFMCAISEhAdOU0FycmF5AJSZDJKEhIQJTlNUZXh0
+ VGFiAJSEAkNmAByGkoSlpAA4hpKEpaQAVIaShKWkAHCG
+ koSlpACBjACGkoSlpACBqACGkoSlpACBxACGkoSlpACB
+ 4ACGkoSlpACB/ACGkoSlpACBGAGGkoSlpACBNAGGkoSl
+ pACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 User navigates to\
+the activity}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>292</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>290</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{116.49, 402.872}</string>
+ <string>{116.49, 287.155}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>289</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{56.4525, 403.372}, {120.076, 51.0524}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>289</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 App process\
+killed*}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{213.242, 402.898}, {84, 52}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>288</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>287</integer>
+ <key>Position</key>
+ <real>0.48301887512207031</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKyZBcHBzIHdpdGggCmhpZ2hlciBwcmlvcml0
+ eQpuZWVkIG1lbW9yeYaEAmlJASaShISEDE5TRGljdGlv
+ bmFyeQCUhAFpA5KElpYHTlNDb2xvcoaShISEB05TQ29s
+ b3IAlIQBYwOEAmZmAINmZiY/hpKElpYGTlNGb250hpKE
+ hIQGTlNGb250HpSZHIQFWzI4Y10GAAAAFAAAAP/+SABl
+ AGwAdgBlAHQAaQBjAGEAhAFmDJsAmwGbAJsAhpKElpYQ
+ TlNQYXJhZ3JhcGhTdHlsZYaShISEEE5TUGFyYWdyYXBo
+ U3R5bGUAlIQEQ0NAUwIAhISEB05TQXJyYXkAlJkMkoSE
+ hAlOU1RleHRUYWIAlIQCQ2YAHIaShKWkADiGkoSlpABU
+ hpKEpaQAcIaShKWkAIGMAIaShKWkAIGoAIaShKWkAIHE
+ AIaShKWkAIHgAIaShKWkAIH8AIaShKWkAIEYAYaShKWk
+ AIE0AYaShKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Apps with \
+higher priority\
+need memory}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>289</integer>
+ </dict>
+ <key>ID</key>
+ <integer>287</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{328.785, 428.899}</string>
+ <string>{176.528, 428.898}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>155</integer>
+ <key>Info</key>
+ <integer>8</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{510.123, 297.165}, {115.508, 29.9264}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>285</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onRestart()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{489.377, 233.692}, {157, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>271</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>258</integer>
+ <key>Position</key>
+ <real>0.19835080206394196</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKzlBY3Rpdml0eSBpbnN0YW5jZSBpcyBpbnRh
+ Y3Q7Cm5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGWG
+ hAJpSQE5koSEhAxOU0RpY3Rpb25hcnkAlIQBaQOShJaW
+ B05TQ29sb3KGkoSEhAdOU0NvbG9yAJSEAWMDhAJmZgCD
+ ZmYmP4aShJaWBk5TRm9udIaShISEBk5TRm9udB6UmRyE
+ BVsyOGNdBgAAABQAAAD//kgAZQBsAHYAZQB0AGkAYwBh
+ AIQBZgybAJsBmwCbAIaShJaWEE5TUGFyYWdyYXBoU3R5
+ bGWGkoSEhBBOU1BhcmFncmFwaFN0eWxlAJSEBENDQFMC
+ AISEhAdOU0FycmF5AJSZDJKEhIQJTlNUZXh0VGFiAJSE
+ AkNmAByGkoSlpAA4hpKEpaQAVIaShKWkAHCGkoSlpACB
+ jACGkoSlpACBqACGkoSlpACBxACGkoSlpACB4ACGkoSl
+ pACB/ACGkoSlpACBGAGGkoSlpACBNAGGkoSlpACBUAGG
+ hgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Activity instance is intact;\
+no need to restore the state}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ <key>ID</key>
+ <integer>258</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{567.877, 297.165}</string>
+ <string>{446.785, 192.997}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>285</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{514.377, 349.44}, {107, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>256</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>255</integer>
+ <key>Position</key>
+ <real>0.8136177659034729</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKx9Vc2VyIG5hdmlnYXRlcyB0byAKdGhlIGFj
+ dGl2aXR5hoQCaUkBH5KEhIQMTlNEaWN0aW9uYXJ5AJSE
+ AWkDkoSWlgdOU0NvbG9yhpKEhIQHTlNDb2xvcgCUhAFj
+ A4QCZmYAg2ZmJj+GkoSWlgZOU0ZvbnSGkoSEhAZOU0Zv
+ bnQelJkchAVbMjhjXQYAAAAUAAAA//5IAGUAbAB2AGUA
+ dABpAGMAYQCEAWYMmwCbAZsAmwCGkoSWlhBOU1BhcmFn
+ cmFwaFN0eWxlhpKEhIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCUmQyShISECU5TVGV4
+ dFRhYgCUhAJDZgAchpKEpaQAOIaShKWkAFSGkoSlpABw
+ hpKEpaQAgYwAhpKEpaQAgagAhpKEpaQAgcQAhpKEpaQA
+ geAAhpKEpaQAgfwAhpKEpaQAgRgBhpKEpaQAgTQBhpKE
+ paQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 User navigates to \
+the activity}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>285</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>255</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{446.785, 428.899}</string>
+ <string>{567.877, 327.091}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>155</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>155</integer>
+ </dict>
+ <key>ID</key>
+ <integer>254</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{387.786, 353.684}</string>
+ <string>{387.785, 403.814}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{328.785, 403.814}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>155</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.472997</string>
+ <key>g</key>
+ <string>0.473094</string>
+ <key>r</key>
+ <string>0.473036</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Activity is\
+not visible}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{322.285, 234.471}, {131, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKypBbm90aGVyIGFjdGl2aXR5IGNvbWVzCmlu
+ dG8gdGhlIGZvcmVncm91bmSGhAJpSQEqkoSEhAxOU0Rp
+ Y3Rpb25hcnkAlIQBaQOShJaWB05TQ29sb3KGkoSEhAdO
+ U0NvbG9yAJSEAWMDhAJmZgCDZmYmP4aShJaWBk5TRm9u
+ dIaShISEBk5TRm9udB6UmRyEBVsyOGNdBgAAABQAAAD/
+ /kgAZQBsAHYAZQB0AGkAYwBhAIQBZgybAJsBmwCbAIaS
+ hJaWEE5TUGFyYWdyYXBoU3R5bGWGkoSEhBBOU1BhcmFn
+ cmFwaFN0eWxlAJSEBENDQFMCAISEhAdOU0FycmF5AJSZ
+ DJKEhIQJTlNUZXh0VGFiAJSEAkNmAByGkoSlpAA4hpKE
+ paQAVIaShKWkAHCGkoSlpACBjACGkoSlpACBqACGkoSl
+ pACBxACGkoSlpACB4ACGkoSlpACB/ACGkoSlpACBGAGG
+ koSlpACBNAGGkoSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Another activity comes\
+into the foreground}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>192</integer>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{387.785, 218.582}</string>
+ <string>{387.786, 297.165}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{318.17, 297.165}, {139.231, 56.5192}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>192</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-LightOblique;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onSaveInstanceState()\
+\
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f1 \cf0 \kerning1\expnd0\expndtw0 Save your activity state}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{328.785, 167.912}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Activity\
+running}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>2</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2012-01-03 15:51:55 -0800</string>
+ <key>Modifier</key>
+ <string>Scott Main</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ iADj3I8j6oXpNDXXRFXry7e5SjC72vhSL3Hiy6S+ZFtMl3po/cSWP3uaWSQ3+ckCA37r
+ zpSA8nqmFtbBdRs/lItEnX7apiufzG7z0dGqca8efV1l/597RhgNFol1eu5Ynxz9fH14
+ /IS894lXR7nD+mxBf5SNNFqlmuNRUSOxnFCqK9bcHjRYvj7AKHkuLLUFzDQ11h16Gynd
+ IAI/eIK9CMF1KNIL6TToUrimB8EWgqs5yohSkz1X3/ntE15Iy/jm3qEs0V4ycNXmKgK3
+ l6dTn86Gcq/kmF1ENi7cXDIoVK8iKi3d6fG9AzMh3JngcKXN6yUtx8UDHo/h9vpcO6E+
+ fsKrWJER9AvpDm4emELwZgL3DZDiiJ7ZrEk2unDIpPID4O9Yn79ZZwibV1n0BVqxt7a2
+ uhvTT9XWTqZrrqTFdjE6Uzv19WHRN7VIHf6HYvNcGY8K8p2APkJiFsYR9HHatNBFMWI7
+ T1udMXPN5owdasMRrxCQxGYzb8/41A2RB23xkTk+tKp7vucndXh6rnx4CUnpqb3cB+LN
+ t+78kgw1kWB1DdtGApW+iu+gE8mK3UFG5ThRuf30P91lQ1cKZW5kc3RyZWFtCmVuZG9i
+ ago2IDAgb2JqCjM4MzMKZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVu
+ dCA0IDAgUiAvUmVzb3VyY2VzIDcgMCBSIC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3gg
+ WzAgMCAxMTUyIDczM10KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERG
+ IC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0Nz
+ MiAxNiAwIFIKL0NzMSA4IDAgUiA+PiAvRXh0R1N0YXRlIDw8IC9HczUgMjMgMCBSIC9H
+ czMgMjQgMCBSIC9HczIgMjUgMCBSIC9HczEgMjYgMCBSCi9HczQgMjcgMCBSID4+IC9G
+ b250IDw8IC9GNC4wIDIyIDAgUiAvRjIuMCAxOCAwIFIgL0YzLjAgMTkgMCBSIC9GMS4w
+ IDE3IDAgUgo+PiAvWE9iamVjdCA8PCAvSW0yIDExIDAgUiAvSW0zIDEzIDAgUiAvSW0x
+ IDkgMCBSID4+IC9TaGFkaW5nIDw8IC9TaDEgMTUgMCBSCi9TaDMgMjEgMCBSIC9TaDIg
+ MjAgMCBSID4+ID4+CmVuZG9iagoxNSAwIG9iago8PCAvQ29sb3JTcGFjZSAyOCAwIFIg
+ L1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDU5LjUgLTI1LjU4NDg1IDU5LjQ5OTk4IDI1
+ LjU4NDg3Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9G
+ dW5jdGlvbiAyOSAwIFIgPj4KZW5kb2JqCjIxIDAgb2JqCjw8IC9Db2xvclNwYWNlIDI4
+ IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNjAuNTM4IC0yNi4wMjYyIDYwLjUz
+ Nzk4IDI2LjAyNjIyCl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxz
+ ZSBdIC9GdW5jdGlvbiAzMCAwIFIgPj4KZW5kb2JqCjIwIDAgb2JqCjw8IC9Db2xvclNw
+ YWNlIDI4IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNTkuNSAtMjUuNTg0ODUg
+ NTkuNDk5OTggMjUuNTg0ODcKXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNl
+ IGZhbHNlIF0gL0Z1bmN0aW9uIDMxIDAgUiA+PgplbmRvYmoKMTEgMCBvYmoKPDwgL0xl
+ bmd0aCAxMiAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAy
+ NTggL0hlaWdodCAxMjIgL0ludGVycG9sYXRlCnRydWUgL0NvbG9yU3BhY2UgMzIgMCBS
+ IC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDMzIDAgUiAvQml0c1BlckNvbXBvbmVu
+ dAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QgQAAAADDoPlTH+SF
+ UGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAED7wMDcOsAAQplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjQzNAplbmRvYmoKMTMg
+ MCBvYmoKPDwgL0xlbmd0aCAxNCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0lt
+ YWdlIC9XaWR0aCAyNjIgL0hlaWdodCAxMjQgL0ludGVycG9sYXRlCnRydWUgL0NvbG9y
+ U3BhY2UgMzIgMCBSIC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDM1IDAgUiAvQml0
+ c1BlckNvbXBvbmVudAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3Q
+ AQ0AAADCoPdPbQ8HESgMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYeBgZ8xwABCmVuZHN0cmVhbQplbmRv
+ YmoKMTQgMCBvYmoKNDQ4CmVuZG9iago5IDAgb2JqCjw8IC9MZW5ndGggMTAgMCBSIC9U
+ eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjU4IC9IZWlnaHQgMTIy
+ IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDMyIDAgUiAvSW50ZW50IC9QZXJj
+ ZXB0dWFsIC9TTWFzayAzNyAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9G
+ bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABA+8DA3DrAAEKZW5k
+ c3RyZWFtCmVuZG9iagoxMCAwIG9iago0MzQKZW5kb2JqCjM1IDAgb2JqCjw8IC9MZW5n
+ dGggMzYgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjYy
+ IC9IZWlnaHQgMTI0IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBvbGF0ZSB0
+ cnVlIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry
+ ZWFtCngB7V1XWyJLEHXIOQeJSs5IRrJkkIyA7v//I7eqB5SsuPtwp6EfZGAXvukzVedU
+ V3dX393d2g2BGwI3BG4I3BD4SwQYhsfj8bnT4G4Z5i/7vPt1hscXCEUisUTKnSYRi4QC
+ /j9DAiEQSWRypUqt1eq40rQatUopl4qFgn8BBGAglMiUGp3RbLHZHQ4nN5rDYbNaTAad
+ WiETC8Eidm37wneAgUiqUOvNtgePPxiOxuLxJy60eDwWDQd8bqfVpFPJJUL+38DA8IVS
+ hdZoe/SFn9K5QqlcqXKlVcrF52wqHvI+WAxquVj4a3NgeAKxXGOye0JP2WKl3mx3ur0+
+ V1qv22k1XsrP6VjAZTWoZSLghwsdgfx3NASVweYOJ/OVRrs3GI4nk+mMK206GY+Gr91W
+ vZx7CroseqXkV+bA8EVy7f1jMJGvtnqD8XT+tlgulyuutOVysXibTUaDbqOSi/udJjCH
+ y9kBvEGpt3lj2UqzP5rOF8vV+/v7B7Q/XGh4o3C/q+XbfDLsNkrpiNuik18MA08gURmd
+ gWSx3h1O3xACrgDw+ZBYJFaL+WTQqeXjPrteIb7MGngCqdr0GM5UWoMJNzH48wdRQIsA
+ HMb9ZikZcBiUF8GAIJhd0VytO5otWDvgiCt8WgK5WOOwfJsO2pV0yGm8BAZGIFGb3dF8
+ vTeegzOQ39r9ec68Y3FYLWajTjUTfrgABoYvVplcAEIfvIFDlHji0aBbrJbzcbeWDTsN
+ ih9SJICgND6yIBBvOPHrXPkYzeH9ffkGMGRCDr38Z3EDT6QwOMM5sASgBPgFrvT2zH1u
+ YKimAzadTMj7PojkCWU6ezBT24BAAwqoF2gNnUrSZ1FLBN/G0gxforb4UpXu+I3lxTMQ
+ c+efWKeYj9qluNv0A6HgiZQmd7zUHtEEAjwu4hSzQfM54kRqOO8TjFCmd0byzcF8yZ14
+ +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
+ VksolT/qt6r5Jzw6QfqzStCEGjd/yCEaRrs3mim+tPvD8XQGJ0hAg0Mk/v8Nb/RtjsdH
+ 9Fq1QirstsIxGr86TQQPVFFozU5fLF2owmEir4PhaAzniXChjcdwksigD0eJVPKpiNdu
+ UsPhET+LEzZW8PkKXiFV6u+d3nAiW6jUGs1Wu8OR1m63mvVa+TkTD3kcZq3ib44ZQnOQ
+ qXRmu8sXjiczuXyhWCyW/v8N7rKQz6YTMThiyGbSKqVgCN+MpT8f/bELgoNSYzDbnC6P
+ LxAMhTnRQqGg3+d5dFhNerVC+tvzhbYAARxEErlSrTMYzfcWi5UbzWIxm4x67T85eowF
+ gxxEJ5bKFUqVSs2RplIplQoZHkP3d76wZQ44zsRTCfFYQq40kUj4L48k/ESDgQaHPnKl
+ wd1+3vrt4obADYEbAjcEfoXAf13V5EoKZW5kc3RyZWFtCmVuZG9iagozNiAwIG9iagoy
+ NzczCmVuZG9iagozNyAwIG9iago8PCAvTGVuZ3RoIDM4IDAgUiAvVHlwZSAvWE9iamVj
+ dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAvQ29sb3JTcGFj
+ ZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1dZ1viQBA2IE2aAQGRDgIC
+ BkQ6iEjvHfT8/3/kZjaAAqHo3Qezsh8OVC5P5uWdtpmdOTs7rRMCJwROCJwQOCFwHAIM
+ I5FIpGJZEgnDHCfXcZ8C6aXnMrlCqVSJYykVCrnsXCr5TygwknOZQqXW6PSXLGsQw2LZ
+ S51Wc6GU/xcQGOm5QqXRs1fm6xub3eEUwXI47DarxWS81KoBhH8kAiOVKS50BtONw3Mb
+ DEe4aDT241c0yt1HQgGfy359dalR/RMGwH+Q33jt9N1x8VQ2/1R8FsUqPhVy6UQsEvDY
+ zKxWJZN+1x4AAVQ6o9UVuH/MPJUqtUaz1RbFajWb9Wr5OZ96CPscZlaj+J4qIAHUrMUV
+ 4JKFUq3Z6fUHw9FoLIY1Gg0H/W67USlmHyM+u0l/If8GDRgJEODKfnufLJQbnf5wPJ3N
+ 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
+ EkEbK5wSrQOBveks3mi+1uNbs4mdB2gDoDFb+yUVchj3hQIfMECOqLfePkB7PrE3aERD
+ DvITAMrpiAuakh3UAYID9qiEFo3QpHMBgWhpQDTgbdGj0m0+rkEjYoDW0AYQVLsjCA7B
+ HoozOkT5QQOgT2nrBVu1QsPeQ1ZwqQl8q1Z/LFdpDxadOsUXGfDyQzIw7jVKqciXAECH
+ IFOzNz4u89LsQb9q8dGAiE8aV0+GndpTIuT6cstmtAXXnkgSe1ZDz2ax6QLhPyjAdNRr
+ lnPxoMP0xZ7VhAUqvdkZfMiV6oDBdAnCzzcJC/aTvuXDXrtaTHG3NiN28F8q+ZGv0Lxf
+ qTXafJFE/qXe7g3HE0AB109vXk9ucga960eDbrP6nHm4c12z6iPd4Do4OL/g0uL0c4l8
+ qdpod2F+AQww+PETDOAWcXxBr9Oql4uZeNhru9J9d4wFzrDQGq6d/kg8XXguV+swxKL1
+ 48dYwC02m41a9aWYS8ZCXrv5Uv3NGRZACNAEOcwxsTi8wfuHZDpXeCoWf/4okyKMMcln
+ U4/RsN9tM7Ea5ffnmPAYKC60rMlqd/sCofA9x8E4mx++OBhlEw76vU6bxaiHWTb/OtgJ
+ eaBS61ijyWLFgUYiWHa77cZqvjLotRcK2b/Kj7YRRnrJ5MoLjZYMtWJh/eC5Vnh7MNJK
+ r9OqLxT/Z6YVYoAgwFwzsQw2Uy7Hmv3jOCsi+sc/jIiG28EUvv882+4Dh9O7EwInBE4I
+ 0IjAXxMa0M0KZW5kc3RyZWFtCmVuZG9iagozOCAwIG9iagoyNjI4CmVuZG9iagozMyAw
+ IG9iago8PCAvTGVuZ3RoIDM0IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
+ Z2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAv
+ SW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRl
+ RGVjb2RlID4+CnN0cmVhbQp4Ae1dZ1viQBA2IE2aAQGR3gUMiAgiVXrvoOf//yM3swEU
+ CEXvPpiV/XCgcnkyL++0zezM2dlpnRA4IXBC4ITACYHjEGAYiUQiFcuSSBjmOLmO+xRI
+ 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
+ RXh0R1N0YXRlIC9DQSAxID4+CmVuZG9iagoyNCAwIG9iago8PCAvVHlwZSAvRXh0R1N0
+ YXRlIC9jYSAxID4+CmVuZG9iagoyNSAwIG9iago8PCAvVHlwZSAvRXh0R1N0YXRlIC9j
+ YSAwLjcgPj4KZW5kb2JqCjI2IDAgb2JqCjw8IC9UeXBlIC9FeHRHU3RhdGUgL0NBIDAu
+ NyA+PgplbmRvYmoKMjcgMCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMC42NSA+
+ PgplbmRvYmoKMzkgMCBvYmoKPDwgL0xlbmd0aCA0MCAwIFIgL04gMyAvQWx0ZXJuYXRl
+ IC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhVTPaxNB
+ FP42bqnQIghaaw6yeJAiSVmraEXUNv0RYmsM2x+2RZBkM0nWbjbr7ia1pYjk4tEq3kXt
+ oQf/gB568GQvSoVaRSjeqyhioRct8c1uTLal6sDOfvPeN+99b3bfAA1y0jT1gATkDcdS
+ ohFpbHxCavyIAI6iCUE0JVXb7E4kBkGDc/l759h6D4FbVsN7+3eyd62a0raaB4T9QOBH
+ mtkqsO8XcQpZEgKIPN+hKcd0CN/j2PLsjzlOeXjBtQ8rPcRZInxANS3Of024U80l00CD
+ SDiU9XFSPpzXi5TXHQdpbmbGyBC9T5Cmu8zuq2KhnE72DpC9nfR+TrPePsIhwgsZrT9G
+ uI2e9YzVP+Jh4aTmxIY9HBg19PhgFbcaqfg1whRfEE0nolRx2S4N8Ziu/VbySoJwkDjK
+ ZGGAc1pIT9dMbvi6hwV9JtcTr+J3VlHheY8TZ97U3e9F2gKvMA4dDBoMmg1IUBBFBGGY
+ sFBAhjwaMTSycj8jqwYbk3sydSRqu3RiRLFBezbcPbdRpN08/igicZRDtQiS/EH+Kq/J
+ T+V5+ctcsNhW95Stm5q68uA7xeWZuRoe19PI43NNXnyV1HaTV0eWrHl6vJrsGj/sV5cx
+ 5oI1j8RzsPvxLV+VzJcpjBTF41Xz6kuEdVoxN9+fbH87PeIuzy611nOtiYs3VpuXZ/1q
+ SPvuqryT5lX5T1718fxnzcRj4ikxJnaK5yGJl8Uu8ZLYS6sL4mBtxwidlYYp0m2R+iTV
+ YGCavPUvXT9beL1Gfwz1UZQZzNJUifd/wipkNJ25Dm/6j9vH/Bfk94rnnygCL2zgyJm6
+ bVNx7xChZaVuc64CF7/RffC2bmujfjj8BFg8qxatUjWfILwBHHaHeh7oKZjTlpbNOVKH
+ LJ+TuunKYlLMUNtDUlLXJddlSxazmVVi6XbYmdMdbhyhOUL3xKdKZZP6r/ERsP2wUvn5
+ rFLZfk4a1oGX+m/AvP1FCmVuZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoKNzM3CmVuZG9i
+ ago4IDAgb2JqClsgL0lDQ0Jhc2VkIDM5IDAgUiBdCmVuZG9iago0MSAwIG9iago8PCAv
+ TGVuZ3RoIDQyIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9G
+ bGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2
+ /RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3x
+ zW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQG
+ QYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY
+ 8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1P
+ kKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAV
+ txqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndW
+ UeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7
+ dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5
+ Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPq
+ S4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEm
+ dornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ
+ 93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+
+ OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZ
+ VWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3Ry
+ ZWFtCmVuZG9iago0MiAwIG9iago3MzcKZW5kb2JqCjI4IDAgb2JqClsgL0lDQ0Jhc2Vk
+ IDQxIDAgUiBdCmVuZG9iago0MyAwIG9iago8PCAvTGVuZ3RoIDQ0IDAgUiAvTiAzIC9B
+ bHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+ eAHVeWdYFMuzd89sXnaXnNOSc845gySJEpWcM0sOIiAgQUFAEQFFQUVEBVGiJFFQxIOI
+ ggoGgkgQFQOCgvIOes753/e59357v7z9PNv7m6rq6pqp7p6qGgA4V7yjosJgBgDCI2Jp
+ 9maGVBdXNypuChABD6AHvEDR2zcmysDW1gr8r+3bBIB2mI9ldnT9r2L/M4PRzz/GFwDI
+ FmH7+MX4hiP4BgCwoW8ULRYA1AZCH02IjUIw+h6CWWiIgQh+sYMD/+DVHezzG2PQv2Uc
+ 7Y0AwHAAgCd5e9MCASALI3RqvG8goodsDACWKcIvOAIAZhcE6/oGefsBwFmOyEiHh0fu
+ 4DsIFvf5L3oC/wv29vb5V6e3d+C/+M+9ICORiY2DY6LCvJN+X/y/7MLD4pDn9bsxIT0p
+ Imz3jm/YkN+in7exJfLPg/x+RYX99hkiA3H5R+xxQGg7WDrCZ7fN31g3gGZqj2BkLGQb
+ FWu4g5FnBgVExdo6/k1PSw4y2o1gEkI/5h9j8o+eMyHeFjs+oyD0Zlqc/R4ECyO4Lybe
+ wQTByIqC3iQHOTr/LfPVz9/4bzoMBwSbmv+RgZmCY8135mJBfC4YGmm5YwMyF6wKLEEY
+ 8AdxgIb0EUAGWAEjYPx3LwMCgDfCiUd4MSAUvEVwODIiEhkTiWDq33JG/41i+ntcIDLu
+ /9ZIBb6IbNy/c/6ZjYrM+Y/OYOCH4H/o3sgcO7wd62I8gzP/M+c/Ejv6flsj3yC/JL/1
+ j01oUbQiWgVtiNZB66I1ABXNhuYCMmhltDraAK2H1kJ4GsAUvEE0B/5j447+8OaA+PLI
+ JE2nIIS7c+8+/3CB02/p4H+v/5sFIHhkpW3lHwsAiPVPRPYBAEaRUUm04MCgWKoBsnP9
+ panmEb6y0lRFeQWFHfb/N23nzPpj7Bf732cRxPbwP7RI5GY0ds6Yg/+heX0AoC0E2aZM
+ /6GJtgFArwjA0AnfOFr8H33onT8MchrSIyuUE/ABISCOPGdFoAq0gD4wARbABjgCV+CB
+ rJ8gZA3SQAJIBRkgBxSAo+A4qADVoBZcBFdAM2gDXeAWGATDYBSMgykwDebBO7AKvoFN
+ CIJwEBlihjghfkgEkoIUIXVIFzKBrCB7yBXyggKhCCgOSoUOQgVQCVQBnYXqoWtQB3QL
+ GoIeQc+hGWgJ+gz9gFEwCWaBeWFRWA5Whw1gS9gR3gcHwtFwMpwFF8LlcA18GW6Fb8HD
+ 8Dg8Db+D11AARYdiQwmgZFDqKCOUDcoNFYCiodJQ+agyVA3qKqoTdRf1GDWNWkF9R2PR
+ zGgqWgZZp7vQe9C+6Gh0GvowugJ9Ed2KvoN+jJ5Br6J/YcgYHowURhNjjnHBBGISMDmY
+ MswFTAtmADOOmcd8w2KxbFgxrBp2F9YVG4JNwR7GnsI2Yvuwj7Bz2DUcDseJk8Lp4Gxw
+ 3rhYXA7uJO4yrhc3hpvHbeDp8Px4Rbwp3g0fgc/El+Ev4XvwY/gF/CaBgSBC0CTYEPwI
+ SYQiwjlCJ+EhYZ6wSWQkihF1iI7EEGIGsZx4lThAfEH8QkdHJ0inQWdHF0yXTldO10R3
+ j26G7juJiSRJMiLtJcWRCkl1pD7Sc9IXMpksStYnu5FjyYXkevJt8ivyBoWZIksxp/hR
+ DlAqKa2UMcoHegK9CL0BvQd9Mn0Z/XX6h/QrDAQGUQYjBm+GNIZKhg6GpwxrjMyMCow2
+ jOGMhxkvMQ4xLjLhmESZTJj8mLKYapluM80xo5iFmI2YfZkPMp9jHmCeZ8GyiLGYs4Sw
+ FLBcYRlhWWVlYlVmdWJNZK1k7WadZkOxibKZs4WxFbE1s02w/WDnZTdg92fPY7/KPsa+
+ zsHNoc/hz5HP0cgxzvGDk8ppwhnKWczZxvmSC80lyWXHlcB1mmuAa4WbhVuL25c7n7uZ
+ e5IH5pHksedJ4anlecCzxsvHa8YbxXuS9zbvCh8bnz5fCN8xvh6+JX5mfl3+YP5j/L38
+ y1RWqgE1jFpOvUNdFeAR2CUQJ3BWYERgU1BMcI9gpmCj4EshopC6UIDQMaF+oVVhfmFr
+ 4VThBuFJEYKIukiQyAmRuyLromKizqKHRNtEF8U4xMzFksUaxF6Ik8X1xKPFa8SfSGAl
+ 1CVCJU5JjErCkiqSQZKVkg+lYClVqWCpU1KPpDHSGtIR0jXST2VIMgYy8TINMjOybLJW
+ spmybbIf5ITl3OSK5e7K/ZJXkQ+TPyc/pcCkYKGQqdCp8FlRUtFXsVLxiRJZyVTpgFK7
+ 0idlKWV/5dPKz1SYVaxVDqn0q/xUVVOlqV5VXVITVvNSq1J7qs6ibqt+WP2eBkbDUOOA
+ RpfGd01VzVjNZs2PWjJaoVqXtBa1xbT9tc9pz+kI6njrnNWZ1qXqeume0Z3WE9Dz1qvR
+ m9UX0vfTv6C/YCBhEGJw2eCDobwhzbDFcN1I02i/UZ8xytjMON94xITJZI9JhckrU0HT
+ QNMG01UzFbMUs75dmF2Wu4p3PTXnNfc1rzdftVCz2G9xx5Jk6WBZYTlrJWlFs+q0hq0t
+ rEutX+wW2R2xu80G2JjblNq8tBWzjba9aYe1s7WrtHtrr2Cfan/XgdnB0+GSwzdHQ8ci
+ x6k94nvi9vQ70Tvtdap3Wnc2di5xnnaRc9nvMuzK5Rrs2u6Gc3Nyu+C25m7iftx9fq/K
+ 3py9E/vE9iXuG/Lg8gjz6Pak9/T2vO6F8XL2uuS15W3jXeO95mPuU+Wz6mvke8L3nZ++
+ 3zG/JX8d/xL/hQCdgJKAxUCdwNLApSC9oLKglWCj4IrgTyG7QqpD1kNtQutCt8OcwxrD
+ 8eFe4R0RTBGhEXci+SITIx9FSUXlRE1Ha0Yfj16lWdIuxEAx+2LaY1mQ4PBBnHhcdtxM
+ vG58ZfxGglPC9UTGxIjEB0mSSXlJC8mmyedT0Cm+Kf2pAqkZqTP7DfafTYPSfNL6Dwgd
+ yDown26WfjGDmBGa8VemfGZJ5teDzgc7s3iz0rPmss2yG3IoObScp4e0DlXnonODc0fy
+ lPJO5v3K98u/XyBfUFawddj38P0jCkfKj2wXBhSOFKkWnT6KPRpxdKJYr/hiCWNJcslc
+ qXVp6zHqsfxjX497Hh8qUy6rPkE8EXdiutyqvP2k8MmjJ7cqgirGKw0rG6t4qvKq1k/5
+ nRo7rX/6ajVvdUH1jzPBZ56dNTvbWiNaU1aLrY2vfXvO6dzd8+rn6y9wXSi48LMuom76
+ ov3FO/Vq9fWXeC4VNcANcQ1Ll/deHr1ifKX9qszVs41sjQVNoCmuafma17WJZsvm/uvq
+ 16/eELlR1cLckt8KtSa1rrYFtU23u7Y/6rDo6O/U6my5KXuzrkugq7Kbtbuoh9iT1bPd
+ m9y71hfVt3Ir8NZcv2f/1G2X20/u2N0ZGbAcuDdoOnj7rsHd3ns697qGNIc67qvfbxtW
+ HW59oPKg5S+Vv1pGVEdaH6o9bB/VGO18pP2oZ0xv7NZj48eDT8yfDI/vHn80sWfi2dO9
+ T6ef+T1bfB72/NNk/OTmVPoLzIv8lwwvy17xvKp5LfG6cVp1unvGeObBrMPs1Jzv3Ls3
+ MW+25rPekt+WLfAv1C8qLnYtmS6NLrsvz7+Lere5kvOe8X3VB/EPNz7qf3yw6rI6/4n2
+ afvz4S+cX+q+Kn/tX7Nde/Ut/Nvmev4G58bF7+rf7/5w/rGwmbCF2yr/KfGz85flrxfb
+ 4dvbUd4079+xAArp4YAAAD7XITmEK5I7jAJApPzJKX5LIOkKhMggGIdEChZIBDAHSSLv
+ 7T6YE46FJ1HmqNtoM/QTTDiWEduPS8XrEnCEl8QOuipSEbmO8oKBgdGSKY95iJWRbS/7
+ ZU40lzd3Ny+V7zD/hoCf4KTwbpEhMTnxQol3UubS1TLf5IzkjyiMKpGVDVViVKvU+tSn
+ NX5qsWtL6WjomujZ6/saxBhmGZ0wbjDpNX1strRr24LVUtrKyNp9d7BNvG22XYl9tUOD
+ Yxuy64edx1yeu752m3Nf3Pt+36LHC88Rr17vRp/Tvkf8kv0DAuwCtYKEgynB30Jehw6G
+ 1YcfiYiKdIhSi+aK3qK9iumLrY3Ljg9IME+USiImLSc/SGlKLd+flZZwIDqdlpGcmX/w
+ bFZ39utDhFztvKj82oKJI8RC7aLwo6eLR0p+HpM+7l6Wf6K1fLqCrlKlyvNU3unm6qmz
+ 6BqZWqdzB85fvPCobqOeesmqIfVy85VPjZpNRdc+Xne/8bDVpu1Jh3Zn7M36rhc9dL1K
+ fU63ovuzbxffKRsoGyy+m3vv4NCh+0eGjzzI/it2xPmh7MPN0b5HKWOqY98eP33SMV4x
+ sf+p5zPD5yKThMn3U49etLyseLX/tde08YzELMPs97m3bybmh97eWri52LHUsXz+XeFK
+ /HuPDyYfpVYZVtc+TX7u+XL2a/Za0DfLdbkN5o317y9+9G3WbGX99P9lvC24vY34Hwu4
+ kOgwEQwgEZ0VdBR6DSshsdcXlCdqAomaXmKisBRsG84fz4WfJFQRA+kMSTpkR0oQfTrD
+ GcZbTEssrKzGbEnsjRwfuWS5aTxdfHT8TtRLAttCBsIZIr2iW+JqEiGSp6SGpT/Lssop
+ ye9ScFcMVIpWTlLZr5qsFqLurmGlqaMlry2ow6qL1/2h915/xmDc8L5Rj/F1kzrTcrPc
+ XQnmQRaulrus1K3FdrPaoG2+2s7aPbLvc2hyPL0n1ynG2cPF3FXJjdcd6/4BOem7PWo9
+ 870ivR19lH1JvrN+Hf5FAQGB2kGMQW+Db4YUh/qHaYbTh89FtEXmRrlGSyHrYiTmTCwt
+ ziieNX4hoSPxcJJHsnwKnPI0tXF/QVr4gT3pxhmamRoHdbJ2ZbvkRBw6lHs+73b+TMGv
+ IzyFGkVOR2OKj5ZcLh069rYMPsFTrnrSriK8sqDq8qnR09/OCJ61rTlY23Hu0wXZuuiL
+ N+rXGzQup17paQRNBtcONg/cwLSYtea23e3AdZrczOzq7v7aK9rncCul//Ttm3fGB5YG
+ 1++hh5jvCwzLPdD5y2rE7WHQaMKjnLHjj2ueNI53TQw9nXg2//zrFOoFy0uRV+qvraYD
+ Z2pnl96Izbu9zVm4tHh3aWZ5Y4XyXuSD3kf31fRPo1+UvpaufVm337jxg2Mze2vjV8Jv
+ /6MBI5AEu0E66EPiek0oFmqDYdgaPgNvojxQ99Ha6FaMOqYfa4udw6XgufF3CUeIvnTa
+ JG7SL/IsZZi+heE8YzlTIXMuSzZrDlsBeylHNWcDVzt3N083bw9fL38P9aZAi2CD0Cnh
+ ApE40b1i+uKCEkBiSrJNqkDaSYYqsyzbIpcub6nApjCj2KAUp6ynQlB5rHpKLUhdWX1D
+ o0czW8tSm0l7UqdGN0RPUW9Lf9Cg2HCfkaTRuvFtkyJTdzMxs8+7eszzLZwsBSzfWbVa
+ p++2smGzmbFtsIux13KAHe47luxxc6I6LThfdYlz1XKD3Ybci/Y67GPb99yj0nOfF6/X
+ S+9TPvt8eXwn/cr9nQKYAx4GFgSZBANkvcSHKoSuhNWF+0TwRDyNLI3aHY2PvkVLjlGK
+ WYk9H+cRzx7/MOFQol7iRlJTcnAKNeV56rH9jmmcafMH2tOPZSRlBhzcm+Wa7Z7jfygu
+ NzuvLP9CQevhwSPjhfNFX4tRJcylgsfkj2uWGZ2wKLc76VrhUxlZdeBU6enL1cNnPtaI
+ 1CadG70gVpd2ceKSTEPW5amrCo25Ta+aVa8X3HjdqtR2qP1Fp9LN/K7ZHu3e8r5v/Y63
+ WwbEBs/dkxkaGA79S3hkZfTu2LUn9RNNz25NvnwJXsvP1L3JWchfbvtA/yl3jWOjZct5
+ x/9/aks77wSsKgDn5wBwOguAnTsAdVIAiFQiZROk3mFLBsBRA8CGRQB6fhJAZlf/fX+Q
+ gRiS5QeAQ0jmOATeQRRIAdoDJUOnoC5oCtpC8js92AfOgS/BD+GvKG6UASoIdRTVgZpF
+ 0yH1Ay8kI2tHv8EwYfQwEZizmHEsEWuATcQ2Y1dw4rhAXB1uCS+Lj8P3EugIboTLRIjo
+ Qmymo9BF0I2R1ElnyHgyjfyKYkHpoBenr2AgM2QwrDNGIvmKL9NrZh/mBZZwlm+sGWwU
+ tlPscuy3Odw51jiLuRS4HnMn8PDyjPIe4jPkB/y3qNkC1oKcgotCN4WLRUJETcVExEni
+ axKzkmNSd6Q7Za7LNsk1yjcrtCv2KQ0rv1L5pIZWZ9UQ0pTRUtCW15HUpeox6cP6Hw2m
+ DHuNaoxzTSJNXcwMd8mZ81nQW6IsN6xWrZd3z9vM2s7YvbF/5/DF8acTwZndRcxVw83a
+ 3Xdvyr7jHk3Ie+y9D8VXyc/V/0BAbeBA0Fzwz1CmMIFwyQjZSJkoiWhBGlsMIeZH7FI8
+ V4J1YlZSb/KvVJP9pWnv0q0zbh5UzurIMT80l3eoQODw1UL9ouni4lKX4zonzE8mVA6c
+ 5j5DqYFrv5//XPehfqVh5crHxrVrP2/gW7nb5TqNu1x7gvvi+9PupA/uvxd/P+yB10jB
+ aPvY8rjA033Pq6fevlKYzpgdn5dayF1aWDH7cOkTw5eUtfcbAT8Wfkb9Pj/ogSywQ6pR
+ FaAXvIHokGqAO5SFZPzD0Ecku9eEveBcuAl+jkIhObsrKht1DfUaTUZOlVB0JfovJP9W
+ wPhhqhC/02OtsHnYezgizhpXgpvEi+Bp+H4CGyGMMEgUImYS5+ks6DpJUqRqMiv5MAVL
+ yaQH9BkMKIZcRgrjCSZBpkZmfeZxlnBWLGsNmwHbLHsOhwzHBGcGlzzXNHcpzy5eNG8/
+ 30F+UyqJOiFQIxgjZCrMJ7whMiHaJnZG/IREsWShVKF0iUyF7AW5Fvl7Cq8U15VZVTRV
+ fdUK1bs1PmqJaHvqVOpO6fMZ+Bk2Gm2amJgWmA2bYyzULH2scqwv7L5lM2m7ao92YHOU
+ 3KPv5Ooc41LketVtxP3TPjYPHc8Ar2LvHp8PfkL+LgFFgYNBP0OUQ4PDToc/ioSjFKO9
+ aIUxN2MX4+kT1BK9kgqS21MW9rOnmR/Yn96csXxQKGtfdkXOs1z2PNf80wVvjsgUJhYN
+ FnOURJY+OC5fVllOOZlXSao6flqs+u7Z4FrSueYLbhfR9U0NnlcYrt5uSmyWu77YUtcW
+ 3CHT+bmrsyezz6qf/fbcQNPd1CGLYc4HoyN7Hs49Sn7M92RkouCZw6ToC+jl7OvBmYa5
+ onnagsMS93L1itj7ax91V0c+e375uJa+Tr9x8gffZvVPrl9Fv/3PDgxAFFI5egi2Ed8H
+ QCehAegLLAjbIzWcNngFqdW4IPt9CI1CaojJ6Db0GkYFE4/pxmKwNthK7DJOC3cUt4g3
+ xp8j4AlRhBdEK2IfnRriaUPSA7IreZmSRs9K38Rgw/CJsYxJl2mJ+RSLAyuZ9T5bHrsV
+ BxPHJOd5Lhq3AQ8zzzveQb5z/DnUUAFHQQMhRWExEX5RbjEucaqElKSGlKW0t0yqbIVc
+ t/wbRYqStjJN5arqR3UVjQzNMW1xnSzdt/pWBm1GUsbnTAXMas0lLFqsjK2f2UTZkeyb
+ HN2R/drtGu+uvHfDo8/riI+Hn2oAKfB5cEWoedhSRFLkVnQsbT7WNu56AmMiLelJimbq
+ 2TS6A4npC5kuBx9kG+Z05irntRboHB4qdC16V5xWynispkzuRMdJ3YreKu1TrdWYM1Zn
+ j9e8Pid5PuHCwEXW+oBLnZcpV/yudjWxXotqHr4hjmQ+79vtOtpu8nXldH/ode671S91
+ +/id7cGQu0+G9O83PGD7K2bk/ij3o6Cxy4+Xx4UmnJ9mPrv4/P7k/NTWS4ZX/K+lplVm
+ NGd15/Tf6M/rvtVcUFtUWJJcFnxHebe00vE+4YPKh5WP51ddPxE/dX0O+MLwpf3r3jWw
+ VvPN8Nvs+oENno2O73u+r/44vCm22b/lsbXxs/SX3K+hbb8d/8cEKCF1SKRBJEOk/Phq
+ e/uLKJJUlADws3h7e7Nme/tnLZJsIN9A+sL+fK/YEcYiNfeqazvof2r/B7Twfo0KZW5k
+ c3RyZWFtCmVuZG9iago0NCAwIG9iago1OTYzCmVuZG9iagozMiAwIG9iagpbIC9JQ0NC
+ YXNlZCA0MyAwIFIgXQplbmRvYmoKNDUgMCBvYmoKPDwgL0xlbmd0aCA0NiAwIFIgL04g
+ MSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
+ cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSmsrKDadnVZlW1bldKiGGffuqOzM9Ob
+ 2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7fe0Rtnabv
+ OylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2+/Y9tZVl
+ YCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWyLZFT5qIo
+ Kq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSnDeOcSEMa
+ KfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkdhX0AdirL
+ 7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqKH14tAUP3
+ VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57AnfT4zvR
+ mzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ejUoFWeo1X
+ xk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/HMoSP2Sc5
+ psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU6j2DSqwc
+ K9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0RmlLFbo+Td
+ eNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB/TwJPa2f
+ 0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9ZgplbmRz
+ dHJlYW0KZW5kb2JqCjQ2IDAgb2JqCjcwNAplbmRvYmoKMTYgMCBvYmoKWyAvSUNDQmFz
+ ZWQgNDUgMCBSIF0KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJv
+ eCBbMCAwIDYxMiA3OTJdIC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSA+PgplbmRvYmoK
+ NDcgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL091dGxpbmVzIDIgMCBSIC9QYWdlcyA0
+ IDAgUiAvVmVyc2lvbiAvMS40ID4+CmVuZG9iagozMSAwIG9iago8PCAvTGVuZ3RoIDQ4
+ IDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1bmN0aW9uVHlwZSAwIC9C
+ aXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAxIF0gL0RvbWFpbiBbIDAg
+ MSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAxMzY1Cl0gL0ZpbHRlciAv
+ RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBrcEHAoEAAEDR+19JNFS0NYwW7TR1BXfgv7dt
+ P/psH87KWZZ1oczLzJmmeaKM08gZQO/hzelBXd9R2q7lNE3bUOqm5lRVXVHKquQUoFfx
+ 4jxB+TOnZHnGSdMspSRpwonjJKY84gfnDrrdb5wrKLpGlDAKOUEQBhQ/8DkXkHfxOC7I
+ cR2ODbJsi2JaJsgwDcrZOHNOIP2kczSQqqmcI0g5KhRZkUGSLFFESeQcQPvDniOAdsLu
+ f1+q/kbMCmVuZHN0cmVhbQplbmRvYmoKNDggMCBvYmoKMTg4CmVuZG9iagozMCAwIG9i
+ ago8PCAvTGVuZ3RoIDQ5IDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1
+ bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAx
+ IF0gL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAx
+ MzY1Cl0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBjcIJN1RxGAfgLyYS
+ iUQikZKSkpISiUQiGWPGrGYMY2bs+77vW1/r/b2d65jTveN/732f8/DfBNuM86VwjC9N
+ XsTYcIwvJKN8oXseZdOjfC45wmfCET4zeRphw2E+lQzzqe5JmE2H+ETwOMTHQ7JBPjZ5
+ FGTDAB8J+/ko+dDPpn18KHjg4wOvuIcPVPc9bDjI+8Ju3k/ec7NVF+9dx55LfdeF3QFx
+ J3ZVd5xI3Y8dSQd2rm47YLMP23a3+qD9I9uLLdXNXqT+jU3hHmz2YMN2NzbsrndD+0u2
+ C+uqa11I/RNrwp1Y68Sq7Q6s2l3pgPaHeDtWblxuR+rvWBZuw3IbliRbsWR5sRXab+It
+ WDReaIH6VyxINmOhGfOSTZi3PNeE618wJ9mIOePZRqh/xqzwJ8xINmDG8nQDrn/EtHA9
+ pnWn6qH+AVPC7zEpWYdJ8xN1+P8dJoRrMaE7Xgv1txgXfoOEcA0SipSoobj+a4oLV1Nc
+ N1ZNpl9RTPIljQlX0ZjJaBUZvqCoZCVFdUcryfRzGpUdeUaiFTRiMlJBhk8pIlxOkeTh
+ cjJdRsOC4TIKPxEvpbBqqJQMH1NIuIRCyUMlZLWYhuwGiyn4SLyIgqqBIjJ8SAHhQgok
+ +wvJagH57foKyPdAPJ98qt58Sn2fvJJ55L3qySObueSxO5hL2nuyOTSo6s6h1HfJLZxN
+ 7mxy2c4il92BLNLeEc+kgRudmZT6NjmFM8iZQf2S6dRv2ZFO2lviaeRI+weKcwqcCmVu
+ ZHN0cmVhbQplbmRvYmoKNDkgMCBvYmoKNTcyCmVuZG9iagoyOSAwIG9iago8PCAvTGVu
+ Z3RoIDUwIDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1bmN0aW9uVHlw
+ ZSAwIC9CaXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAxIF0gL0RvbWFp
+ biBbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAxMzY1Cl0gL0Zp
+ bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBtcKJVgFRAADQ7zL76kuzRZbIIJJ1
+ BqGUypItSynCF3Tq5DijMebNvHfPLW3spWOVjR342q4YLSprVXktHrkSZXiLK1H1Sywi
+ uhSLS7EAuVBY/l4IBa35hQDhp5A3NvcpgP0QchZmPwS9cyGrl8/OwWbm/O47n0H3jc+8
+ 8dcozvjrw9Mz3nAuPft3yqVBXk05gBPuytrUhNM+5lIIJsfcz1fNbPIVxhGb3L4csTAP
+ 2UvdiSFr/oBNAI4P2G0mPtDdZ+KWx/qMxh4TQ1PqMdILyl1G+ktLXToKd4eO6r7o0Ca3
+ 6QvwkTZtaIuOAKcirf3hFqXxmQqjef5EIfxInauHHilom2To2GCTNPOBDJoaeCCPvycD
+ kPrvyf0N0m8o4W8AP7sjUL0lzrT6bgkI64TPWG+dMBb31rdruNfs0xqut4qfQu2p4rs3
+ uAfdCu6p4O6DMXfF7DLmPtBVxqwuYS7DnSUMrII5LXQo2LbNoajLNgfsJ7Ltb9F2AvIb
+ Cq+1owplbmRzdHJlYW0KZW5kb2JqCjUwIDAgb2JqCjM4NAplbmRvYmoKMiAwIG9iago8
+ PCAvTGFzdCA1MSAwIFIgL0ZpcnN0IDUyIDAgUiA+PgplbmRvYmoKNTIgMCBvYmoKPDwg
+ L1BhcmVudCA1MyAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzMzIDAg
+ XSAvVGl0bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKNTMgMCBvYmoKPDwgPj4KZW5kb2Jq
+ CjUxIDAgb2JqCjw8IC9QYXJlbnQgNTMgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIg
+ L1hZWiAwIDczMyAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjU0IDAgb2Jq
+ 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
+ EAL+1qjGwS8/ChZopN2CgsGCguhZx0jLLC/64Q/HFeBaNSzTyjAcV+CrOB77Xw0vORte
+ yaTf2k23ffcWIEQhfXgyfR3Gl1ju3wd+1q3fZDpoonnOyOVrKjV1moX8KnoVv0W3G+1i
+ d+t3GXYZe1GvQaxEU/UVxot6ppR9jaU2sgfQAXyQ7TWyiUmsSW80gC+gVypibYKKGHpD
+ HABD5DbqTUeVjxrA3r8TRRngqbpmgk5834+oaoC1yDKnm4qLigCsAgyjEdDo4fjVsFRj
+ NJpYjMkAmOAQR1xzXooEiDE5pFgmHZJlczTFU9LEzSFOZW7eBJwHSNC084JnXXPJvq59
+ Hl98erKYlS6yE1ThjjewHTPpC8Nbw1+9GG7t54TnYjinSdieyFQDXA8RWyv9Ii3w/czf
+ +4HqwVoYPUGOBQ8/BeWiUlSGyqUvcyZLX9+Qb4PIFziz0GxUh+rRXKkhDCfMWEpx5NR5
+ zvQpc2bd5a9sWdLZ0rFofhOUREtJlXagB4C2AO0Deh7oJSDiOV0F+groFtygBLICpQAV
+ AU0Dmgu0BOgBoC1A+4CeB3oJ6A2gq0BfAd2KDP2gLTSSxsgxhk8aw8O3m6PqJ4/hU8bw
+ E8fw4EyMur92DE+QuF2e5jH8/DH8gjG8NG639ad1THnbGH7RGF76Lve2+382pvy+Mfzy
+ MfyKMbz0ne1t7a0cU945hl9N+P8PRAt2rQplbmRzdHJlYW0KZW5kb2JqCjU1IDAgb2Jq
+ Cjc0MDYKZW5kb2JqCjU2IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNj
+ ZW50IDc3MCAvQ2FwSGVpZ2h0IDcxNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9u
+ dEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvWlFKWlZVK0hlbHZl
+ dGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdo
+ dCA2MzcgL0ZvbnRGaWxlMiA1NCAwIFIgPj4KZW5kb2JqCjU3IDAgb2JqClsgMjc4IDAg
+ MCAwIDAgMCAwIDAgMzMzIDMzMyAzODkgMCAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAKMCAwIDY2NyAwIDAgMCAwIDAgMCAwIDI3OCAwIDAgMCAwIDAg
+ MCAwIDAgMCA2NjcgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAo1NTYgNTU2IDUwMCA1
+ NTYgNTU2IDI3OCAwIDU1NiAyMjIgMCAwIDAgODMzIDU1NiA1NTYgMCAwIDMzMyA1MDAg
+ Mjc4IDU1NiA1MDAKMCAwIDUwMCBdCmVuZG9iagoyMiAwIG9iago8PCAvVHlwZSAvRm9u
+ dCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9aUUpaVlUrSGVsdmV0aWNhIC9G
+ b250RGVzY3JpcHRvcgo1NiAwIFIgL1dpZHRocyA1NyAwIFIgL0ZpcnN0Q2hhciAzMiAv
+ TGFzdENoYXIgMTIxIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoK
+ NTggMCBvYmoKPDwgL0xlbmd0aCA1OSAwIFIgL0xlbmd0aDEgMTI2NjAgL0ZpbHRlciAv
+ RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBvXt5fFRFtn/V3XtJp/d9Tae70+mks5FASCBN
+ yAokBsKSIMEECASEkSUEcYQXFQQiouwIuKAOBFBpQkYaEB/DgIjjKC6AMujoiKPjM8+Z
+ 99CZkaT7d+p2iJA3Mz//8DP3pva6dU9969Q5p07ftC5e2owSUDuiUc3UpoWzkXhlGBGi
+ ps1c0LQwXtakQfrmzLZWZ7zMpiBEz5+9cM6CeFnYgpDUNmf+8v7ntcMQMk9raW6aFW9H
+ vZDmtUBFvIyHQJrcsqD13nhZ3Q3pvfPvmdnfrvkblEcuaLq3//3oKpSdP2ta0BzvH7wO
+ afLCe5a09pe3QNq4cHFzf39cB/S9jTDU2tE9SILuRjyikBLuBoT4L6U2xEAraYdrVpps
+ 812Jhd8ilSCW76p6TExfc71y6W/NvT7ZRuHvUCG52Z+knD/qR0iOob1HtnGgRXwOInsE
+ 1QYiqBJCEYRcCIHAKCNqx3vR4xCegUCjufgRtBzCOghPQGAGcvuhdAw/0sUIoeN4OTLj
+ MSEZ45ioNTmMUpnj3Qjmup9yfGj87AQ2wep9ik1dCUgySoqfwU+jWciBf4E8+D5UgVLw
+ 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
+ L0B4BQKxvq9C+BpCL3SWQ7BCSINQCGEchGkQ5kO4H8J6CLshvADhFQhvQrgK4WsIvTBh
+ OQQrhDQIhRDGxfovGB8N5DFyDiqnDCr7B5XJ16i3Pj9qUHn0oDIYqbf1nzCoXDuoPGlQ
+ mSB36/tmDirPGlQW1/eW+c0e1D5nULllUHnuoLL4/wi3jPezQe33DCovHFRePKi8ZFBZ
+ /H+DW8ZfOqi9bVB52aDyclL+fzOk2I8KZW5kc3RyZWFtCmVuZG9iago1OSAwIG9iago4
+ NDE2CmVuZG9iago2MCAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2Vu
+ dCA3NzAgL0NhcEhlaWdodCA3MTcgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRC
+ Qm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL0JKS0dIVStIZWx2ZXRp
+ Y2EgL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQg
+ NjM3IC9Gb250RmlsZTIgNTggMCBSID4+CmVuZG9iago2MSAwIG9iagpbIDI3OCAwIDAg
+ MCAwIDAgMCAwIDMzMyAzMzMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDI3OCAwIDAgMCAwCjAgNjY3IDAgNzIyIDAgMCAwIDAgMCAyNzggMCAwIDAgMCAwIDAg
+ MCAwIDcyMiA2NjcgMCA3MjIgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDU1NiAwIDUwMCA1
+ NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAwIDAgMCA4MzMgNTU2IDU1NiA1NTYgMCAzMzMg
+ NTAwIDI3OAo1NTYgNTAwIDcyMiAwIDUwMCBdCmVuZG9iagoxOCAwIG9iago8PCAvVHlw
+ ZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9CSktHSFUrSGVsdmV0
+ aWNhIC9Gb250RGVzY3JpcHRvcgo2MCAwIFIgL1dpZHRocyA2MSAwIFIgL0ZpcnN0Q2hh
+ ciAzMiAvTGFzdENoYXIgMTIxIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+Pgpl
+ bmRvYmoKNjIgMCBvYmoKPDwgL0xlbmd0aCA2MyAwIFIgL0xlbmd0aDEgMzc2NCAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1V1tsG1kZ/s8Ze8aOr8kkzsWxa3tq
+ O7ET3+vJxXHj2Lk6F6fZbe1sl643SZvQpi1t2YtgaVcqoop2VytRIVDhZeEp2gcjAUrS
+ Qise0CL1oQJW8LDaFwRaCdBKqyKhitr8ZzxJ3MI+Msmcyz9n/vP933+Z42tXvr4GRrgB
+ HIyubJYvg3JxP8Tu4cpr11z1OXmIvfPs5XOb6vzvAOTquQtvnq3PNbcA9PfW18qr9Tn8
+ G/vkOgrU9Qnsj65vXnujPudewT514dKK+lyzjnPXZvkNdX/4hM0vljfXsMfLfBObyOVL
+ V68pUzDnsB+9fGVNXU+KOL9ymj2krAGorcEaEBxY4JsgKCI2A2hiS8jVAwkRNq+ff/n7
+ Zyypf4Ke+4zJd6XPb7P+I/G9N2ul6ueak9zv8SX9vm6ml6O1Lmz/hc9/g88/g4/ZGweX
+ ZQcgCHu4kgINkj2kVxncx8FpmIZB6AV8H3TB+6CBxWckcB9fuwjLMAGxg0UUzjy7aA+0
+ +CcEcSPX+FsbHYyRVnxhCFLAxmItATrKg5nugUAfgQiAS/vyO6AvFH9KyHulHVL79g7k
+ HLtoGXfmK/07QPpcrvGNXIW8ghPah4KAG0dcn2uiwnknThSlkmvLtTW9uuWacK2XVysa
+ r9Ljg7WtUthVgaXiBrYvFN2V0ZL9YLhWKg2hHg3Tg6/g8q0SaviqqgF7RRR+iou0fXlX
+ hfMViovFyo2cvTKaK9ndbtd45UGhWHmQs7tLJVzFHyBFxMz6OmYBMfMBfK6ra1kqVkbt
+ FShtbTGdS0XJXbmxtWXfQjvU+Q48eE5A4HnBqCpAJlAHMjG+Q24UUBl2ktvOBJJbciPO
+ Ug731vfll4rjiNRd6gd6C24TG8bcHSjQFZijfZDFexnvInwKi9gvkDnIk8cwg+tWcb6G
+ 4+t4s/gg+McuI/DwK+xdGBZ1iSL+vzUU4/TLLw0+0uLNq0vq+VWf6JROj3lmQNQmZWZW
+ 2jEYg1+TEHlIXfRb9BeclStwFY1Gc1JzU/Mp6sOco7foPdyZx4g0YuYOspAdL2ITtu+i
+ DkO6pAooE1DQKgLrLuYQeYwhi6MmHEWiorvZTdztYrMg+gW/7L9NHleN5CfVD7c/2n5n
+ e9u5vU3vPc3RrVr1D6SKTa3WX6uhwgJi+AtmixFCcH5/dyvbzAqmg93NTGBWd2f43Ezg
+ bhBITCAxwV3URZEHDWaqVcFHEanZugOWT3bA8wjvcCRKYmkqJ0NYKjiBk0R3zCaYieCk
+ PHattnZB8iXlNDmWCFGJ7PnGZb9O3xIY8fxp2DiR+wHpev18m3k657QLOq1O4HmSFzRa
+ rbHVHeokb1ulpK8n4TRW/zZU3aWPSqu5QrchkEx19yY9olYQj0tSttUhtaAzCczV/kHv
+ 0D8j88f2re9gpnQ0WJ9gggSzbRe9xqzpQLskHEWiMu+k8botvJzm4jEnFSS0S/KYqcA7
+ mTmSJ0TlO3xrKNcbyR9z83q7PDM/k2g36EJTK6mRpYi5KaNv7hnxJOYS3YRKQzOzE5E2
+ Q9sHbw0sD7Ya/xjJBsSO3qQzkHC3il1948e8E0mXZ3i+rzfla3GEBrqlgL2ZPUisXnQM
+ nxrGuKGQrX1Bw7QVvZiBK3exTHIgo0v2bfQyk7ygP/BwmAnCDQ6NMUGsQXDIghqSQ2zF
+ UJ0WgxKOXqSlWwlHgs7E/31y/GmC3mT+ljy8IKk8cbxNVvjxh4is8pSUyceBhZ6JkkFr
+ tPvajk6O9Onnm6PNzSZOy3f2S+nTthFTdGwh4M8ErfqUrq23SXCYTCaHThs+P+gZ7rHq
+ 7HeJ1drEaRPHOqR2Q4t30H+J6gTBbW73dVtj2VCmV2z2pvurf5VEc5jqOG2/PdDX4pN9
+ NztY2hJYRu7GkTvpMB9dzFZXA182JrDV6XGh2ZxCgA1HpjoBIfS7EgIYHkk5buaUMGCW
+ 2wRKudFUaGbgqF7POYbC2XLHaHNs7EQ0vRjkjYbE7MrQ8ss8WRnK+I4v9PTOp70zmeBk
+ vDswvTqYXJntP/kSw0mhiDhPIM4m8EF237NqIh56tpMh7WRI77JagVWKZaaESLUK5k4c
+ WeuY1bi1EMVvz6MmVZ3gHOjpySZ7jAY97xoODpe7smJ0tFAHbkzOlQfOv3SE+H3ZqMMZ
+ G/PGAnnZnR70Hg93BaZXBgdX88HvvlPHvohE92Ld4fCsMrWnFFbuIDoJg0wa2NYygbYh
+ JdX6qJRDLRqgUZIxLsY5UY4LixdTFyfFMZHyT5/Q10sl5GoBuZpGrkTwH3q1ialtatin
+ UW0Tqu1UGAIcSQpD2hC3n+RmTjxMc6UEEDG2ELeajfFZzOrFPp3RNDBf/pmeOoYj4Tz6
+ uolRFs7LR83EkzubG1yZCQbRo+nVKT9pDhWGPd6RhUBkccjlTc8rcZhHjn6MmM2MIR0S
+ csiQjiHXNSBXvw+Hbm80RYcG4GEOy1VcEuNCPE3igg+D8zupi6k26lvOmGPTcbee8uV0
+ NEM8QwtBZf8Z5MyE+4cPa2ML27elYd8AEwTqRaCeAy0qb1gbnUQtjRrMfhb4WJlZAVDq
+ Yj0h3iUjOXfc267R9U6cyHkN5sunXigKI5rRgcFJHW8LDAzLPS06XTCzGApleiz8B1nZ
+ aveIPm+bxTkQzyzli6lotKfLY7NYWt0xr3fQJ9ojo14F/2rtC7JOv4dePLGfHXoGV9+A
+ 38QEpgYBxwRcPbH1aIqghIAFP1tWvDmU2JRQaGcFyyeLkhzHiIsLEmcmzN6kXDX4bf1e
+ Y2HaMH0kdaRsKOc1GkEUjZ0mSpv6h8g3Yu+/H6v+SOxu0Wnw0EFgDXlexJNrJ8zt41S9
+ d+hOC4NlacD5zIGAfZJV05SvVKsCkcQ5SVYLD2YGb1O8QdvQ6xbL0X7Zkxh1afRTqSlz
+ eNKbiXsxAJ4+mTI7O5sdifFe8mL1w+ykIzGFwUDgOhYchpGH5JdiVKk7BK2mLULCA0pc
+ JHEiXc/MED5T/W2W8tUcuff0CeruqiVoAXXb4NV93f/lJyOz39hgv5oBSgVQjkwiWyGC
+ cPBJU0u0IhDRb/iLBDOgXQ1KTsHD2PH5fYZOU6ff2Wlczk4RTab6O0ckkjhidRjepRpX
+ f7SZNlWz5JdVEp2XHcxlWE+g9hjvn+MX8n9dFhRymDVJ/GUyAVMwixH4IpyEU3gGLuHv
+ IcZoC97s4sEBcHJuYrpQCE6tXXht7drGSrl/duPc+rWFVy9sfA1/rv4HnPrOlAplbmRz
+ dHJlYW0KZW5kb2JqCjYzIDAgb2JqCjI0MTYKZW5kb2JqCjY0IDAgb2JqCjw8IC9UeXBl
+ IC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcwMCAvRGVzY2Vu
+ dCAtMjMwIC9GbGFncyA5NgovRm9udEJCb3ggWy0xNjcgLTI3MyAxMTEwIDk3OV0gL0Zv
+ bnROYW1lIC9WTUZJUFArSGVsdmV0aWNhLUxpZ2h0T2JsaXF1ZSAvSXRhbGljQW5nbGUK
+ LTEyIC9TdGVtViAwIC9NYXhXaWR0aCAxMDE2IC9YSGVpZ2h0IDYyMyAvRm9udEZpbGUy
+ IDYyIDAgUiA+PgplbmRvYmoKNjUgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAow
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2NjcgNjExIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgNTU2IDAgNTU2CjAgNTU2IDAgMCAwIDIyMiAwIDAgMCAwIDAgNTU2
+ IDAgMCAzMzMgNTAwIDI3OCA1NTYgNTAwIDAgMCA1MDAgXQplbmRvYmoKMTkgMCBvYmoK
+ PDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvVk1GSVBQ
+ K0hlbHZldGljYS1MaWdodE9ibGlxdWUKL0ZvbnREZXNjcmlwdG9yIDY0IDAgUiAvV2lk
+ dGhzIDY1IDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMjEgL0VuY29kaW5nCi9N
+ YWNSb21hbkVuY29kaW5nID4+CmVuZG9iago2NiAwIG9iago8PCAvTGVuZ3RoIDY3IDAg
+ UiAvTGVuZ3RoMSA5Njk2IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1a
+ C1hTV7Ze+zyTkwSSQJ4QkpBAeAQCKMEoyhHDQwFFRAsKFUQs1kfVWnyNjlVbEO1r5voo
+ 0xn7sDPW3nYCtjbW0evXsVP78Lt9Tmtr2+nUtraWvsY+leSuc4JUub39/L7bb87JPnuv
+ /Th77X+tvdbe+2TlipvaQQMbgYba2a3LFoB8uccAkH1tS1qXxeiEDIxfaOtc6YjRLNL0
+ rQuWXbckRitCAIL7usVrhtonYr34vR3trfNj5XARY38HZsRoMhpjd8eSlatjtP5VjOsX
+ 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
+ L1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNzIwIC9E
+ ZXNjZW50IC0yMzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTEwMTggLTQ4MSAxNDM2IDEx
+ NTldIC9Gb250TmFtZSAvTkRGRVFaK0hlbHZldGljYS1Cb2xkIC9JdGFsaWNBbmdsZQow
+ IC9TdGVtViAwIC9NYXhXaWR0aCAxNTAwIC9YSGVpZ2h0IDY0NCAvRm9udEZpbGUyIDY2
+ IDAgUiA+PgplbmRvYmoKNjkgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMzg5
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyCjAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCA2MTEgNTU2IDYxMQo1NTYgMCA2MTEgMCAyNzggMCA1NTYgMjc4IDAg
+ NjExIDYxMSA2MTEgMCAzODkgNTU2IDMzMyA2MTEgNTU2IDAgMCA1NTYgXQplbmRvYmoK
+ MTcgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9u
+ dCAvTkRGRVFaK0hlbHZldGljYS1Cb2xkIC9Gb250RGVzY3JpcHRvcgo2OCAwIFIgL1dp
+ ZHRocyA2OSAwIFIgL0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIgMTIxIC9FbmNvZGluZyAv
+ TWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKNzAgMCBvYmoKKFVudGl0bGVkKQplbmRv
+ YmoKNzEgMCBvYmoKKE1hYyBPUyBYIDEwLjYuOCBRdWFydHogUERGQ29udGV4dCkKZW5k
+ b2JqCjcyIDAgb2JqCihTY290dCBNYWluKQplbmRvYmoKNzMgMCBvYmoKKE9tbmlHcmFm
+ ZmxlIFByb2Zlc3Npb25hbCkKZW5kb2JqCjc0IDAgb2JqCihEOjIwMTIwMTAzMjM1MjI2
+ WjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1RpdGxlIDcwIDAgUiAvQXV0aG9yIDcy
+ IDAgUiAvUHJvZHVjZXIgNzEgMCBSIC9DcmVhdG9yIDczIDAgUiAvQ3JlYXRpb25EYXRl
+ Cjc0IDAgUiAvTW9kRGF0ZSA3NCAwIFIgPj4KZW5kb2JqCnhyZWYKMCA3NQowMDAwMDAw
+ MDAwIDY1NTM1IGYgCjAwMDAwNTQ1ODYgMDAwMDAgbiAKMDAwMDAyNjYxMyAwMDAwMCBu
+ IAowMDAwMDAzOTQ5IDAwMDAwIG4gCjAwMDAwMjQ2MDEgMDAwMDAgbiAKMDAwMDAwMDAy
+ MiAwMDAwMCBuIAowMDAwMDAzOTI5IDAwMDAwIG4gCjAwMDAwMDQwNTQgMDAwMDAgbiAK
+ MDAwMDAxNjY3OSAwMDAwMCBuIAowMDAwMDA2MjQ1IDAwMDAwIG4gCjAwMDAwMDY4OTkg
+ MDAwMDAgbiAKMDAwMDAwNDg4MSAwMDAwMCBuIAowMDAwMDA1NTM2IDAwMDAwIG4gCjAw
+ MDAwMDU1NTYgMDAwMDAgbiAKMDAwMDAwNjIyNSAwMDAwMCBuIAowMDAwMDA0NDA2IDAw
+ MDAwIG4gCjAwMDAwMjQ1NjQgMDAwMDAgbiAKMDAwMDA1NDIxMyAwMDAwMCBuIAowMDAw
+ MDQ0MDQ4IDAwMDAwIG4gCjAwMDAwNDcyMTcgMDAwMDAgbiAKMDAwMDAwNDcyMyAwMDAw
+ MCBuIAowMDAwMDA0NTY0IDAwMDAwIG4gCjAwMDAwMzQ4NjIgMDAwMDAgbiAKMDAwMDAx
+ NTU4NyAwMDAwMCBuIAowMDAwMDE1NjMyIDAwMDAwIG4gCjAwMDAwMTU2NzcgMDAwMDAg
+ biAKMDAwMDAxNTcyNCAwMDAwMCBuIAowMDAwMDE1NzcxIDAwMDAwIG4gCjAwMDAwMTc1
+ NzUgMDAwMDAgbiAKMDAwMDAyNTk5NCAwMDAwMCBuIAowMDAwMDI1MTg3IDAwMDAwIG4g
+ CjAwMDAwMjQ3NjQgMDAwMDAgbiAKMDAwMDAyMzY5OSAwMDAwMCBuIAowMDAwMDEyNzQ2
+ IDAwMDAwIG4gCjAwMDAwMTU1NjYgMDAwMDAgbiAKMDAwMDAwNjkxOSAwMDAwMCBuIAow
+ MDAwMDA5ODg0IDAwMDAwIG4gCjAwMDAwMDk5MDUgMDAwMDAgbiAKMDAwMDAxMjcyNSAw
+ MDAwMCBuIAowMDAwMDE1ODE5IDAwMDAwIG4gCjAwMDAwMTY2NTkgMDAwMDAgbiAKMDAw
+ MDAxNjcxNSAwMDAwMCBuIAowMDAwMDE3NTU1IDAwMDAwIG4gCjAwMDAwMTc2MTIgMDAw
+ MDAgbiAKMDAwMDAyMzY3OCAwMDAwMCBuIAowMDAwMDIzNzM2IDAwMDAwIG4gCjAwMDAw
+ MjQ1NDQgMDAwMDAgbiAKMDAwMDAyNDY4NCAwMDAwMCBuIAowMDAwMDI1MTY3IDAwMDAw
+ IG4gCjAwMDAwMjU5NzQgMDAwMDAgbiAKMDAwMDAyNjU5MyAwMDAwMCBuIAowMDAwMDI2
+ Nzc2IDAwMDAwIG4gCjAwMDAwMjY2NjEgMDAwMDAgbiAKMDAwMDAyNjc1NCAwMDAwMCBu
+ IAowMDAwMDI2ODY5IDAwMDAwIG4gCjAwMDAwMzQzNjYgMDAwMDAgbiAKMDAwMDAzNDM4
+ NyAwMDAwMCBuIAowMDAwMDM0NjEyIDAwMDAwIG4gCjAwMDAwMzUwMzcgMDAwMDAgbiAK
+ MDAwMDA0MzU0NCAwMDAwMCBuIAowMDAwMDQzNTY1IDAwMDAwIG4gCjAwMDAwNDM3OTAg
+ MDAwMDAgbiAKMDAwMDA0NDIyMyAwMDAwMCBuIAowMDAwMDQ2NzI5IDAwMDAwIG4gCjAw
+ MDAwNDY3NTAgMDAwMDAgbiAKMDAwMDA0Njk4OSAwMDAwMCBuIAowMDAwMDQ3NDA1IDAw
+ MDAwIG4gCjAwMDAwNTM3MjEgMDAwMDAgbiAKMDAwMDA1Mzc0MiAwMDAwMCBuIAowMDAw
+ MDUzOTczIDAwMDAwIG4gCjAwMDAwNTQzOTMgMDAwMDAgbiAKMDAwMDA1NDQyMCAwMDAw
+ MCBuIAowMDAwMDU0NDcyIDAwMDAwIG4gCjAwMDAwNTQ1MDEgMDAwMDAgbiAKMDAwMDA1
+ NDU0NCAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDc1IC9Sb290IDQ3IDAgUiAvSW5m
+ byAxIDAgUiAvSUQgWyA8M2QwYzRmYWZkYzk0MzkyYmU1MTE3YWY0MGNiMzE5OTA+Cjwz
+ ZDBjNGZhZmRjOTQzOTJiZTUxMTdhZjQwY2IzMTk5MD4gXSA+PgpzdGFydHhyZWYKNTQ3
+ MDYKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgKFNjb3R0IE1haW4pL0NyZWF0aW9uRGF0
+ ZSAoRDoyMDEwMDkyODE5MDYwMFopL0NyZWF0b3IgKE9tbmlHcmFmZmxlIFByb2Zlc3Np
+ b25hbCA1LjIpL01vZERhdGUgKEQ6MjAxMjAxMDMyMzUxMDBaKS9Qcm9kdWNlciA3MSAw
+ IFIgL1RpdGxlIChyZXN0b3JlX2luc3RhbmNlKT4+CmVuZG9iagp4cmVmCjEgMQowMDAw
+ MDU2MzY0IDAwMDAwIG4gCnRyYWlsZXIKPDwvSUQgWzwzZDBjNGZhZmRjOTQzOTJiZTUx
+ MTdhZjQwY2IzMTk5MD4gPDNkMGM0ZmFmZGM5NDM5MmJlNTExN2FmNDBjYjMxOTkwPl0g
+ L0luZm8gMSAwIFIgL1ByZXYgNTQ3MDYgL1Jvb3QgNDcgMCBSIC9TaXplIDc1Pj4Kc3Rh
+ cnR4cmVmCjU2NTQ2CiUlRU9GCg==
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ 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
+ ZmlGSQAAABAAAAISaXRJVAAAABQAAAIia29LUgAAAAwAAAI2AEsAbABlAHUAcgBlAG4A
+ LQBMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG0ASwBvAGwAbwByACAATABD
+ AEQAQwBvAGwAbwByACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABjAG8A
+ dQBsAGUAdQByAEwAQwBEACAAQwBvAGwAbwByAGkAZABvAEwAQwBEACAAYQAgAEMAbwBy
+ AGUAc19pgnIAIABMAEMARABMAEMARAAgAGMAbwBsAG8AcjCrMOkw/AAgAEwAQwBEBCYE
+ MgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5AEYA5AByAGcALQBMAEMARF9p
+ gnJtsmZ2mG95OlZoAEYAYQByAGIALQBMAEMARABWAOQAcgBpAC0ATABDAEQATABDAEQA
+ IABjAG8AbABvAHIAac7st+wAIABMAEMARAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUs
+ IEluYy4sIDIwMTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUgABAAAAARbP
+ WFlaIAAAAAAAAG8xAAA5YwAAAYNYWVogAAAAAAAAYO4AALdqAAAIElhZWiAAAAAAAAAm
+ twAADzIAAMmXY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABF
+ AEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEA
+ xgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZ
+ AWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0C
+ JgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMh
+ Ay0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE
+ YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXV
+ BeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YH
+ mQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmP
+ CaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL
+ 4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5k
+ Dn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETER
+ TxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRq
+ FIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX
+ 9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2Mbihuy
+ G9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f
+ 6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRN
+ JHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYp
+ OClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5M
+ LoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz
+ 8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8
+ Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JA
+ I0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0ar
+ RvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN
+ 3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21Uo
+ VXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd
+ J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9
+ ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbblu
+ Em5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4
+ d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeA
+ qIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opk
+ isqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU
+ 9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+L
+ n/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+r
+ Aqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5
+ tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C
+ 28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83
+ z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXc
+ it0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ
+ 6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4
+ Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAA
+ DVkAABPQAAAKDnZjZ3QAAAAAAAAAAAADAQAAAgAAAAcAHgBKAIsA4wEqAW4BwAIZAnQC
+ 2gNJA8MERwTUBW0GEQbCB3wIPgkHCd0KuQucDI8Npw7cEBARSxKJE8kVERZcF6wZBBph
+ G70dIB6MH/ghZCLaJE4lyScvKI4p6ytJLJ8t9i9DMI0x0DMNNEI1czacN8A44Dn9Oxc8
+ Kz05PkU/UkBjQXNChEOXRKtFv0bTR+lI/0oVSyxMQ01bTmlPdlCFUZJSn1OrVLdVwlbL
+ V9JY2VnfWuNb6FztXehe3F/OYL9hr2KeY41kemVmZlFnO2gkaQ5p9mrfa8ZsqW2NbnBv
+ U3A3cRpx/HLec8B0o3WFdmZ3SXgreQp56nrMe7B8mH2Efnd/cYBygXqCioOhhL2F34cJ
+ iDyJcIqji9aNCo48j22QnpHOkv2ULJVbloqXtpjgmgubNZxfnYmesp/boQSiLaNWpH+l
+ qKbRp/ipIKpMq3yssq3xrzqwj7Hvs1u0z7ZPt9S5PLp0u6m83L4LvzPAVsFxwoXDkcSW
+ xZbGkceIyIPJh8qNy43Mhc10zlfPLs/70MDRe9I20vbT19S51ZrWfddf2ELZJdoJ2u3b
+ 0dy13Zrefd9g4EThKeIQ4vnj5uTW5cnmwee76Lnpueql647sdu1e7kXvK/AQ8PXx2vK+
+ 86H0hfVo9kv3L/gT+Pf53PrA+6L8hP1l/kT/Iv//AAAABgAaAEAAeADFARMBTAGQAd8C
+ MwKOAvMDXwPWBFUE3QVwBg4GtwdlCBoI2gmcCmcLQgw9DVQOaA+AEKARwRLpFBUVRBZ5
+ F68Y7xouG3IcvB4LH1YgqiH/I0EkgSW/JvwoNylqKp0ryyzyLhUvMzBIMVsyZzNxNHk1
+ fTZ6N2o4WzlMOj07MDwiPRU+CD76P+1A4UHVQspDvkSzRadGmEeISHdJaEpZS0hMOE0n
+ ThVPBE/0UOJR0VLAU7BUnlWIVnNXXlhJWTNaHVsGW+5c1l29XqNfimBvYVRiNGMMY+Jk
+ uWWPZmZnPGgRaOZpu2qRa2VsOm0PbeNut2+IcFlxK3H8cs5zoHRydUN2FXbnd7l4jHle
+ ejB7AnvXfK99i35tf1WARIE6gjmDPYRIhViGboeHiKWJw4rhi/6NHI45j1aQc5GQkqyT
+ yZTmlgKXHJg2mVGabZuLnKyd0J72oCKhUKKDo7mk8aYup3GotKn3qzmsfK2+rwCwQbGD
+ ssW0BbVHtoi3x7kHukW7gry9vfS/JsBTwXvCnsO7xNXF6cb3yATJE8ohyy/MPc1MzlrP
+ aNB30YbSldOi1K/VvNbJ19bY5dn02wPcFN0l3jjfTOBn4aPi6eQn5Vrmhueq6Mfp4er4
+ 7A7tJe4/71vwgPHQ8zP0k/Xz91L4tPoY+4X8+P53//8AAAAEABEAKgBOAIAAwAEHAToB
+ dAG3AgICTQKgAvsDXgPKBDwEtgU4BcIGUAbjB3sIGwjHCY0KYws8DBsM/g3iDssPtRCl
+ EZgSjhOIFIUVhhaLF5MYnxmrGrgbvRy9Hb4evx++ILshtSKrI50kiyV1JlwnQCgiKQAp
+ 2yq3K4ssVi0gLeoutS+AMEsxFjHhMqszdTQ/NQk10zadN2g4NDj4Ob46hTtLPBI82j2i
+ Pmo/Mj/8QMZBkUJdQypD90TDRY9GW0cnR/JIvkmKSlZLIUvrTLZNgE5MTxZP4VCrUXNS
+ O1MCU8pUklVaViBW51euWHVZO1oCWslbj1xTXRZd2V6bX11gHWDdYZ1iXWMcY9pkmGVW
+ ZhNmz2eLaEVpAGm7anZrMWvsbKdtYm4cbtdvk3BOcQhxwXJ6czNz7HSldV52F3bPd4d4
+ P3j4ebB6aXsge9l8lH1Ufhl+5X+4gJSBeYJmg1yEWYVbhmWHdYiFiZaKpou2jMaN1Y7l
+ j/SRA5ITkyKUMJU6lkOXSphRmVmaYptvnH+dk56sn8ug76Ilo3mk0KYnp36o1qotq4Ss
+ 264xr4iw3rI2s4u037Yzt4e43Lozu4q84r48v5jA9sJUw7XFJ8akyC3JxctrzSTO7NDH
+ 0rHUqdaw2MHa3d0A3zDhp+SG54rqt+4P8Yj1GPi1/Ff//wAAbmRpbgAAAAAAAAY2AACl
+ 4wAAVqEAAFFbAACnKwAAJZsAAA4UAABQDQAAVDkAAkKPAAHZmQABR64AAwEAAAIAAAAN
+ ACcARgBmAIcAqADJAOsBDgExAVUBegGdAbwB2wH8Ah0CPwJiAoYCqgLPAvQDGwNBA2gD
+ kAO5A+IECwQ1BGAEjAS4BOQFEgU/BW4FoQXVBgoGQQZ4BrIG7AcoB2cHpwfpCC4IdQi/
+ CQsJWgmsCgEKWAqyCw4LbgvSDDgMoA0IDXIN3g5KDrkPKA+aEA0QgRD3EW8R6BJjEt8T
+ YhPnFG0U9hWBFg4WnRcvF8MYWxj1GZEaMRrTG3ccHRzQHYceQh8AH8EghSFNIhki6CO7
+ JJElaiZGJyUoDCj1KeIq0ivELLotsy6wL68wsjG4MsAzyzTeNfE3BDgVOSM6LTsxPDA9
+ Kj4gPxJAAkDvQdtCv0OiRIhFb0ZYR0JIL0keSg9LA0v4TPBN6k7lT+JQ4VHkUutT81T9
+ VglXF1gnWTlaTVtjXHtdlV6wX85g7WIOYzNkWWV/ZqNnxWjjaf1rEmwhbSpuLm8tcClx
+ InIWcwlz+nTpdhp3TXiEeb96/nxFfZN+64BNgbuDNIS5hkmH44mHiyGMro5Aj+CRkZNY
+ lT2XSZl3m8WeG6AOogKj+aXyp+6p7Kvsre+v9bH9tAi2G7gvukS8Wb5pwHbCfsSAxn3I
+ dspszGDOi9C40urVIddd2Z/b5t4x4IHi1eUr54jp5+xH7qrxEPN79e34Zvrn/XD//wAA
+ AA8ALgBRAHUAmgC/AOQBCwEyAVsBhAGpAcsB7wIUAjoCYAKIArAC2QMDAy0DWQOFA7ED
+ 3wQNBDwEawSbBM0E/gUxBWQFnAXVBg8GTAaJBsgHCgdNB5IH2gglCHIIwgkWCWwJxgoj
+ CoIK5QtKC7oMKwyfDRUNjA4GDoIPAA+BEAMQiBEOEZcSIhKvE0AT1RRtFQYVohZBFuIX
+ hhgtGNYZgRowGuAbkxxIHQQdwh6DH0YgDCDWIaIicyNGJB4k+CXWJrcnoCiXKZEqjiuO
+ LJItmi6mL7UwyDHeMvc0FTU6NmM3jji9Oe87JTxfPZs+20AeQWRCr0P7RUVGi0fLSQVK
+ N0tiTIZNpk7BT9pQ8FIEUxZUKlVAVllXc1iPWa5azlvxXRZePV9mYJFhvmLuZCNlWGaP
+ Z8Zo/Wo0a2lsnm3RbwJwMnFgco5zu3Todg93N3hgeYt6uHvnfRd+SX99gLKB6oMjhF2F
+ mobYiBeJWYqei+SNLY54j8aRGJJvk8yVMJabmA6ZiZsMnJWeJ5/HoWmjDKSyplqoBKmw
+ q1+tEK7DsHiyL7Potae3abktuvK8ur6CwEzCF8PjxbDHfMlKyxnM0M5Vz+PRetMe1M7W
+ i9hT2ibcAd3i38bhq+OP5XLnU+kb6p/sJ+2x7z7wzvJf8+/1gPcP+Jn6Hvuf/Rr+j///
+ AAAAFwBBAHAAnwDPAP8BMgFmAZkBxQHzAiICUgKEArcC7AMhA1gDkAPJBAMEPgR6BLcE
+ 9QU1BXYFvQYFBk8GmwbqBzsHkAfoCEQIpAkICXAJ3ApMCsALNwu6DEIMzA1ZDeoOfg8V
+ D7AQTxDxEZYSPhLpE50UUxUNFcoWiRdMGBIY2hmlGnIbQRwTHOsdxh6kH4YgayFUIkEj
+ MiQnJR8mGycaKCApKyo5K0ssYS18LpovvTDkMg4zPDRyNa427zg1OYE60jwoPYQ+5kBM
+ QbdDK0SkRiFHo0kpSrVMRE3YT3BRDFKwVFtWCVe9WXZbNFz4XsBgjWJeZDZmDGfZaZpr
+ SWzpbnlv/HF0cuV0UHWzdxF4cnnUezp8oX4Lf3iA54JYg8yFQoa6iDSJtos9jMmOWY/r
+ kX6TEZSili+XuZk+mr+cPJ22nwWgTKGVot+kKqV3psWoFalmqrqsDq1krrywFbFwssu0
+ KLWKtu24Ubm3ux68hr3uv1fAwcIrw5XE/8Zqx9TJQMqrzBbNc87K0BvRaNKs0+rVI9ZX
+ 14LYqNnK2uXb/N0Q3h/fK+A14TriPuNA5EDlPuY65zfoMekq6iLrDuvp7Lntd+417uzv
+ pfBZ8QrxvPJm8xDzuPRc9QD1ovZC9uL3f/gc+Ln5Vfnw+oz7J/vC/F78+P2T/i/+yf9k
+ //8AAHNmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBsbW1v
+ ZAAAAAAAAAYQAACcsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{241, 113}, {949, 760}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{0, 17.8947}, {842.105, 622.105}}</string>
+ <key>Zoom</key>
+ <real>0.94999998807907104</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>0.94999998807907104</real>
+ <real>1.1299999952316284</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
diff --git a/docs/html/images/fundamentals/restore_instance.png b/docs/html/images/fundamentals/restore_instance.png
index fa428a7c9934..57a95eca6f99 100644
--- a/docs/html/images/fundamentals/restore_instance.png
+++ b/docs/html/images/fundamentals/restore_instance.png
Binary files differ
diff --git a/docs/html/images/fundamentals/service_binding_tree_lifecycle.png b/docs/html/images/fundamentals/service_binding_tree_lifecycle.png
index 46d2df50e85a..526521625b5a 100644
--- a/docs/html/images/fundamentals/service_binding_tree_lifecycle.png
+++ b/docs/html/images/fundamentals/service_binding_tree_lifecycle.png
Binary files differ
diff --git a/docs/html/images/fundamentals/service_lifecycle.graffle b/docs/html/images/fundamentals/service_lifecycle.graffle
new file mode 100644
index 000000000000..73a17a25ab7d
--- /dev/null
+++ b/docs/html/images/fundamentals/service_lifecycle.graffle
@@ -0,0 +1,8595 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>138.9.0.117994</string>
+ </array>
+ <key>CreationDate</key>
+ <string>2010-10-05 15:40:27 -0700</string>
+ <key>Creator</key>
+ <string>Scott Main</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2011-12-29 10:02:33 -0800</string>
+ <key>Modifier</key>
+ <string>Scott Main</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ H374+NuHH+8gaW+FBrEcVrGOS13l8OErAp3abz3/DO7Ybw2vJU32eFZ+aSuHRaT+LL/m
+ FfZStXDz7ZWdfOEibSdnPxV13Ml3/wcwYwWhCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9i
+ ago2MDY5CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIg
+ L1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNTc2
+ IDczM10KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9J
+ bWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNyAwIFIK
+ L0NzMSA4IDAgUiA+PiAvRXh0R1N0YXRlIDw8IC9HczUgMjQgMCBSIC9HczMgMjUgMCBS
+ IC9HczQgMjYgMCBSIC9HczEgMjcgMCBSCi9HczIgMjggMCBSID4+IC9Gb250IDw8IC9G
+ MS4wIDE1IDAgUiAvRjIuMCAxOCAwIFIgPj4gL1hPYmplY3QgPDwgL0ltMyAxMyAwIFIK
+ L0ltMiAxMSAwIFIgL0ltMSA5IDAgUiA+PiAvU2hhZGluZyA8PCAvU2gyIDE5IDAgUiAv
+ U2gzIDIwIDAgUiAvU2gxIDE2IDAgUgovU2g1IDIyIDAgUiAvU2g2IDIzIDAgUiAvU2g0
+ IDIxIDAgUiA+PiA+PgplbmRvYmoKMTkgMCBvYmoKPDwgL0NvbG9yU3BhY2UgMjkgMCBS
+ IC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyA1OS41IC0yNS41ODQ4NSA1OS40OTk5OCAy
+ NS41ODQ4NwpdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAv
+ RnVuY3Rpb24gMzAgMCBSID4+CmVuZG9iagoyMCAwIG9iago8PCAvQ29sb3JTcGFjZSAy
+ OSAwIFIgL1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDU5LjUgLTI1LjU4NDg1IDU5LjQ5
+ OTk4IDI1LjU4NDg3Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxz
+ ZSBdIC9GdW5jdGlvbiAzMSAwIFIgPj4KZW5kb2JqCjE2IDAgb2JqCjw8IC9Db2xvclNw
+ YWNlIDI5IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNTkuNSAtMjUuNTg0ODUg
+ NTkuNDk5OTggMjUuNTg0ODcKXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNl
+ IGZhbHNlIF0gL0Z1bmN0aW9uIDMyIDAgUiA+PgplbmRvYmoKMjIgMCBvYmoKPDwgL0Nv
+ bG9yU3BhY2UgMjkgMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyA1OS41IC0yNS41
+ ODQ4NSA1OS40OTk5OCAyNS41ODQ4NwpdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsg
+ ZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMzMgMCBSID4+CmVuZG9iagoyMyAwIG9iago8
+ PCAvQ29sb3JTcGFjZSAyOSAwIFIgL1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDU5LjUg
+ LTI1LjU4NDg1IDU5LjQ5OTk4IDI1LjU4NDg3Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRl
+ bmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAzNCAwIFIgPj4KZW5kb2JqCjIxIDAg
+ b2JqCjw8IC9Db2xvclNwYWNlIDI5IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsg
+ NjAuNTM4MDkgLTI2LjAyNjIxIDYwLjUzODA4CjI2LjAyNjIzIF0gL0RvbWFpbiBbIDAg
+ MSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAzNSAwIFIgPj4KZW5k
+ b2JqCjEzIDAgb2JqCjw8IC9MZW5ndGggMTQgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0
+ eXBlIC9JbWFnZSAvV2lkdGggMjU4IC9IZWlnaHQgMTIyIC9JbnRlcnBvbGF0ZQp0cnVl
+ IC9Db2xvclNwYWNlIDM2IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAzNyAw
+ IFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
+ YW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABA+8DA3DrAAEKZW5kc3RyZWFtCmVuZG9iagoxNCAw
+ IG9iago0MzQKZW5kb2JqCjExIDAgb2JqCjw8IC9MZW5ndGggMTIgMCBSIC9UeXBlIC9Y
+ T2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjYyIC9IZWlnaHQgMTI0IC9JbnRl
+ cnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDM2IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFs
+ IC9TTWFzayAzOSAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAHt0AENAAAAwqD3T20PBxEoDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGHgYG
+ fMcAAQplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjQ0OAplbmRvYmoKOSAwIG9iago8
+ PCAvTGVuZ3RoIDEwIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dp
+ ZHRoIDI1OCAvSGVpZ2h0IDEyMiAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAz
+ NiAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sgNDEgMCBSIC9CaXRzUGVyQ29t
+ cG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCBAAAAAMOg
+ +VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQPvAwNw6wABCmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKNDM0CmVuZG9i
+ ago0MSAwIG9iago8PCAvTGVuZ3RoIDQyIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlw
+ ZSAvSW1hZ2UgL1dpZHRoIDI1OCAvSGVpZ2h0IDEyMiAvQ29sb3JTcGFjZQovRGV2aWNl
+ R3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
+ L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1dZ1viQBA2IE2aAQGRDgICBkQ6iEjvHfT8
+ /3/kZjaAAqHo3Qezsh8OVC5P5uWdtpmdOTs7rRMCJwROCJwQOCFwHAIMI5FIpGJZEgnD
+ HCfXcZ8C6aXnMrlCqVSJYykVCrnsXCr5TygwknOZQqXW6PSXLGsQw2LZS51Wc6GU/xcQ
+ GOm5QqXRs1fm6xub3eEUwXI47DarxWS81KoBhH8kAiOVKS50BtONw3MbDEe4aDT241c0
+ yt1HQgGfy359dalR/RMGwH+Q33jt9N1x8VQ2/1R8FsUqPhVy6UQsEvDYzKxWJZN+1x4A
+ AVQ6o9UVuH/MPJUqtUaz1RbFajWb9Wr5OZ96CPscZlaj+J4qIAHUrMUV4JKFUq3Z6fUH
+ w9FoLIY1Gg0H/W67USlmHyM+u0l/If8GDRgJEODKfnufLJQbnf5wPJ3N5vP5qxgW3Ods
+ OhkPeq1aKRsPeawGteLLEAAAF3qL6y6ee2l0B+MpiP729gfW+49feJd/3t5e57PJqN+u
+ FdOc336lVZ5Ljgt+Fp9ipHI1a/Xep4q1zmAyE430q69nAcJ03G9V8vE7p1n3NQgQAIPt
+ NpotN/vj2Zz/9sXw/a8QeH9fYjDs1ovJsNuiV32BBYwEAQg85KudIfAf2f/p0iJ5CzdN
+ lGE27jdL6XvPVyAAG4AAxAu17ohXAJEIvXGbPAav88mgXc5wXoteeX5kYABGkAUAnuq9
+ MQAA19m4snh+5Gkwnw4BAmCB7kiPwJyrLm/8CMCE1wDxIgDfFdGE6bADELhN2qMgYKQK
+ 3bUvVqgBAGJxgPtYidbgdQYsSIedV2rZYZ8IVlBr8nC5andMGLDv4qL4G9GE1+mwVUoG
+ 7YaLw6YAjIDREU5XOrwNEIWQ+29yAcGgWYz7rXrloeCQkSovbwKJUntIjOD+a4vkrwSC
+ +aRfz0c9Jo38gB6ADpi9safGYIpeQCQiHrpNHoJxt5IJOw7pAXN+YXBGslW0gvD/Dl1a
+ LH8HUcAajtqlhN96wCWCH7CiDox4NyAWCQ/fJ0IwHdQLnHu/P2Bk6it3tLDQAWoogAAB
+ BPNJt5K6s13uM4ZShf4mmKp0iQ4cBlZMn+CjgmYx5jVpdgcFSAFP7Kk5nNFkBPjviZiC
+ Sa+aCe0jAVLgLl3pTcSdDeygJrBgNmoVH/aQgFiBJQV2XEbEvybGcEkC4f0iCTgCYgWA
+ AiKWdNetox7Mh61izAPuQDBNJrEAV2gQK7DrMmL+PZJg0qukgxATCAaGEA5abhNl4gjE
+ LOjOe0cSzIbNAufcERhCRmAL5+oQD9MTDK6jgWow7rwkbs0aITVgzsEVPjxjOEijFUAs
+ gASv034tG7bphdQAlSCQ4l3hOnQU/QQkAIcYcxmF9glACeyRfGOA0RBFMq+LgrawW04K
+ qgF4AqM79tweY1K4/t8o+glt4aCeC90IqAEj05pvk5ASgB2kGgFUg6jToJJuBkUSiIhD
+ 4AmoVgJiCyedl0evaTsokqpYBwdJEdVKgO7gddqrpgPXWvlGWAhm4MoTL3XGVCsB2SaY
+ DRp5AX/IyDTmW+ILKbYCYNIxKBI2BBI5ZEXZWp9uM0AgeIWwMA7Z0fm6KZRASByhOCta
+ eXQwBJAdCUQEUpXBGS22RnN6PSEPAqgBBMaZ4LVuwxRiPMQbwhVadL4hMRGYws2YCNIi
+ kw8z41faOfCO2yTNp3s7q1yLidAV+FPV3pTavHDF6D9/5uP281ZUyGBimKn1fwUC4AxK
+ D25IDz87A3SGd3xMvAKL0jfoDLrlR++GO8SsIMynxpQKvhKLIFBJ+uDByee4WKLAcACy
+ ArojQh6Gt2mvktrcIoCAyH6PedEvQaCa9lu06xxQsnaOBETUe8P3dxISBSzr2SHJjX8V
+ AkEBBKLPGBT/Bg7MSFi8zYEo7pSvTCbFb94AgWxwY48EtYDnAMWSL0VDBCA12uYAbwmX
+ H6P4VdASSla+gGLJl6IhAulNX/ARDyw/RvErREQC8YBCv4gJKZZ8KZpwTLjKC5Yfo/aV
+ zwsSvo0nBh+5IbWSLwVDBDrlx82t0k/7A7SHRICA0P4A/7iA7BHRj8B8JLRHBPuEXn6f
+ kHoEVvuE67VEH3vFlCOwa6/4DJ4XOMjzAtq3SlfPC9aD4rMzfpOIVJAsjSadr+gKBJ8Z
+ keeGv2GzmHcFAs8NiTPgS0jo/O4XUoES7Hh2fPbr6wfAFP7yGhIwhVBHRH0BASgBlg9g
+ HdHWwUPeEJBnpxTvFaIZgOemUFm8XUu2rCfEolp6gyJAYNavZwXrCc+wpjScp7ycbl9N
+ 6RnWFfvxlBWd5yt4b7jwhcJ1xVhP547hUxNqA+NlbXlIuLYc1QDPF/R/7fmCM+INEi8d
+ rK2mMi7kz5g08IyJassXYjUF9J4wOH/BOaNUwKrbcQAdz5rBGQtqbSG6wiGcOoWjx4IU
+ QBJASV10ceSUQj0gR82q6TsopFsrI/tUTrQ6dkztmVM4bghnTrcr65cg8EfPkQQIAV0s
+ QDMIeyPVNDl3vJR465UnQRmasFCIAHakaT7FPECB9T3SzzAACYwuDkJj0oODKhZgTjTu
+ llPBm/3NWLAXkR97UMxIKyJ6FAF1YAq9WDjXrkPHCyaAOzA4whk6+5AMW8+P/mvoQ/KZ
+ 9lvvJXIN9KJZ9uGghANgBYkOVNKhwz2ZoB+RHvoRPbco8gc8AJN+Lc8d0Y/oDHpSGRyh
+ dLmDjfmocIkEAGhE0yjGb1EHPtfSbukA/AL6kmlM7vss9CWjA4IFAGAEEkEbK5wSrQOB
+ veks3mi+1uNbs4mdB2gDoDFb+yUVchj3hQIfMECOqLfePkB7PrE3aERDDvITAMrpiAua
+ kh3UAYID9qiEFo3QpHMBgWhpQDTgbdGj0m0+rkEjYoDW0AYQVLsjCA7BHoozOkT5QQOg
+ T2nrBVu1QsPeQ1ZwqQl8q1Z/LFdpDxadOsUXGfDyQzIw7jVKqciXAECHIFOzNz4u89Ls
+ Qb9q8dGAiE8aV0+GndpTIuT6cstmtAXXnkgSe1ZDz2ax6QLhPyjAdNRrlnPxoMP0xZ7V
+ hAUqvdkZfMiV6oDBdAnCzzcJC/aTvuXDXrtaTHG3NiN28F8q+ZGv0LxfqTXafJFE/qXe
+ 7g3HE0AB109vXk9ucga960eDbrP6nHm4c12z6iPd4Do4OL/g0uL0c4l8qdpod2F+AQww
+ +PETDOAWcXxBr9Oql4uZeNhru9J9d4wFzrDQGq6d/kg8XXguV+swxKL148dYwC02m41a
+ 9aWYS8ZCXrv5Uv3NGRZACNAEOcwxsTi8wfuHZDpXeCoWf/4okyKMMclnU4/RsN9tM7Ea
+ 5ffnmPAYKC60rMlqd/sCofA9x8E4mx++OBhlEw76vU6bxaiHWTb/OtgJeaBS61ijyWLF
+ gUYiWHa77cZqvjLotRcK2b/Kj7YRRnrJ5MoLjZYMtWJh/eC5Vnh7MNJKr9OqLxT/Z6YV
+ YoAgwFwzsQw2Uy7Hmv3jOCsi+sc/jIiG28EUvv882+4Dh9O7EwInBE4I0IjAXxMa0M0K
+ ZW5kc3RyZWFtCmVuZG9iago0MiAwIG9iagoyNjI4CmVuZG9iagozNyAwIG9iago8PCAv
+ TGVuZ3RoIDM4IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRo
+ IDI1OCAvSGVpZ2h0IDEyMiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xh
+ dGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
+ CnN0cmVhbQp4Ae1dZ1viQBA2IE2aAQGR3gUMiAgiVXrvoOf//yM3swEUCEXvPpiV/XCg
+ cnkyL++0zezM2dlpnRA4IXBC4ITACYHjEGAYiUQiFcuSSBjmOLmO+xRILz2XyRVKpUoc
+ S6lQyGXnUsl/QoGRnMsUKrVGp79kWYMYFste6rSaC6X8v4DASM8VKo2evTJf39jsDqcI
+ lsNht1ktJuOlVg0g/CMRGKlMcaEzmG4cHn8oEuVisfiPX7EYdxcNB30u+/XVpUb1TxgA
+ /0F+47XTd8slUplsvlAUxSrkc8/pZDwa9NjMrFYlk37XHgABVDqj1RW8e3jKlyq1RrPV
+ FsVqNZv1armYTd1HfA4zq1F8TxWQAGrW4gpyj7lSrdnp9QfD0WgshjUaDQf9brtRKWQe
+ oj67SX8h/wYNGAkQ4Mruv3vMlRud/nA8nc3m8/mrGBbc52w6GQ96rVopkwh7rAa14ssQ
+ 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
+ zNZ+SYUdxn2hwAcMkCPqrf57aM8n9gaNaMhBfgJAOR11QVOygzpAcMAeldCiEZp0LiAQ
+ LQ2IBrwtelS6zcc1aEQM0BraAIJqdwTBIdhDcUaHKD9oAPQpbb1gq1Zo2HvICi41gW/V
+ Gog/V9qDRadO8UUGvPyQDIx7jWIq+iUA0CHI1OyNj3t6afagX7X4aEDEJ42rJ8NOLZ8M
+ u77cshltwbUn+og9q6Fns9h0gfAfFGA66jXLz4mQw/TFntWEBSq92Rm6fy7VAYPpEoSf
+ bxIW7Cd9y4e9drWQ4vw2I3bwXyr5ka/QvF+pNdp80WT2pd7uDccTQAHXT29eT25yBr3r
+ R4Nus1p8ur91XbPqI93gOjg4v+DS4gxwyWyp2mh3YX4BDDD48RMM4BZxfEGv06qXC0+J
+ iNd2pfvuGAucYaE1XDsD0UQ6VyxX6zDEovXjx1jALTabjVr1pfD8GA977eZL9TdnWAAh
+ QBPkMMfE4vCG7u4f08+5fKHw80eZFGCMSTaTeohFAm6bidUovz/HhMdAcaFlTVa72xcM
+ R+44DsbZ/PDFwSibSCjgddosRj3MsvnXwU7IA5VaxxpNFisONBLBstttN1bzlUGvvVDI
+ /lV+tI0w0ksmV15otGSoFQvrB8+1wtuDkVZ6nVZ9ofg/M60QAwQB5pqJZbCZcjnW7B/H
+ WRHRP/5hRDTcDqbw/efZdh84nN6dEDghcEKARgT+AgHb0MwKZW5kc3RyZWFtCmVuZG9i
+ agozOCAwIG9iagoyNjI4CmVuZG9iagozOSAwIG9iago8PCAvTGVuZ3RoIDQwIDAgUiAv
+ VHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI2MiAvSGVpZ2h0IDEy
+ NCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1Bl
+ ckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1dV1si
+ SxB1yDkHiUrOSEayZJCMgO7//yO3qgeUrLj7cKehH2RgF77pM1XnVFd3V9/d3doNgRsC
+ NwRuCNwQ+EsEGIbH4/G50+BuGeYv+7z7dYbHFwhFIrFEyp0mEYuEAv4/QwIhEElkcqVK
+ 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
+ SqVUKmR4DN3f+cKWOeA4E08lxGMJudJEIuG/PJLwEw0GGhz6yJUGd/t567eLGwI3BG4I
+ 3BD4FQL/AZmG5E4KZW5kc3RyZWFtCmVuZG9iago0MCAwIG9iagoyNzcyCmVuZG9iagoy
+ NCAwIG9iago8PCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAwLjY1ID4+CmVuZG9iagoyNSAw
+ IG9iago8PCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAxID4+CmVuZG9iagoyNiAwIG9iago8
+ PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAxID4+CmVuZG9iagoyNyAwIG9iago8PCAvVHlw
+ ZSAvRXh0R1N0YXRlIC9DQSAwLjcgPj4KZW5kb2JqCjI4IDAgb2JqCjw8IC9UeXBlIC9F
+ eHRHU3RhdGUgL2NhIDAuNyA+PgplbmRvYmoKNDMgMCBvYmoKPDwgL0xlbmd0aCA0NCAw
+ IFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUg
+ Pj4Kc3RyZWFtCngB1XlnWBTLs3fPbF52l5zTknPOOYMkiRKVnDNLDiIgIEFBQBEBRUFF
+ RAVRoiRRUMSDiIIKBoJIEBUDgoLyDnrO+d/3ufd+e7+8/Tzb+5uq6uqaqe6eqhoAOFe8
+ o6LCYAYAwiNiafZmhlQXVzcqbgoQAQ+gB7xA0ds3JsrA1tYK/K/t2wSAdpiPZXZ0/a9i
+ /zOD0c8/xhcAyBZh+/jF+IYj+AYAsKFvFC0WANQGQh9NiI1CMPoeglloiIEIfrGDA//g
+ 1R3s8xtj0L9lHO2NAMBwAIAneXvTAgEgCyN0arxvIKKHbAwAlinCLzgCAGYXBOv6Bnn7
+ AcBZjshIh4dH7uA7CBb3+S96Av8L9vb2+Vent3fgv/jPvSAjkYmNg2OiwryTfl/8v+zC
+ w+KQ5/W7MSE9KSJs945v2JDfop+3sSXyz4P8fkWF/fYZIgNx+UfscUBoO1g6wme3zd9Y
+ N4Bmao9gZCxkGxVruIORZwYFRMXaOv5NT0sOMtqNYBJCP+YfY/KPnjMh3hY7PqMg9GZa
+ nP0eBAsjuC8m3sEEwciKgt4kBzk6/y3z1c/f+G86DAcEm5r/kYGZgmPNd+ZiQXwuGBpp
+ uWMDMhesCixBGPAHcYCG9BFABlgBI2D8dy8DAoA3wolHeDEgFLxFcDgyIhIZE4lg6t9y
+ Rv+NYvp7XCAy7v/WSAW+iGzcv3P+mY2KzPmPzmDgh+B/6N7IHDu8HetiPIMz/zPnPxI7
+ +n5bI98gvyS/9Y9NaFG0IloFbYjWQeuiNQAVzYbmAjJoZbQ62gCth9ZCeBrAFLxBNAf+
+ Y+OO/vDmgPjyyCRNpyCEu3PvPv9wgdNv6eB/r/+bBSB4ZKVt5R8LAIj1T0T2AQBGkVFJ
+ tODAoFiqAbJz/aWp5hG+stJURXkFhR32/zdt58z6Y+wX+99nEcT28D+0SORmNHbOmIP/
+ oXl9AKAtBNmmTP+hibYBQK8IwNAJ3zha/B996J0/DHIa0iMrlBPwASEgjjxnRaAKtIA+
+ MAEWwAY4AlfggayfIGQN0kACSAUZIAcUgKPgOKgA1aAWXARXQDNoA13gFhgEw2AUjIMp
+ MA3mwTuwCr6BTQiCcBAZYoY4IX5IBJKCFCF1SBcygawge8gV8oICoQgoDkqFDkIFUAlU
+ AZ2F6qFrUAd0CxqCHkHPoRloCfoM/YBRMAlmgXlhUVgOVocNYEvYEd4HB8LRcDKcBRfC
+ 5XANfBluhW/Bw/A4PA2/g9dQAEWHYkMJoGRQ6igjlA3KDRWAoqHSUPmoMlQN6iqqE3UX
+ 9Rg1jVpBfUdj0cxoKloGWae70HvQvuhodBr6MLoCfRHdir6DfoyeQa+if2HIGB6MFEYT
+ Y45xwQRiEjA5mDLMBUwLZgAzjpnHfMNisWxYMawadhfWFRuCTcEexp7CNmL7sI+wc9g1
+ HA7HiZPC6eBscN64WFwO7iTuMq4XN4abx23g6fD8eEW8Kd4NH4HPxJfhL+F78GP4Bfwm
+ gYEgQtAk2BD8CEmEIsI5QifhIWGesElkJIoRdYiOxBBiBrGceJU4QHxB/EJHRydIp0Fn
+ RxdMl05XTtdEd49uhu47iYkkSTIi7SXFkQpJdaQ+0nPSFzKZLErWJ7uRY8mF5HrybfIr
+ 8gaFmSJLMaf4UQ5QKimtlDHKB3oCvQi9Ab0HfTJ9Gf11+of0KwwEBlEGIwZvhjSGSoYO
+ hqcMa4zMjAqMNozhjIcZLzEOMS4y4ZhEmUyY/JiymGqZbjPNMaOYhZiNmH2ZDzKfYx5g
+ nmfBsoixmLOEsBSwXGEZYVllZWJVZnViTWStZO1mnWZDsYmymbOFsRWxNbNNsP1g52U3
+ YPdnz2O/yj7Gvs7BzaHP4c+Rz9HIMc7xg5PKacIZylnM2cb5kgvNJcllx5XAdZprgGuF
+ m4Vbi9uXO5+7mXuSB+aR5LHnSeGp5XnAs8bLx2vGG8V7kvc27wofG58+XwjfMb4eviV+
+ Zn5d/mD+Y/y9/MtUVqoBNYxaTr1DXRXgEdglECdwVmBEYFNQTHCPYKZgo+BLIaKQulCA
+ 0DGhfqFVYX5ha+FU4QbhSRGCiLpIkMgJkbsi66Jios6ih0TbRBfFOMTMxZLFGsReiJPF
+ 9cSjxWvEn0hgJdQlQiVOSYxKwpIqkkGSlZIPpWApValgqVNSj6Qx0hrSEdI10k9lSDIG
+ MvEyDTIzsmyyVrKZsm2yH+SE5dzkiuXuyv2SV5EPkz8nP6XApGChkKnQqfBZUVLRV7FS
+ 8YkSWclU6YBSu9InZSllf+XTys9UmFWsVQ6p9Kv8VFVTpaleVV1SE1bzUqtSe6rOom6r
+ flj9ngZGw1DjgEaXxndNVc1YzWbNj1oyWqFal7QWtcW0/bXPac/pCOp465zVmdal6nrp
+ ntGd1hPQ89ar0ZvVF9L307+gv2AgYRBicNngg6G8Ic2wxXDdSNNov1GfMcrYzDjfeMSE
+ yWSPSYXJK1NB00DTBtNVMxWzFLO+XZhdlruKdz015zX3Na83X7VQs9hvcceSZOlgWWE5
+ ayVpRbPqtIatLaxLrV/sFtkdsbvNBtiY25TavLQVs422vWmHtbO1q7R7a69gn2p/14HZ
+ wdPhksM3R0PHIsepPeJ74vb0O9E77XWqd1p3NnYucZ52kXPZ7zLsyuUa7NruhnNzcrvg
+ tuZu4n7cfX6vyt6cvRP7xPYl7hvy4PII8+j2pPf09rzuhfFy9rrkteVt413jveZj7lPl
+ s+pr5HvC952fvt8xvyV/Hf8S/4UAnYCSgMVAncDSwKUgvaCyoJVgo+CK4E8hu0KqQ9ZD
+ bULrQrfDnMMaw/HhXuEdEUwRoRF3IvkiEyMfRUlF5URNR2tGH49epVnSLsRAMfti2mNZ
+ kODwQZx4XHbcTLxufGX8RoJTwvVExsSIxAdJkkl5SQvJpsnnU9Apvin9qQKpGakz+w32
+ n02D0nzS+g8IHcg6MJ9uln4xg5gRmvFXpnxmSebXg84HO7N4s9Kz5rLNshtyKDm0nKeH
+ tA5V56Jzg3NH8pTyTub9yvfLv18gX1BWsHXY9/D9IwpHyo9sFwYUjhSpFp0+ij0acXSi
+ WK/4YgljSXLJXKl1aesx6rH8Y1+Pex4fKlMuqz5BPBF3Yrrcqrz9pPDJoye3KoIqxisN
+ KxureKryqtZP+Z0aO61/+mo1b3VB9Y8zwWeenTU721ojWlNWi62Nr317zunc3fPq5+sv
+ cF0ouPCzLqJu+qL9xTv1avX1l3guFTXADXENS5f3Xh69Ynyl/arM1bONbI0FTaAprmn5
+ mte1iWbL5v7r6tev3hC5UdXC3JLfCrUmta62BbVNt7u2P+qw6Ojv1OpsuSl7s65LoKuy
+ m7W7qIfYk9Wz3Zvcu9YX1bdyK/DWXL9n/9Rtl9tP7tjdGRmwHLg3aDp4+67B3d57Ove6
+ hjSHOu6r328bVh1ufaDyoOUvlb9aRlRHWh+qPWwf1RjtfKT9qGdMb+zWY+PHg0/MnwyP
+ 7x5/NLFn4tnTvU+nn/k9W3we9vzTZPzk5lT6C8yL/JcML8te8byqeS3xunFadbp7xnjm
+ wazD7NSc79y7NzFvtuaz3pLfli3wL9QvKi52LZkujS67L8+/i3q3uZLznvF91QfxDzc+
+ 6n98sOqyOv+J9mn78+EvnF/qvip/7V+zXXv1Lfzb5nr+BufGxe/q3+/+cP6xsJmwhdsq
+ /ynxs/OX5a8X2+Hb21HeNO/fsQAK6eGAAAA+1yE5hCuSO4wCQKT8ySl+SyDpCoTIIBiH
+ RAoWSAQwB0ki7+0+mBOOhSdR5qjbaDP0E0w4lhHbj0vF6xJwhJfEDroqUhG5jvKCgYHR
+ kimPeYiVkW0v+2VONJc3dzcvle8w/4aAn+Ck8G6RITE58UKJd1Lm0tUy3+SM5I8ojCqR
+ lQ1VYlSr1PrUpzV+arFrS+lo6Jro2ev7GsQYZhmdMG4w6TV9bLa0a9uC1VLaysjafXew
+ Tbxttl2JfbVDg2MbsuuHncdcnru+dptzX9z7ft+ixwvPEa9e70af075H/JL9AwLsArWC
+ hIMpwd9CXocOhtWHH4mIinSIUovmit6ivYrpi62Ny44PSDBPlEoiJi0nP0hpSi3fn5WW
+ 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
+ egJjIi3pSYpm6tk0ugOJ6QuZLgcfZBvmdOYq57UW6BweKnQtelecVsp4rKZM7kTHSd2K
+ 3irtU63VmDNWZ4/XvD4neT7hwsBF1vqAS52XKVf8rnY1sV6Lah6+IY5kPu/b7TrabvJ1
+ 5XR/6HXuu9Uvdfv4ne3BkLtPhvTvNzxg+ytm5P4o96OgscuPl8eFJpyfZj67+Pz+5PzU
+ 1kuGV/yvpaZVZjRndef03+jP677VXFBbVFiSXBZ8R3m3tNLxPuGDyoeVj+dXXT8RP3V9
+ DvjC8KX96941sFbzzfDb7PqBDZ6Nju97vq/+OLwpttm/5bG18bP0l9yvoW2/Hf/HBCgh
+ dUikQSRDpPz4anv7iyiSVJQA8LN4e3uzZnv7Zy2SbCDfQPrC/nyv2BHGIjX3qms76H9q
+ /we08H6NCmVuZHN0cmVhbQplbmRvYmoKNDQgMCBvYmoKNTk2MwplbmRvYmoKMzYgMCBv
+ YmoKWyAvSUNDQmFzZWQgNDMgMCBSIF0KZW5kb2JqCjQ1IDAgb2JqCjw8IC9MZW5ndGgg
+ NDYgMCBSIC9OIDEgL0FsdGVybmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAGFUk9IFFEc/s02EoSIQYV4iHcKCZUprKyg2nZ1WZVtW5XS
+ ohhn37qjszPTm9k1xZMEXaI8dQ+iY3Ts0KGbl6LArEvXIKkgCDx16PvN7OoohG95O9/7
+ /f1+33tEbZ2m7zspQVRzQ5UrpaduTk2Lgx8pRR3UTlimFfjpYnGMseu5kr+719Zn0tiy
+ 3se1dvv2PbWVZWAh6i22txD6IZFmAB+ZnyhlgLPAHZav2D4BPFgOrBrwI6IDD5q5MNPR
+ nHSlsi2RU+aiKCqvYjtJrvv5uca+i7WJg/5cj2bWjr2z6qrRTNS090ShvA+uRBnPX1T2
+ bDUUpw3jnEhDGinyrtXfK0zHEZErEEoGUjVkuZ9qTp114HUYu126k+P49hClPslgqIm1
+ 6bKZHYV9AHYqy+wQ8AXo8bJiD+eBe2H/W1HDk8AnYT9kh3nWrR/2F65T4HuEPTXgzhSu
+ xfHaih9eLQFD91QjaIxzTcTT1zlzpIjvMdQZmPdGOaYLMXeWqhM3gDthH1mqZgqxXfuu
+ 6iXuewJ30+M70Zs5C1ygHElysRXZFNA8CVgUfYuwSQ48Ps4eVeB3qJjAHLmJ3M0o9x7V
+ ERtno1KBVnqNV8ZP47nxxfhlbBjPgH6sdtd7fP/p4xV117Y+PPmNetw5rr2dG1VhVnFl
+ C93/xzKEj9knOabB06FZWGvYduQPmsxMsAwoxH8FPpf6khNV3NXu7bhFEsxQPixsJbpL
+ VG4p1Oo9g0qsHCvYAHZwksQsWhy4U2u6OXh32CJ6bflNV7Lrhv769nr72vIebcqoKSgT
+ zbNEZpSxW6Pk3Xjb/WaREZ84Or7nvYpayf5JRRA/hTlaKvIUVfRWUNbEb2cOfhu2flw/
+ pef1Qf08CT2tn9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKgioMz1E5UY40D4inx8rRbZJH9
+ D0AZ/WYKZW5kc3RyZWFtCmVuZG9iago0NiAwIG9iago3MDQKZW5kb2JqCjE3IDAgb2Jq
+ ClsgL0lDQ0Jhc2VkIDQ1IDAgUiBdCmVuZG9iago0NyAwIG9iago8PCAvTGVuZ3RoIDQ4
+ IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29k
+ ZSA+PgpzdHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZF
+ kGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+
+ 8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoP
+ gVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1
+ Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGc
+ TvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8Q
+ TSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd
+ 70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9
+ t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01e
+ fJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359s
+ fzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7x
+ kthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkO
+ b/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1S
+ NZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1u
+ HKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9i
+ ago0OCAwIG9iago3MzcKZW5kb2JqCjI5IDAgb2JqClsgL0lDQ0Jhc2VkIDQ3IDAgUiBd
+ CmVuZG9iago0OSAwIG9iago8PCAvTGVuZ3RoIDUwIDAgUiAvTiAzIC9BbHRlcm5hdGUg
+ L0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFVM9rE0EU
+ /jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2h
+ B/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1Ki
+ EWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea
+ 2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINI
+ OJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4
+ jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpk
+ YYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiw
+ 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
+ LRrELM/Km+XtKUoL58bt2VZwM7wvJJVwsupqnOOjQ8E6V+ML3ydfT1g7HlgKBygFuVe5
+ H3xrzsPyZHoXSbgacrMyWXU/Hda7g9b7lXcRoSqygJ376YRW9wOlYQtp8w1db1ner/4O
+ Zyzu/gplbmRzdHJlYW0KZW5kb2JqCjUzIDAgb2JqCjQ4MDUKZW5kb2JqCjUxIDAgb2Jq
+ Cjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNlcyA1NCAwIFIgL0Nv
+ bnRlbnRzIDUyIDAgUiAvTWVkaWFCb3gKWzAgMCA1NzYgNzMzXSA+PgplbmRvYmoKNTQg
+ MCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1h
+ Z2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNyAwIFIKL0NzMSA4IDAgUiA+PiAvRXh0
+ R1N0YXRlIDw8IC9HczUgMjQgMCBSIC9HczMgMjUgMCBSIC9HczEgMjcgMCBSIC9HczIg
+ MjggMCBSCj4+IC9Gb250IDw8IC9GMS4wIDE1IDAgUiAvRjIuMCAxOCAwIFIgPj4gL1hP
+ YmplY3QgPDwgL0ltMyAxMyAwIFIgL0ltNCA1NSAwIFIKL0ltNSA1NyAwIFIgPj4gL1No
+ YWRpbmcgPDwgL1NoNyA1OSAwIFIgL1NoOSA2MSAwIFIgL1NoOCA2MCAwIFIgPj4gPj4K
+ ZW5kb2JqCjU5IDAgb2JqCjw8IC9Db2xvclNwYWNlIDI5IDAgUiAvU2hhZGluZ1R5cGUg
+ MiAvQ29vcmRzIFsgNTkuNSAtMjUuNTg0ODUgNTkuNDk5OTggMjUuNTg0ODcKXSAvRG9t
+ YWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDYyIDAg
+ UiA+PgplbmRvYmoKNjEgMCBvYmoKPDwgL0NvbG9yU3BhY2UgMjkgMCBSIC9TaGFkaW5n
+ VHlwZSAyIC9Db29yZHMgWyA2NC4xNzQxIC0yNy41NzIxNSA2NC4xNzQwOQoyNy41NzIx
+ OCBdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rp
+ b24gNjMgMCBSID4+CmVuZG9iago2MCAwIG9iago8PCAvQ29sb3JTcGFjZSAyOSAwIFIg
+ L1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDY0LjMxNDEyIC0yNS41ODQ4NSA2NC4zMTQx
+ CjI1LjU4NDg4IF0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBd
+ IC9GdW5jdGlvbiA2NCAwIFIgPj4KZW5kb2JqCjU1IDAgb2JqCjw8IC9MZW5ndGggNTYg
+ MCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjc4IC9IZWln
+ aHQgMTIyIC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDM2IDAgUiAvSW50ZW50
+ IC9QZXJjZXB0dWFsIC9TTWFzayA2NSAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0DEBAAAAwqD1T20KP4hAYcCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYOA7MI2DAAEKZW5kc3RyZWFtCmVuZG9i
+ ago1NiAwIG9iago0NjcKZW5kb2JqCjU3IDAgb2JqCjw8IC9MZW5ndGggNTggMCBSIC9U
+ eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjc4IC9IZWlnaHQgMTMw
+ IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDM2IDAgUiAvSW50ZW50IC9QZXJj
+ ZXB0dWFsIC9TTWFzayA2NyAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9G
+ bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0DEBAAAAwqD1T20Hb4hAYcCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ gX9gp5MAAQplbmRzdHJlYW0KZW5kb2JqCjU4IDAgb2JqCjQ5NgplbmRvYmoKNjcgMCBv
+ YmoKPDwgL0xlbmd0aCA2OCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdl
+ IC9XaWR0aCAyNzggL0hlaWdodCAxMzAgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0lu
+ 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
+ oYedTG20+6KZYr3dH0/nS6aJHXSE49zYQA+7xWwy6DRKd/GA06xVSH4Qkt+AApdILjqL
+ 0x/LFqvNTn80nmLDQ+6NObQ7nIwG3VbtIZcIuq161e/7HSIsaC56q8t/m7p7qDZaHWiO
+ 2R9wbfSxNWbrsVa6T8eCbptR89tmh0ebgZ6h0FvW4vAGo8lsvlgqV6s1ro0qtlG9z6Vi
+ oRun1ahRSv+xjyoxFxH0IdaZrA63Lxi+jcUTiSS3RiIRj0UjQb/HaTPr1dCL+NeMcrQV
+ BheJTKnWGcxWaNDsdLo4N5wO+7XVbNRplPI/wgTxgYbvYolMoVRjM2+9gWtDr8dW3iqF
+ DFpW/4mdHG0GgGEav8vk3Buyfdv3v4Vkj40AoMEh4tYg9wz3fvyGLxcXBC4IXBC4IPA/
+ QeA/tQrR4gplbmRzdHJlYW0KZW5kb2JqCjY4IDAgb2JqCjI4NDgKZW5kb2JqCjY1IDAg
+ b2JqCjw8IC9MZW5ndGggNjYgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFn
+ ZSAvV2lkdGggMjc4IC9IZWlnaHQgMTIyIC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9J
+ bnRlcnBvbGF0ZSB0cnVlIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVE
+ ZWNvZGUgPj4Kc3RyZWFtCngB7V1nQypLDGXpRTrSi4CAdKVKb9J7U+///yMvmQUu1Xb9
+ 8HaH+cLqe3p3jycnmWwmEQiu64rAFYErAlcErgj87xFgGKFQKOLkghtnmN8HmBGKxBKp
+ TCZXcHLJZVKpRCwS/iYyAIlEKlfeqDVand7AwaXXaTVqlVIulfwWMAwjEksVKo3eeGux
+ OZwul5tzy+V02m2WW6NOo1JIxb9BGEYkkSk1+lub884fDEdj8UQiybGVSMRjkYeA3+O0
+ mvRqpUws+kdDQkxUWqPV5QvFHtO5QqlcqXJwVcqlQi6djAa9TotRA7j8C18YoViq1Jrs
+ d8FYKleqNlrtTrfX5+DqdTvtVqNazD1FAx4b4CL9ub4AURRqo+0ulMgWa61OfzieTKez
+ OQfXbDqdjIb9TqtazMSDHqtBLZf8kC5CkVSlt7iDiWy52RmMp/PFcrVer1+5t+Cu16vl
+ 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
+ VtDMNRf1mL7WhxJgkWssvgS059x0ouQbKuh9SCvXfOzO/AVRYV0RuGetzQ+wECPCviM8
+ ogs+DbhkbPubj3stmq/2twVpwba/AEuTp72QX9eLCYLyjaa/wBfSYR2aiecbPdJgnUdk
+ Idazmo+7tVwM24l/o282C4vVF8tVO6MZX1pno+2gQwbrGbYrmcjdN0EhbFFoLXfhdLnV
+ n/Ch9zwLCWICROk1i6kH9y1oyofbn13Av7vAgRaaW1cw+VxrD8GMNuMsOOuOCE2QJ/PJ
+ oF3NJQJOk/oHIy1AcmU3Rrsvmi42Ors5H8QhccwjEZqwcz4Ws/GgXS+kwl6bQfV5nL/j
+ yN4FI5IqdWZXIJ4pNdr90WQGM2FwKAzXxsKQW17B5JMZzoSpF9Oxe+ftD2fCADzgiuRq
+ g80TjGeK1SbMDxrBAKEZLG5NEIIbhvFB49Gg125WC+lYwG3R34CkHBy83GPDZ5dk1pTG
+ aPMEok/ZYqXeeul0u70ex8ZNwQ3DqKmXZr1SyCYj926YqaSAWVOfPfwH/x1wgVltRovT
+ G4wmU9nnIgwmq3BsNBnccLlUzGdTiUjgzmE2wPytnxNlgxXM9ZMp1XqT1eHxBUI4xC4O
+ Y+y4tOCGY9Fw6N7ndlhMupvfmu0HM9sUKrXOYDJb7Q4nTDzk2nI6HDar2WTQqmEQ5D/z
+ ZGtaOC4UZmOqYDYmDMfExZn5mORuYTSmVnOjUsikvz80VMwOUuXgJFW5XCYjY1R/7He2
+ /DjzSWbucnLoLhm5+1NPfAaJ67euCFwRuCJwReBXEPgPyd1QdgplbmRzdHJlYW0KZW5k
+ b2JqCjY2IDAgb2JqCjI2NzMKZW5kb2JqCjcwIDAgb2JqCjw8IC9MZW5ndGggNzEgMCBS
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AaVbyZJdtw3d8yu4bFVFV5fT
+ HZaxnKTiVRIplUWchfMiWXa1PHTLTuXvc0ASB3zvvh6USOXq6yMOIA4IAiD7Z/9n/7Of
+ 8besi19T8nfv/N/8D/7V6/vgT/c+1L/3J/9ynoqX/4aG7/2rP727O7376dMv39y6u+8w
+ VIh7HW5Bx5SnLeXNL2GfYtk3f/roX/3xY/Bf/linvdY25zwtJQXX2ia2TaGNGzFumtZ9
+ 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
+ tq1ON/R+OHIUPtkDNxVNQJuvVsS70JxPquQds/mwH9i7RY7tlf5wrpEZtXxE48tUViTA
+ mBFPe5Hl4vcxOgbVkS3FEHRHsFUZHDCZT2ohFVdTrWy3tq7glz3qY7ChP85+xT5c7f24
+ 1jgf5RDromwwElnXMB+oUszmQ6BPDVyLt00tON2mBRtNiiY4T47xtrsSbyfcOOCZE0wb
+ 9+ZBeh8DoQVlsn1FRY7PcBAJPfIIdriJ7if9ozu4h4OygzWMsNezGkwz2Lzj3mdIpW3u
+ ftHQkqHLb8bIYjC0Zy0br+fWNCMuOD4C1CmR2re4lTNSPF3L/xwSnf26A0dBON9m/EYX
+ e/SKOvVjiQIeRFnM9TPY7GWP52gmFVxNwtRQlbsWWnZCj3LRWz8RPZsz748m/wuBvOJ2
+ CmVuZHN0cmVhbQplbmRvYmoKNzEgMCBvYmoKMzk0NgplbmRvYmoKNjkgMCBvYmoKPDwg
+ L1R5cGUgL1BhZ2UgL1BhcmVudCA0IDAgUiAvUmVzb3VyY2VzIDcyIDAgUiAvQ29udGVu
+ dHMgNzAgMCBSIC9NZWRpYUJveApbMCAwIDU3NiA3MzNdID4+CmVuZG9iago3MiAwIG9i
+ ago8PCAvUHJvY1NldCBbIC9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkg
+ XSAvQ29sb3JTcGFjZSA8PCAvQ3MyIDE3IDAgUgovQ3MxIDggMCBSID4+IC9FeHRHU3Rh
+ dGUgPDwgL0dzNSAyNCAwIFIgL0dzMyAyNSAwIFIgL0dzNCAyNiAwIFIgL0dzMSAyNyAw
+ IFIKL0dzMiAyOCAwIFIgPj4gL0ZvbnQgPDwgL0YxLjAgMTUgMCBSIC9GMi4wIDE4IDAg
+ UiA+PiAvWE9iamVjdCA8PCAvSW0zIDEzIDAgUgovSW02IDczIDAgUiAvSW0xIDkgMCBS
+ ID4+IC9TaGFkaW5nIDw8IC9TaDEwIDc1IDAgUiAvU2gxMiA3NyAwIFIgL1NoMTEgNzYg
+ MCBSCj4+ID4+CmVuZG9iago3NSAwIG9iago8PCAvQ29sb3JTcGFjZSAyOSAwIFIgL1No
+ YWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDU5LjUgLTI1LjU4NDg1IDU5LjQ5OTk4IDI1LjU4
+ NDg3Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5j
+ dGlvbiA3OCAwIFIgPj4KZW5kb2JqCjc3IDAgb2JqCjw8IC9Db2xvclNwYWNlIDI5IDAg
+ UiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNjAuNTM4IC0yNi4wMjYyIDYwLjUzNzk4
+ IDI2LjAyNjIyCl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBd
+ IC9GdW5jdGlvbiA3OSAwIFIgPj4KZW5kb2JqCjc2IDAgb2JqCjw8IC9Db2xvclNwYWNl
+ IDI5IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNTkuNSAtMjUuNTg0ODUgNTku
+ NDk5OTggMjUuNTg0ODcKXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZh
+ bHNlIF0gL0Z1bmN0aW9uIDgwIDAgUiA+PgplbmRvYmoKNzMgMCBvYmoKPDwgL0xlbmd0
+ aCA3NCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNjIg
+ L0hlaWdodCAxMjQgL0ludGVycG9sYXRlCnRydWUgL0NvbG9yU3BhY2UgMzYgMCBSIC9J
+ bnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDgxIDAgUiAvQml0c1BlckNvbXBvbmVudAo4
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QAQ0AAADCoPdPbQ8HESgM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYeBgZ8xwABCmVuZHN0cmVhbQplbmRvYmoKNzQgMCBvYmoKNDQ4
+ CmVuZG9iago4MSAwIG9iago8PCAvTGVuZ3RoIDgyIDAgUiAvVHlwZSAvWE9iamVjdCAv
+ U3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI2MiAvSGVpZ2h0IDEyNCAvQ29sb3JTcGFjZQov
+ RGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9G
+ aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1dV1siSxB1yDkHiUrOSEayZJCM
+ gO7//yO3qgeUrLj7cKehH2RgF77pM1XnVFd3V9/d3doNgRsCNwRuCNwQ+EsEGIbH4/G5
+ 0+BuGeYv+7z7dYbHFwhFIrFEyp0mEYuEAv4/QwIhEElkcqVKrdXquNK0GrVKKZeKhYJ/
+ AQRgIJTIlBqd0Wyx2R0OJzeaw2GzWkwGnVohEwvBInZt+8J3gIFIqlDrzbYHjz8Yjsbi
+ 8ScutHg8Fg0HfG6n1aRTySVC/t/AwPCFUoXWaHv0hZ/SuUKpXKlypVXKxedsKh7yPlgM
+ arlY+GtzYHgCsVxjsntCT9lipd5sd7q9Pldar9tpNV7Kz+lYwGU1qGUi4IcLHYH8dzQE
+ lcHmDifzlUa7NxiOJ5PpjCttOhmPhq/dVr2cewq6LHql5FfmwPBFcu39YzCRr7Z6g/F0
+ /rZYLpcrrrTlcrF4m01Gg26jkov7nSYwh8vZAbxBqbd5Y9lKsz+azhfL1fv7+we0P1xo
+ eKNwv6vl23wy7DZK6YjbopNfDANPIFEZnYFksd4dTt8QAq4A8PmQWCRWi/lk0Knl4z67
+ XiG+zBp4Aqna9BjOVFqDCTcx+PMHUUCLABzG/WYpGXAYlBfBgCCYXdFcrTuaLVg74Igr
+ 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
+ IKUNA+kqVPWjwxrgUaIlzIftUsL7o8KGaAxADXpHKAMwsE7BdXtgQZgN2+Wkzwqk8L0/
+ EJ/gY7VPhAG4getBJBoCqgOCkPL/sNInonBHKr8CDJXOcF0ImavkwGIAZT6ng1Yp6bdD
+ ffCfF81HGAzOYKrceiVFscmPcY8n1xiQstiN4pPPdmGRdIBBYbD7E4V6D+pir8shw49y
+ yCbYJ0dqxU+HUCI95rVeCAJxCoUOiuXnqu3XMeCwLhDOMRQIBrNRv1nORFz3WtnFZ4qs
+ D04IpQovHcABjk1YARLrcwNYnP/Hf8mdrlZLKJU/6req+Sc8OkH6s0rQhBo3f8ghGka7
+ N5opvrT7w/F0BidIQINDJP7/DW/0bY7HR/RatUIq7LbCMRq/Ok0ED1RRaM1OXyxdqMJh
+ Iq+D4WgM54lwoY3HcJLIoA9HiVTyqYjXblLD4RE/ixM2VvD5Cl4hVervnd5wIluo1BrN
+ VrvDkdZut5r1Wvk5Ew95HGat4m+OGUJzkKl0ZrvLF44nM7l8oVgslv7/De6ykM+mEzE4
+ Yshm0iqlYAjfjKU/H/2xC4KDUmMw25wujy8QDIU50UKhoN/neXRYTXq1Qvrb84W2AAEc
+ RBK5Uq0zGM33FouVG81iMZuMeu0/OXqMBYMcRCeWyhVKlUrNkaZSKZUKGR5D93e+sGUO
+ OM7EUwnxWEKuNJFI+C+PJPxEg4EGhz5ypcHdft767eKGwA2BGwI3BH6FwH9d1eRKCmVu
+ ZHN0cmVhbQplbmRvYmoKODIgMCBvYmoKMjc3MwplbmRvYmoKNCAwIG9iago8PCAvVHlw
+ ZSAvUGFnZXMgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0gL0NvdW50IDMgL0tpZHMgWyAz
+ IDAgUiA1MSAwIFIgNjkgMCBSCl0gPj4KZW5kb2JqCjgzIDAgb2JqCjw8IC9UeXBlIC9D
+ YXRhbG9nIC9PdXRsaW5lcyAyIDAgUiAvUGFnZXMgNCAwIFIgL1ZlcnNpb24gLzEuNCA+
+ PgplbmRvYmoKODAgMCBvYmoKPDwgL0xlbmd0aCA4NCAwIFIgL09yZGVyIDEgL0VuY29k
+ ZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNv
+ ZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAx
+ IDAgMSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVh
+ bQp4AbXCiVYBUQAA0O8y++pLs0WWyCCSdQahlMqSLUspwhd06uQ4ozHmzbx3zy1t7KVj
+ lY0d+NquGC0qa1V5LR65EmV4iytR9UssIroUi0uxALlQWP5eCAWt+YUA4aeQNzb3KYD9
+ EHIWZj8EvXMhq5fPzsFm5vzuO59B943PvPHXKM7468PTM95wLj37d8qlQV5NOYAT7sra
+ 1ITTPuZSCCbH3M9XzWzyFcYRm9y+HLEwD9lL3Ykha/6ATQCOD9htJj7Q3Wfilsf6jMYe
+ E0NT6jHSC8pdRvpLS106CneHjuq+6NAmt+kL8JE2bWiLjgCnIq394Ral8ZkKo3n+RCH8
+ SJ2rhx4paJtk6NhgkzTzgQyaGnggj78nA5D678n9DdJvKOFvAD+7I1C9Jc60+m4JCOuE
+ z1hvnTAW99a3a7jX7NMarreKn0LtqeK7N7gH3QruqeDugzF3xewy5j7QVcasLmEuw50l
+ DKyCOS10KNi2zaGoyzYH7Cey7W/RdgLyGwqvtaMKZW5kc3RyZWFtCmVuZG9iago4NCAw
+ IG9iagozODQKZW5kb2JqCjc5IDAgb2JqCjw8IC9MZW5ndGggODUgMCBSIC9PcmRlciAx
+ IC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUK
+ OCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsg
+ MCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
+ PgpzdHJlYW0KeAGNwgk3VHEYB+AvJhKJRCKRkpKSkhKJRCIZY8asZgxjZuz7vu9bX+v9
+ vZ3rmNO943/vfZ/z8N8E24zzpXCML01exNhwjC8ko3yhex5l06N8LjnCZ8IRPjN5GmHD
+ YT6VDPOp7kmYTYf4RPA4xMdDskE+NnkUZMMAHwn7+Sj50M+mfXwoeODjA6+4hw9U9z1s
+ OMj7wm7eT95zs1UX713Hnkt914XdAXEndlV3nEjdjx1JB3aubjtgsw/bdrf6oP0j24st
+ 1c1epP6NTeEebPZgw3Y3Nuyud0P7S7YL66prXUj9E2vCnVjrxKrtDqzaXemA9od4O1Zu
+ XG5H6u9YFm7DchuWJFuxZHmxFdpv4i1YNF5ogfpXLEg2Y6EZ85JNmLc814TrXzAn2Yg5
+ 49lGqH/GrPAnzEg2YMbydAOuf8S0cD2mdafqof4BU8LvMSlZh0nzE3X4/x0mhGsxoTte
+ C/W3GBd+g4RwDRKKlKihuP5rigtXU1w3Vk2mX1FM8iWNCVfRmMloFRm+oKhkJUV1RyvJ
+ 9HMalR15RqIVNGIyUkGGTykiXE6R5OFyMl1Gw4LhMgo/ES+lsGqolAwfU0i4hELJQyVk
+ tZiG7AaLKfhIvIiCqoEiMnxIAeFCCiT7C8lqAfnt+grI90A8n3yq3nxKfZ+8knnkverJ
+ I5u55LE7mEvae7I5NKjqzqHUd8ktnE3ubHLZziKX3YEs0t4Rz6SBG52ZlPo2OYUzyJlB
+ /ZLp1G/ZkU7aW+Jp5Ej7B4pzCpwKZW5kc3RyZWFtCmVuZG9iago4NSAwIG9iago1NzIK
+ ZW5kb2JqCjc4IDAgb2JqCjw8IC9MZW5ndGggODYgMCBSIC9PcmRlciAxIC9FbmNvZGUg
+ WyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2Rl
+ IFsgMCAxIDAgMSAwIDEgXSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAw
+ IDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+ eAGlwoVSQlEAQMG/tru7u7HpBhUDA1uxA+tTjjEy+PDFjZ1NfpC0mPjg+7vi+DvF34gL
+ j71h95WY7egrEl+IGkdeUJwjkiOsPZQj9Kw++IzhE0GZgSfsPhKw7X9E9AP+f30PqLzH
+ 99N7j2bPHTrddxje4pa5eovlG1adrtwg9JoVs8vXSL9iOX/pCs2LWXQuZCm8ZEHy/CXm
+ L5gX6LpA6Dkus3PnSD9jLn/2DK2nzOidPuX3CdPyp04wf8yUwMljnB8xaXHiCLmHTPw5
+ foj6DOMZxvSOZvh9wKj8kQNM7jMidngfh3sMWx/aQ+IuQ8aDu6hPM5hmQG9/mu87ivt2
+ KL5Nn/DebRxu0Wu9ZwuJm/QYd2+iOEX3z64UOjtTdG6o79ig+DodwtvXsbtGu+22NUQn
+ afu3NYnKBK35LQl0NidojqtvimMYo0lmYwzLURqdNkQRGqHBbH0ElWHq8+vC6KwNobMm
+ RGGQGsnVQSwHqHZaFUConyqzlX6k+6j8s8KHei/lesu8FHook1zqwbybUoElbr5+Al7l
+ iFUKZW5kc3RyZWFtCmVuZG9iago4NiAwIG9iago0MTAKZW5kb2JqCjY0IDAgb2JqCjw8
+ IC9MZW5ndGggODcgMCBSIC9PcmRlciAxIC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rp
+ b25UeXBlIDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAv
+ RG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUK
+ XSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1wolWAVEAANDvMvvqS7NF
+ lsggknUGoZTKki1LKcIXdOrkOKMx5s28d88tbeylY5WNHfjarhgtKmtVeS0euRJleIsr
+ UfVLLCK6FItLsQC5UFj+XggFrfmFAOGnkDc29ymA/RByFmY/BL1zIauXz87BZub87juf
+ QfeNz7zx1yjO+OvD0zPecC49+3fKpUFeTTmAE+7K2tSE0z7mUggmx9zPV81s8hXGEZvc
+ vhyxMA/ZS92JIWv+gE0Ajg/YbSY+0N1n4pbH+ozGHhNDU+ox0gvKXUb6S0tdOgp3h47q
+ vujQJrfpC/CRNm1oi44ApyKt/eEWpfGZCqN5/kQh/Eidq4ceKWibZOjYYJM084EMmhp4
+ II+/JwOQ+u/J/Q3SbyjhbwA/uyNQvSXOtPpuCQjrhM9Yb50wFvfWt2u41+zTGq63ip9C
+ 7aniuze4B90K7qng7oMxd8XsMuY+0FXGrC5hLsOdJQysgjktdCjYts2hqMs2B+wnsu1v
+ 0XYC8hsKr7WjCmVuZHN0cmVhbQplbmRvYmoKODcgMCBvYmoKMzg0CmVuZG9iago2MyAw
+ IG9iago8PCAvTGVuZ3RoIDg4IDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0g
+ L0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEg
+ MCAxIF0gL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUg
+ WyAxMzY1Cl0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBjcIJN1RxGAfg
+ LyYSiUQikZKSkpISiUQiGWPGrGYMY2bs+77vW1/r/b2d65jTveN/732f8/DfBNuM86Vw
+ jC9NXsTYcIwvJKN8oXseZdOjfC45wmfCET4zeRphw2E+lQzzqe5JmE2H+ETwOMTHQ7JB
+ PjZ5FGTDAB8J+/ko+dDPpn18KHjg4wOvuIcPVPc9bDjI+8Ju3k/ec7NVF+9dx55LfdeF
+ 3QFxJ3ZVd5xI3Y8dSQd2rm47YLMP23a3+qD9I9uLLdXNXqT+jU3hHmz2YMN2NzbsrndD
+ +0u2C+uqa11I/RNrwp1Y68Sq7Q6s2l3pgPaHeDtWblxuR+rvWBZuw3IbliRbsWR5sRXa
+ b+ItWDReaIH6VyxINmOhGfOSTZi3PNeE618wJ9mIOePZRqh/xqzwJ8xINmDG8nQDrn/E
+ tHA9pnWn6qH+AVPC7zEpWYdJ8xN1+P8dJoRrMaE7Xgv1txgXfoOEcA0SipSoobj+a4oL
+ V1NcN1ZNpl9RTPIljQlX0ZjJaBUZvqCoZCVFdUcryfRzGpUdeUaiFTRiMlJBhk8pIlxO
+ keThcjJdRsOC4TIKPxEvpbBqqJQMH1NIuIRCyUMlZLWYhuwGiyn4SLyIgqqBIjJ8SAHh
+ Qgok+wvJagH57foKyPdAPJ98qt58Sn2fvJJ55L3qySObueSxO5hL2nuyOTSo6s6h1HfJ
+ LZxN7mxy2c4il92BLNLeEc+kgRudmZT6NjmFM8iZQf2S6dRv2ZFO2lviaeRI+weKcwqc
+ CmVuZHN0cmVhbQplbmRvYmoKODggMCBvYmoKNTcyCmVuZG9iago2MiAwIG9iago8PCAv
+ TGVuZ3RoIDg5IDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1bmN0aW9u
+ VHlwZSAwIC9CaXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAxIF0gL0Rv
+ bWFpbiBbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAxMzY1Cl0g
+ L0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBtcKJVgFRAADQ7zL76kuzRZbI
+ IJJ1BqGUypItSynCF3Tq5DijMebNvHfPLW3spWOVjR342q4YLSprVXktHrkSZXiLK1H1
+ SywiuhSLS7EAuVBY/l4IBa35hQDhp5A3NvcpgP0QchZmPwS9cyGrl8/OwWbm/O47n0H3
+ jc+88dcozvjrw9Mz3nAuPft3yqVBXk05gBPuytrUhNM+5lIIJsfcz1fNbPIVxhGb3L4c
+ sTAP2UvdiSFr/oBNAI4P2G0mPtDdZ+KWx/qMxh4TQ1PqMdILyl1G+ktLXToKd4eO6r7o
+ 0Ca36QvwkTZtaIuOAKcirf3hFqXxmQqjef5EIfxInauHHilom2To2GCTNPOBDJoaeCCP
+ vycDkPrvyf0N0m8o4W8AP7sjUL0lzrT6bgkI64TPWG+dMBb31rdruNfs0xqut4qfQu2p
+ 4rs3uAfdCu6p4O6DMXfF7DLmPtBVxqwuYS7DnSUMrII5LXQo2LbNoajLNgfsJ7Ltb9F2
+ AvIbCq+1owplbmRzdHJlYW0KZW5kb2JqCjg5IDAgb2JqCjM4NAplbmRvYmoKMzUgMCBv
+ YmoKPDwgL0xlbmd0aCA5MCAwIFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9G
+ dW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAg
+ MSBdIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsg
+ MTM2NQpdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AY3CCTdUcRgH4C8m
+ EolEIpGSkpKSEolEIhljxqxmDGNm7Pu+71tf6/29neuY073jf+99n/Pw3wTbjPOlcIwv
+ TV7E2HCMLySjfKF7HmXTo3wuOcJnwhE+M3kaYcNhPpUM86nuSZhNh/hE8DjEx0OyQT42
+ eRRkwwAfCfv5KPnQz6Z9fCh44OMDr7iHD1T3PWw4yPvCbt5P3nOzVRfvXceeS33Xhd0B
+ cSd2VXecSN2PHUkHdq5uO2CzD9t2t/qg/SPbiy3VzV6k/o1N4R5s9mDDdjc27K53Q/tL
+ tgvrqmtdSP0Ta8KdWOvEqu0OrNpd6YD2h3g7Vm5cbkfq71gWbsNyG5YkW7FkebEV2m/i
+ LVg0XmiB+lcsSDZjoRnzkk2YtzzXhOtfMCfZiDnj2Uaof8as8CfMSDZgxvJ0A65/xLRw
+ PaZ1p+qh/gFTwu8xKVmHSfMTdfj/HSaEazGhO14L9bcYF36DhHANEoqUqKG4/muKC1dT
+ XDdWTaZfUUzyJY0JV9GYyWgVGb6gqGQlRXVHK8n0cxqVHXlGohU0YjJSQYZPKSJcTpHk
+ 4XIyXUbDguEyCj8RL6WwaqiUDB9TSLiEQslDJWS1mIbsBosp+Ei8iIKqgSIyfEgB4UIK
+ JPsLyWoB+e36Csj3QDyffKrefEp9n7ySeeS96skjm7nksTuYS9p7sjk0qOrOodR3yS2c
+ Te5sctnOIpfdgSzS3hHPpIEbnZmU+jY5hTPImUH9kunUb9mRTtpb4mnkSPsHinMKnApl
+ bmRzdHJlYW0KZW5kb2JqCjkwIDAgb2JqCjU3MgplbmRvYmoKMzQgMCBvYmoKPDwgL0xl
+ bmd0aCA5MSAwIFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5
+ cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21h
+ aW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9G
+ aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AY3CCTdUcRgH4C8mEolEIpGSkpKS
+ EolEIhljxqxmDGNm7Pu+71tf6/29neuY073jf+99n/Pw3wTbjPOlcIwvTV7E2HCMLySj
+ fKF7HmXTo3wuOcJnwhE+M3kaYcNhPpUM86nuSZhNh/hE8DjEx0OyQT42eRRkwwAfCfv5
+ KPnQz6Z9fCh44OMDr7iHD1T3PWw4yPvCbt5P3nOzVRfvXceeS33Xhd0BcSd2VXecSN2P
+ HUkHdq5uO2CzD9t2t/qg/SPbiy3VzV6k/o1N4R5s9mDDdjc27K53Q/tLtgvrqmtdSP0T
+ a8KdWOvEqu0OrNpd6YD2h3g7Vm5cbkfq71gWbsNyG5YkW7FkebEV2m/iLVg0XmiB+lcs
+ SDZjoRnzkk2YtzzXhOtfMCfZiDnj2Uaof8as8CfMSDZgxvJ0A65/xLRwPaZ1p+qh/gFT
+ wu8xKVmHSfMTdfj/HSaEazGhO14L9bcYF36DhHANEoqUqKG4/muKC1dTXDdWTaZfUUzy
+ JY0JV9GYyWgVGb6gqGQlRXVHK8n0cxqVHXlGohU0YjJSQYZPKSJcTpHk4XIyXUbDguEy
+ Cj8RL6WwaqiUDB9TSLiEQslDJWS1mIbsBosp+Ei8iIKqgSIyfEgB4UIKJPsLyWoB+e36
+ Csj3QDyffKrefEp9n7ySeeS96skjm7nksTuYS9p7sjk0qOrOodR3yS2cTe5sctnOIpfd
+ gSzS3hHPpIEbnZmU+jY5hTPImUH9kunUb9mRTtpb4mnkSPsHinMKnAplbmRzdHJlYW0K
+ ZW5kb2JqCjkxIDAgb2JqCjU3MgplbmRvYmoKMzMgMCBvYmoKPDwgL0xlbmd0aCA5MiAw
+ IFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0
+ c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEg
+ XSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0Zs
+ YXRlRGVjb2RlID4+CnN0cmVhbQp4AbXCiVYBUQAA0O8y++pLs0WWyCCSdQahlMqSLUsp
+ whd06uQ4ozHmzbx3zy1t7KVjlY0d+NquGC0qa1V5LR65EmV4iytR9UssIroUi0uxALlQ
+ WP5eCAWt+YUA4aeQNzb3KYD9EHIWZj8EvXMhq5fPzsFm5vzuO59B943PvPHXKM7468PT
+ M95wLj37d8qlQV5NOYAT7sra1ITTPuZSCCbH3M9XzWzyFcYRm9y+HLEwD9lL3Ykha/6A
+ TQCOD9htJj7Q3Wfilsf6jMYeE0NT6jHSC8pdRvpLS106CneHjuq+6NAmt+kL8JE2bWiL
+ jgCnIq394Ral8ZkKo3n+RCH8SJ2rhx4paJtk6NhgkzTzgQyaGnggj78nA5D678n9DdJv
+ KOFvAD+7I1C9Jc60+m4JCOuEz1hvnTAW99a3a7jX7NMarreKn0LtqeK7N7gH3QruqeDu
+ gzF3xewy5j7QVcasLmEuw50lDKyCOS10KNi2zaGoyzYH7Cey7W/RdgLyGwqvtaMKZW5k
+ c3RyZWFtCmVuZG9iago5MiAwIG9iagozODQKZW5kb2JqCjMyIDAgb2JqCjw8IC9MZW5n
+ dGggOTMgMCBSIC9PcmRlciAxIC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBl
+ IDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAvRG9tYWlu
+ IFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlwoVSQlEAQMG/tru7u7HpBhUDA1ux
+ A+tTjjEy+PDFjZ1NfpC0mPjg+7vi+DvF34gLj71h95WY7egrEl+IGkdeUJwjkiOsPZQj
+ 9Kw++IzhE0GZgSfsPhKw7X9E9AP+f30PqLzH99N7j2bPHTrddxje4pa5eovlG1adrtwg
+ 9JoVs8vXSL9iOX/pCs2LWXQuZCm8ZEHy/CXmL5gX6LpA6Dkus3PnSD9jLn/2DK2nzOid
+ PuX3CdPyp04wf8yUwMljnB8xaXHiCLmHTPw5foj6DOMZxvSOZvh9wKj8kQNM7jMidngf
+ h3sMWx/aQ+IuQ8aDu6hPM5hmQG9/mu87ivt2KL5Nn/DebRxu0Wu9ZwuJm/QYd2+iOEX3
+ z64UOjtTdG6o79ig+DodwtvXsbtGu+22NUQnafu3NYnKBK35LQl0NidojqtvimMYo0lm
+ YwzLURqdNkQRGqHBbH0ElWHq8+vC6KwNobMmRGGQGsnVQSwHqHZaFUConyqzlX6k+6j8
+ s8KHei/lesu8FHook1zqwbybUoElbr5+Al7liFUKZW5kc3RyZWFtCmVuZG9iago5MyAw
+ IG9iago0MTAKZW5kb2JqCjMxIDAgb2JqCjw8IC9MZW5ndGggOTQgMCBSIC9PcmRlciAx
+ IC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUK
+ OCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsg
+ MCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
+ PgpzdHJlYW0KeAG1wolWAVEAANDvMvvqS7NFlsggknUGoZTKki1LKcIXdOrkOKMx5s28
+ d88tbeylY5WNHfjarhgtKmtVeS0euRJleIsrUfVLLCK6FItLsQC5UFj+XggFrfmFAOGn
+ kDc29ymA/RByFmY/BL1zIauXz87BZub87jufQfeNz7zx1yjO+OvD0zPecC49+3fKpUFe
+ TTmAE+7K2tSE0z7mUggmx9zPV81s8hXGEZvcvhyxMA/ZS92JIWv+gE0Ajg/YbSY+0N1n
+ 4pbH+ozGHhNDU+ox0gvKXUb6S0tdOgp3h47qvujQJrfpC/CRNm1oi44ApyKt/eEWpfGZ
+ CqN5/kQh/Eidq4ceKWibZOjYYJM084EMmhp4II+/JwOQ+u/J/Q3SbyjhbwA/uyNQvSXO
+ tPpuCQjrhM9Yb50wFvfWt2u41+zTGq63ip9C7aniuze4B90K7qng7oMxd8XsMuY+0FXG
+ rC5hLsOdJQysgjktdCjYts2hqMs2B+wnsu1v0XYC8hsKr7WjCmVuZHN0cmVhbQplbmRv
+ YmoKOTQgMCBvYmoKMzg0CmVuZG9iagozMCAwIG9iago8PCAvTGVuZ3RoIDk1IDAgUiAv
+ T3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVy
+ U2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAxIF0gL0RvbWFpbiBbIDAgMSBdIC9S
+ YW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAxMzY1Cl0gL0ZpbHRlciAvRmxhdGVE
+ ZWNvZGUgPj4Kc3RyZWFtCngBpcKFUkJRAEDBv7a7u7ux6QYVAwNbsQPrU44xMvjwxY2d
+ TX6QtJj44Pu74vg7xd+IC4+9YfeVmO3oKxJfiBpHXlCcI5IjrD2UI/SsPviM4RNBmYEn
+ 7D4SsO1/RPQD/n99D6i8x/fTe49mzx063XcY3uKWuXqL5RtWna7cIPSaFbPL10i/Yjl/
+ 6QrNi1l0LmQpvGRB8vwl5i+YF+i6QOg5LrNz50g/Yy5/9gytp8zonT7l9wnT8qdOMH/M
+ lMDJY5wfMWlx4gi5h0z8OX6I+gzjGcb0jmb4fcCo/JEDTO4zInZ4H4d7DFsf2kPiLkPG
+ g7uoTzOYZkBvf5rvO4r7dii+TZ/w3m0cbtFrvWcLiZv0GHdvojhF98+uFDo7U3RuqO/Y
+ oPg6HcLb17G7RrvttjVEJ2n7tzWJygSt+S0JdDYnaI6rb4pjGKNJZmMMy1EanTZEERqh
+ wWx9BJVh6vPrwuisDaGzJkRhkBrJ1UEsB6h2WhVAqJ8qs5V+pPuo/LPCh3ov5XrLvBR6
+ KJNc6sG8m1KBJW6+fgJe5YhVCmVuZHN0cmVhbQplbmRvYmoKOTUgMCBvYmoKNDEwCmVu
+ ZG9iagoyIDAgb2JqCjw8IC9MYXN0IDk2IDAgUiAvRmlyc3QgOTcgMCBSID4+CmVuZG9i
+ ago5NyAwIG9iago8PCAvUGFyZW50IDk4IDAgUiAvVGl0bGUgKENhbnZhcyAxKSAvQ291
+ bnQgMCAvRGVzdCBbIDMgMCBSIC9YWVogMCA3MzMgMCBdCi9OZXh0IDk5IDAgUiA+Pgpl
+ bmRvYmoKOTkgMCBvYmoKPDwgL1BhcmVudCAxMDAgMCBSIC9QcmV2IDEwMSAwIFIgL0Nv
+ dW50IDAgL1RpdGxlIChDYW52YXMgMykgL0Rlc3QgWyA1MSAwIFIKL1hZWiAwIDczMyAw
+ IF0gL05leHQgMTAyIDAgUiA+PgplbmRvYmoKMTAyIDAgb2JqCjw8IC9QYXJlbnQgMTAz
+ IDAgUiAvUHJldiAxMDQgMCBSIC9Db3VudCAwIC9EZXN0IFsgNjkgMCBSIC9YWVogMCA3
+ MzMgMCBdIC9UaXRsZQooQ2FudmFzIDIpID4+CmVuZG9iagoxMDQgMCBvYmoKPDwgL1Bh
+ cmVudCAxMDAgMCBSID4+CmVuZG9iagoxMDMgMCBvYmoKPDwgPj4KZW5kb2JqCjEwMSAw
+ IG9iago8PCAvUGFyZW50IDk4IDAgUiA+PgplbmRvYmoKMTAwIDAgb2JqCjw8ID4+CmVu
+ ZG9iago5OCAwIG9iago8PCA+PgplbmRvYmoKOTYgMCBvYmoKPDwgL1BhcmVudCAxMDMg
+ MCBSIC9QcmV2IDEwNCAwIFIgL0NvdW50IDAgL0Rlc3QgWyA2OSAwIFIgL1hZWiAwIDcz
+ MyAwIF0gL1RpdGxlCihDYW52YXMgMikgPj4KZW5kb2JqCjEwNSAwIG9iago8PCAvTGVu
+ Z3RoIDEwNiAwIFIgL0xlbmd0aDEgMTQwNTIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngBvXt7fFTF9fjMfe/7/X5ns7vZvB/kRQJZQhISIBGIQoIEEyAQEGqAEMQK
+ 34gggogC8hBQwQdPNUuIsoD4pRRE/NqKVlGpWq1oqTXV9of2W2F3v2fuhhjya/vxj356
+ N2dmzszcuWfOnDnnzLk3HYuWtCIF6kI0mjC1pX02Eq+8KwhR12cuaGlP4LrxkL85s7PD
+ ncDZFITo+bPb5yxI4MJjCEkdc+Yv679f34aQ8+u21pZZiXZ0HfKCNqhI4HgY5MltCzru
+ TuDaXsi3z79rZn+73gx43YKWu/ufjz4C3P2zlgWtif55ZyBPbr9rcUc/fivk7e2LWvv7
+ 4wag7y2EodaP7kISdCfiEYXU8GtCiL8idSAGWkk7XLPSZZvvUJV+hzSCiN9R+4iYv+Z5
+ 5eL/tl4PyDYKf4cKyY3+JOeCsSBCcgztfbKNAy3ifZD4I6g+LYJqAMoA8gHS0kaZURfe
+ ix4F2A1Ao7n4IbQMYC3A4wDMQOkAYMfwQz2MEDqOlyErHhuSMa5b9RaXWSpzvRPBXO+T
+ rg/Nn5/AFli9z7ClR4Eko6R4N34KzUIu/Bzy4XtQNUrBO44E57uaoekAagfoAqDFFOMD
+ Pc5c16s4HfkYDPf4kZPBL7v+kJPh+iInQuEe1+lAhIHsF07AQirXKceTrv92zHG9CnAo
+ 0XQwCD1edh1wzHdtdkbwjh7XJkcEwz0bE9kSB9z6smtBcKtrVo7YPn5rhDrU4yqG9skh
+ maugyOPKd1x2ZQUiAgY8wzHelZrzK1cy3Ajd3DCoL6Rx2R2bXcOhyemoDAwHOIEP4p0o
+ Fe/s8Y11HYciTPdITbBoawT//Eh1So4vgu8JFVSnbA1WB3zB8S5fsCoQgPLk1/lV/O38
+ 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
+ Obj/jCH4zCH4rCG4KI+D+Dt7SPucIXjbEHzuEHz+EFz8f7BB4/9sSPtdQ/D2IfiiIfji
+ IXjHEHzJEJx8aTKYP8sI/n8a+VX4CmVuZHN0cmVhbQplbmRvYmoKMTA2IDAgb2JqCjkz
+ OTgKZW5kb2JqCjEwNyAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2Vu
+ dCA3NzAgL0NhcEhlaWdodCA3MTcgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRC
+ Qm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL01FWkFYUytIZWx2ZXRp
+ Y2EgL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQg
+ NjM3IC9Gb250RmlsZTIgMTA1IDAgUiA+PgplbmRvYmoKMTA4IDAgb2JqClsgMjc4IDAg
+ MCAwIDAgMCAwIDAgMzMzIDMzMyAwIDAgMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDU1NgowIDY2NyA2NjcgNzIyIDcyMiAwIDAgMCAwIDI3OCAwIDAg
+ NTU2IDAgNzIyIDAgMCAwIDcyMiA2NjcgNjExIDcyMiAwIDAgMCA2NjcKMCAwIDAgMCAw
+ IDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAwIDAgMjIyIDgz
+ MyA1NTYgNTU2IDU1NgowIDMzMyA1MDAgMjc4IDU1NiA1MDAgMCAwIDUwMCBdCmVuZG9i
+ agoxNSAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VG
+ b250IC9NRVpBWFMrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgoxMDcgMCBSIC9XaWR0
+ aHMgMTA4IDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMjEgL0VuY29kaW5nIC9N
+ YWNSb21hbkVuY29kaW5nCj4+CmVuZG9iagoxMDkgMCBvYmoKPDwgL0xlbmd0aCAxMTAg
+ MCBSIC9MZW5ndGgxIDEwMjM2IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+ 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
+ kvqdGaO6bQg2R4/LmFNvQj4Hk4v9X7ofK+iWTFnzkvvNvhU/C+DnRekM5zRPWdf2RVsB
+ +Ziril7VXTBzlbiQmXHuuZ18sbHc/0TPIebONMTOjnZiNn4XF+BX4nSf0CbMFx4SfoPf
+ 4QSiY+qw6DpmJbuaE+rIZujnt/OP8E/xR9kPyVmiYp0c5zPwvMA48fRqwC4Ehsd/dRFY
+ Rq1k0GZFiHaQxUMx0R7gbIpeirdt1TTdsLU5Ggzin033B6tsXMrLDUG+Pz93na5xRsd1
+ nUf6862j8bjzhDsumkviMrJeUiytxiP2GiK+x1Wde46rOn8S54H3OoIL56GFIP2PHYgA
+ XxABJRIgsUjqgqdRLnhDg2r8NFrvCzHtSKywiLhS6BgaeSCmn7ge3kuypSPSW489Lr0h
+ /Rcp3ouDfcrqzz3H2s9/gPEv4muR/kKMfpH+V48NM1n5XscLmfgtvwy/rddALX7Hrsd/
+ EWnE7/3T8Yt2K34jnwWz8SaqE+ZgC4IeNZG7E/CsBLVNHVWNDbn1vYtX9a5cOC+UV3XV
+ 4vm01oVnMUauRaL/T7UDaQ8SdXmPIr2BdBrpa2ygRLIiZSGVIdUjdSD1IV2LtBlpB9Ie
+ pAjSUaQ3kE7HRh7sB0bjBJxj0llj0vi/VpfUrxqTls3ZRf3NHFPePiYdGpOeOyY9b0wa
+ QbpkfFlGF4135ZjyvjHphWPSFOeL5790TPqqMekVY9JXj0nL/wd3ET/XjClfNSa9mqb/
+ BxUD7IcKZW5kc3RyZWFtCmVuZG9iagoxMTAgMCBvYmoKNjYzNgplbmRvYmoKMTExIDAg
+ b2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0
+ IDcyMCAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy0xMDE4IC00ODEg
+ MTQzNiAxMTU5XSAvRm9udE5hbWUgL0ZMWEJLSStIZWx2ZXRpY2EtQm9sZCAvSXRhbGlj
+ QW5nbGUKMCAvU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2NDQgL0ZvbnRG
+ aWxlMiAxMDkgMCBSID4+CmVuZG9iagoxMTIgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAg
+ MCAzMzMgMzMzIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMAowIDcyMiA3MjIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNjY3IDAg
+ NzIyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYKNjExIDU1NiA2MTEgNTU2IDAgNjEx
+ IDYxMSAyNzggMCAwIDI3OCAwIDYxMSA2MTEgMCAwIDM4OSA1NTYgMzMzIDYxMSA1NTYg
+ Nzc4Cl0KZW5kb2JqCjE4IDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVl
+ VHlwZSAvQmFzZUZvbnQgL0ZMWEJLSStIZWx2ZXRpY2EtQm9sZCAvRm9udERlc2NyaXB0
+ b3IKMTExIDAgUiAvV2lkdGhzIDExMiAwIFIgL0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIg
+ MTE5IC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKMTEzIDAgb2Jq
+ CihVbnRpdGxlZCkKZW5kb2JqCjExNCAwIG9iagooTWFjIE9TIFggMTAuNi44IFF1YXJ0
+ eiBQREZDb250ZXh0KQplbmRvYmoKMTE1IDAgb2JqCihTY290dCBNYWluKQplbmRvYmoK
+ MTE2IDAgb2JqCihPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwpCmVuZG9iagoxMTcgMCBv
+ YmoKKEQ6MjAxMTEyMjkxODAyNDFaMDAnMDAnKQplbmRvYmoKMSAwIG9iago8PCAvVGl0
+ bGUgMTEzIDAgUiAvQXV0aG9yIDExNSAwIFIgL1Byb2R1Y2VyIDExNCAwIFIgL0NyZWF0
+ b3IgMTE2IDAgUiAvQ3JlYXRpb25EYXRlCjExNyAwIFIgL01vZERhdGUgMTE3IDAgUiA+
+ PgplbmRvYmoKeHJlZgowIDExOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwNzYwMjYg
+ MDAwMDAgbiAKMDAwMDA1NzU4NCAwMDAwMCBuIAowMDAwMDA2MTg1IDAwMDAwIG4gCjAw
+ MDAwNDkxNDkgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDA2MTY1IDAw
+ MDAwIG4gCjAwMDAwMDYyODkgMDAwMDAgbiAKMDAwMDAyNzI4NiAwMDAwMCBuIAowMDAw
+ MDA4OTY3IDAwMDAwIG4gCjAwMDAwMDk2MjEgMDAwMDAgbiAKMDAwMDAwODI3OCAwMDAw
+ MCBuIAowMDAwMDA4OTQ3IDAwMDAwIG4gCjAwMDAwMDc2MDMgMDAwMDAgbiAKMDAwMDAw
+ ODI1OCAwMDAwMCBuIAowMDAwMDY4MjQwIDAwMDAwIG4gCjAwMDAwMDY5NjcgMDAwMDAg
+ biAKMDAwMDAyNTQ5MiAwMDAwMCBuIAowMDAwMDc1NjQ2IDAwMDAwIG4gCjAwMDAwMDY2
+ NTEgMDAwMDAgbiAKMDAwMDAwNjgwOSAwMDAwMCBuIAowMDAwMDA3NDQxIDAwMDAwIG4g
+ CjAwMDAwMDcxMjUgMDAwMDAgbiAKMDAwMDAwNzI4MyAwMDAwMCBuIAowMDAwMDE4MzA4
+ IDAwMDAwIG4gCjAwMDAwMTgzNTYgMDAwMDAgbiAKMDAwMDAxODQwMSAwMDAwMCBuIAow
+ MDAwMDE4NDQ2IDAwMDAwIG4gCjAwMDAwMTg0OTMgMDAwMDAgbiAKMDAwMDAyNjM4OSAw
+ MDAwMCBuIAowMDAwMDU2OTM5IDAwMDAwIG4gCjAwMDAwNTYzMjAgMDAwMDAgbiAKMDAw
+ MDA1NTY3NSAwMDAwMCBuIAowMDAwMDU1MDU2IDAwMDAwIG4gCjAwMDAwNTQyNDkgMDAw
+ MDAgbiAKMDAwMDA1MzQ0MiAwMDAwMCBuIAowMDAwMDI0NjI3IDAwMDAwIG4gCjAwMDAw
+ MTI0ODIgMDAwMDAgbiAKMDAwMDAxNTMwMiAwMDAwMCBuIAowMDAwMDE1MzIzIDAwMDAw
+ IG4gCjAwMDAwMTgyODcgMDAwMDAgbiAKMDAwMDAwOTY0MSAwMDAwMCBuIAowMDAwMDEy
+ NDYxIDAwMDAwIG4gCjAwMDAwMTg1NDAgMDAwMDAgbiAKMDAwMDAyNDYwNiAwMDAwMCBu
+ IAowMDAwMDI0NjY0IDAwMDAwIG4gCjAwMDAwMjU0NzIgMDAwMDAgbiAKMDAwMDAyNTUy
+ OSAwMDAwMCBuIAowMDAwMDI2MzY5IDAwMDAwIG4gCjAwMDAwMjY0MjYgMDAwMDAgbiAK
+ MDAwMDAyNzI2NiAwMDAwMCBuIAowMDAwMDMyMjI0IDAwMDAwIG4gCjAwMDAwMjczMjIg
+ MDAwMDAgbiAKMDAwMDAzMjIwMyAwMDAwMCBuIAowMDAwMDMyMzMxIDAwMDAwIG4gCjAw
+ MDAwMzMxMjcgMDAwMDAgbiAKMDAwMDAzMzgxNSAwMDAwMCBuIAowMDAwMDMzODM1IDAw
+ MDAwIG4gCjAwMDAwMzQ1NTIgMDAwMDAgbiAKMDAwMDAzMjY0NyAwMDAwMCBuIAowMDAw
+ MDMyOTY2IDAwMDAwIG4gCjAwMDAwMzI4MDUgMDAwMDAgbiAKMDAwMDA1MjgyMyAwMDAw
+ MCBuIAowMDAwMDUyMDE2IDAwMDAwIG4gCjAwMDAwNTEzOTcgMDAwMDAgbiAKMDAwMDAz
+ NzYzMyAwMDAwMCBuIAowMDAwMDQwNDk4IDAwMDAwIG4gCjAwMDAwMzQ1NzIgMDAwMDAg
+ biAKMDAwMDAzNzYxMiAwMDAwMCBuIAowMDAwMDQ0NTYyIDAwMDAwIG4gCjAwMDAwNDA1
+ MTkgMDAwMDAgbiAKMDAwMDA0NDU0MSAwMDAwMCBuIAowMDAwMDQ0NjY5IDAwMDAwIG4g
+ CjAwMDAwNDU0NzQgMDAwMDAgbiAKMDAwMDA0NjE0MyAwMDAwMCBuIAowMDAwMDQ0OTk5
+ IDAwMDAwIG4gCjAwMDAwNDUzMTYgMDAwMDAgbiAKMDAwMDA0NTE1NyAwMDAwMCBuIAow
+ MDAwMDUwNzUyIDAwMDAwIG4gCjAwMDAwNDk5NDUgMDAwMDAgbiAKMDAwMDA0OTMyNiAw
+ MDAwMCBuIAowMDAwMDQ2MTYzIDAwMDAwIG4gCjAwMDAwNDkxMjggMDAwMDAgbiAKMDAw
+ MDA0OTI0NiAwMDAwMCBuIAowMDAwMDQ5OTI1IDAwMDAwIG4gCjAwMDAwNTA3MzIgMDAw
+ MDAgbiAKMDAwMDA1MTM3NyAwMDAwMCBuIAowMDAwMDUxOTk2IDAwMDAwIG4gCjAwMDAw
+ NTI4MDMgMDAwMDAgbiAKMDAwMDA1MzQyMiAwMDAwMCBuIAowMDAwMDU0MjI5IDAwMDAw
+ IG4gCjAwMDAwNTUwMzYgMDAwMDAgbiAKMDAwMDA1NTY1NSAwMDAwMCBuIAowMDAwMDU2
+ MzAwIDAwMDAwIG4gCjAwMDAwNTY5MTkgMDAwMDAgbiAKMDAwMDA1NzU2NCAwMDAwMCBu
+ IAowMDAwMDU4MTE2IDAwMDAwIG4gCjAwMDAwNTc2MzIgMDAwMDAgbiAKMDAwMDA1ODA5
+ NCAwMDAwMCBuIAowMDAwMDU3NzM4IDAwMDAwIG4gCjAwMDAwNTgwNzEgMDAwMDAgbiAK
+ MDAwMDA1ODAzMyAwMDAwMCBuIAowMDAwMDU3ODYxIDAwMDAwIG4gCjAwMDAwNTgwMTAg
+ MDAwMDAgbiAKMDAwMDA1Nzk3MSAwMDAwMCBuIAowMDAwMDU4MjI1IDAwMDAwIG4gCjAw
+ MDAwNjc3MTYgMDAwMDAgbiAKMDAwMDA2NzczOCAwMDAwMCBuIAowMDAwMDY3OTY1IDAw
+ MDAwIG4gCjAwMDAwNjg0MTcgMDAwMDAgbiAKMDAwMDA3NTE0NiAwMDAwMCBuIAowMDAw
+ MDc1MTY4IDAwMDAwIG4gCjAwMDAwNzU0MDEgMDAwMDAgbiAKMDAwMDA3NTgyOCAwMDAw
+ MCBuIAowMDAwMDc1ODU2IDAwMDAwIG4gCjAwMDAwNzU5MDkgMDAwMDAgbiAKMDAwMDA3
+ NTkzOSAwMDAwMCBuIAowMDAwMDc1OTgzIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUg
+ MTE4IC9Sb290IDgzIDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8NTQzYjhmY2IxYjc2NDM2
+ MzNmMDJhYTcxZDQyOWU2ODY+Cjw1NDNiOGZjYjFiNzY0MzYzM2YwMmFhNzFkNDI5ZTY4
+ Nj4gXSA+PgpzdGFydHhyZWYKNzYxNTIKJSVFT0YKMyAwIG9iago8PC9UeXBlIC9QYWdl
+ IC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3ggWzAgMCA1NzYgNzMzXSAvUGFyZW50IDQg
+ MCBSIC9SZXNvdXJjZXMgNyAwIFIgPj4KZW5kb2JqCjUxIDAgb2JqCjw8L1R5cGUgL1Bh
+ Z2UgL0NvbnRlbnRzIDUyIDAgUiAvTWVkaWFCb3ggWzAgMCA1NzYgNzMzXSAvUGFyZW50
+ IDQgMCBSIC9SZXNvdXJjZXMgNTQgMCBSID4+CmVuZG9iago2OSAwIG9iago8PC9UeXBl
+ IC9QYWdlIC9Db250ZW50cyA3MCAwIFIgL01lZGlhQm94IFswIDAgNTc2IDczM10gL1Bh
+ cmVudCA0IDAgUiAvUmVzb3VyY2VzIDcyIDAgUiA+PgplbmRvYmoKMSAwIG9iago8PC9B
+ dXRob3IgKFNjb3R0IE1haW4pL0NyZWF0aW9uRGF0ZSAoRDoyMDEwMTAwNTIyNDAwMFop
+ L0NyZWF0b3IgKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25hbCA1LjIpL01vZERhdGUgKEQ6
+ MjAxMTEyMjkxODAyMDBaKS9Qcm9kdWNlciAxMTQgMCBSIC9UaXRsZSAoc2VydmljZV9s
+ aWZlY3ljbGUpPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwNzg5ODcgMDAwMDAgbiAKMyAx
+ CjAwMDAwNzg2NzIgMDAwMDAgbiAKNTEgMQowMDAwMDc4Nzc1IDAwMDAwIG4gCjY5IDEK
+ MDAwMDA3ODg4MSAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8NTQzYjhmY2IxYjc2NDM2
+ MzNmMDJhYTcxZDQyOWU2ODY+IDw1NDNiOGZjYjFiNzY0MzYzM2YwMmFhNzFkNDI5ZTY4
+ Nj5dIC9JbmZvIDEgMCBSIC9QcmV2IDc2MTUyIC9Sb290IDgzIDAgUiAvU2l6ZSAxMTg+
+ PgpzdGFydHhyZWYKNzkxNzEKJSVFT0YK
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ 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
+ cHQAAATIAAAAFHJYWVoAAATcAAAAFGdYWVoAAATwAAAAFGJYWVoAAAUEAAAAFHJUUkMA
+ AAUYAAAIDGFhcmcAAA0kAAAAIHZjZ3QAAA1EAAAGEm5kaW4AABNYAAAGPmNoYWQAABmY
+ AAAALG1tb2QAABnEAAAAKGJUUkMAAAUYAAAIDGdUUkMAAAUYAAAIDGFhYmcAAA0kAAAA
+ IGFhZ2cAAA0kAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAABtbHVjAAAAAAAAABIAAAAMbmxOTAAAABYAAADoZGFESwAAABwAAAD+
+ cGxQTAAAABIAAAEaZW5VUwAAABIAAAEsbmJOTwAAABIAAAE+ZnJGUgAAABYAAAFQcHRC
+ UgAAABgAAAFmcHRQVAAAABYAAAF+emhDTgAAAAwAAAGUZXNFUwAAABIAAAGgamFKUAAA
+ AA4AAAGycnVSVQAAACQAAAHAc3ZTRQAAABAAAAHkemhUVwAAAA4AAAH0ZGVERQAAABAA
+ AAICZmlGSQAAABAAAAISaXRJVAAAABQAAAIia29LUgAAAAwAAAI2AEsAbABlAHUAcgBl
+ AG4ALQBMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG0ASwBvAGwAbwByACAA
+ TABDAEQAQwBvAGwAbwByACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABj
+ AG8AdQBsAGUAdQByAEwAQwBEACAAQwBvAGwAbwByAGkAZABvAEwAQwBEACAAYQAgAEMA
+ bwByAGUAc19pgnIAIABMAEMARABMAEMARAAgAGMAbwBsAG8AcjCrMOkw/AAgAEwAQwBE
+ BCYEMgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5AEYA5AByAGcALQBMAEMA
+ RF9pgnJtsmZ2mG95OlZoAEYAYQByAGIALQBMAEMARABWAOQAcgBpAC0ATABDAEQATABD
+ AEQAIABjAG8AbABvAHIAac7st+wAIABMAEMARAAAdGV4dAAAAABDb3B5cmlnaHQgQXBw
+ bGUsIEluYy4sIDIwMTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUgABAAAA
+ ARbPWFlaIAAAAAAAAG8xAAA5YwAAAYNYWVogAAAAAAAAYO4AALdqAAAIElhZWiAAAAAA
+ AAAmtwAADzIAAMmXY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsA
+ QABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8
+ AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwB
+ UgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIU
+ Ah0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsD
+ FgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRI
+ BFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUF
+ xQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0
+ B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJ
+ eQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuw
+ C8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4O
+ SQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RET
+ ETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcU
+ SRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu
+ F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2Mb
+ ihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+U
+ H78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/Ak
+ HyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijU
+ KQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu
+ Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/
+ M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5
+ fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+i
+ P+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJG
+ Z0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1K
+ TZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U
+ 21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyG
+ XNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk
+ 6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1g
+ bbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52
+ m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/l
+ gEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ
+ /opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQg
+ lIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6f
+ HZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaoc
+ qo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2
+ AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hj
+ wl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO
+ ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA
+ 3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp
+ RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb7
+ 94r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADy
+ pwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAAADAQAAAgAAAAcAHgBKAIsA4wEqAW4BwAIZ
+ AnQC2gNJA8MERwTUBW0GEQbCB3wIPgkHCd0KuQucDI8Npw7cEBARSxKJE8kVERZcF6wZ
+ BBphG70dIB6MH/ghZCLaJE4lyScvKI4p6ytJLJ8t9i9DMI0x0DMNNEI1czacN8A44Dn9
+ Oxc8Kz05PkU/UkBjQXNChEOXRKtFv0bTR+lI/0oVSyxMQ01bTmlPdlCFUZJSn1OrVLdV
+ wlbLV9JY2VnfWuNb6FztXehe3F/OYL9hr2KeY41kemVmZlFnO2gkaQ5p9mrfa8ZsqW2N
+ bnBvU3A3cRpx/HLec8B0o3WFdmZ3SXgreQp56nrMe7B8mH2Efnd/cYBygXqCioOhhL2F
+ 34cJiDyJcIqji9aNCo48j22QnpHOkv2ULJVbloqXtpjgmgubNZxfnYmesp/boQSiLaNW
+ pH+lqKbRp/ipIKpMq3yssq3xrzqwj7Hvs1u0z7ZPt9S5PLp0u6m83L4LvzPAVsFxwoXD
+ kcSWxZbGkceIyIPJh8qNy43Mhc10zlfPLs/70MDRe9I20vbT19S51ZrWfddf2ELZJdoJ
+ 2u3b0dy13Zrefd9g4EThKeIQ4vnj5uTW5cnmwee76Lnpueql647sdu1e7kXvK/AQ8PXx
+ 2vK+86H0hfVo9kv3L/gT+Pf53PrA+6L8hP1l/kT/Iv//AAAABgAaAEAAeADFARMBTAGQ
+ Ad8CMwKOAvMDXwPWBFUE3QVwBg4GtwdlCBoI2gmcCmcLQgw9DVQOaA+AEKARwRLpFBUV
+ RBZ5F68Y7xouG3IcvB4LH1YgqiH/I0EkgSW/JvwoNylqKp0ryyzyLhUvMzBIMVsyZzNx
+ NHk1fTZ6N2o4WzlMOj07MDwiPRU+CD76P+1A4UHVQspDvkSzRadGmEeISHdJaEpZS0hM
+ OE0nThVPBE/0UOJR0VLAU7BUnlWIVnNXXlhJWTNaHVsGW+5c1l29XqNfimBvYVRiNGMM
+ Y+JkuWWPZmZnPGgRaOZpu2qRa2VsOm0PbeNut2+IcFlxK3H8cs5zoHRydUN2FXbnd7l4
+ jHleejB7AnvXfK99i35tf1WARIE6gjmDPYRIhViGboeHiKWJw4rhi/6NHI45j1aQc5GQ
+ kqyTyZTmlgKXHJg2mVGabZuLnKyd0J72oCKhUKKDo7mk8aYup3GotKn3qzmsfK2+rwCw
+ QbGDssW0BbVHtoi3x7kHukW7gry9vfS/JsBTwXvCnsO7xNXF6cb3yATJE8ohyy/MPc1M
+ zlrPaNB30YbSldOi1K/VvNbJ19bY5dn02wPcFN0l3jjfTOBn4aPi6eQn5Vrmhueq6Mfp
+ 4er47A7tJe4/71vwgPHQ8zP0k/Xz91L4tPoY+4X8+P53//8AAAAEABEAKgBOAIAAwAEH
+ AToBdAG3AgICTQKgAvsDXgPKBDwEtgU4BcIGUAbjB3sIGwjHCY0KYws8DBsM/g3iDssP
+ tRClEZgSjhOIFIUVhhaLF5MYnxmrGrgbvRy9Hb4evx++ILshtSKrI50kiyV1JlwnQCgi
+ KQAp2yq3K4ssVi0gLeoutS+AMEsxFjHhMqszdTQ/NQk10zadN2g4NDj4Ob46hTtLPBI8
+ 2j2iPmo/Mj/8QMZBkUJdQypD90TDRY9GW0cnR/JIvkmKSlZLIUvrTLZNgE5MTxZP4VCr
+ UXNSO1MCU8pUklVaViBW51euWHVZO1oCWslbj1xTXRZd2V6bX11gHWDdYZ1iXWMcY9pk
+ mGVWZhNmz2eLaEVpAGm7anZrMWvsbKdtYm4cbtdvk3BOcQhxwXJ6czNz7HSldV52F3bP
+ d4d4P3j4ebB6aXsge9l8lH1Ufhl+5X+4gJSBeYJmg1yEWYVbhmWHdYiFiZaKpou2jMaN
+ 1Y7lj/SRA5ITkyKUMJU6lkOXSphRmVmaYptvnH+dk56sn8ug76Ilo3mk0KYnp36o1qot
+ q4Ss264xr4iw3rI2s4u037Yzt4e43Lozu4q84r48v5jA9sJUw7XFJ8akyC3JxctrzSTO
+ 7NDH0rHUqdaw2MHa3d0A3zDhp+SG54rqt+4P8Yj1GPi1/Ff//wAAbmRpbgAAAAAAAAY2
+ AACl4wAAVqEAAFFbAACnKwAAJZsAAA4UAABQDQAAVDkAAkKPAAHZmQABR64AAwEAAAIA
+ AAANACcARgBmAIcAqADJAOsBDgExAVUBegGdAbwB2wH8Ah0CPwJiAoYCqgLPAvQDGwNB
+ A2gDkAO5A+IECwQ1BGAEjAS4BOQFEgU/BW4FoQXVBgoGQQZ4BrIG7AcoB2cHpwfpCC4I
+ dQi/CQsJWgmsCgEKWAqyCw4LbgvSDDgMoA0IDXIN3g5KDrkPKA+aEA0QgRD3EW8R6BJj
+ Et8TYhPnFG0U9hWBFg4WnRcvF8MYWxj1GZEaMRrTG3ccHRzQHYceQh8AH8EghSFNIhki
+ 6CO7JJElaiZGJyUoDCj1KeIq0ivELLotsy6wL68wsjG4MsAzyzTeNfE3BDgVOSM6LTsx
+ PDA9Kj4gPxJAAkDvQdtCv0OiRIhFb0ZYR0JIL0keSg9LA0v4TPBN6k7lT+JQ4VHkUutT
+ 81T9VglXF1gnWTlaTVtjXHtdlV6wX85g7WIOYzNkWWV/ZqNnxWjjaf1rEmwhbSpuLm8t
+ cClxInIWcwlz+nTpdhp3TXiEeb96/nxFfZN+64BNgbuDNIS5hkmH44mHiyGMro5Aj+CR
+ kZNYlT2XSZl3m8WeG6AOogKj+aXyp+6p7Kvsre+v9bH9tAi2G7gvukS8Wb5pwHbCfsSA
+ xn3IdspszGDOi9C40urVIddd2Z/b5t4x4IHi1eUr54jp5+xH7qrxEPN79e34Zvrn/XD/
+ /wAAAA8ALgBRAHUAmgC/AOQBCwEyAVsBhAGpAcsB7wIUAjoCYAKIArAC2QMDAy0DWQOF
+ A7ED3wQNBDwEawSbBM0E/gUxBWQFnAXVBg8GTAaJBsgHCgdNB5IH2gglCHIIwgkWCWwJ
+ xgojCoIK5QtKC7oMKwyfDRUNjA4GDoIPAA+BEAMQiBEOEZcSIhKvE0AT1RRtFQYVohZB
+ FuIXhhgtGNYZgRowGuAbkxxIHQQdwh6DH0YgDCDWIaIicyNGJB4k+CXWJrcnoCiXKZEq
+ jiuOLJItmi6mL7UwyDHeMvc0FTU6NmM3jji9Oe87JTxfPZs+20AeQWRCr0P7RUVGi0fL
+ SQVKN0tiTIZNpk7BT9pQ8FIEUxZUKlVAVllXc1iPWa5azlvxXRZePV9mYJFhvmLuZCNl
+ WGaPZ8Zo/Wo0a2lsnm3RbwJwMnFgco5zu3Todg93N3hgeYt6uHvnfRd+SX99gLKB6oMj
+ hF2FmobYiBeJWYqei+SNLY54j8aRGJJvk8yVMJabmA6ZiZsMnJWeJ5/HoWmjDKSyplqo
+ BKmwq1+tEK7DsHiyL7Potae3abktuvK8ur6CwEzCF8PjxbDHfMlKyxnM0M5Vz+PRetMe
+ 1M7Wi9hT2ibcAd3i38bhq+OP5XLnU+kb6p/sJ+2x7z7wzvJf8+/1gPcP+Jn6Hvuf/Rr+
+ j///AAAAFwBBAHAAnwDPAP8BMgFmAZkBxQHzAiICUgKEArcC7AMhA1gDkAPJBAMEPgR6
+ BLcE9QU1BXYFvQYFBk8GmwbqBzsHkAfoCEQIpAkICXAJ3ApMCsALNwu6DEIMzA1ZDeoO
+ fg8VD7AQTxDxEZYSPhLpE50UUxUNFcoWiRdMGBIY2hmlGnIbQRwTHOsdxh6kH4YgayFU
+ IkEjMiQnJR8mGycaKCApKyo5K0ssYS18LpovvTDkMg4zPDRyNa427zg1OYE60jwoPYQ+
+ 5kBMQbdDK0SkRiFHo0kpSrVMRE3YT3BRDFKwVFtWCVe9WXZbNFz4XsBgjWJeZDZmDGfZ
+ aZprSWzpbnlv/HF0cuV0UHWzdxF4cnnUezp8oX4Lf3iA54JYg8yFQoa6iDSJtos9jMmO
+ WY/rkX6TEZSili+XuZk+mr+cPJ22nwWgTKGVot+kKqV3psWoFalmqrqsDq1krrywFbFw
+ ssu0KLWKtu24Ubm3ux68hr3uv1fAwcIrw5XE/8Zqx9TJQMqrzBbNc87K0BvRaNKs0+rV
+ I9ZX14LYqNnK2uXb/N0Q3h/fK+A14TriPuNA5EDlPuY65zfoMekq6iLrDuvp7Lntd+41
+ 7uzvpfBZ8QrxvPJm8xDzuPRc9QD1ovZC9uL3f/gc+Ln5Vfnw+oz7J/vC/F78+P2T/i/+
+ yf9k//8AAHNmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBs
+ bW1vZAAAAAAAAAYQAACcsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>Sheets</key>
+ <array>
+ <dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{360.27, 518.028}, {62, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>244</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKw9Cb3VuZGVkCnNl
+ cnZpY2WGhAJpSQEPkoSEhAxOU0Rp
+ Y3Rpb25hcnkAlIQBaQOShJaWB05T
+ Q29sb3KGkoSEhAdOU0NvbG9yAJSE
+ AWMDhAJmZgCDZmYmP4aShJaWEE5T
+ UGFyYWdyYXBoU3R5bGWGkoSEhBBO
+ U1BhcmFncmFwaFN0eWxlAJSEBEND
+ QFMCAISEhAdOU0FycmF5AJSZDJKE
+ hIQJTlNUZXh0VGFiAJSEAkNmAByG
+ koSioQA4hpKEoqEAVIaShKKhAHCG
+ koSioQCBjACGkoSioQCBqACGkoSi
+ oQCBxACGkoSioQCB4ACGkoSioQCB
+ /ACGkoSioQCBGAGGkoSioQCBNAGG
+ koSioQCBUAGGhgCGkoSWlgZOU0Zv
+ bnSGkoSEhAZOU0ZvbnQelJkohAVb
+ NDBjXQYAAAAeAAAA//5IAGUAbAB2
+ AGUAdABpAGMAYQAtAEIAbwBsAGQA
+ AACEAWYMmwCbAZsAmwCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs24 \cf2 Bounded\
+service}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{137.454, 518.028}, {77, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>243</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKxFVbmJvdW5kZWQK
+ c2VydmljZYaEAmlJARGShISEDE5T
+ RGljdGlvbmFyeQCUhAFpA5KElpYH
+ TlNDb2xvcoaShISEB05TQ29sb3IA
+ lIQBYwOEAmZmAINmZiY/hpKElpYQ
+ TlNQYXJhZ3JhcGhTdHlsZYaShISE
+ EE5TUGFyYWdyYXBoU3R5bGUAlIQE
+ Q0NAUwIAhISEB05TQXJyYXkAlJkM
+ koSEhAlOU1RleHRUYWIAlIQCQ2YA
+ HIaShKKhADiGkoSioQBUhpKEoqEA
+ cIaShKKhAIGMAIaShKKhAIGoAIaS
+ hKKhAIHEAIaShKKhAIHgAIaShKKh
+ AIH8AIaShKKhAIEYAYaShKKhAIE0
+ AYaShKKhAIFQAYaGAIaShJaWBk5T
+ Rm9udIaShISEBk5TRm9udB6UmSiE
+ BVs0MGNdBgAAAB4AAAD//kgAZQBs
+ AHYAZQB0AGkAYwBhAC0AQgBvAGwA
+ ZAAAAIQBZgybAJsBmwCbAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs24 \cf2 Unbounded\
+service}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{314.27, 287.204}, {154, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>242</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>239</integer>
+ <key>Position</key>
+ <real>0.42118796706199646</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.599538</string>
+ <key>g</key>
+ <string>0.933883</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKy1BbGwgY2xpZW50
+ cyB1bmJpbmQgYnkgY2FsbGluZwp1
+ bmJpbmRTZXJ2aWNlKCmGhAJpSQEt
+ koSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWB05TQ29sb3KGkoSEhAdO
+ U0NvbG9yAJSEAWMDhAJmZgCDZmYm
+ P4aShJaWBk5TRm9udIaShISEBk5T
+ Rm9udB6UmRyEBVsyOGNdBgAAABQA
+ AAD//kgAZQBsAHYAZQB0AGkAYwBh
+ AIQBZgybAJsBmwCbAIaShJaWEE5T
+ UGFyYWdyYXBoU3R5bGWGkoSEhBBO
+ U1BhcmFncmFwaFN0eWxlAJSEBEND
+ QFMCAISEhAdOU0FycmF5AJSZDJKE
+ hIQJTlNUZXh0VGFiAJSEAkNmAByG
+ koSlpAA4hpKEpaQAVIaShKWkAHCG
+ koSlpACBjACGkoSlpACBqACGkoSl
+ pACBxACGkoSlpACB4ACGkoSlpACB
+ /ACGkoSlpACBGAGGkoSlpACBNAGG
+ koSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 All clients unbind by calling\
+unbindService()}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{110.362, 287.991}, {131, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Position</key>
+ <real>0.22845998406410217</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.599538</string>
+ <key>g</key>
+ <string>0.933883</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKyxUaGUgc2Vydmlj
+ ZSBpcyBzdG9wcGVkCmJ5IGl0c2Vs
+ ZiBvciBhIGNsaWVudIaEAmlJASyS
+ hISEDE5TRGljdGlvbmFyeQCUhAFp
+ A5KElpYHTlNDb2xvcoaShISEB05T
+ Q29sb3IAlIQBYwOEAmZmAINmZiY/
+ hpKElpYGTlNGb250hpKEhIQGTlNG
+ b250HpSZHIQFWzI4Y10GAAAAFAAA
+ AP/+SABlAGwAdgBlAHQAaQBjAGEA
+ hAFmDJsAmwGbAJsAhpKElpYQTlNQ
+ YXJhZ3JhcGhTdHlsZYaShISEEE5T
+ UGFyYWdyYXBoU3R5bGUAlIQEQ0NA
+ UwIAhISEB05TQXJyYXkAlJkMkoSE
+ hAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hKWkADiGkoSlpABUhpKEpaQAcIaS
+ hKWkAIGMAIaShKWkAIGoAIaShKWk
+ AIHEAIaShKWkAIHgAIaShKWkAIH8
+ AIaShKWkAIEYAYaShKWkAIE0AYaS
+ hKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 The service is stopped\
+by itself or a client}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>237</integer>
+ </dict>
+ <key>ID</key>
+ <integer>241</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{391.27, 373.425}</string>
+ <string>{391.27, 397.368}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>240</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.786, 342.353}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>240</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onUnbind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>240</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>239</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{391.27, 279.898}</string>
+ <string>{391.27, 342.353}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>232</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>233</integer>
+ </dict>
+ <key>ID</key>
+ <integer>238</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{391.27, 427.94}</string>
+ <string>{391.27, 448.542}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>237</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.786, 397.368}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>237</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>236</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{391.27, 102.976}</string>
+ <string>{391.27, 123.622}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>232</integer>
+ </dict>
+ <key>ID</key>
+ <integer>235</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{391.27, 208.991}</string>
+ <string>{391.27, 229.729}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>234</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.786, 178.419}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>234</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onBind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.27, 448.542}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>233</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service \
+shut down}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.27, 229.729}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>232</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Clients are bound to service}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>234</integer>
+ </dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{391.27, 154.194}</string>
+ <string>{391.27, 178.419}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.786, 123.622}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>227</integer>
+ </dict>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{175.845, 279.898}</string>
+ <string>{175.954, 398.488}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>201</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>222</integer>
+ </dict>
+ <key>ID</key>
+ <integer>228</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{175.954, 429.56}</string>
+ <string>{175.954, 448.704}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>227</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{117.47, 398.488}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>226</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{175.954, 103.476}</string>
+ <string>{175.954, 123.622}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>157</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>201</integer>
+ </dict>
+ <key>ID</key>
+ <integer>225</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{175.845, 209.316}</string>
+ <string>{175.845, 229.729}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>224</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{117.361, 178.244}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onStartCommand()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{115.916, 448.704}, {120.076, 51.0524}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service \
+shut down}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{116.845, 229.729}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service running}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>224</integer>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{175.954, 154.194}</string>
+ <string>{175.845, 178.244}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>193</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{117.47, 123.622}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>193</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{332.27, 52.8065}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Call to bindService()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{116.954, 52.8065}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Call to startService()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{95.1479, 162.963}, {376.852, 216.667}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0748095</string>
+ <key>g</key>
+ <string>0.715745</string>
+ <key>r</key>
+ <string>0.753695</string>
+ </dict>
+ </dict>
+ <key>ID</key>
+ <integer>132</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.599538</string>
+ <key>g</key>
+ <string>0.933883</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>2</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.24049</string>
+ <key>g</key>
+ <string>0.515772</string>
+ <key>r</key>
+ <string>0.742387</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>6</real>
+ <key>Pattern</key>
+ <integer>11</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red192\green183\blue19;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Active\
+Lifetime}</string>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>VPages</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>254</integer>
+ </dict>
+ <key>ID</key>
+ <integer>278</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{119.458, 103.672}</string>
+ <string>{119.458, 230.326}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>277</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{51.4582, 51.6724}, {136, 52}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>277</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBK0BJbiBubyBwYXJ0
+ aWN1bGFyIG9yZGVyLApvblN0YXJ0
+ Q29tbWFuZCgpIGFuZApvbkJpbmQo
+ KSBhcmUgY2FsbGVkhoQCaUkBQJKE
+ hIQMTlNEaWN0aW9uYXJ5AJSEAWkD
+ koSWlgdOU0NvbG9yhpKEhIQHTlND
+ b2xvcgCUhAFjA4QCZmYAg2ZmJj+G
+ koSWlgZOU0ZvbnSGkoSEhAZOU0Zv
+ bnQelJkchAVbMjhjXQYAAAAUAAAA
+ //5IAGUAbAB2AGUAdABpAGMAYQCE
+ AWYMmwCbAZsAmwCGkoSWlhBOU1Bh
+ cmFncmFwaFN0eWxlhpKEhIQQTlNQ
+ YXJhZ3JhcGhTdHlsZQCUhARDQ0BT
+ AgCEhIQHTlNBcnJheQCUmQyShISE
+ CU5TVGV4dFRhYgCUhAJDZgAchpKE
+ paQAOIaShKWkAFSGkoSlpABwhpKE
+ paQAgYwAhpKEpaQAgagAhpKEpaQA
+ gcQAhpKEpaQAgeAAhpKEpaQAgfwA
+ hpKEpaQAgRgBhpKEpaQAgTQBhpKE
+ paQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 In no particular order,\
+onStartCommand() and\
+onBind() are called}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>222</integer>
+ </dict>
+ <key>ID</key>
+ <integer>276</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{119.458, 508.849}</string>
+ <string>{119.458, 530.75}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>251</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{55.7841, 530.75}, {127.348, 54.1443}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service \
+shut down}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{42.4582, 289.233}, {154, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>275</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKy1BbGwgY2xpZW50
+ cyB1bmJpbmQgYnkgY2FsbGluZwp1
+ bmJpbmRTZXJ2aWNlKCmGhAJpSQEt
+ koSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWB05TQ29sb3KGkoSEhAdO
+ U0NvbG9yAJSEAWMDhAJmZgCDZmYm
+ P4aShJaWBk5TRm9udIaShISEBk5T
+ Rm9udB6UmRyEBVsyOGNdBgAAABQA
+ AAD//kgAZQBsAHYAZQB0AGkAYwBh
+ AIQBZgybAJsBmwCbAIaShJaWEE5T
+ UGFyYWdyYXBoU3R5bGWGkoSEhBBO
+ U1BhcmFncmFwaFN0eWxlAJSEBEND
+ QFMCAISEhAdOU0FycmF5AJSZDJKE
+ hIQJTlNUZXh0VGFiAJSEAkNmAByG
+ koSlpAA4hpKEpaQAVIaShKWkAHCG
+ koSlpACBjACGkoSlpACBqACGkoSl
+ pACBxACGkoSlpACB4ACGkoSlpACB
+ /ACGkoSlpACBGAGGkoSlpACBNAGG
+ koSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 All clients unbind by calling\
+unbindService()}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ </dict>
+ <key>ID</key>
+ <integer>274</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{119.458, 280.495}</string>
+ <string>{119.458, 346.07}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>254</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{268.383, 65.6724}, {26, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>273</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>264</integer>
+ <key>Position</key>
+ <real>0.14760473370552063</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwJOb4aEAmlJAQKS
+ hISEDE5TRGljdGlvbmFyeQCUhAFp
+ A5KElpYHTlNDb2xvcoaShISEB05T
+ Q29sb3IAlIQBYwOEAmZmAINmZiY/
+ hpKElpYGTlNGb250hpKEhIQGTlNG
+ b250HpSZHIQFWzI4Y10GAAAAFAAA
+ AP/+SABlAGwAdgBlAHQAaQBjAGEA
+ hAFmDJsAmwGbAJsAhpKElpYQTlNQ
+ YXJhZ3JhcGhTdHlsZYaShISEEE5T
+ UGFyYWdyYXBoU3R5bGUAlIQEQ0NA
+ UwIAhISEB05TQXJyYXkAlJkMkoSE
+ hAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hKWkADiGkoSlpABUhpKEpaQAcIaS
+ hKWkAIGMAIaShKWkAIGoAIaShKWk
+ AIHEAIaShKWkAIHgAIaShKWkAIH8
+ AIaShKWkAIEYAYaShKWkAIE0AYaS
+ hKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 No}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{350.249, 125.785}, {30, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>272</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>262</integer>
+ <key>Position</key>
+ <real>0.37241667509078979</real>
+ <key>RotationType</key>
+ <integer>4</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Rotation</key>
+ <real>2.162055492401123</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwNZZXOGhAJpSQED
+ koSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWB05TQ29sb3KGkoSEhAdO
+ U0NvbG9yAJSEAWMDhAJmZgCDZmYm
+ P4aShJaWBk5TRm9udIaShISEBk5T
+ Rm9udB6UmRyEBVsyOGNdBgAAABQA
+ AAD//kgAZQBsAHYAZQB0AGkAYwBh
+ AIQBZgybAJsBmwCbAIaShJaWEE5T
+ UGFyYWdyYXBoU3R5bGWGkoSEhBBO
+ U1BhcmFncmFwaFN0eWxlAJSEBEND
+ QFMCAISEhAdOU0FycmF5AJSZDJKE
+ hIQJTlNUZXh0VGFiAJSEAkNmAByG
+ koSlpAA4hpKEpaQAVIaShKWkAHCG
+ koSlpACBjACGkoSlpACBqACGkoSl
+ pACBxACGkoSlpACB4ACGkoSlpACB
+ /ACGkoSlpACBGAGGkoSlpACBNAGG
+ koSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Yes}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{245.015, 481.45}, {30.8841, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>271</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>258</integer>
+ <key>Position</key>
+ <real>0.2065550833940506</real>
+ <key>RotationType</key>
+ <integer>4</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwNZZXOGhAJpSQED
+ koSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWB05TQ29sb3KGkoSEhAdO
+ U0NvbG9yAJSEAWMDhAJmZgCDZmYm
+ P4aShJaWBk5TRm9udIaShISEBk5T
+ Rm9udB6UmRyEBVsyOGNdBgAAABQA
+ AAD//kgAZQBsAHYAZQB0AGkAYwBh
+ AIQBZgybAJsBmwCbAIaShJaWEE5T
+ UGFyYWdyYXBoU3R5bGWGkoSEhBBO
+ U1BhcmFncmFwaFN0eWxlAJSEBEND
+ QFMCAISEhAdOU0FycmF5AJSZDJKE
+ hIQJTlNUZXh0VGFiAJSEAkNmAByG
+ koSlpAA4hpKEpaQAVIaShKWkAHCG
+ koSlpACBjACGkoSlpACBqACGkoSl
+ pACBxACGkoSlpACB4ACGkoSlpACB
+ /ACGkoSlpACBGAGGkoSlpACBNAGG
+ koSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Yes}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{371.094, 416.886}, {26, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>270</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>255</integer>
+ <key>Position</key>
+ <real>0.10439391434192657</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKwJOb4aEAmlJAQKS
+ hISEDE5TRGljdGlvbmFyeQCUhAFp
+ A5KElpYHTlNDb2xvcoaShISEB05T
+ Q29sb3IAlIQBYwOEAmZmAINmZiY/
+ hpKElpYGTlNGb250hpKEhIQGTlNG
+ b250HpSZHIQFWzI4Y10GAAAAFAAA
+ AP/+SABlAGwAdgBlAHQAaQBjAGEA
+ hAFmDJsAmwGbAJsAhpKElpYQTlNQ
+ YXJhZ3JhcGhTdHlsZYaShISEEE5T
+ UGFyYWdyYXBoU3R5bGUAlIQEQ0NA
+ UwIAhISEB05TQXJyYXkAlJkMkoSE
+ hAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hKWkADiGkoSlpABUhpKEpaQAcIaS
+ hKWkAIGMAIaShKWkAIGoAIaShKWk
+ AIHEAIaShKWkAIHgAIaShKWkAIH8
+ AIaShKWkAIEYAYaShKWkAIE0AYaS
+ hKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 No}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{454.447, 166.593}, {81, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>268</integer>
+ <key>Position</key>
+ <real>0.20122452080249786</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKxxBIGNsaWVudCBj
+ YWxscwpiaW5kU2VydmljZSgphoQC
+ aUkBHJKEhIQMTlNEaWN0aW9uYXJ5
+ AJSEAWkDkoSWlgdOU0NvbG9yhpKE
+ hIQHTlNDb2xvcgCUhAFjA4QCZmYA
+ g2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYA
+ AAAUAAAA//5IAGUAbAB2AGUAdABp
+ AGMAYQCEAWYMmwCbAZsAmwCGkoSW
+ lhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJD
+ ZgAchpKEpaQAOIaShKWkAFSGkoSl
+ pABwhpKEpaQAgYwAhpKEpaQAgagA
+ hpKEpaQAgcQAhpKEpaQAgeAAhpKE
+ paQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 A client calls\
+bindService()}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>261</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>268</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{494.947, 230.326}</string>
+ <string>{424.249, 77.6724}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Info</key>
+ <integer>6</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>266</integer>
+ <key>Position</key>
+ <real>0.79816216230392456</real>
+ </dict>
+ <key>ID</key>
+ <integer>267</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{230.708, 199.334}</string>
+ <string>{231.109, 255.41}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>253</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>254</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ <key>ID</key>
+ <integer>266</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{365.249, 199.334}</string>
+ <string>{183.272, 255.41}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>252</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>253</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>264</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{305.749, 77.6724}</string>
+ <string>{230.708, 168.762}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>261</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>252</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>262</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{365.249, 119.403}</string>
+ <string>{365.249, 168.762}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>261</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{306.249, 35.9417}, {118, 83.4614}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>261</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Diamond</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKxlvblVuYmluZCgp
+ IHJldHVybmVkIHRydWU/hoQCaUkB
+ GZKEhIQMTlNEaWN0aW9uYXJ5AJSE
+ AWkDkoSWlgdOU0NvbG9yhpKEhIQH
+ TlNDb2xvcgCUhAFjA4QCZmYAg2Zm
+ Jj+GkoSWlgZOU0ZvbnSGkoSEhAZO
+ U0ZvbnQelJkchAVbMjhjXQYAAAAU
+ AAAA//5IAGUAbAB2AGUAdABpAGMA
+ YQCEAWYMmwCbAZsAmwCGkoSWlhBO
+ U1BhcmFncmFwaFN0eWxlhpKEhIQQ
+ TlNQYXJhZ3JhcGhTdHlsZQCUhARD
+ Q0BTAgCEhIQHTlNBcnJheQCUmQyS
+ hISECU5TVGV4dFRhYgCUhAJDZgAc
+ hpKEpaQAOIaShKWkAFSGkoSlpABw
+ hpKEpaQAgYwAhpKEpaQAgagAhpKE
+ paQAgcQAhpKEpaQAgeAAhpKEpaQA
+ gfwAhpKEpaQAgRgBhpKEpaQAgTQB
+ hpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 onUnbind() returned true?}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>251</integer>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{119.458, 376.642}</string>
+ <string>{119.458, 478.277}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>257</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>260</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{177.942, 361.356}</string>
+ <string>{263.403, 383.86}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>251</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ <key>ID</key>
+ <integer>258</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{263.403, 473.912}</string>
+ <string>{177.942, 493.563}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>257</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{172.807, 383.86}, {181.191, 90.0511}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>257</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Diamond</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKzhJcyBzZXJ2aWNl
+ IGFsc28Kc3RvcHBlZCB2aWEgc3Rv
+ cFNlbGYoKSBvciBzdG9wU2Vydmlj
+ ZSgpP4aEAmlJATiShISEDE5TRGlj
+ dGlvbmFyeQCUhAFpBJKElpYQTlNQ
+ YXJhZ3JhcGhTdHlsZYaShISEEE5T
+ UGFyYWdyYXBoU3R5bGUAlIQEQ0NA
+ UwIAhISEB05TQXJyYXkAlJkMkoSE
+ hAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hJ+eADiGkoSfngBUhpKEn54AcIaS
+ hJ+eAIGMAIaShJ+eAIGoAIaShJ+e
+ AIHEAIaShJ+eAIHgAIaShJ+eAIH8
+ AIaShJ+eAIEYAYaShJ+eAIE0AYaS
+ hJ+eAIFQAYaGAIaShJaWDk5TT3Jp
+ Z2luYWxGb250hpKEhIQGTlNGb250
+ HpSZHIQFWzI4Y10GAAAAFAAAAP/+
+ SABlAGwAdgBlAHQAaQBjAGEAhAFm
+ DIQBYwCiAaIAogCGkoSWlgZOU0Zv
+ bnSGkqyShJaWB05TQ29sb3KGkoSE
+ hAdOU0NvbG9yAJSiA4QCZmYAg2Zm
+ Jj+GhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Is service also\
+stopped via stopSelf() or stopService()?}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ <key>ID</key>
+ <integer>255</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{353.998, 428.886}</string>
+ <string>{494.947, 280.495}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>257</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{55.6441, 230.326}, {127.628, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>254</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service running and clients are bound}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{172.224, 168.762}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>253</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onBind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{306.765, 168.762}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>252</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onRebind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{60.9742, 478.277}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>251</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{60.9742, 346.07}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onUnbind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{435.947, 230.326}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service running}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 3</string>
+ <key>UniqueID</key>
+ <integer>3</integer>
+ <key>VPages</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{301.31, 333.832}, {138, 52}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>262</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>260</integer>
+ <key>Position</key>
+ <real>0.43316367268562317</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBK0BvblVuYmluZCgp
+ IHJldHVybnMgdHJ1ZSwKdGhlbiBh
+ IGNsaWVudCBhZ2FpbiBjYWxscwpi
+ aW5kU2VydmljZSgphoQCaUkBQJKE
+ hIQMTlNEaWN0aW9uYXJ5AJSEAWkD
+ koSWlgdOU0NvbG9yhpKEhIQHTlND
+ b2xvcgCUhAFjA4QCZmYAg2ZmJj+G
+ koSWlgZOU0ZvbnSGkoSEhAZOU0Zv
+ bnQelJkchAVbMjhjXQYAAAAUAAAA
+ //5IAGUAbAB2AGUAdABpAGMAYQCE
+ AWYMmwCbAZsAmwCGkoSWlhBOU1Bh
+ cmFncmFwaFN0eWxlhpKEhIQQTlNQ
+ YXJhZ3JhcGhTdHlsZQCUhARDQ0BT
+ AgCEhIQHTlNBcnJheQCUmQyShISE
+ CU5TVGV4dFRhYgCUhAJDZgAchpKE
+ paQAOIaShKWkAFSGkoSlpABwhpKE
+ paQAgYwAhpKEpaQAgagAhpKEpaQA
+ gcQAhpKEpaQAgeAAhpKEpaQAgfwA
+ hpKEpaQAgRgBhpKEpaQAgTQBhpKE
+ paQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 onUnbind() returns true,\
+then a client again calls\
+bindService()}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>231</integer>
+ </dict>
+ <key>ID</key>
+ <integer>261</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{312.71, 196.578}</string>
+ <string>{257.716, 196.578}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>259</integer>
+ <key>Info</key>
+ <integer>4</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>259</integer>
+ </dict>
+ <key>ID</key>
+ <integer>260</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{257.716, 361.323}</string>
+ <string>{371.194, 211.864}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>251</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{312.71, 181.292}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>259</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onRebind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{144.732, 385.043}, {109, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>258</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>256</integer>
+ <key>Position</key>
+ <real>0.41964080929756165</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKyhTZXJ2aWNlIGlz
+ IHN0b3BwZWQKYnkgaXRzZWxmIG9y
+ IGEgY2xpZW50hoQCaUkBKJKEhIQM
+ TlNEaWN0aW9uYXJ5AJSEAWkDkoSW
+ lgdOU0NvbG9yhpKEhIQHTlNDb2xv
+ cgCUhAFjA4QCZmYAg2ZmJj+GkoSW
+ lgZOU0ZvbnSGkoSEhAZOU0ZvbnQe
+ lJkchAVbMjhjXQYAAAAUAAAA//5I
+ AGUAbAB2AGUAdABpAGMAYQCEAWYM
+ mwCbAZsAmwCGkoSWlhBOU1BhcmFn
+ cmFwaFN0eWxlhpKEhIQQTlNQYXJh
+ Z3JhcGhTdHlsZQCUhARDQ0BTAgCE
+ hIQHTlNBcnJheQCUmQyShISECU5T
+ VGV4dFRhYgCUhAJDZgAchpKEpaQA
+ OIaShKWkAFSGkoSlpABwhpKEpaQA
+ gYwAhpKEpaQAgagAhpKEpaQAgcQA
+ hpKEpaQAgeAAhpKEpaQAgfwAhpKE
+ paQAgRgBhpKEpaQAgTQBhpKEpaQA
+ gVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Service is stopped\
+by itself or a client}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{125.232, 290.499}, {148, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>255</integer>
+ <key>Position</key>
+ <real>0.42571654915809631</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISE
+ hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
+ hIQITlNPYmplY3QAhZKEhIQITlNT
+ dHJpbmcBlIQBKytBIGNsaWVudCB1
+ bmJpbmRzIGJ5IGNhbGxpbmcKdW5i
+ aW5kU2VydmljZSgphoQCaUkBK5KE
+ hIQMTlNEaWN0aW9uYXJ5AJSEAWkD
+ koSWlgdOU0NvbG9yhpKEhIQHTlND
+ b2xvcgCUhAFjA4QCZmYAg2ZmJj+G
+ koSWlgZOU0ZvbnSGkoSEhAZOU0Zv
+ bnQelJkchAVbMjhjXQYAAAAUAAAA
+ //5IAGUAbAB2AGUAdABpAGMAYQCE
+ AWYMmwCbAZsAmwCGkoSWlhBOU1Bh
+ cmFncmFwaFN0eWxlhpKEhIQQTlNQ
+ YXJhZ3JhcGhTdHlsZQCUhARDQ0BT
+ AgCEhIQHTlNBcnJheQCUmQyShISE
+ CU5TVGV4dFRhYgCUhAJDZgAchpKE
+ paQAOIaShKWkAFSGkoSlpABwhpKE
+ paQAgYwAhpKEpaQAgagAhpKEpaQA
+ gcQAhpKEpaQAgeAAhpKEpaQAgfwA
+ hpKEpaQAgRgBhpKEpaQAgTQBhpKE
+ paQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 A client unbinds by calling\
+unbindService()}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Info</key>
+ <integer>6</integer>
+ </dict>
+ <key>ID</key>
+ <integer>257</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{199.232, 471.865}</string>
+ <string>{199.232, 495.193}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>252</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{139.194, 495.193}, {120.076, 51.0524}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.628571</string>
+ <key>g</key>
+ <string>0.768599</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.236788</string>
+ <key>g</key>
+ <string>0.532236</string>
+ <key>r</key>
+ <string>0.990271</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.131021</string>
+ <key>g</key>
+ <string>0.363196</string>
+ <key>r</key>
+ <string>0.725948</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Service\
+shut down}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>252</integer>
+ </dict>
+ <key>ID</key>
+ <integer>256</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{199.232, 377.109}</string>
+ <string>{199.232, 441.293}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>251</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>251</integer>
+ </dict>
+ <key>ID</key>
+ <integer>255</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{199.232, 282.414}</string>
+ <string>{199.232, 346.037}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ </dict>
+ <key>ID</key>
+ <integer>254</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{199.232, 107.307}</string>
+ <string>{199.232, 129.214}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>231</integer>
+ </dict>
+ <key>ID</key>
+ <integer>253</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{199.232, 159.786}</string>
+ <string>{199.232, 181.292}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>250</integer>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{199.232, 211.864}</string>
+ <string>{199.232, 231.744}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{140.748, 441.293}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>252</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onDestroy()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{140.748, 346.037}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>251</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onUnbind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{140.232, 231.744}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>250</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.274119</string>
+ <key>g</key>
+ <string>0.950739</string>
+ <key>r</key>
+ <string>0.787494</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.165602</string>
+ <key>g</key>
+ <string>0.586124</string>
+ <key>r</key>
+ <string>0.428309</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Client(s) bound to service}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{140.748, 181.292}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onBind()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{140.748, 129.214}, {116.968, 30.572}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSansMono</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.45</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>0.0</real>
+ <key>ShadowVector</key>
+ <string>{0.5, 2}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.700224</string>
+ <key>g</key>
+ <string>0.700574</string>
+ <key>r</key>
+ <string>0.700377</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
+onCreate()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{140.232, 57.1374}, {118, 50.1697}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans-Bold</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Call to\
+bindService()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 2</string>
+ <key>UniqueID</key>
+ <integer>2</integer>
+ <key>VPages</key>
+ <integer>1</integer>
+ </dict>
+ </array>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>1</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{221, 40}, {1085, 835}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{-234, -7}, {1043.96, 748.352}}</string>
+ <key>Zoom</key>
+ <real>0.9100000262260437</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1.0800000429153442</real>
+ <real>1.0499999523162842</real>
+ </array>
+ <array>
+ <string>Canvas 2</string>
+ <real>1.0399999618530273</real>
+ <real>1</real>
+ </array>
+ <array>
+ <string>Canvas 3</string>
+ <real>0.9100000262260437</real>
+ <real>0.93000000715255737</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
diff --git a/docs/html/images/resources/res-selection-flowchart.graffle b/docs/html/images/resources/res-selection-flowchart.graffle
new file mode 100644
index 000000000000..2d6473532034
--- /dev/null
+++ b/docs/html/images/resources/res-selection-flowchart.graffle
@@ -0,0 +1,2629 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>138.9.0.117994</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2012-01-03 18:30:01 -0800</string>
+ <key>Creator</key>
+ <string>Scott Main</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1 0/72 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{177.408, 457.685}, {248, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBK2EqIElmIHRoZSBxdWFsaWZpZXIgaXMgc2Ny
+ ZWVuIGRlbnNpdHksIHRoZSBzeXN0ZW0Kc2VsZWN0cyB0
+ aGUgImJlc3QgbWF0Y2giIGFuZCB0aGUgcHJvY2VzcyBp
+ cyBkb25lhoQCaUkBYZKEhIQMTlNEaWN0aW9uYXJ5AJSE
+ AWkDkoSWlgdOU0NvbG9yhpKEhIQHTlNDb2xvcgCUhAFj
+ A4QCZmYAg2ZmJj+GkoSWlgZOU0ZvbnSGkoSEhAZOU0Zv
+ bnQelJkchAVbMjhjXQYAAAAUAAAA//5IAGUAbAB2AGUA
+ dABpAGMAYQCEAWYLmwCbAZsAmwCGkoSWlhBOU1BhcmFn
+ cmFwaFN0eWxlhpKEhIQQTlNQYXJhZ3JhcGhTdHlsZQCU
+ hARDQ0BTAgCEhIQHTlNBcnJheQCUmQyShISECU5TVGV4
+ dFRhYgCUhAJDZgAchpKEpaQAOIaShKWkAFSGkoSlpABw
+ hpKEpaQAgYwAhpKEpaQAgagAhpKEpaQAgcQAhpKEpaQA
+ geAAhpKEpaQAgfwAhpKEpaQAgRgBhpKEpaQAgTQBhpKE
+ paQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs22 \cf2 * If the qualifier is screen density, the system\
+selects the "best match" and the process is done}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ </dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{301.407, 111}</string>
+ <string>{301.407, 138}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>160</integer>
+ </dict>
+ <key>ID</key>
+ <integer>204</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{301.407, 203}</string>
+ <string>{301.408, 230.336}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{375.5, 303.315}, {131, 52}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>203</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>Position</key>
+ <real>0.37667733430862427</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBK0Y1LiBDb250aW51ZSB1bnRpbCBvbmx5Cm9u
+ ZSBkaXJlY3RvcnkgZm9yIHRoZSAKZGVzaXJlZCByZXNv
+ dXJjZSBpcyBsZWZ0hoQCaUkBRpKEhIQMTlNEaWN0aW9u
+ YXJ5AJSEAWkDkoSWlgdOU0NvbG9yhpKEhIQHTlNDb2xv
+ cgCUhAFjA4QCZmYAg2ZmJj+GkoSWlgZOU0ZvbnSGkoSE
+ hAZOU0ZvbnQelJkchAVbMjhjXQYAAAAUAAAA//5IAGUA
+ bAB2AGUAdABpAGMAYQCEAWYMmwCbAZsAmwCGkoSWlhBO
+ U1BhcmFncmFwaFN0eWxlhpKEhIQQTlNQYXJhZ3JhcGhT
+ dHlsZQCUhARDQ0BTAgCEhIQHTlNBcnJheQCUmQyShISE
+ CU5TVGV4dFRhYgCUhAJDZgAchpKEpaQAOIaShKWkAFSG
+ koSlpABwhpKEpaQAgYwAhpKEpaQAgagAhpKEpaQAgcQA
+ hpKEpaQAgeAAhpKEpaQAgfwAhpKEpaQAgRgBhpKEpaQA
+ gTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 5. Continue until only\
+one directory for the \
+desired resource is left}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ <key>ID</key>
+ <integer>202</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{395, 407.5}</string>
+ <string>{441, 321}</string>
+ <string>{395, 170.5}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>159</integer>
+ <key>Info</key>
+ <integer>7</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{286.407, 331.842}, {30, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Position</key>
+ <real>0.42656871676445007</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKwNZZXOGhAJpSQEDkoSEhAxOU0RpY3Rpb25h
+ cnkAlIQBaQOShJaWB05TQ29sb3KGkoSEhAdOU0NvbG9y
+ AJSEAWMDhAJmZgCDZmYmP4aShJaWBk5TRm9udIaShISE
+ Bk5TRm9udB6UmRyEBVsyOGNdBgAAABQAAAD//kgAZQBs
+ AHYAZQB0AGkAYwBhAIQBZgybAJsBmwCbAIaShJaWEE5T
+ UGFyYWdyYXBoU3R5bGWGkoSEhBBOU1BhcmFncmFwaFN0
+ eWxlAJSEBENDQFMCAISEhAdOU0FycmF5AJSZDJKEhIQJ
+ TlNUZXh0VGFiAJSEAkNmAByGkoSlpAA4hpKEpaQAVIaS
+ hKWkAHCGkoSlpACBjACGkoSlpACBqACGkoSlpACBxACG
+ koSlpACB4ACGkoSlpACB/ACGkoSlpACBGAGGkoSlpACB
+ NAGGkoSlpACBUAGGhgCGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Yes}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>159</integer>
+ <key>Info</key>
+ <integer>6</integer>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{301.408, 320.664}</string>
+ <string>{301.407, 375}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>160</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{168.719, 263.5}, {26, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>Position</key>
+ <real>0.14238780736923218</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKwJOb4aEAmlJAQKShISEDE5TRGljdGlvbmFy
+ eQCUhAFpA5KElpYHTlNDb2xvcoaShISEB05TQ29sb3IA
+ lIQBYwOEAmZmAINmZiY/hpKElpYGTlNGb250hpKEhIQG
+ TlNGb250HpSZHIQFWzI4Y10GAAAAFAAAAP/+SABlAGwA
+ dgBlAHQAaQBjAGEAhAFmDJsAmwGbAJsAhpKElpYQTlNQ
+ YXJhZ3JhcGhTdHlsZYaShISEEE5TUGFyYWdyYXBoU3R5
+ bGUAlIQEQ0NAUwIAhISEB05TQXJyYXkAlJkMkoSEhAlO
+ U1RleHRUYWIAlIQCQ2YAHIaShKWkADiGkoSlpABUhpKE
+ paQAcIaShKWkAIGMAIaShKWkAIGoAIaShKWkAIHEAIaS
+ hKWkAIHgAIaShKWkAIH8AIaShKWkAIEYAYaShKWkAIE0
+ AYaShKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 No}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Info</key>
+ <integer>8</integer>
+ </dict>
+ <key>ID</key>
+ <integer>196</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{211.676, 275.5}</string>
+ <string>{156, 230}</string>
+ <string>{207.815, 170.5}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>160</integer>
+ <key>Info</key>
+ <integer>8</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{207.815, 230}, {187.185, 91}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>160</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>Diamond</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 3. Do any resource directories use this qualifer?}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextRelativeArea</key>
+ <string>{{0.135, 0.165}, {0.75, 0.75}}</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{207.815, 375}, {187.185, 65}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>159</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 4. Eliminate directories that do not include this qualifier *}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{207.815, 138}, {187.185, 65}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 2. Identify the next qualifier in the table (MCC first, then MNC, then language, and so on)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{207.815, 46}, {187.185, 65}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{1, 1}</string>
+ <string>{1, -1}</string>
+ <string>{-1, -1}</string>
+ <string>{-1, 1}</string>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{-0.5, -0.233518}</string>
+ <string>{-0.491442, 0.260063}</string>
+ <string>{0.507118, -0.224086}</string>
+ <string>{0.507118, 0.267179}</string>
+ <string>{-0.27431, -0.474028}</string>
+ <string>{0.27978, -0.478478}</string>
+ <string>{0.293938, 0.543044}</string>
+ <string>{-0.286232, 0.553804}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.35</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Fuzziness</key>
+ <real>2.3972222805023193</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.93512</string>
+ <key>g</key>
+ <string>0.472602</string>
+ <key>r</key>
+ <string>0.333854</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 1. Eliminate qualifiers that contradict the device configuration}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2012-01-03 18:46:11 -0800</string>
+ <key>Modifier</key>
+ <string>Scott Main</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ ywZIOs1zGROYoAwapVcwhffluUQuoQfhhwIkJPygOgOyb3pmBuziPR2vzWcBCIsYL/Xp
+ sflF+EBW0rvBuFqMrgASOv326fFw9/j5Wn/G771+erz/cqHYWj6B2Pw0Kiql80pUs4gw
+ 6BDkCNnH8hlUEwRK5dc8ZJq5Ib6UnT+ij/wF7jY3nmXO7pDSflX3ef7C625KRUCOeOYv
+ eZHe4MVydaY6Gk60Ej3CIRIbN/SOcoyGRZUfhoV+oXp/hBOZxURWJvdPHGYhUioS2Mlm
+ PF/23PMIwpQFe1kkePVsoxMujDUKXXoHhNfIcwm0y98xWEOX7V4tBk53KfwujgVusfMu
+ cBILmKAiUhlbz1qOpBKa7AXHVfbiW6/S8z5ZZxNNyCYBSJG8mnghvEsifSierjiJOgZn
+ J34Co3X1y2hANiLnWVsYQ4k4ez28j1Wi5bxmrDmvrk4e9gxf7tOfZggB6FpL2mKKaADl
+ iGYACQFgpvjwQrfHWy3BpAgJf72SIBY5W3ajdUDI9XgxzYvOkg0ocURJcwZTwmcIafUM
+ WdSiJgWNOepCygtXDRHDc+AvmtBAAIpj8NreW3ohfT0Cq6pDBIY/jmFUa7wrg58h7IR+
+ 4e5QoMxZGhJQgCNu/+Zb/e5GH26v9Sf8bdjdyed70Dk7DH9CU/AVR3jUgWxEbsY1UDkC
+ GCpQIAC3xALkVruKJzJfMJcRQ0BoPYUxK4FHelnBO+NRrHxJeA0/HnGQ9SinrSQGdpYv
+ OKfQumSDX/bsB4RwlHv/V+q2BkgUAsF5+TufVtp7OWKNr8Ud6Y1gcCW+/NWKrGaZf4Pn
+ xQVMF27qW+RDLRAXf7cT3/UNbyRzRK2iTp5SqZEjC1k843cm5lncZnU1e2FraWB68yv7
+ KFknZIDlqoof/wvJ11+UCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iagozMjAxCmVuZG9i
+ agozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNlcyA3
+ IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNTc2IDczM10KPj4KZW5k
+ b2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdl
+ QyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNiAwIFIKL0NzMSA4IDAgUiA+
+ PiAvRXh0R1N0YXRlIDw8IC9HczQgMjMgMCBSIC9HczMgMjQgMCBSIC9HczIgMjUgMCBS
+ IC9HczEgMjYgMCBSCj4+IC9Gb250IDw8IC9GMS4wIDE3IDAgUiAvRjIuMCAyMSAwIFIg
+ L0YzLjAgMjIgMCBSID4+IC9YT2JqZWN0IDw8IC9JbTIgMTEgMCBSCi9JbTMgMTMgMCBS
+ IC9JbTEgOSAwIFIgPj4gL1NoYWRpbmcgPDwgL1NoMSAxNSAwIFIgL1NoMiAxOCAwIFIg
+ L1NoNCAyMCAwIFIKL1NoMyAxOSAwIFIgPj4gPj4KZW5kb2JqCjE1IDAgb2JqCjw8IC9D
+ b2xvclNwYWNlIDI3IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgOTQuMDkyNTkg
+ LTMzIDk0LjA5MjU4IDMzLjAwMDA0Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBm
+ YWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAyOCAwIFIgPj4KZW5kb2JqCjE4IDAgb2JqCjw8
+ IC9Db2xvclNwYWNlIDI3IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgOTQuMDky
+ NTkgLTMzIDk0LjA5MjU4IDMzLjAwMDA0Cl0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQg
+ WyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAyOSAwIFIgPj4KZW5kb2JqCjIwIDAgb2Jq
+ Cjw8IC9Db2xvclNwYWNlIDI3IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgOTQu
+ MDkyNSAtNDYgOTQuMDkyNDggNDYuMDAwMDQKXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVu
+ ZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDMwIDAgUiA+PgplbmRvYmoKMTkgMCBv
+ YmoKPDwgL0NvbG9yU3BhY2UgMjcgMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyA5
+ NC4wOTI1IC0zMyA5NC4wOTI0OCAzMy4wMDAwNApdIC9Eb21haW4gWyAwIDEgXSAvRXh0
+ ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMzEgMCBSID4+CmVuZG9iagoxMSAw
+ IG9iago8PCAvTGVuZ3RoIDEyIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
+ Z2UgL1dpZHRoIDM5NiAvSGVpZ2h0IDE1MiAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JT
+ cGFjZSAzMiAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sgMzMgMCBSIC9CaXRz
+ UGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCB
+ AAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMDAy8AAwX4AAQplbmRzdHJlYW0K
+ ZW5kb2JqCjEyIDAgb2JqCjgxMAplbmRvYmoKMTMgMCBvYmoKPDwgL0xlbmd0aCAxNCAw
+ IFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAzOTYgL0hlaWdo
+ dCAyMDQgL0ludGVycG9sYXRlCnRydWUgL0NvbG9yU3BhY2UgMzIgMCBSIC9JbnRlbnQg
+ L1BlcmNlcHR1YWwgL1NNYXNrIDM1IDAgUiAvQml0c1BlckNvbXBvbmVudAo4IC9GaWx0
+ ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QMQEAAADCoPVPbQo/iEBhwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwMBrYLLdAAEKZW5kc3RyZWFtCmVuZG9i
+ agoxNCAwIG9iagoxMDgwCmVuZG9iago5IDAgb2JqCjw8IC9MZW5ndGggMTAgMCBSIC9U
+ eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMzk2IC9IZWlnaHQgMTUy
+ IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDMyIDAgUiAvSW50ZW50IC9QZXJj
+ ZXB0dWFsIC9TTWFzayAzNyAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9G
+ bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwMDLwADBfgABCmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKODEwCmVuZG9i
+ agozNyAwIG9iago8PCAvTGVuZ3RoIDM4IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlw
+ ZSAvSW1hZ2UgL1dpZHRoIDM5NiAvSGVpZ2h0IDE1MiAvQ29sb3JTcGFjZQovRGV2aWNl
+ R3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
+ L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae2WX1PaaBxGSUJCgGAMKVLQaLssSou+ztAq
+ iwItK8ifIoGaQPb7f5EF9qKA2puO7zw7fX4XXppnzuEQYjEeCZAACZAACZAACZDArxNQ
+ VFXjySKgqspLyhRV042EmeTJIWAmjLj2vA5F0810xnayPDkEHDuTNnXtmTZUzUjbbr54
+ 5B3zZBDwjop5104bT2UoWsJyi+/KH8+FuOS9PgEhzj+UTwquldiVoWiG9cY7FVeNZqvN
+ k0Gg1Wx8FqfeG2u3DFVPu16ldtvp9QdDngwCg36vc1OreNmUrm79nNJMu3Baa/W+Tfzp
+ jCeDwNSfjLrN2mnBTmibLpR42n0nbnvjWRCGc54MAmEYzMbdG3HipuKbv6VUI5MvX3VG
+ s3CxiKLoH95rE1hSXizC2ajzuXyQMbZcJOzix0ZvEqxM0MVri1j//5WN4KHX+FC0E5sv
+ DM10js6bfT9kFVI8rB6ychH6/dvq4b655SLpeKI1mIaMQpqLlYxwOmhdeI65+fLWktlj
+ 0R7Oli7kbeGTli6GbeFlk7suLulC9qfjpy7mstf85s+bz17ugi7kfjjWLo6f/46iC7qQ
+ SwDnaeyCLnAI4CxhF3SBQwBnCbugCxwCOEvYBV3gEMBZwi7oAocAzhJ2QRc4BHCWsAu6
+ wCGAs4Rd0AUOAZwl7IIucAjgLGEXdIFDAGcJu6ALHAI4S9gFXeAQwFnCLugChwDOEnZB
+ FzgEcJawC7rAIYCzhF3QBQ4BnCXsgi5wCOAsYRd0gUMAZwm7oAscAjhL2AVd4BDAWcIu
+ 6AKHAM4SdkEXOARwlrALusAhgLOEXdAFDgGcJeyCLnAI4CxhF3SBQwBnCbugCxwCOEvY
+ BV3gEMBZwi7oAocAzhJ2QRc4BHCWsAu6wCGAs4Rd0AUOAZwl7IIucAjgLGEXdIFDAGcJ
+ u6ALHAI4S9gFXeAQwFnCLugChwDOEnZBFzgEcJawC7rAIYCzhF3QBQ4BnCXsgi5wCOAs
+ YRd0gUMAZwm7oAscAjhL2AVd4BDAWcIu6AKHAM4SdkEXOARwlrALusAhgLOEXdAFDgGc
+ JeyCLnAI4CxhF3SBQwBnCbugCxwCOEvYBV3gEMBZwi7oAocAzhJ2geMinA7bwssmtdiP
+ 05LZ48v2cBZGODt/gyXRSy4EXcjWv3QxaAnP2enC8S5ag2kYMQx5QqIo9PvN8yPHVH98
+ RcVUc/+wenvvBwvKkOYiihbB5P6memgntlwk9gqVevfhcU4ZslwsVcwfx3f1s8KeselC
+ 0a2DUu3L0A/mC54sAvPAH7RrpZylKxvfUUo8lfWq9b9H/vfHgCeHwOP3ybBTry5f3fFN
+ FzHVyORLotHpfxs/THgyCDyMR/edv8QfB5mtr6hYTIkn94t/Xlw3O3fdHk8Gge7d1+bV
+ Ramwv5NFLKbqKafwviI+XdcbPBkE6tefROV9wUnpm2/u1YtD0fSUnTs8KZXPKjwZBM7K
+ pZNizl6q2HpbrGWoumnZbi7/tsCTQeBtPufalvmMimUZatwwU1ZmjyeHQMZKmbr2tIr1
+ 71tF1eK6wZNFQI+/ZOI/HYqiqDwZBJakn7wo1g74hwRIgARIgARI4H9C4F8GkUfiCmVu
+ ZHN0cmVhbQplbmRvYmoKMzggMCBvYmoKMTE5OAplbmRvYmoKMzMgMCBvYmoKPDwgL0xl
+ bmd0aCAzNCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAz
+ OTYgL0hlaWdodCAxNTIgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0ludGVycG9sYXRl
+ IHRydWUgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
+ dHJlYW0KeAHtlltX2mgYRnMgIUAwBooIGm2HQWnRz7VolUGBGUaQQ5FDTSDz//9IA70o
+ oM7NLL/1zOrzXnhpnrU3m6AoPBIgARIgARIgARIggf9OQNU0nSeLgKaprylTNd0w41aC
+ J4eAFTdj+ss6VN2wUmnHzfDkEHCddMoy9Bfa0HQz5WTzxWPvhCeDgHdczGedlPlchqrH
+ 7WzxffnThRBXvLcnIMTFx/JpIWvHd2Woumm/887EdaPZavNkEGg1G1/EmffO3i1DM1JZ
+ r1K76/T6gyFPBoFBv9e5rVW8TNLQtn5O6ZZTOKu1el8n09mcJ4PAbDoZdZu1s8JeXN90
+ ocZS2ffirjee+0Gw4MkgEAT+fNy9FafZZGzzt5RmpvPl685oHiyXYRj+w3trAhHl5TKY
+ jzpfygdpc8tF3Cl+avQm/soEXby1iPX/X9nwH3uNj0UnvvnC0C33+KLZnwasQoqH1UNW
+ LoJp/656tG9tuUi4nmgNZgGjkOZiJSOYDVqXnmttvrz1ROZEtIfzyIW8LXxS5GLYFl4m
+ seviii5kfzr+1cVC9ppf/HmL+etd0IXcD8faxcnL31F0QRdyCeA8jV3QBQ4BnCXsgi5w
+ COAsYRd0gUMAZwm7oAscAjhL2AVd4BDAWcIu6AKHAM4SdkEXOARwlrALusAhgLOEXdAF
+ DgGcJeyCLnAI4CxhF3SBQwBnCbugCxwCOEvYBV3gEMBZwi7oAocAzhJ2QRc4BHCWsAu6
+ wCGAs4Rd0AUOAZwl7IIucAjgLGEXdIFDAGcJu6ALHAI4S9gFXeAQwFnCLugChwDOEnZB
+ FzgEcJawC7rAIYCzhF3QBQ4BnCXsgi5wCOAsYRd0gUMAZwm7oAscAjhL2AVd4BDAWcIu
+ 6AKHAM4SdkEXOARwlrALusAhgLOEXdAFDgGcJeyCLnAI4CxhF3SBQwBnCbugCxwCOEvY
+ BV3gEMBZwi7oAocAzhJ2QRc4BHCWsAu6wCGAs4Rd0AUOAZwl7IIucAjgLGEXdIFDAGcJ
+ u6ALHAI4S9gFXeAQwFnCLugChwDOEnZBFzgEcJawC7rAIYCzhF3QBQ4BnCXsgi5wCOAs
+ YRd0gUMAZwm7oAscAjhL2AVd4BDAWcIucFwEs2FbeJmErvw8PZE5uWoP50GIs/MXWBK+
+ 5kLQhWz9kYtBS3juTheud9kazIKQYcgTEobBtN+8OHYt7edXlKJZ+0fVu4epv6QMaS7C
+ cOlPHm6rR058y0V8r1Cpdx+fFpQhy0WkYvE0vq+fF/bMTReqYR+Uan8Op/5iyZNFYOFP
+ B+1aKWcb6sZ3lBpLZrxq/e/R9NuTz5ND4OnbZNipV6NXd2zThaKZ6XxJNDr9r+PHCU8G
+ gcfx6KHzh/jtIL31FaUoaiyxX/z98qbZue/2eDIIdO//al5flgr7O1koimYk3cKHivh8
+ U2/wZBCo33wWlQ+HbtLYfHOvXhyqbiSd3NFpqXxe4ckgcF4unRZzTqRi622xlqEZlu1k
+ c/nDAk8GgcN8LuvY1gsqojK0mGkl7fQeTw6BtJ20DP15Fevft6qmxwyTJ4uAEXvNxA8d
+ qqpqPBkEItLPXhRrB/xDAiRAAiRAAiTwPyHwHSF9R+AKZW5kc3RyZWFtCmVuZG9iagoz
+ NCAwIG9iagoxMTk5CmVuZG9iagozNSAwIG9iago8PCAvTGVuZ3RoIDM2IDAgUiAvVHlw
+ ZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDM5NiAvSGVpZ2h0IDIwNCAv
+ Q29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNv
+ bXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae2de0PaPBSH
+ X1AQFBVR8YI6mU7nfbp5mYp3hvOC4m3b9/8i70matGmptS2nbVriP0KhoZyHcMnTX/Lf
+ f+pPVUBVQFVAVUBVQFVAVUBVQFVAVSDaCqTSPeQvnYr2MNSjA4hMNpfP53PZjMIR5esB
+ SGRzA0PFUqlUHBrIKRqRwUile7P5QnFssjI7N1uZHCsW8tle9VYVAQ9KYnCkXKkurW1s
+ bqwuVSvlEUUjQhIzC6vfdg+Pa8eHu1srCzPlkUHVN8LFofWJ0sTswur2Qe2i3rhu1C9q
+ +9urC7OKRqgoCIn+QSCxuLbz8+Tq+q75+PjYvLu+OjkgNCZKqm+ExANI9OkkTq9+3z8+
+ vby+vr48Pd7/vjr5ubO2SGj0q0/xwHlQEkOlybnF9Z2fp3Ug8fz69of8vb0+ExqnjMZQ
+ f5/6ThUkjlQP9Imh0cm5L+vfD0/rN/ctSuIv+eM06qc/v69/mZscVTQCRMFITH0iJM7M
+ JHQarfub+tmhQaNHDY3gI0n1ZPoGhkanPi1t/CAkmkKf+Pfvn9E3Wk1G49MU6RsZRQMZ
+ BiUxPEZJHJ3/spIAGBYa54c/NpYIjQFFA5NFipGYnoc+ASRum60X8olN+wLBwP5MfePX
+ +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
+ o3P5p+umx6fnl+cnqidkngRQ/sr6OUJz1uzq+vb+/v72GhJFXZHt8lOxIPeBoRGWNVvb
+ OaidX11dndfI1HPdke0KsrJ+2qY0aNZsdevH/sH+j63VBaXs/FQSYx8ybAjyr1yZX1xe
+ Xl6cr5TjMQkgxnOXrw1tELc4Wp6cmiyPkvVYwloZR75aRH9EhEauvzA4NFjozykSEQOB
+ oZHeTDabzfTGb+q5iEsXxMOnUul0Wp2eHERpVZuqAqoCqgKqAqoCqgKqAvGowP/fTSIY
+ CmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKNDE0MQplbmRvYmoKMjMgMCBvYmoKPDwg
+ L1R5cGUgL0V4dEdTdGF0ZSAvY2EgMC42NSA+PgplbmRvYmoKMjQgMCBvYmoKPDwgL1R5
+ cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgplbmRvYmoKMjUgMCBvYmoKPDwgL1R5cGUgL0V4
+ dEdTdGF0ZSAvY2EgMC43ID4+CmVuZG9iagoyNiAwIG9iago8PCAvVHlwZSAvRXh0R1N0
+ YXRlIC9DQSAwLjcgPj4KZW5kb2JqCjM5IDAgb2JqCjw8IC9MZW5ndGggNDAgMCBSIC9O
+ IDEgL0FsdGVybmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
+ dHJlYW0KeAGFUk9IFFEc/s02EoSIQYV4iHcKCZUprKyg2nZ1WZVtW5XSohhn37qjszPT
+ m9k1xZMEXaI8dQ+iY3Ts0KGbl6LArEvXIKkgCDx16PvN7OoohG95O9/7/f1+33tEbZ2m
+ 7zspQVRzQ5UrpaduTk2Lgx8pRR3UTlimFfjpYnGMseu5kr+719Zn0tiy3se1dvv2PbWV
+ ZWAh6i22txD6IZFmAB+ZnyhlgLPAHZav2D4BPFgOrBrwI6IDD5q5MNPRnHSlsi2RU+ai
+ KCqvYjtJrvv5uca+i7WJg/5cj2bWjr2z6qrRTNS090ShvA+uRBnPX1T2bDUUpw3jnEhD
+ GinyrtXfK0zHEZErEEoGUjVkuZ9qTp114HUYu126k+P49hClPslgqIm16bKZHYV9AHYq
+ y+wQ8AXo8bJiD+eBe2H/W1HDk8AnYT9kh3nWrR/2F65T4HuEPTXgzhSuxfHaih9eLQFD
+ 91QjaIxzTcTT1zlzpIjvMdQZmPdGOaYLMXeWqhM3gDthH1mqZgqxXfuu6iXuewJ30+M7
+ 0Zs5C1ygHElysRXZFNA8CVgUfYuwSQ48Ps4eVeB3qJjAHLmJ3M0o9x7VERtno1KBVnqN
+ V8ZP47nxxfhlbBjPgH6sdtd7fP/p4xV117Y+PPmNetw5rr2dG1VhVnFlC93/xzKEj9kn
+ OabB06FZWGvYduQPmsxMsAwoxH8FPpf6khNV3NXu7bhFEsxQPixsJbpLVG4p1Oo9g0qs
+ HCvYAHZwksQsWhy4U2u6OXh32CJ6bflNV7Lrhv769nr72vIebcqoKSgTzbNEZpSxW6Pk
+ 3Xjb/WaREZ84Or7nvYpayf5JRRA/hTlaKvIUVfRWUNbEb2cOfhu2flw/pef1Qf08CT2t
+ n9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKgioMz1E5UY40D4inx8rRbZJH9D0AZ/WYKZW5k
+ c3RyZWFtCmVuZG9iago0MCAwIG9iago3MDQKZW5kb2JqCjE2IDAgb2JqClsgL0lDQ0Jh
+ c2VkIDM5IDAgUiBdCmVuZG9iago0MSAwIG9iago8PCAvTGVuZ3RoIDQyIDAgUiAvTiAz
+ IC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
+ YW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvu
+ JrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8A
+ DXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3
+ rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1
+ Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5O
+ s94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3x
+ mK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0M
+ GgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJx
+ lEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5as
+ eXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXW
+ c62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3H
+ CJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3
+ iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6
+ HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0pl
+ k/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9iago0MiAwIG9i
+ ago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFzZWQgNDEgMCBSIF0KZW5kb2JqCjQz
+ IDAgb2JqCjw8IC9MZW5ndGggNDQgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdC
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVUz2sTQRT+Nm6p0CIIWmsO
+ sniQIklZq2hF1Db9EWJrDNsftkWQZDNJ1m426+4mtaWI5OLRKt5F7aEH/4AeevBkL0qF
+ WkUo3qsoYqEXLfHNbky2perAzn7z3jfvfW923wANctI09YAE5A3HUqIRaWx8Qmr8iACO
+ oglBNCVV2+xOJAZBg3P5e+fYeg+BW1bDe/t3snetmtK2mgeE/UDgR5rZKrDvF3EKWRIC
+ iDzfoSnHdAjf49jy7I85Tnl4wbUPKz3EWSJ8QDUtzn9NuFPNJdNAg0g4lPVxUj6c14uU
+ 1x0HaW5mxsgQvU+QprvM7qtioZxO9g6QvZ30fk6z3j7CIcILGa0/RriNnvWM1T/iYeGk
+ 5sSGPRwYNfT4YBW3Gqn4NcIUXxBNJ6JUcdkuDfGYrv1W8kqCcJA4ymRhgHNaSE/XTG74
+ uocFfSbXE6/id1ZR4XmPE2fe1N3vRdoCrzAOHQwaDJoNSFAQRQRhmLBQQIY8GjE0snI/
+ I6sGG5N7MnUkart0YkSxQXs23D23UaTdPP4oInGUQ7UIkvxB/iqvyU/lefnLXLDYVveU
+ rZuauvLgO8XlmbkaHtfTyONzTV58ldR2k1dHlqx5erya7Bo/7FeXMeaCNY/Ec7D78S1f
+ lcyXKYwUxeNV8+pLhHVaMTffn2x/Oz3iLs8utdZzrYmLN1abl2f9akj77qq8k+ZV+U9e
+ 9fH8Z83EY+IpMSZ2iuchiZfFLvGS2EurC+JgbccInZWGKdJtkfok1WBgmrz1L10/W3i9
+ Rn8M9VGUGczSVIn3f8IqZDSduQ5v+o/bx/wX5PeK558oAi9s4MiZum1Tce8QoWWlbnOu
+ Ahe/0X3wtm5ro344/ARYPKsWrVI1nyC8ARx2h3oe6CmY05aWzTlShyyfk7rpymJSzFDb
+ Q1JS1yXXZUsWs5lVYul22JnTHW4coTlC98SnSmWT+q/xEbD9sFL5+axS2X5OGtaBl/pv
+ wLz9RQplbmRzdHJlYW0KZW5kb2JqCjQ0IDAgb2JqCjczNwplbmRvYmoKMjcgMCBvYmoK
+ WyAvSUNDQmFzZWQgNDMgMCBSIF0KZW5kb2JqCjQ1IDAgb2JqCjw8IC9MZW5ndGggNDYg
+ MCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
+ ID4+CnN0cmVhbQp4AdV5Z1gUy7N3z2xedpec05JzzjmDJIkSlZwzSw4iICBBQUARAUVB
+ RUQFUaIkUVDEg4iCCgaCSBAVA4KC8g56zvnf97n3fnu/vP082/ubqurqmqnunqoaADhX
+ vKOiwmAGAMIjYmn2ZoZUF1c3Km4KEAEPoAe8QNHbNybKwNbWCvyv7dsEgHaYj2V2dP2v
+ Yv8zg9HPP8YXAMgWYfv4xfiGI/gGALChbxQtFgDUBkIfTYiNQjD6HoJZaIiBCH6xgwP/
+ 4NUd7PMbY9C/ZRztjQDAcACAJ3l70wIBIAsjdGq8byCih2wMAJYpwi84AgBmFwTr+gZ5
+ +wHAWY7ISIeHR+7gOwgW9/kvegL/C/b29vlXp7d34L/4z70gI5GJjYNjosK8k35f/L/s
+ wsPikOf1uzEhPSkibPeOb9iQ36Kft7El8s+D/H5Fhf32GSIDcflH7HFAaDtYOsJnt83f
+ WDeAZmqPYGQsZBsVa7iDkWcGBUTF2jr+TU9LDjLajWASQj/mH2Pyj54zId4WOz6jIPRm
+ Wpz9HgQLI7gvJt7BBMHIioLeJAc5Ov8t89XP3/hvOgwHBJua/5GBmYJjzXfmYkF8Lhga
+ abljAzIXrAosQRjwB3GAhvQRQAZYASNg/HcvAwKAN8KJR3gxIBS8RXA4MiISGROJYOrf
+ ckb/jWL6e1wgMu7/1kgFvohs3L9z/pmNisz5j85g4Ifgf+jeyBw7vB3rYjyDM/8z5z8S
+ O/p+WyPfIL8kv/WPTWhRtCJaBW2I1kHrojUAFc2G5gIyaGW0OtoArYfWQngawBS8QTQH
+ /mPjjv7w5oD48sgkTacghLtz7z7/cIHTb+ngf6//mwUgeGSlbeUfCwCI9U9E9gEARpFR
+ SbTgwKBYqgGyc/2lqeYRvrLSVEV5BYUd9v83befM+mPsF/vfZxHE9vA/tEjkZjR2zpiD
+ /6F5fQCgLQTZpkz/oYm2AUCvCMDQCd84WvwffeidPwxyGtIjK5QT8AEhII48Z0WgCrSA
+ PjABFsAGOAJX4IGsnyBkDdJAAkgFGSAHFICj4DioANWgFlwEV0AzaANd4BYYBMNgFIyD
+ KTAN5sE7sAq+gU0IgnAQGWKGOCF+SASSghQhdUgXMoGsIHvIFfKCAqEIKA5KhQ5CBVAJ
+ VAGdheqha1AHdAsagh5Bz6EZaAn6DP2AUTAJZoF5YVFYDlaHDWBL2BHeBwfC0XAynAUX
+ wuVwDXwZboVvwcPwODwNv4PXUABFh2JDCaBkUOooI5QNyg0VgKKh0lD5qDJUDeoqqhN1
+ F/UYNY1aQX1HY9HMaCpaBlmnu9B70L7oaHQa+jC6An0R3Yq+g36MnkGvon9hyBgejBRG
+ E2OOccEEYhIwOZgyzAVMC2YAM46Zx3zDYrFsWDGsGnYX1hUbgk3BHsaewjZi+7CPsHPY
+ NRwOx4mTwungbHDeuFhcDu4k7jKuFzeGm8dt4Onw/HhFvCneDR+Bz8SX4S/he/Bj+AX8
+ JoGBIELQJNgQ/AhJhCLCOUIn4SFhnrBJZCSKEXWIjsQQYgaxnHiVOEB8QfxCR0cnSKdB
+ Z0cXTJdOV07XRHePbobuO4mJJEkyIu0lxZEKSXWkPtJz0hcymSxK1ie7kWPJheR68m3y
+ K/IGhZkiSzGn+FEOUCoprZQxygd6Ar0IvQG9B30yfRn9dfqH9CsMBAZRBiMGb4Y0hkqG
+ DoanDGuMzIwKjDaM4YyHGS8xDjEuMuGYRJlMmPyYsphqmW4zzTGjmIWYjZh9mQ8yn2Me
+ YJ5nwbKIsZizhLAUsFxhGWFZZWViVWZ1Yk1krWTtZp1mQ7GJspmzhbEVsTWzTbD9YOdl
+ N2D3Z89jv8o+xr7Owc2hz+HPkc/RyDHO8YOTymnCGcpZzNnG+ZILzSXJZceVwHWaa4Br
+ hZuFW4vblzufu5l7kgfmkeSx50nhqeV5wLPGy8drxhvFe5L3Nu8KHxufPl8I3zG+Hr4l
+ fmZ+Xf5g/mP8vfzLVFaqATWMWk69Q10V4BHYJRAncFZgRGBTUExwj2CmYKPgSyGikLpQ
+ gNAxoX6hVWF+YWvhVOEG4UkRgoi6SJDICZG7IuuiYqLOoodE20QXxTjEzMWSxRrEXoiT
+ xfXEo8VrxJ9IYCXUJUIlTkmMSsKSKpJBkpWSD6VgKVWpYKlTUo+kMdIa0hHSNdJPZUgy
+ BjLxMg0yM7JsslaymbJtsh/khOXc5Irl7sr9kleRD5M/Jz+lwKRgoZCp0KnwWVFS0Vex
+ UvGJElnJVOmAUrvSJ2UpZX/l08rPVJhVrFUOqfSr/FRVU6WpXlVdUhNW81KrUnuqzqJu
+ q35Y/Z4GRsNQ44BGl8Z3TVXNWM1mzY9aMlqhWpe0FrXFtP21z2nP6QjqeOuc1ZnWpep6
+ 6Z7RndYT0PPWq9Gb1RfS99O/oL9gIGEQYnDZ4IOhvCHNsMVw3UjTaL9RnzHK2Mw433jE
+ hMlkj0mFyStTQdNA0wbTVTMVsxSzvl2YXZa7inc9Nec19zWvN1+1ULPYb3HHkmTpYFlh
+ OWslaUWz6rSGrS2sS61f7BbZHbG7zQbYmNuU2ry0FbONtr1ph7Wztau0e2uvYJ9qf9eB
+ 2cHT4ZLDN0dDxyLHqT3ie+L29DvRO+11qndadzZ2LnGedpFz2e8y7MrlGuza7oZzc3K7
+ 4LbmbuJ+3H1+r8renL0T+8T2Je4b8uDyCPPo9qT39Pa87oXxcva65LXlbeNd473mY+5T
+ 5bPqa+R7wvedn77fMb8lfx3/Ev+FAJ2AkoDFQJ3A0sClIL2gsqCVYKPgiuBPIbtCqkPW
+ Q21C60K3w5zDGsPx4V7hHRFMEaERdyL5IhMjH0VJReVETUdrRh+PXqVZ0i7EQDH7Ytpj
+ WZDg8EGceFx23Ey8bnxl/EaCU8L1RMbEiMQHSZJJeUkLyabJ51PQKb4p/akCqRmpM/sN
+ 9p9Ng9J80voPCB3IOjCfbpZ+MYOYEZrxV6Z8Zknm14POBzuzeLPSs+ayzbIbcig5tJyn
+ h7QOVeeic4NzR/KU8k7m/cr3y79fIF9QVrB12Pfw/SMKR8qPbBcGFI4UqRadPoo9GnF0
+ oliv+GIJY0lyyVypdWnrMeqx/GNfj3seHypTLqs+QTwRd2K63Kq8/aTwyaMntyqCKsYr
+ DSsbq3iq8qrWT/mdGjutf/pqNW91QfWPM8Fnnp01O9taI1pTVoutja99e87p3N3z6ufr
+ L3BdKLjwsy6ibvqi/cU79Wr19Zd4LhU1wA1xDUuX914evWJ8pf2qzNWzjWyNBU2gKa5p
+ +ZrXtYlmy+b+6+rXr94QuVHVwtyS3wq1JrWutgW1Tbe7tj/qsOjo79TqbLkpe7OuS6Cr
+ spu1u6iH2JPVs92b3LvWF9W3civw1ly/Z//UbZfbT+7Y3RkZsBy4N2g6ePuuwd3eezr3
+ uoY0hzruq99vG1Ydbn2g8qDlL5W/WkZUR1ofqj1sH9UY7Xyk/ahnTG/s1mPjx4NPzJ8M
+ j+8efzSxZ+LZ071Pp5/5PVt8Hvb802T85OZU+gvMi/yXDC/LXvG8qnkt8bpxWnW6e8Z4
+ 5sGsw+zUnO/cuzcxb7bms96S35Yt8C/ULyoudi2ZLo0uuy/Pv4t6t7mS857xfdUH8Q83
+ Pup/fLDqsjr/ifZp+/PhL5xf6r4qf+1fs1179S382+Z6/gbnxsXv6t/v/nD+sbCZsIXb
+ Kv8p8bPzl+WvF9vh29tR3jTv37EACunhgAAAPtchOYQrkjuMAkCk/Mkpfksg6QqEyCAY
+ h0QKFkgEMAdJIu/tPpgTjoUnUeao22gz9BNMOJYR249LxesScISXxA66KlIRuY7ygoGB
+ 0ZIpj3mIlZFtL/tlTjSXN3c3L5XvMP+GgJ/gpPBukSExOfFCiXdS5tLVMt/kjOSPKIwq
+ kZUNVWJUq9T61Kc1fmqxa0vpaOia6Nnr+xrEGGYZnTBuMOk1fWy2tGvbgtVS2srI2n13
+ sE28bbZdiX21Q4NjG7Lrh53HXJ67vnabc1/c+37foscLzxGvXu9Gn9O+R/yS/QMC7AK1
+ goSDKcHfQl6HDobVhx+JiIp0iFKL5oreor2K6YutjcuOD0gwT5RKIiYtJz9IaUot35+V
+ lnAgOp2WkZyZf/BsVnf260OEXO28qPzagokjxELtovCjp4tHSn4ekz7uXpZ/orV8uoKu
+ UqXK81Te6ebqqbPoGplap3MHzl+88Khuo556yaoh9XLzlU+Nmk1F1z5ed7/xsNWm7UmH
+ dmfszfquFz10vUp9Trei+7NvF98pGygbLL6be+/g0KH7R4aPPMj+K3bE+aHsw83Rvkcp
+ Y6pj3x4/fdIxXjGx/6nnM8PnIpOEyfdTj160vKx4tf+117TxjMQsw+z3ubdvJuaH3t5a
+ uLnYsdSxfP5d4Ur8e48PJh+lVhlW1z5Nfu75cvZr9lrQN8t1uQ3mjfXvL370bdZsZf30
+ /2W8Lbi9jfgfC7iQ6DARDCARnRV0FHoNKyGx1xeUJ2oCiZpeYqKwFGwbzh/PhZ8kVBED
+ 6QxJOmRHShB9OsMZxltMSyysrMZsSeyNHB+5ZLlpPF18dPxO1EsC20IGwhkivaJb4moS
+ IZKnpIalP8uyyinJ71JwVwxUilZOUtmvmqwWou6uYaWpoyWvLajDqovX/aH3Xn/GYNzw
+ vlGP8XWTOtNys9xdCeZBFq6Wu6zUrcV2s9qgbb7azto9su9zaHI8vSfXKcbZw8XcVcmN
+ 1x3r/gE56bs9aj3zvSK9HX2UfUm+s34d/kUBAYHaQYxBb4NvhhSH+odphtOHz0W0ReZG
+ uUZLIetiJOZMLC3OKJ41fiGhI/FwkkeyfAqc8jS1cX9BWviBPenGGZqZGgd1snZlu+RE
+ HDqUez7vdv5Mwa8jPIUaRU5HY4qPllwuHTr2tgw+wVOuetKuIryyoOryqdHT384InrWt
+ OVjbce7TBdm66Is36tcbNC6nXulpBE0G1w42D9zAtJi15rbd7cB1mtzM7Oru/tor2udw
+ K6X/9O2bd8YHlgbX76GHmO8LDMs90PnLasTtYdBowqOcseOPa540jndNDD2deDb//OsU
+ 6gXLS5FX6q+tpgNnameX3ojNu73NWbi0eHdpZnljhfJe5IPeR/fV9E+jX5S+lq59Wbff
+ uPGDYzN7a+NXwm//owEjkAS7QTroQ+J6TSgWaoNh2Bo+A2+iPFD30droVow6ph9ri53D
+ peC58XcJR4i+dNokbtIv8ixlmL6F4TxjOVMhcy5LNmsOWwF7KUc1ZwNXO3c3TzdvD18v
+ fw/1pkCLYIPQKeECkTjRvWL64oISQGJKsk2qQNpJhiqzLNsily5vqcCmMKPYoBSnrKdC
+ UHmsekotSF1ZfUOjRzNby1KbSXtSp0Y3RE9Rb0t/0KDYcJ+RpNG68W2TIlN3MzGzz7t6
+ zPMtnCwFLN9ZtVqn77ayYbOZsW2wi7HXcoAd7juW7HFzojotOF91iXPVcoPdhtyL9jrs
+ Y9v33KPSc58Xr9dL71M++3x5fCf9yv2dApgDHgYWBJkEA2S9xIcqhK6E1YX7RPBEPI0s
+ jdodjY++RUuOUYpZiT0f5xHPHv8w4VCiXuJGUlNycAo15Xnqsf2OaZxp8wfa049lJGUG
+ HNyb5ZrtnuN/KC43O68s/0JB6+HBI+OF80Vfi1ElzKWCx+SPa5YZnbAotzvpWuFTGVl1
+ 4FTp6cvVw2c+1ojUJp0bvSBWl3Zx4pJMQ9blqasKjblNr5pVrxfceN2q1Hao/UWn0s38
+ rtke7d7yvm/9jrdbBsQGz92TGRoYDv1LeGRl9O7YtSf1E03Pbk2+fAley8/UvclZyF9u
+ +0D/KXeNY6Nly3nH/39qSzvvBKwqAOfnAHA6C4CdOwB1UgCIVCJlE6TeYUsGwFEDwIZF
+ AHp+EkBmV/99f5CBGJLlB4BDSOY4BN5BFEgB2gMlQ6egLmgK2kLyOz3YB86BL8EP4a8o
+ bpQBKgh1FNWBmkXTIfUDLyQja0e/wTBh9DARmLOYcSwRa4BNxDZjV3DiuEBcHW4JL4uP
+ w/cS6AhuhMtEiOhCbKaj0EXQjZHUSWfIeDKN/IpiQemgF6evYCAzZDCsM0Yi+Yov02tm
+ H+YFlnCWb6wZbBS2U+xy7Lc53DnWOIu5FLgecyfw8PKM8h7iM+QH/Leo2QLWgpyCi0I3
+ hYtFQkRNxUTESeJrErOSY1J3pDtlrss2yTXKNyu0K/YpDSu/UvmkhlZn1RDSlNFS0JbX
+ kdSl6jHpw/ofDaYMe41qjHNNIk1dzAx3yZnzWdBboiw3rFatl3fP28zazti9sX/n8MXx
+ pxPBmd1FzFXDzdrdd2/KvuMeTch77L0PxVfJz9X/QEBt4EDQXPDPUKYwgXDJCNlImSiJ
+ aEEaWwwh5kfsUjxXgnViVlJv8q9Uk/2lae/SrTNuHlTO6sgxPzSXd6hA4PDVQv2i6eLi
+ UpfjOifMTyZUDpzmPkOpgWu/n/9c96F+pWHlysfGtWs/b+BbudvlOo27XHuC++L70+6k
+ D+6/F38/7IHXSMFo+9jyuMDTfc+rp96+UpjOmB2fl1rIXVpYMftw6RPDl5S19xsBPxZ+
+ Rv0+P+iBLLBDqlEVoBe8geiQaoA7lIVk/MPQRyS714S94Fy4CX6OQiE5uysqG3UN9RpN
+ Rk6VUHQl+i8k/1bA+GGqEL/TY62wedh7OCLOGleCm8SL4Gn4fgIbIYwwSBQiZhLn6Szo
+ OklSpGoyK/kwBUvJpAf0GQwohlxGCuMJJkGmRmZ95nGWcFYsaw2bAdssew6HDMcEZwaX
+ PNc0dynPLl40bz/fQX5TKok6IVAjGCNkKswnvCEyIdomdkb8hESxZKFUoXSJTIXsBbkW
+ +XsKrxTXlVlVNFV91QrVuzU+aoloe+pU6k7p8xn4GTYabZqYmBaYDZtjLNQsfaxyrC/s
+ vmUzabtqj3Zgc5Tco+/k6hzjUuR61W3E/dM+Ng8dzwCvYu8enw9+Qv4uAUWBg0E/Q5RD
+ g8NOhz+KhKMUo71ohTE3Yxfj6RPUEr2SCpLbUxb2s6eZH9if3pyxfFAoa192Rc6zXPY8
+ 1/zTBW+OyBQmFg0Wc5RElj44Ll9WWU45mVdJqjp+Wqz67tngWtK55gtuF9H1TQ2eVxiu
+ 3m5KbJa7vthS1xbcIdP5uauzJ7PPqp/99txA093UIYthzgejI3sezj1Kfsz3ZGSi4JnD
+ pOgL6OXs68GZhrmiedqCwxL3cvWK2PtrH3VXRz57fvm4lr5Ov3HyB99m9U+uX0W//c8O
+ DEAUUjl6CLYR3wdAJ6EB6AssCNsjNZw2eAWp1bgg+30IjUJqiMnoNvQaRgUTj+nGYrA2
+ 2ErsMk4LdxS3iDfGnyPgCVGEF0QrYh+dGuJpQ9IDsit5mZJGz0rfxGDD8ImxjEmXaYn5
+ FIsDK5n1PlseuxUHE8ck53kuGrcBDzPPO95BvnP8OdRQAUdBAyFFYTERflFuMS5xqoSU
+ pIaUpbS3TKpshVy3/BtFipK2Mk3lqupHdRWNDM0xbXGdLN23+lYGbUZSxudMBcxqzSUs
+ WqyMrZ/ZRNmR7Jsc3ZH92u0a7668d8Ojz+uIj4efagAp8HlwRah52FJEUuRWdCxtPtY2
+ 7noCYyIt6UmKZurZNLoDiekLmS4HH2Qb5nTmKue1FugcHip0LXpXnFbKeKymTO5Ex0nd
+ it4q7VOt1ZgzVmeP17w+J3k+4cLARdb6gEudlylX/K52NbFei2oeviGOZD7v2+062m7y
+ deV0f+h17rvVL3X7+J3twZC7T4b07zc8YPsrZuT+KPejoLHLj5fHhSacn2Y+u/j8/uT8
+ 1NZLhlf8r6WmVWY0Z3Xn9N/oz+u+1VxQW1RYklwWfEd5t7TS8T7hg8qHlY/nV10/ET91
+ fQ74wvCl/eveNbBW883w2+z6gQ2ejY7ve76v/ji8KbbZv+WxtfGz9Jfcr6Ftvx3/xwQo
+ IXVIpEEkQ6T8+Gp7+4soklSUAPCzeHt7s2Z7+2ctkmwg30D6wv58r9gRxiI196prO+h/
+ av8HtPB+jQplbmRzdHJlYW0KZW5kb2JqCjQ2IDAgb2JqCjU5NjMKZW5kb2JqCjMyIDAg
+ b2JqClsgL0lDQ0Jhc2VkIDQ1IDAgUiBdCmVuZG9iago0IDAgb2JqCjw8IC9UeXBlIC9Q
+ YWdlcyAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvQ291bnQgMSAvS2lkcyBbIDMgMCBS
+ IF0gPj4KZW5kb2JqCjQ3IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9PdXRsaW5lcyAy
+ IDAgUiAvUGFnZXMgNCAwIFIgL1ZlcnNpb24gLzEuNCA+PgplbmRvYmoKMzEgMCBvYmoK
+ PDwgL0xlbmd0aCA0OCAwIFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5j
+ dGlvblR5cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBd
+ IC9Eb21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2
+ NQpdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AaXChVJCUQBAwb+2u7u7
+ sekGFQMDW7ED61OOMTL48MWNnU1+kLSY+OD7u+L4O8XfiAuPvWH3lZjt6CsSX4gaR15Q
+ nCOSI6w9lCP0rD74jOETQZmBJ+w+ErDtf0T0A/5/fQ+ovMf303uPZs8dOt13GN7ilrl6
+ i+UbVp2u3CD0mhWzy9dIv2I5f+kKzYtZdC5kKbxkQfL8JeYvmBfoukDoOS6zc+dIP2Mu
+ f/YMrafM6J0+5fcJ0/KnTjB/zJTAyWOcHzFpceIIuYdM/Dl+iPoM4xnG9I5m+H3AqPyR
+ A0zuMyJ2eB+HewxbH9pD4i5DxoO7qE8zmGZAb3+a7zuK+3Yovk2f8N5tHG7Ra71nC4mb
+ 9Bh3b6I4RffPrhQ6O1N0bqjv2KD4Oh3C29exu0a77bY1RCdp+7c1icoErfktCXQ2J2iO
+ q2+KYxijSWZjDMtRGp02RBEaocFsfQSVYerz68LorA2hsyZEYZAaydVBLAeodloVQKif
+ KrOVfqT7qPyzwod6L+V6y7wUeiiTXOrBvJtSgSVuvn4CXuWIVQplbmRzdHJlYW0KZW5k
+ b2JqCjQ4IDAgb2JqCjQxMAplbmRvYmoKMzAgMCBvYmoKPDwgL0xlbmd0aCA0OSAwIFIg
+ L09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0c1Bl
+ clNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEgXSAv
+ UmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0ZsYXRl
+ RGVjb2RlID4+CnN0cmVhbQp4AaXChVJCUQBAwb+2u7u7sekGFQMDW7ED61OOMTL48MWN
+ nU1+kLSY+OD7u+L4O8XfiAuPvWH3lZjt6CsSX4gaR15QnCOSI6w9lCP0rD74jOETQZmB
+ J+w+ErDtf0T0A/5/fQ+ovMf303uPZs8dOt13GN7ilrl6i+UbVp2u3CD0mhWzy9dIv2I5
+ f+kKzYtZdC5kKbxkQfL8JeYvmBfoukDoOS6zc+dIP2Muf/YMrafM6J0+5fcJ0/KnTjB/
+ zJTAyWOcHzFpceIIuYdM/Dl+iPoM4xnG9I5m+H3AqPyRA0zuMyJ2eB+HewxbH9pD4i5D
+ xoO7qE8zmGZAb3+a7zuK+3Yovk2f8N5tHG7Ra71nC4mb9Bh3b6I4RffPrhQ6O1N0bqjv
+ 2KD4Oh3C29exu0a77bY1RCdp+7c1icoErfktCXQ2J2iOq2+KYxijSWZjDMtRGp02RBEa
+ ocFsfQSVYerz68LorA2hsyZEYZAaydVBLAeodloVQKifKrOVfqT7qPyzwod6L+V6y7wU
+ eiiTXOrBvJtSgSVuvn4CXuWIVQplbmRzdHJlYW0KZW5kb2JqCjQ5IDAgb2JqCjQxMApl
+ bmRvYmoKMjkgMCBvYmoKPDwgL0xlbmd0aCA1MCAwIFIgL09yZGVyIDEgL0VuY29kZSBb
+ IDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNvZGUg
+ WyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAg
+ MSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+ AaXChVJCUQBAwb+2u7u7sekGFQMDW7ED61OOMTL48MWNnU1+kLSY+OD7u+L4O8XfiAuP
+ vWH3lZjt6CsSX4gaR15QnCOSI6w9lCP0rD74jOETQZmBJ+w+ErDtf0T0A/5/fQ+ovMf3
+ 03uPZs8dOt13GN7ilrl6i+UbVp2u3CD0mhWzy9dIv2I5f+kKzYtZdC5kKbxkQfL8JeYv
+ mBfoukDoOS6zc+dIP2Muf/YMrafM6J0+5fcJ0/KnTjB/zJTAyWOcHzFpceIIuYdM/Dl+
+ iPoM4xnG9I5m+H3AqPyRA0zuMyJ2eB+HewxbH9pD4i5DxoO7qE8zmGZAb3+a7zuK+3Yo
+ vk2f8N5tHG7Ra71nC4mb9Bh3b6I4RffPrhQ6O1N0bqjv2KD4Oh3C29exu0a77bY1RCdp
+ +7c1icoErfktCXQ2J2iOq2+KYxijSWZjDMtRGp02RBEaocFsfQSVYerz68LorA2hsyZE
+ YZAaydVBLAeodloVQKifKrOVfqT7qPyzwod6L+V6y7wUeiiTXOrBvJtSgSVuvn4CXuWI
+ VQplbmRzdHJlYW0KZW5kb2JqCjUwIDAgb2JqCjQxMAplbmRvYmoKMjggMCBvYmoKPDwg
+ L0xlbmd0aCA1MSAwIFIgL09yZGVyIDEgL0VuY29kZSBbIDAgMTM2NCBdIC9GdW5jdGlv
+ blR5cGUgMCAvQml0c1BlclNhbXBsZQo4IC9EZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9E
+ b21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9TaXplIFsgMTM2NQpd
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AaXChVJCUQBAwb+2u7u7sekG
+ FQMDW7ED61OOMTL48MWNnU1+kLSY+OD7u+L4O8XfiAuPvWH3lZjt6CsSX4gaR15QnCOS
+ I6w9lCP0rD74jOETQZmBJ+w+ErDtf0T0A/5/fQ+ovMf303uPZs8dOt13GN7ilrl6i+Ub
+ Vp2u3CD0mhWzy9dIv2I5f+kKzYtZdC5kKbxkQfL8JeYvmBfoukDoOS6zc+dIP2Muf/YM
+ rafM6J0+5fcJ0/KnTjB/zJTAyWOcHzFpceIIuYdM/Dl+iPoM4xnG9I5m+H3AqPyRA0zu
+ MyJ2eB+HewxbH9pD4i5DxoO7qE8zmGZAb3+a7zuK+3Yovk2f8N5tHG7Ra71nC4mb9Bh3
+ b6I4RffPrhQ6O1N0bqjv2KD4Oh3C29exu0a77bY1RCdp+7c1icoErfktCXQ2J2iOq2+K
+ YxijSWZjDMtRGp02RBEaocFsfQSVYerz68LorA2hsyZEYZAaydVBLAeodloVQKifKrOV
+ fqT7qPyzwod6L+V6y7wUeiiTXOrBvJtSgSVuvn4CXuWIVQplbmRzdHJlYW0KZW5kb2Jq
+ CjUxIDAgb2JqCjQxMAplbmRvYmoKMiAwIG9iago8PCAvTGFzdCA1MiAwIFIgL0ZpcnN0
+ IDUzIDAgUiA+PgplbmRvYmoKNTMgMCBvYmoKPDwgL1BhcmVudCA1NCAwIFIgL0NvdW50
+ IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzMzIDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+
+ PgplbmRvYmoKNTQgMCBvYmoKPDwgPj4KZW5kb2JqCjUyIDAgb2JqCjw8IC9QYXJlbnQg
+ NTQgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDczMyAwIF0gL1RpdGxl
+ IChDYW52YXMgMSkKPj4KZW5kb2JqCjU1IDAgb2JqCjw8IC9MZW5ndGggNTYgMCBSIC9M
+ ZW5ndGgxIDEzODcyIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ad17eXQU
+ Vdb4e7V2Vy/pfcvS3elOOmRfOwQCqYRskAQCCZBgIgkQBGRJMAYBwQhoIKCgo4LIjBs6
+ yoxOExxsRPz4MXHc4PeJ4jAq6ucYFZfo6ERQSFd/91WHCDlz5njOb8788evKrfdevVf1
+ 7rv3vrtVpXP1zW1Ig7oRjWrntbYvRvIvR40Q7V24orU90jZ2IoQfWNjV6Yq02STov3Nx
+ +w0rIm1FACHBe8PytSP3m1sQitUtaWtdFOlHw1D6l8CFSBvnQuldsqLzlkjbcAbKR5av
+ WjjSb4b50awVrbeMzI/OQdu1snVFW2R89gCUSe2rbgK8yC+bjOtsX902Mh43AH7/jTBc
+ TULLkBItRwpEIR0cTQjx5wUvYqCX9AMUp81+ZH5U4Q9Ir4ALCD3mS+8m5Z/dL/508dyw
+ T7VRWQ7jlPJ40gH3cOOkcQipMfS/r9o42kN6yS8piGalBFElwGSAXIDklIMK8QW8C5ma
+ h0QldjJI5fyr/ZuXcDrQ/zP5HMDpolqDlAs3FzoXbt5cOa5YiatQPoORE5chr1yW9nl/
+ 5wziyX1eDxSTIgXVlx8LLSQq873OUP4C53B+UIHFaOeP3l85LwJc8BY5f/BmOU/DuDfz
+ K5yniqG/z/lGcpCC4nVvkMFilPNV7+3OP+aPcz6XP9HZ54Nrfc6DxVAcdu7Pv935+Bb5
+ ymPJcvGoN4j39jkfIcVh58Pw/Ac2yx33R27cFCnat8gTrTokFysPBanfHXau8CY6F8CN
+ WFQ5m73LnU3eAmd9cRAn9DlryG2HndW+U84qMnWfU4xM5I88Pc8rY5wdmTbVe9SZFJkh
+ nowWjU6Xt9oZC89PfeQBZ6r3emdxchA/9XxlUrK30veAP4iH5DlIAYiSYmWkWOg7hn+L
+ KtA4PA8l4AcPVY4DnPGuPudmKPYeqkzKTwjS50WD85Cv0rcFwA+QADA7iOvFVH43v4if
+ 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
+ MxxRHja8YtBG8VECJUSB16NArJanaIPA01o9orQKWmGCNVAM7aMMURqtL8punAVLmK4b
+ Ap/Prjt3zhYq1I1YxELw+8A7wLAFiaNAtl0HKMxmmYi5ftAH2GQxE3JiZgU+Kn1MSV9I
+ 70hfUdLH+DhWEweR/jTloeTLKcw7yQ+lDEezJy6vJbQFWrCl7MtyNDFXzFBQcymK4njM
+ JxswpiheIdCYgjeWgoA5BeVjHWqQRaVdpT7uJsiChxpxUGtkjxFoDogWGgoKiN+i69nQ
+ L5teN/AAMIO/3XgKVYWd0snQk4DjAsDiMsNemsxYL38BSACHJ4Y/ZMYz88FXK0ATQPvO
+ mEjl+dfibZj5axxO/MdnyZ97tBoW3loZHSmQ+2cS0xPTk8kFJloVH21JneDkkwVVarZq
+ grEG1aRPyEuenOgodNREpylq8uwTC1/EdrDrlfhZ4usC8oNDsm4b0Bec+vRTebeDg31K
+ dsVgFUDviFuWEtn8YGujMOg3edf7831XNNyoSQbTBD5yHLaa3enYByM98Yl5uaAfjNSH
+ 0fmZ4jxfycwJTQ/Rz8yIn9Q8ry05TpAGlRUd2Hho+3aKjomRXgfrMbGmqfO+//PQ7Cfa
+ KYPerFTrrL5ZU4uX7/xWiHLkT8nJTija2bSrouJlSZ07bXySJtk9IUFMy3v6odfmZZkx
+ +YAC+Lo+/Amzjz0OMu5CJWKC0qXSGtTI7jXwKsHlZVXmLZQjPtYpODU+ld0dv8ddO32E
+ m0MDIwpjEFRGkR5IQaTNQExuPJhcM3BSD+vOMUTsNLgjhBr00//4+9meWVkF0hc4xl9c
+ syZhXVzBgw9NiLv1Nmae9PoPktTnd9VuY4+HhqqTsoc7++7prN51V9WaHcEIvhXh95hc
+ 4DuJL1eKZQ9anrJQPTF4qrnBsMRwi7DWEDS/YnzVrLBRHBP7FuONc/AWraDWPa/2mlRx
+ On+UE/njrLEOl8JvtTtdPe7KkfXI7NUXhIZkXT4I9rWgqHBQLglPO8DvkDU5WYbsfYAq
+ 5zm3i8rTITBpVkzrFO7Mtl15MTE5dy2qV2KPUH+n9JP004/Y8N0pzNqkaOropKySndUb
+ b5m6dfmcTZ1HwQJjOx4f/ALvl3lRBDLdBrzQwepmiKnn1Rgmi6V0NLJ6dTwnxHoFlZl2
+ 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
+ ORUKn0GpJFWNYFYDnTheiZxUqtGpizLxFqCRFt7hgIwcgg4BSlFtvFdhbzNbRmk2VDNg
+ Gwb6EIiQDsSmqGYgNAAOg5zZAM1EErMsCNCsW9a9nDMiQKRO0jMZV4TIiS0ka+2TqYMp
+ kgnw4YPe5GqHPYWR2vGkbz6G1xu9yzceS0xPx5tOU5Rg0C9XM6uHz9Hey29Kr9+Pac5E
+ 7C68J2bmyjlcHqzZMrG4mqqma7RNVBPdrOVUTq1XcLowfRCGcSZ7U7SBs/BCPKyWdWIf
+ j0y9gkXvszpj7rWDjYOVjviwEEoUnhn4sDA0EBEReXtANAEeLSyXcJc4jyTejwQWJBU/
+ JrKgJ2IrCfilASnkjzUlRk+JoyJhRk3ZGfYNabj38p/Y0wx1HuNpM0wjwcazs2sjdoWc
+ UZh8efvPfvCfJbB2FbwZ14C/qB99Hx0Pb5t98N8cqRCjZMF3xWWoHL7hrURT4QP5Kvja
+ eQZ4fTPRLFQPXwnPQXPh295GdB18WXxcngSDH4nlGkdit+Lihil1lSmVbcu72jqXLmxN
+ K1m1fBHR81d+T0HlOYB+AJJaGQAYggEMADAHewFyAUoB6gEWAXQCbAG4D2A/wHMA/QBn
+ AAYAhsCoMgAmAC9ALkApQD3AIoBOgC0A9wHsB3gOoB/gDMAAwBAQhgEwhUd+gBMarWOQ
+ kWvbhJJX98P/q1zTTh7TTh3TlkPdq56fNaY/e0w7Z0w7d0y7aExbdjOuen7pmP6yMe2p
+ Y9o1Y9rTx7Rbx7QXjGkvHNNeNKYty+dV+C0e03/DmPaSMe2lY9rLx7Tl/5266vkrx/Sv
+ GtPuGNNePaZ905h255j2zWPaXWPa8v9iXYUPJIqvlpfL8u74X4s5Q8oKZW5kc3RyZWFt
+ CmVuZG9iago1NiAwIG9iago5MTc3CmVuZG9iago1NyAwIG9iago8PCAvVHlwZSAvRm9u
+ dERlc2NyaXB0b3IgL0FzY2VudCA3NzAgL0NhcEhlaWdodCA3MjAgL0Rlc2NlbnQgLTIz
+ MCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstMTAxOCAtNDgxIDE0MzYgMTE1OV0gL0ZvbnRO
+ YW1lIC9BQVhDU0grSGVsdmV0aWNhLUJvbGQgL0l0YWxpY0FuZ2xlCjAgL1N0ZW1WIDAg
+ L01heFdpZHRoIDE1MDAgL1hIZWlnaHQgNTQ5IC9Gb250RmlsZTIgNTUgMCBSID4+CmVu
+ ZG9iago1OCAwIG9iagpbIDI3OCAwIDAgMCAwIDAgMCAwIDMzMyAzMzMgMzg5IDAgMjc4
+ IDAgMjc4IDAgMCA1NTYgNTU2IDU1NiA1NTYgMCAwIDAgMCAwCjAgMCAwIDAgMCA2MTEg
+ MCAwIDAgNzIyIDcyMiA2NjcgMCAwIDAgMjc4IDAgMCAwIDgzMyA3MjIgMCAwIDAgMCAw
+ IDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDYxMSA1NTYgNjExIDU1NiAzMzMg
+ NjExIDYxMSAyNzggMCAwIDI3OCA4ODkgNjExIDYxMQowIDYxMSAzODkgNTU2IDMzMyA2
+ MTEgNTU2IDAgNTU2IDU1NiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAow
+ IDAgMCAwIDAgMCAwIDYxMSBdCmVuZG9iagoxNyAwIG9iago8PCAvVHlwZSAvRm9udCAv
+ U3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9BQVhDU0grSGVsdmV0aWNhLUJvbGQg
+ L0ZvbnREZXNjcmlwdG9yCjU3IDAgUiAvV2lkdGhzIDU4IDAgUiAvRmlyc3RDaGFyIDMy
+ IC9MYXN0Q2hhciAyMjIgL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nCj4+CmVuZG9i
+ ago1OSAwIG9iago8PCAvTGVuZ3RoIDYwIDAgUiAvTGVuZ3RoMSA5NzgwIC9GaWx0ZXIg
+ L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1ae3xTRfY/cx+5N0mb5p2bNGkS0iR9P+kL
+ Co2lLx7FQhFapNgChRZBEUsV9wdbFReoiCIKCKyKDyigNpQKQRaWZUF011V0EZT1t7uu
+ 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
+ GKQJenlD+YxhfN4wnq7ENz4/eRhfP4yfO4yfN4yXcb1BnvnDyrEPQ97XOoyn56g3ynPX
+ MP7uYfzSYfy9w3j5/1Q3yLNsWPlyyv8/o7vjDAplbmRzdHJlYW0KZW5kb2JqCjYwIDAg
+ b2JqCjYyMjcKZW5kb2JqCjYxIDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAv
+ QXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcxNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgov
+ Rm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvRlJYVFVTK0hl
+ bHZldGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhl
+ aWdodCA2MzcgL0ZvbnRGaWxlMiA1OSAwIFIgPj4KZW5kb2JqCjYyIDAgb2JqClsgMjc4
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMjc4IDAgMCAwIDAgMCAwIDU1NiAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAKMCAwIDcyMiAwIDAgMCAwIDAgMCAwIDAgMCAwIDcyMiAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDY2NyAwIDAgMCAwIDAgMCAwIDAgMAo1MDAgNTU2IDU1
+ NiAyNzggMCA1NTYgMjIyIDAgMCAyMjIgMCA1NTYgNTU2IDAgMCAzMzMgNTAwIDI3OCA1
+ NTYgMCAwIDAgNTAwCl0KZW5kb2JqCjIxIDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0
+ eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL0ZSWFRVUytIZWx2ZXRpY2EgL0ZvbnREZXNj
+ cmlwdG9yCjYxIDAgUiAvV2lkdGhzIDYyIDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hh
+ ciAxMjEgL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nCj4+CmVuZG9iago2MyAwIG9i
+ ago8PCAvTGVuZ3RoIDY0IDAgUiAvTGVuZ3RoMSAxMTEwMCAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAHVegt4lNW16Nr/ex6ZzEzm/cjMZDIzmbwf5GUCGUNePBJD
+ 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
+ UAplbmRzdHJlYW0KZW5kb2JqCjY0IDAgb2JqCjY5NzMKZW5kb2JqCjY1IDAgb2JqCjw8
+ IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcxNyAv
+ RGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDEx
+ MjJdIC9Gb250TmFtZSAvSkxVVFJPK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3Rl
+ bVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2MzcgL0ZvbnRGaWxlMiA2MyAwIFIg
+ Pj4KZW5kb2JqCjY2IDAgb2JqClsgMjc4IDAgMzU1IDAgMCAwIDAgMCAwIDAgMzg5IDAg
+ Mjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAw
+ IDAgMCAwIDAgMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCA1NTYgNTU2CjUwMCA1NTYgNTU2IDI3OCAwIDU1NiAyMjIgMCAwIDIyMiA4
+ MzMgNTU2IDU1NiA1NTYgNTU2IDMzMyA1MDAgMjc4IDU1NiAwIDAKMCA1MDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1MDAgXQplbmRv
+ YmoKMjIgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNl
+ Rm9udCAvSkxVVFJPK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKNjUgMCBSIC9XaWR0
+ aHMgNjYgMCBSIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDIyMiAvRW5jb2RpbmcgL01h
+ Y1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjY3IDAgb2JqCihVbnRpdGxlZCkKZW5kb2Jq
+ CjY4IDAgb2JqCihNYWMgT1MgWCAxMC42LjggUXVhcnR6IFBERkNvbnRleHQpCmVuZG9i
+ ago2OSAwIG9iagooU2NvdHQgTWFpbikKZW5kb2JqCjcwIDAgb2JqCihPbW5pR3JhZmZs
+ ZSBQcm9mZXNzaW9uYWwpCmVuZG9iago3MSAwIG9iagooRDoyMDEyMDEwNDAyNDY1MVow
+ MCcwMCcpCmVuZG9iagoxIDAgb2JqCjw8IC9UaXRsZSA2NyAwIFIgL0F1dGhvciA2OSAw
+ IFIgL1Byb2R1Y2VyIDY4IDAgUiAvQ3JlYXRvciA3MCAwIFIgL0NyZWF0aW9uRGF0ZQo3
+ MSAwIFIgL01vZERhdGUgNzEgMCBSID4+CmVuZG9iagp4cmVmCjAgNzIKMDAwMDAwMDAw
+ MCA2NTUzNSBmIAowMDAwMDUyMjM4IDAwMDAwIG4gCjAwMDAwMjY2OTQgMDAwMDAgbiAK
+ MDAwMDAwMzMxNyAwMDAwMCBuIAowMDAwMDIzOTUxIDAwMDAwIG4gCjAwMDAwMDAwMjIg
+ MDAwMDAgbiAKMDAwMDAwMzI5NyAwMDAwMCBuIAowMDAwMDAzNDIxIDAwMDAwIG4gCjAw
+ MDAwMTY4OTQgMDAwMDAgbiAKMDAwMDAwNjc1NSAwMDAwMCBuIAowMDAwMDA3Nzg1IDAw
+ MDAwIG4gCjAwMDAwMDQzODIgMDAwMDAgbiAKMDAwMDAwNTQxMyAwMDAwMCBuIAowMDAw
+ MDA1NDMzIDAwMDAwIG4gCjAwMDAwMDY3MzQgMDAwMDAgbiAKMDAwMDAwMzc2MCAwMDAw
+ MCBuIAowMDAwMDE1OTk3IDAwMDAwIG4gCjAwMDAwMzY5NTAgMDAwMDAgbiAKMDAwMDAw
+ MzkxNiAwMDAwMCBuIAowMDAwMDA0MjI3IDAwMDAwIG4gCjAwMDAwMDQwNzIgMDAwMDAg
+ biAKMDAwMDA0MzkzMyAwMDAwMCBuIAowMDAwMDUxODcwIDAwMDAwIG4gCjAwMDAwMTQ5
+ ODIgMDAwMDAgbiAKMDAwMDAxNTAzMCAwMDAwMCBuIAowMDAwMDE1MDc1IDAwMDAwIG4g
+ CjAwMDAwMTUxMjIgMDAwMDAgbiAKMDAwMDAxNzc5MCAwMDAwMCBuIAowMDAwMDI2MDQ5
+ IDAwMDAwIG4gCjAwMDAwMjU0MDQgMDAwMDAgbiAKMDAwMDAyNDc1OSAwMDAwMCBuIAow
+ MDAwMDI0MTE0IDAwMDAwIG4gCjAwMDAwMjM5MTQgMDAwMDAgbiAKMDAwMDAwOTIxNiAw
+ MDAwMCBuIAowMDAwMDEwNjA3IDAwMDAwIG4gCjAwMDAwMTA2MjggMDAwMDAgbiAKMDAw
+ MDAxNDk2MSAwMDAwMCBuIAowMDAwMDA3ODA1IDAwMDAwIG4gCjAwMDAwMDkxOTUgMDAw
+ MDAgbiAKMDAwMDAxNTE2OSAwMDAwMCBuIAowMDAwMDE1OTc3IDAwMDAwIG4gCjAwMDAw
+ MTYwMzQgMDAwMDAgbiAKMDAwMDAxNjg3NCAwMDAwMCBuIAowMDAwMDE2OTMwIDAwMDAw
+ IG4gCjAwMDAwMTc3NzAgMDAwMDAgbiAKMDAwMDAxNzgyNyAwMDAwMCBuIAowMDAwMDIz
+ ODkzIDAwMDAwIG4gCjAwMDAwMjQwMzQgMDAwMDAgbiAKMDAwMDAyNDczOSAwMDAwMCBu
+ IAowMDAwMDI1Mzg0IDAwMDAwIG4gCjAwMDAwMjYwMjkgMDAwMDAgbiAKMDAwMDAyNjY3
+ NCAwMDAwMCBuIAowMDAwMDI2ODU3IDAwMDAwIG4gCjAwMDAwMjY3NDIgMDAwMDAgbiAK
+ MDAwMDAyNjgzNSAwMDAwMCBuIAowMDAwMDI2OTUwIDAwMDAwIG4gCjAwMDAwMzYyMTgg
+ MDAwMDAgbiAKMDAwMDAzNjIzOSAwMDAwMCBuIAowMDAwMDM2NDcwIDAwMDAwIG4gCjAw
+ MDAwMzcxMzAgMDAwMDAgbiAKMDAwMDA0MzQ0NyAwMDAwMCBuIAowMDAwMDQzNDY4IDAw
+ MDAwIG4gCjAwMDAwNDM2OTMgMDAwMDAgbiAKMDAwMDA0NDEwOCAwMDAwMCBuIAowMDAw
+ MDUxMTcyIDAwMDAwIG4gCjAwMDAwNTExOTMgMDAwMDAgbiAKMDAwMDA1MTQxOCAwMDAw
+ MCBuIAowMDAwMDUyMDQ1IDAwMDAwIG4gCjAwMDAwNTIwNzIgMDAwMDAgbiAKMDAwMDA1
+ MjEyNCAwMDAwMCBuIAowMDAwMDUyMTUzIDAwMDAwIG4gCjAwMDAwNTIxOTYgMDAwMDAg
+ biAKdHJhaWxlcgo8PCAvU2l6ZSA3MiAvUm9vdCA0NyAwIFIgL0luZm8gMSAwIFIgL0lE
+ IFsgPDFkN2Q2ZDY1ZDAyMjlhMTBiMmNhNDlmYjEyOWNiZDE0Pgo8MWQ3ZDZkNjVkMDIy
+ OWExMGIyY2E0OWZiMTI5Y2JkMTQ+IF0gPj4Kc3RhcnR4cmVmCjUyMzU4CiUlRU9GCjEg
+ MCBvYmoKPDwvQXV0aG9yIChTY290dCBNYWluKS9DcmVhdGlvbkRhdGUgKEQ6MjAxMjAx
+ MDQwMjMwMDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4yKS9N
+ b2REYXRlIChEOjIwMTIwMTA0MDI0NjAwWikvUHJvZHVjZXIgNjggMCBSIC9UaXRsZSA2
+ NyAwIFIgPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwNTM5NTYgMDAwMDAgbiAKdHJhaWxl
+ cgo8PC9JRCBbPDFkN2Q2ZDY1ZDAyMjlhMTBiMmNhNDlmYjEyOWNiZDE0PiA8MWQ3ZDZk
+ NjVkMDIyOWExMGIyY2E0OWZiMTI5Y2JkMTQ+XSAvSW5mbyAxIDAgUiAvUHJldiA1MjM1
+ OCAvUm9vdCA0NyAwIFIgL1NpemUgNzI+PgpzdGFydHhyZWYKNTQxMjcKJSVFT0YK
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ 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
+ cHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR
+ ZGVzYwAAAVAAAABiZHNjbQAAAbQAAAJCY3BydAAAA/gAAADQd3RwdAAABMgAAAAUclhZ
+ WgAABNwAAAAUZ1hZWgAABPAAAAAUYlhZWgAABQQAAAAUclRSQwAABRgAAAgMYWFyZwAA
+ DSQAAAAgdmNndAAADUQAAAYSbmRpbgAAE1gAAAY+Y2hhZAAAGZgAAAAsbW1vZAAAGcQA
+ AAAoYlRSQwAABRgAAAgMZ1RSQwAABRgAAAgMYWFiZwAADSQAAAAgYWFnZwAADSQAAAAg
+ ZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1s
+ dWMAAAAAAAAAEgAAAAxubE5MAAAAFgAAAOhkYURLAAAAHAAAAP5wbFBMAAAAEgAAARpl
+ blVTAAAAEgAAASxuYk5PAAAAEgAAAT5mckZSAAAAFgAAAVBwdEJSAAAAGAAAAWZwdFBU
+ AAAAFgAAAX56aENOAAAADAAAAZRlc0VTAAAAEgAAAaBqYUpQAAAADgAAAbJydVJVAAAA
+ JAAAAcBzdlNFAAAAEAAAAeR6aFRXAAAADgAAAfRkZURFAAAAEAAAAgJmaUZJAAAAEAAA
+ AhJpdElUAAAAFAAAAiJrb0tSAAAADAAAAjYASwBsAGUAdQByAGUAbgAtAEwAQwBEAEwA
+ QwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbQBLAG8AbABvAHIAIABMAEMARABDAG8AbABv
+ AHIAIABMAEMARABGAGEAcgBnAGUALQBMAEMARABMAEMARAAgAGMAbwB1AGwAZQB1AHIA
+ TABDAEQAIABDAG8AbABvAHIAaQBkAG8ATABDAEQAIABhACAAQwBvAHIAZQBzX2mCcgAg
+ AEwAQwBEAEwAQwBEACAAYwBvAGwAbwByMKsw6TD8ACAATABDAEQEJgQyBDUEQgQ9BD4E
+ OQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkARgDkAHIAZwAtAEwAQwBEX2mCcm2yZnaYb3k6
+ VmgARgBhAHIAYgAtAEwAQwBEAFYA5AByAGkALQBMAEMARABMAEMARAAgAGMAbwBsAG8A
+ cgBpzuy37AAgAEwAQwBEAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwgMjAx
+ MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNSAAEAAAABFs9YWVogAAAAAAAA
+ bzEAADljAAABg1hZWiAAAAAAAABg7gAAt2oAAAgSWFlaIAAAAAAAACa3AAAPMgAAyZdj
+ dXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBe
+ AGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA
+ 4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8
+ AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksC
+ VAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNa
+ A2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoE
+ qAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYn
+ BjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH
+ +AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7
+ ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMM
+ XAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7u
+ DwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR
+ 6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUS
+ FTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoY
+ rxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7
+ HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJgg
+ xCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4
+ JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIq
+ NSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9a
+ L5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1
+ EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrv
+ Oy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlB
+ akGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF
+ SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBP
+ SU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFap
+ VvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxe
+ vV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmbo
+ Zz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv
+ 0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjM
+ eSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCC
+ koL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/Ixj
+ jMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+X
+ Cpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2
+ oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCt
+ RK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjR
+ uUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7F
+ S8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+
+ 0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLf
+ Kd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG
+ 7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf6
+ 5/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoO
+ dmNndAAAAAAAAAAAAAMBAAACAAAABwAeAEoAiwDjASoBbgHAAhkCdALaA0kDwwRHBNQF
+ bQYRBsIHfAg+CQcJ3Qq5C5wMjw2nDtwQEBFLEokTyRURFlwXrBkEGmEbvR0gHowf+CFk
+ ItokTiXJJy8ojinrK0ksny32L0MwjTHQMw00QjVzNpw3wDjgOf07FzwrPTk+RT9SQGNB
+ c0KEQ5dEq0W/RtNH6Uj/ShVLLExDTVtOaU92UIVRklKfU6tUt1XCVstX0ljZWd9a41vo
+ XO1d6F7cX85gv2GvYp5jjWR6ZWZmUWc7aCRpDmn2at9rxmypbY1ucG9TcDdxGnH8ct5z
+ wHSjdYV2ZndJeCt5Cnnqesx7sHyYfYR+d39xgHKBeoKKg6GEvYXfhwmIPIlwiqOL1o0K
+ jjyPbZCekc6S/ZQslVuWipe2mOCaC5s1nF+diZ6yn9uhBKIto1akf6WoptGn+Kkgqkyr
+ fKyyrfGvOrCPse+zW7TPtk+31Lk8unS7qbzcvgu/M8BWwXHChcORxJbFlsaRx4jIg8mH
+ yo3LjcyFzXTOV88uz/vQwNF70jbS9tPX1LnVmtZ911/YQtkl2gna7dvR3LXdmt5932Dg
+ ROEp4hDi+ePm5NblyebB57vouem56qXrjux27V7uRe8r8BDw9fHa8r7zofSF9Wj2S/cv
+ +BP49/nc+sD7ovyE/WX+RP8i//8AAAAGABoAQAB4AMUBEwFMAZAB3wIzAo4C8wNfA9YE
+ VQTdBXAGDga3B2UIGgjaCZwKZwtCDD0NVA5oD4AQoBHBEukUFRVEFnkXrxjvGi4bchy8
+ HgsfViCqIf8jQSSBJb8m/Cg3KWoqnSvLLPIuFS8zMEgxWzJnM3E0eTV9Nno3ajhbOUw6
+ PTswPCI9FT4IPvo/7UDhQdVCykO+RLNFp0aYR4hId0loSllLSEw4TSdOFU8ET/RQ4lHR
+ UsBTsFSeVYhWc1deWElZM1odWwZb7lzWXb1eo1+KYG9hVGI0Ywxj4mS5ZY9mZmc8aBFo
+ 5mm7apFrZWw6bQ9t4263b4hwWXErcfxyznOgdHJ1Q3YVdud3uXiMeV56MHsCe9d8r32L
+ fm1/VYBEgTqCOYM9hEiFWIZuh4eIpYnDiuGL/o0cjjmPVpBzkZCSrJPJlOaWApccmDaZ
+ UZptm4ucrJ3QnvagIqFQooOjuaTxpi6ncai0qferOax8rb6vALBBsYOyxbQFtUe2iLfH
+ uQe6RbuCvL299L8mwFPBe8Kew7vE1cXpxvfIBMkTyiHLL8w9zUzOWs9o0HfRhtKV06LU
+ r9W81snX1tjl2fTbA9wU3SXeON9M4Gfho+Lp5CflWuaG56rox+nh6vjsDu0l7j/vW/CA
+ 8dDzM/ST9fP3Uvi0+hj7hfz4/nf//wAAAAQAEQAqAE4AgADAAQcBOgF0AbcCAgJNAqAC
+ +wNeA8oEPAS2BTgFwgZQBuMHewgbCMcJjQpjCzwMGwz+DeIOyw+1EKURmBKOE4gUhRWG
+ FosXkxifGasauBu9HL0dvh6/H74guyG1IqsjnSSLJXUmXCdAKCIpACnbKrcriyxWLSAt
+ 6i61L4AwSzEWMeEyqzN1ND81CTXTNp03aDg0OPg5vjqFO0s8EjzaPaI+aj8yP/xAxkGR
+ Ql1DKkP3RMNFj0ZbRydH8ki+SYpKVkshS+tMtk2ATkxPFk/hUKtRc1I7UwJTylSSVVpW
+ IFbnV65YdVk7WgJayVuPXFNdFl3ZXptfXWAdYN1hnWJdYxxj2mSYZVZmE2bPZ4toRWkA
+ abtqdmsxa+xsp21ibhxu12+TcE5xCHHBcnpzM3PsdKV1XnYXds93h3g/ePh5sHppeyB7
+ 2XyUfVR+GX7lf7iAlIF5gmaDXIRZhVuGZYd1iIWJloqmi7aMxo3VjuWP9JEDkhOTIpQw
+ lTqWQ5dKmFGZWZpim2+cf52Tnqyfy6DvoiWjeaTQpienfqjWqi2rhKzbrjGviLDesjaz
+ i7TftjO3h7jcujO7irzivjy/mMD2wlTDtcUnxqTILcnFy2vNJM7s0MfSsdSp1rDYwdrd
+ 3QDfMOGn5Ibniuq37g/xiPUY+LX8V///AABuZGluAAAAAAAABjYAAKXjAABWoQAAUVsA
+ AKcrAAAlmwAADhQAAFANAABUOQACQo8AAdmZAAFHrgADAQAAAgAAAA0AJwBGAGYAhwCo
+ AMkA6wEOATEBVQF6AZ0BvAHbAfwCHQI/AmIChgKqAs8C9AMbA0EDaAOQA7kD4gQLBDUE
+ YASMBLgE5AUSBT8FbgWhBdUGCgZBBngGsgbsBygHZwenB+kILgh1CL8JCwlaCawKAQpY
+ CrILDgtuC9IMOAygDQgNcg3eDkoOuQ8oD5oQDRCBEPcRbxHoEmMS3xNiE+cUbRT2FYEW
+ DhadFy8XwxhbGPUZkRoxGtMbdxwdHNAdhx5CHwAfwSCFIU0iGSLoI7skkSVqJkYnJSgM
+ KPUp4irSK8Qsui2zLrAvrzCyMbgywDPLNN418TcEOBU5IzotOzE8MD0qPiA/EkACQO9B
+ 20K/Q6JEiEVvRlhHQkgvSR5KD0sDS/hM8E3qTuVP4lDhUeRS61PzVP1WCVcXWCdZOVpN
+ W2Nce12VXrBfzmDtYg5jM2RZZX9mo2fFaONp/WsSbCFtKm4uby1wKXEichZzCXP6dOl2
+ GndNeIR5v3r+fEV9k37rgE2Bu4M0hLmGSYfjiYeLIYyujkCP4JGRk1iVPZdJmXebxZ4b
+ oA6iAqP5pfKn7qnsq+yt76/1sf20CLYbuC+6RLxZvmnAdsJ+xIDGfch2ymzMYM6L0LjS
+ 6tUh113Zn9vm3jHggeLV5SvniOnn7EfuqvEQ83v17fhm+uf9cP//AAAADwAuAFEAdQCa
+ AL8A5AELATIBWwGEAakBywHvAhQCOgJgAogCsALZAwMDLQNZA4UDsQPfBA0EPARrBJsE
+ zQT+BTEFZAWcBdUGDwZMBokGyAcKB00HkgfaCCUIcgjCCRYJbAnGCiMKggrlC0oLugwr
+ DJ8NFQ2MDgYOgg8AD4EQAxCIEQ4RlxIiEq8TQBPVFG0VBhWiFkEW4heGGC0Y1hmBGjAa
+ 4BuTHEgdBB3CHoMfRiAMINYhoiJzI0YkHiT4JdYmtyegKJcpkSqOK44ski2aLqYvtTDI
+ Md4y9zQVNTo2YzeOOL057zslPF89mz7bQB5BZEKvQ/tFRUaLR8tJBUo3S2JMhk2mTsFP
+ 2lDwUgRTFlQqVUBWWVdzWI9ZrlrOW/FdFl49X2ZgkWG+Yu5kI2VYZo9nxmj9ajRraWye
+ bdFvAnAycWByjnO7dOh2D3c3eGB5i3q4e+d9F35Jf32AsoHqgyOEXYWahtiIF4lZip6L
+ 5I0tjniPxpEYkm+TzJUwlpuYDpmJmwyclZ4nn8ehaaMMpLKmWqgEqbCrX60QrsOweLIv
+ s+i1p7dpuS268ry6voLATMIXw+PFsMd8yUrLGczQzlXP49F60x7UztaL2FPaJtwB3eLf
+ xuGr44/lcudT6Rvqn+wn7bHvPvDO8l/z7/WA9w/4mfoe+5/9Gv6P//8AAAAXAEEAcACf
+ AM8A/wEyAWYBmQHFAfMCIgJSAoQCtwLsAyEDWAOQA8kEAwQ+BHoEtwT1BTUFdgW9BgUG
+ TwabBuoHOweQB+gIRAikCQgJcAncCkwKwAs3C7oMQgzMDVkN6g5+DxUPsBBPEPERlhI+
+ EukTnRRTFQ0VyhaJF0wYEhjaGaUachtBHBMc6x3GHqQfhiBrIVQiQSMyJCclHyYbJxoo
+ ICkrKjkrSyxhLXwumi+9MOQyDjM8NHI1rjbvODU5gTrSPCg9hD7mQExBt0MrRKRGIUej
+ SSlKtUxETdhPcFEMUrBUW1YJV71Zdls0XPhewGCNYl5kNmYMZ9lpmmtJbOlueW/8cXRy
+ 5XRQdbN3EXhyedR7Onyhfgt/eIDngliDzIVChrqINIm2iz2MyY5Zj+uRfpMRlKKWL5e5
+ mT6av5w8nbafBaBMoZWi36QqpXemxagVqWaquqwOrWSuvLAVsXCyy7QotYq27bhRube7
+ HryGve6/V8DBwivDlcT/xmrH1MlAyqvMFs1zzsrQG9Fo0qzT6tUj1lfXgtio2cra5dv8
+ 3RDeH98r4DXhOuI+40DkQOU+5jrnN+gx6SrqIusO6+nsue137jXu7O+l8FnxCvG88mbz
+ EPO49Fz1APWi9kL24vd/+Bz4uflV+fD6jPsn+8L8Xvz4/ZP+L/7J/2T//wAAc2YzMgAA
+ AAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAAwGxtbW9kAAAAAAAABhAA
+ AJyxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{300, -1}, {710, 874}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{4, 0}, {561, 705}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
diff --git a/docs/html/images/resources/res-selection-flowchart.png b/docs/html/images/resources/res-selection-flowchart.png
index eb700741a7cf..5de7688a2532 100644
--- a/docs/html/images/resources/res-selection-flowchart.png
+++ b/docs/html/images/resources/res-selection-flowchart.png
Binary files differ
diff --git a/docs/html/images/resources/resource_devices_diagram.graffle b/docs/html/images/resources/resource_devices_diagram.graffle
new file mode 100644
index 000000000000..ab71dd1f0979
--- /dev/null
+++ b/docs/html/images/resources/resource_devices_diagram.graffle
@@ -0,0 +1,4358 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>5</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>138.9.0.117994</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {578.8, 754.8}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2007-11-06 13:31:34 -0800</string>
+ <key>Creator</key>
+ <string>mcleron</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ControlPoints</key>
+ <array>
+ <string>{-14.7983, -8.44159}</string>
+ <string>{27.0848, -19.9415}</string>
+ </array>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Points</key>
+ <array>
+ <string>{220.383, 373.377}</string>
+ <string>{149.489, 383.117}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Bezier</key>
+ <true/>
+ <key>HeadArrow</key>
+ <string>SharpArrow</string>
+ <key>HeadScale</key>
+ <real>2.0000002384185791</real>
+ <key>LineType</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{210.846, 347.666}, {87, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>305</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs20 \cf0 default resources}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{406.066, 448.914}, {88, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>303</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs20 \cf0 Android Device B}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{94.337, 448.914}, {87, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>302</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs20 \cf0 Android Device A}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{232.539, 363.643}, {20.2114, 20.2114}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>28</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.658730149269104</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{273.71, 364.425}, {19.429, 19.4289}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.72222220897674561</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+\
+\
+\
+}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{314.098, 363.643}, {20.2114, 20.2114}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Rotation</key>
+ <real>180</real>
+ <key>Shape</key>
+ <string>VerticalTriangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.51587307453155518</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{130.583, 404.24}, {14.5085, 14.5085}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>285</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.658730149269104</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{130.843, 357.029}, {13.9886, 13.9886}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>288</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.72222220897674561</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+\
+\
+\
+}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{130.025, 379.747}, {14.5085, 14.5085}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>281</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Rotation</key>
+ <real>180</real>
+ <key>Shape</key>
+ <string>VerticalTriangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.51587307453155518</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{439.584, 383.552}, {9.66876, 9.66877}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>1192</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.658730149269104</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{439.929, 355.759}, {9.45554, 9.45549}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>1191</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.72222220897674561</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+\
+\
+\
+}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{439.691, 369.709}, {9.45554, 9.45554}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>1190</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Rotation</key>
+ <real>180</real>
+ <key>Shape</key>
+ <string>VerticalTriangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.51587307453155518</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ControlPoints</key>
+ <array>
+ <string>{22.3508, -10.3896}</string>
+ <string>{-22.3872, -12.3377}</string>
+ </array>
+ <key>ID</key>
+ <integer>284</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Points</key>
+ <array>
+ <string>{343.623, 375.974}</string>
+ <string>{418.231, 377.922}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Bezier</key>
+ <true/>
+ <key>HeadArrow</key>
+ <string>SharpArrow</string>
+ <key>HeadScale</key>
+ <real>2.0000002384185791</real>
+ <key>LineType</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{250.417, 404.24}, {65, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>304</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs20 \cf0 Android App}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{210.339, 344.24}, {145.157, 52.561}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>13</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.94898</string>
+ <key>g</key>
+ <string>0.94898</string>
+ <key>r</key>
+ <string>0.94898</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{463.897, 367.129}, {15.0187, 15.0187}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.14902</string>
+ <key>g</key>
+ <string>0.690196</string>
+ <key>r</key>
+ <string>0.482353</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0726494</string>
+ <key>g</key>
+ <string>0.663043</string>
+ <key>r</key>
+ <string>0.201281</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{411.352, 367.129}, {14.4373, 14.4372}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.14902</string>
+ <key>g</key>
+ <string>0.690196</string>
+ <key>r</key>
+ <string>0.482353</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0726494</string>
+ <key>g</key>
+ <string>0.663043</string>
+ <key>r</key>
+ <string>0.201281</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{437.624, 366.137}, {14.4373, 14.4373}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>221</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Rotation</key>
+ <real>180</real>
+ <key>Shape</key>
+ <string>VerticalTriangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.14902</string>
+ <key>g</key>
+ <string>0.690196</string>
+ <key>r</key>
+ <string>0.482353</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0726494</string>
+ <key>g</key>
+ <string>0.663043</string>
+ <key>r</key>
+ <string>0.201281</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{249.852, 448.914}, {65, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>307</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs20 \cf0 Android App}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{210.846, 393.24}, {113, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>306</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Join</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs20 \cf0 alternative resources B}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ControlPoints</key>
+ <array>
+ <string>{25.974, 6.07614}</string>
+ <string>{-17.8177, 38.3117}</string>
+ </array>
+ <key>ID</key>
+ <integer>275</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Points</key>
+ <array>
+ <string>{343.247, 423.794}</string>
+ <string>{425.315, 385.714}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Bezier</key>
+ <true/>
+ <key>HeadArrow</key>
+ <string>SharpArrow</string>
+ <key>HeadScale</key>
+ <real>2.0000002384185791</real>
+ <key>LineType</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{232.539, 409.334}, {20.2114, 20.2114}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>201</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.14902</string>
+ <key>g</key>
+ <string>0.690196</string>
+ <key>r</key>
+ <string>0.482353</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0726494</string>
+ <key>g</key>
+ <string>0.663043</string>
+ <key>r</key>
+ <string>0.201281</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{273.71, 409.334}, {19.429, 19.4289}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.14902</string>
+ <key>g</key>
+ <string>0.690196</string>
+ <key>r</key>
+ <string>0.482353</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0726494</string>
+ <key>g</key>
+ <string>0.663043</string>
+ <key>r</key>
+ <string>0.201281</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{314.098, 409.334}, {20.2114, 20.2114}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Rotation</key>
+ <real>180</real>
+ <key>Shape</key>
+ <string>VerticalTriangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.14902</string>
+ <key>g</key>
+ <string>0.690196</string>
+ <key>r</key>
+ <string>0.482353</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.0726494</string>
+ <key>g</key>
+ <string>0.663043</string>
+ <key>r</key>
+ <string>0.201281</string>
+ </dict>
+ <key>Width</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{210.846, 344.24}, {144.65, 96.4999}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>296</integer>
+ <key>Layer</key>
+ <integer>2</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.94898</string>
+ <key>g</key>
+ <string>0.94898</string>
+ <key>r</key>
+ <string>0.94898</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1189</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{402.118, 422.794}</string>
+ <string>{497.604, 422.794}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1169</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{449.566, 409.334}</string>
+ <string>{449.566, 429.545}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{492.061, 377.855}, {6, 6}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>35</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.26087</string>
+ <key>g</key>
+ <string>0.26087</string>
+ <key>r</key>
+ <string>0.26087</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{492.061, 365.017}, {6, 6}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>34</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.26087</string>
+ <key>g</key>
+ <string>0.26087</string>
+ <key>r</key>
+ <string>0.26087</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{492.061, 390.801}, {6, 6}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>33</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.26087</string>
+ <key>g</key>
+ <string>0.26087</string>
+ <key>r</key>
+ <string>0.26087</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{492.061, 352.179}, {6, 6}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>32</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.26087</string>
+ <key>g</key>
+ <string>0.26087</string>
+ <key>r</key>
+ <string>0.26087</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>58</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{441.483, 409.334}</string>
+ <string>{441.483, 429.545}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>57</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{457.656, 409.334}</string>
+ <string>{457.656, 429.004}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>54</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{402.118, 415.794}</string>
+ <string>{497.424, 415.794}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>53</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{402.118, 429.794}</string>
+ <string>{497.604, 429.794}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1184</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{489.983, 409.334}</string>
+ <string>{489.983, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1185</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{481.899, 409.334}</string>
+ <string>{481.899, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1187</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{465.732, 409.334}</string>
+ <string>{465.732, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>47</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{433.398, 409.334}</string>
+ <string>{433.398, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>46</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{417.231, 409.334}</string>
+ <string>{417.231, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1178</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{409.148, 409.334}</string>
+ <string>{409.148, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>44</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{425.315, 409.334}</string>
+ <string>{425.315, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>1186</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Points</key>
+ <array>
+ <string>{473.816, 409.334}</string>
+ <string>{473.816, 436.793}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{401.757, 408.794}, {95.8473, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>1188</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.538043</string>
+ <key>g</key>
+ <string>0.538043</string>
+ <key>r</key>
+ <string>0.538043</string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{401.757, 350.24}, {85.4542, 48.5}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Copperplate-Bold</string>
+ <key>Size</key>
+ <real>36</real>
+ </dict>
+ <key>ID</key>
+ <integer>37</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.964211</string>
+ <key>r</key>
+ <string>0.859238</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>61</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.758265</string>
+ <key>g</key>
+ <string>0.768371</string>
+ <key>r</key>
+ <string>0.771739</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.6428571343421936</real>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{396.214, 344.24}, {107.164, 61}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>36</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.695652</string>
+ <key>g</key>
+ <string>0.653375</string>
+ <key>r</key>
+ <string>0.591879</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{396.214, 379.74}, {107.164, 61}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>38</integer>
+ <key>Layer</key>
+ <integer>3</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.695652</string>
+ <key>g</key>
+ <string>0.653375</string>
+ <key>r</key>
+ <string>0.591879</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>69</integer>
+ <key>Layer</key>
+ <integer>4</integer>
+ <key>Points</key>
+ <array>
+ <string>{111.671, 427.852}</string>
+ <string>{162.888, 428.116}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>YES</string>
+ <key>Fuzziness</key>
+ <real>1.9227640628814697</real>
+ <key>ShadowVector</key>
+ <string>{0, 1}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>66</integer>
+ <key>Layer</key>
+ <integer>4</integer>
+ <key>Points</key>
+ <array>
+ <string>{124.664, 428.248}</string>
+ <string>{124.664, 434.529}</string>
+ <string>{125.058, 434.529}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>65</integer>
+ <key>Layer</key>
+ <integer>4</integer>
+ <key>Points</key>
+ <array>
+ <string>{149.489, 428.273}</string>
+ <string>{149.489, 434.553}</string>
+ <string>{149.883, 434.553}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>64</integer>
+ <key>Layer</key>
+ <integer>4</integer>
+ <key>Points</key>
+ <array>
+ <string>{137.077, 428.273}</string>
+ <string>{137.077, 434.553}</string>
+ <string>{137.471, 434.553}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>YES</string>
+ <key>ShadowVector</key>
+ <string>{0, 0}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{95.118, 366.783}, {84.3242, 51.2171}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Copperplate-Bold</string>
+ <key>Size</key>
+ <real>36</real>
+ </dict>
+ <key>ID</key>
+ <integer>5</integer>
+ <key>Layer</key>
+ <integer>4</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Rotation</key>
+ <real>90</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.96285</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.928013</string>
+ </dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>320</real>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.758265</string>
+ <key>g</key>
+ <string>0.768371</string>
+ <key>r</key>
+ <string>0.771739</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.73809522390365601</real>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{89.1621, 360.281}, {96.4999, 64.4173}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Layer</key>
+ <integer>4</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Rotation</key>
+ <real>90</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.641335</string>
+ <key>g</key>
+ <string>0.695652</string>
+ <key>r</key>
+ <string>0.651805</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>5</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{440.23, 353.676}, {11.832, 11.8319}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>1193</integer>
+ <key>Layer</key>
+ <integer>5</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ <key>MiddleFraction</key>
+ <real>0.72222220897674561</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Cap</key>
+ <integer>0</integer>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.362245</string>
+ <key>g</key>
+ <string>0.362245</string>
+ <key>r</key>
+ <string>0.362245</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 \
+\
+\
+\
+}</string>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>3</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Constants</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>defaults</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>alternates</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Lock</key>
+ <string>YES</string>
+ <key>Name</key>
+ <string>Device A</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ <dict>
+ <key>Lock</key>
+ <string>YES</string>
+ <key>Name</key>
+ <string>Device B</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ <dict>
+ <key>Lock</key>
+ <string>YES</string>
+ <key>Name</key>
+ <string>balance</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2010-04-02 16:18:16 -0700</string>
+ <key>Modifier</key>
+ <string>Scott Main</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>OutlineStyle</key>
+ <string>Basic</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>18.6</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>16.6</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>16.6</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18.6</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ S1IlKwmQEy/9rTBxdnpz/hu2vXgxwctqPIsJpRxZR5e//WbaCP4hLt9VL02no9IM9kKi
+ lXnoYK9N5nVTRxJnzHjlYC/UfCTcsqu0Q5riDW0wD0deaI8GtN2bvYzF0V5MGDgOwWOx
+ F11ZA5gndjQJyHsTl1aEuEN1dOEPT9PFyEXq7LrJbVobudhspI5cvn387e3D4+3JywV9
+ SWtn+nguJwa5iLkif3PwQihx0UE64RZTOL6m+AyON17kcitwRfLM8Tc3dwhcozLhYqZC
+ OeA59hXLsgF3rbQ6Vxv88Pj6+1/ffcJZP77/lb+5+9h34A+CGFXpHwTRAdx55B/4Uw/+
+ bksqjzxL5IyMY8rfZTkJbs50PPkik0paPLjskZMf53L58xHpw2X6gUPtgTV3BkqezsZx
+ kmEhVVIimNJP431wB8Tpj0dPVEHpeZWgPOkio4SdP3m7A5Pz6cZ5XEZcK6HEOk4LdRco
+ tl0+P1IyDOiQWDL27XwpD9DOlJyBLxGUw8wdWOOLYzcyybrOV9uFEq7l6r9z78ErCmVu
+ ZHN0cmVhbQplbmRvYmoKNiAwIG9iago0NjYyCmVuZG9iagozIDAgb2JqCjw8IC9UeXBl
+ IC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAw
+ IFIgL01lZGlhQm94IFswIDAgNTc5IDc1NV0KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1By
+ b2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9y
+ U3BhY2UgPDwgL0NzMSA4IDAgUgovQ3MyIDMwIDAgUiA+PiAvRm9udCA8PCAvRjEuMCAz
+ MSAwIFIgPj4gL1hPYmplY3QgPDwgL0ltOCAyNSAwIFIgL0ltNyAyMyAwIFIKL0ltMiAx
+ MiAwIFIgL0ltNCAxNiAwIFIgL0ltMSAxMCAwIFIgL0ltNSAxOSAwIFIgL0ltNiAyMSAw
+ IFIgL0ltOSAyOCAwIFIgL0ltMwoxNCAwIFIgPj4gL1NoYWRpbmcgPDwgL1NoMTAgMzgg
+ MCBSIC9TaDEgOSAwIFIgL1NoMiAxOCAwIFIgL1NoNSAzMyAwIFIgL1NoNAozMiAwIFIg
+ L1NoMyAyNyAwIFIgL1NoNiAzNCAwIFIgL1NoMTEgMzkgMCBSIC9TaDEyIDQwIDAgUiAv
+ U2g5IDM3IDAgUiAvU2g3CjM1IDAgUiAvU2g4IDM2IDAgUiA+PiA+PgplbmRvYmoKMzgg
+ MCBvYmoKPDwgL0NvbG9yU3BhY2UgOCAwIFIgL1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBb
+ IDEwLjYwNTcgLTEwLjYwNTcgMTAuNjA1NjkgMTAuNjA1NwpdIC9Eb21haW4gWyAwIDEg
+ XSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gNDEgMCBSID4+CmVuZG9i
+ ago5IDAgb2JqCjw8IC9Db2xvclNwYWNlIDggMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29y
+ ZHMgWyA2LjQxNiAtNi40MTU5NSA2LjQxNTk5OSA2LjQxNTk1MgpdIC9Eb21haW4gWyAw
+ IDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gNDIgMCBSID4+CmVu
+ ZG9iagoxOCAwIG9iago8PCAvQ29sb3JTcGFjZSA4IDAgUiAvU2hhZGluZ1R5cGUgMiAv
+ Q29vcmRzIFsgLTQyLjY2MjEgMjYuMTA4NTUgMzMuMTIwMTEgLTM3LjQ4MDI2Cl0gL0Rv
+ bWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA0MyAw
+ IFIgPj4KZW5kb2JqCjMzIDAgb2JqCjw8IC9Db2xvclNwYWNlIDggMCBSIC9TaGFkaW5n
+ VHlwZSAyIC9Db29yZHMgWyA1LjIyNzc2OCAtNS4yMjc3NDUgNS4yMjc3NjcKNS4yMjc3
+ NDYgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0
+ aW9uIDQ0IDAgUiA+PgplbmRvYmoKMzIgMCBvYmoKPDwgL0NvbG9yU3BhY2UgOCAwIFIg
+ L1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDUuMjI3NzY4IC01LjIyNzc2OCA1LjIyNzc2
+ Ngo1LjIyNzc3IF0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBd
+ IC9GdW5jdGlvbiA0NSAwIFIgPj4KZW5kb2JqCjI3IDAgb2JqCjw8IC9Db2xvclNwYWNl
+ IDggMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyAtNDMuMjI3MSAtMjQuNzUgLTEu
+ OTE3NjkgNDkuNzc0MTYKXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZh
+ bHNlIF0gL0Z1bmN0aW9uIDQ2IDAgUiA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL0NvbG9y
+ U3BhY2UgOCAwIFIgL1NoYWRpbmdUeXBlIDIgL0Nvb3JkcyBbIDUuMzM0MzgxIC01LjMz
+ NDM4MyA1LjMzNDM3OAo1LjMzNDM4NSBdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsg
+ ZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gNDcgMCBSID4+CmVuZG9iagozOSAwIG9iago8
+ PCAvQ29sb3JTcGFjZSA4IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgMTAuMjE0
+ NSAtMTAuMjE0NDUgMTAuMjE0NSAxMC4yMTQ0NQpdIC9Eb21haW4gWyAwIDEgXSAvRXh0
+ ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gNDggMCBSID4+CmVuZG9iago0MCAw
+ IG9iago8PCAvQ29sb3JTcGFjZSA4IDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsg
+ MTAuNjA1NyAtMTAuNjA1NyAxMC42MDU2OSAxMC42MDU3Cl0gL0RvbWFpbiBbIDAgMSBd
+ IC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA0OSAwIFIgPj4KZW5kb2Jq
+ CjM3IDAgb2JqCjw8IC9Db2xvclNwYWNlIDggMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29y
+ ZHMgWyA3Ljc1NDI1IC03Ljc1NDI1IDcuNzU0MjQ2IDcuNzU0MjUzCl0gL0RvbWFpbiBb
+ IDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA1MCAwIFIgPj4K
+ ZW5kb2JqCjM1IDAgb2JqCjw8IC9Db2xvclNwYWNlIDggMCBSIC9TaGFkaW5nVHlwZSAy
+ IC9Db29yZHMgWyA3Ljc1NDI1IC03Ljc1NDI1IDcuNzU0MjQ2IDcuNzU0MjUzCl0gL0Rv
+ bWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA1MSAw
+ IFIgPj4KZW5kb2JqCjM2IDAgb2JqCjw8IC9Db2xvclNwYWNlIDggMCBSIC9TaGFkaW5n
+ VHlwZSAyIC9Db29yZHMgWyA3LjQ5NDMyNCAtNy40OTQzMjQgNy40OTQzMjEKNy40OTQz
+ MjcgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0
+ aW9uIDUyIDAgUiA+PgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCAyNiAwIFIgL1R5
+ cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyMzYgL0hlaWdodCAxMDAg
+ L0NvbG9yU3BhY2UKNTMgMCBSIC9TTWFzayA1NCAwIFIgL0JpdHNQZXJDb21wb25lbnQg
+ OCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0DEBAAAAwqD1T20LL4hA
+ YcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YOA3MBSfAAEKZW5kc3RyZWFtCmVuZG9iagoyNiAwIG9iagozMzIKZW5kb2JqCjIzIDAg
+ b2JqCjw8IC9MZW5ndGggMjQgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFn
+ ZSAvV2lkdGggMjE2IC9IZWlnaHQgMTQyIC9Db2xvclNwYWNlCjU2IDAgUiAvU01hc2sg
+ NTcgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngB7dABDQAAAMKg909tDjeIQGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgIGPgQFnfwABCmVuZHN0cmVhbQplbmRvYmoKMjQgMCBvYmoK
+ NDI1CmVuZG9iagoxMiAwIG9iago8PCAvTGVuZ3RoIDEzIDAgUiAvVHlwZSAvWE9iamVj
+ dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE0OCAvSGVpZ2h0IDIxNCAvQ29sb3JTcGFj
+ ZQo1OSAwIFIgL1NNYXNrIDYwIDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
+ L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QMQEAAADCoPVPbQlPiEBhwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGPgMDHM3
+ AAEKZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iago0MzgKZW5kb2JqCjE2IDAgb2JqCjw8
+ IC9MZW5ndGggMTcgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lk
+ dGggMTI0IC9IZWlnaHQgMjIgL0NvbG9yU3BhY2UKNjIgMCBSIC9TTWFzayA2MyAwIFIg
+ L0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+ eAHt0AENAAAAwqD3T20ON4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DLwODB/4AAEKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9iago1OQplbmRvYmoKMTAgMCBv
+ YmoKPDwgL0xlbmd0aCAxMSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdl
+ IC9XaWR0aCAxNzQgL0hlaWdodCAyMzggL0NvbG9yU3BhY2UKNjUgMCBSIC9TTWFzayA2
+ NiAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
+ dHJlYW0KeAHt0DEBAAAAwqD1T20ND4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgw8DIw5VsAAQplbmRzdHJlYW0KZW5kb2JqCjExIDAgb2JqCjU2NQplbmRvYmoKMTkg
+ MCBvYmoKPDwgL0xlbmd0aCAyMCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0lt
+ YWdlIC9XaWR0aCAyNjAgL0hlaWdodCAxNjYgL0NvbG9yU3BhY2UKNjggMCBSIC9TTWFz
+ ayA2OSAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
+ PgpzdHJlYW0KeAHt0AENAAAAwqD3T20PBxEoDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYOB5YPnXAAEKZW5kc3RyZWFtCmVuZG9i
+ agoyMCAwIG9iago1ODcKZW5kb2JqCjIxIDAgb2JqCjw8IC9MZW5ndGggMjIgMCBSIC9U
+ eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjYwIC9IZWlnaHQgMTY2
+ IC9Db2xvclNwYWNlCjY4IDAgUiAvU01hc2sgNzEgMCBSIC9CaXRzUGVyQ29tcG9uZW50
+ IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABDQAAAMKg909tDwcR
+ KAwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDgeWD51wABCmVuZHN0cmVhbQplbmRvYmoKMjIgMCBvYmoKNTg3CmVuZG9iagoyOCAw
+ IG9iago8PCAvTGVuZ3RoIDI5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
+ Z2UgL1dpZHRoIDMzNiAvSGVpZ2h0IDE1MCAvQ29sb3JTcGFjZQo3MyAwIFIgL1NNYXNr
+ IDc0IDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
+ CnN0cmVhbQp4Ae3QMQEAAADCoPVP7WkJiEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBg4AMDTr4AAQplbmRzdHJlYW0KZW5kb2JqCjI5IDAg
+ b2JqCjY4MwplbmRvYmoKMTQgMCBvYmoKPDwgL0xlbmd0aCAxNSAwIFIgL1R5cGUgL1hP
+ YmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCA0NiAvSGVpZ2h0IDU4IC9Db2xvclNw
+ YWNlCjc2IDAgUiAvU01hc2sgNzcgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRl
+ ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABDQAAAMKg90/t7AERKAwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgIEPDB9EAAEKZW5kc3RyZWFtCmVuZG9iagox
+ NSAwIG9iago1OAplbmRvYmoKNjAgMCBvYmoKPDwgL0xlbmd0aCA2MSAwIFIgL1R5cGUg
+ L1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxNDggL0hlaWdodCAyMTQgL0Nv
+ bG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9G
+ bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtnflXUlsfxrvVdRYVQRRBURTECTEUw1Bynsgc
+ KErFMQ0nckrL0jSnLDPHNKecTTNt0Mx61/3X3u8+QKcUTunh3vWu+57nh9qtvdg9fvb3
+ HPnpec6coUQRoAj87xH4w7oi8wMiJ2e/65wV9P2ws2fh7JN6M9oBH+fP/2llnT9//tw5
+ ZO9EvjA+YAfM2NjY2toZZU9KplNsbW1s4GAwZvD1W7iQI8yQDbixt3dwBDk5OTmTFhzi
+ BGc5ONjb2YEz8IVs/cYlYo6AEBhCdpycaTQXV1c3K8nV1cWFRnMGa8iXydUvUKGphkuz
+ sbNzcHSi0cAM3Z3BYDI9PFik5eHhwWQwGO50N1cXmjOyZXRFPO7o2sCRLThyBkPuDCaL
+ 5clms705HA6XrDgcb28228uT5cFg0N1caE7gyga7QCJTRkt29uDIjc7wYHmxOVwfHs/P
+ 359vDfn78Xi+PlxvtieL6Y5cOSBUMFWWTcEsASWA5ERzpTNYXt5cXx6fHygQBolEomCk
+ kFMK+3AwnBIkEATw/Xg+HLanB8PNxRlDRWTKaAlBAkccHx4/UCgKCQ0TiyMkEkkkScER
+ kghxeFhocJAgwJ/HZbOYdFfaL0zBzSFKjs4udKant49fgFAUKo6IlEbJZDEX5SbFnlim
+ T8rlF2Nk0dILEnFYSFAgn8f18nB3M5mycHuACR44zJIXl8cXBodLLkTHyC/FKZUJiUhJ
+ ZIQOSLisjFfEXpRJJeJQUaCfD5vFQKZs/zxvYaQQJhs7B6Dk4cX1CxSFSaQxsXGXE1NS
+ 0zMys7JUqiukpFKpsrIy09NSkhKUCnl0pDhEyPf1xkzBoJ8zP+YIk629E43O9OL6C0LE
+ 0phLysTUDFV2Tp5afe26hryuX1Pn5169kpmenBAnj5aEiQKQKVdnRzsbC6AwTI4w3mBJ
+ GCqRxSqT01U5as3NQm1JaVk5qIKE0OfLSkuKiwo06tzszJQERYxUDKbYLHcXJ7g9s6Aw
+ TA7OrgwWx08AlhSJaarcawXa0opKXXVtbV19vZ6U6uvr6mprdFW3yooLNfnZGclKOZji
+ +7CZMFIIlJkp/wNNkyONzvLmBYZIZHFJGVfVBcXlVdV1dxqbW+62tpFX692WpgZ9re5W
+ SaEmNysFTIUH+XM94fYcEKjjv/b+OPunrYMz3JwPXySOViRl5miKyqpq7zS13mvv6HzU
+ ZQU96ux40N7W0livqyi+mX8lVSmPDBXwvFl0AGX28mDCMUwcP2GYNDYxI0ejrajWN7c9
+ 6Ozu6esfeDJIXk8G+nsfd3Xcv9tQW1lakK9KiZdFiPhcL4ark725y8OuzskVMAUES2KU
+ aVc12ls1Da3tj3r6B4eeD78YGRklq5GRF8NDTwd6uzramupvlxbkZSXGSsMAlIcbDS7v
+ +ECBJ3R1Ht48QZj0UrJKXVRR09jW8bj/6fDI+MTLqampaZKCI15OTowODz3pedTeUl9V
+ ciMnXSmTAChPdxfs8o4OFIwTXJ07i8sXRciU6bkFZdUNbR09T4ZGJ6ZmZufnFxYWXpPT
+ wsL8/NzM9OTY8NO+rvbmukqtWpUUK4WJYsPl2dkcH/I/0Di5MLx8A0MvxCaqrhVX6e92
+ 9AwOj03NzC8uraysrq6ukRIcsLKyvLgwOz0x8qy/635jdfnNnLR4mTjIDy7PGQ3UUU5o
+ xJ3cmGyeMDw6LjXnZnltc3v3k+Hx6bnFlbWNN5ubm1skBUdsbqyvLM3PTI487e1o01dp
+ 1ZkJckkwnwtPnoOtOU829jBOHH9RRIwyI19bpW971D80Nj2/tLaxtf1uZ2dnl6x2dt5t
+ v91cX1mYmXwx+Li9qaZMk518SRoa6OPFQG+DY0MOb0wHeGFy+cGR8sSs66XVTQ96no5O
+ zS2tbW7vvP/w0Tp6v7u9BaZejT/v72zV3yrISY2LCkcDhYbcjCdbB5q7p09gKDx12TfL
+ 6+529j+fmFlc3dze/bi3j/SZlLAj9j6+39laX56fGhl8fL/xtjYfnjw0UEwYcrOeHGkw
+ 4oKwKBinwso797oHR6bmVzbA0v7nL1bSwf6nD+821xZnxof6HrbUlFzLSrgoEflzYMjN
+ ekKPHYy4WBafnqvVNbb3PBubWVzb2vm4f/Dl69ev30gLDjn8sv9pd3tjeW5yeKCztbZc
+ o0o0DDk8eH+eO/pbGL2eXMFTkFgGI15S3fyw7/nE7BJg+vT5C2boPySF/UyHB/sAamV+
+ anSwq01fcSM7OfZCCDx4bjR7G/OemN5+ooiLlzPVpbUtHf3DL+dX3rz7sH9w+O0HO3+d
+ WD98+Nu3L/sfd7fWXr8afdp9/05lQXYKPHgBXE+6BU9Orkxvf5HkYkLWtbLau50DL2Cc
+ NsETYDIee2I73z9gPAA8ff60+3Z9cWbs2eP2hsqCqykK9DIATw5mOTlhrycJehWU17U+
+ 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
+ QkqGKifvmqagsEirLS4uIafiYq22sODGdaiRAEdKKLdAlrCbs9QjYQCFbo/hyeEFQAVI
+ lFyhTEpNz7qSnZObl5efryan/Py83Nyr2VkZackJ8bGyC+IQAVjyoLtA240FTOAJgbI3
+ muILQ8SRUVBMokxISklJS09PzyCr9PS01JTkxMvxCrlMGoHKUsCSO1YBYnbCUby9ob8F
+ ineg5Ybt4xcYFAIFLlGyi7EKRVy80qTLJ5bpk0plfJwiVh5jqG8R8HkcLw86smS5vwWB
+ QqUyRlMcX39o3gkNF0sipdLoaJlJMSeW6ZMyWXQUtNxEiENDgsARlO8w6KgRiMASAgW3
+ B6YcoaKIyWJzff34gYIg1AgULraKoAwoNFgkxOqAvL2gpAhqphAls0UpxmYCoymocnJx
+ c2caipP8+AGBAoFAKAwiK6FQIAgM4PvzfLlYbRI0FGFlTqgizNyLwGAKFYMZK69o4Aor
+ mPLmcn18eZj8yAg7AcqlwA+ql2K4gaPfK73CZgruz97RVMQFpWCeXl7QxWUNQQkXCwrC
+ oB4M1XBB49Wve7hgpJApqFCDSjcoLHOG/jTUWAaVZUhMMjIc4U6nuwEhY12ZwRHBxeEz
+ hbn6XuwGzW40F5ArWcEZcBTW6obVzZlq3SzPktGSARVegIca8LAKPFSDR15Qfgctc+jO
+ TuAIs4ZuENnCegtRVSBeFmiq+zvV33CODdYSCI8/PGy/Vcj3nZWRFjKGrFmrVBGdBG4w
+ OyerU/zuDEoYMWLoJ7Km0LHf/xOyC3TYKUX2v6Y+TxGgCPwfEvgvhxVLsAplbmRzdHJl
+ YW0KZW5kb2JqCjYxIDAgb2JqCjQxNTMKZW5kb2JqCjU0IDAgb2JqCjw8IC9MZW5ndGgg
+ NTUgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjM2IC9I
+ ZWlnaHQgMTAwIC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50
+ IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7ZzrVxJrFMa9IHe5yABy
+ EwQFERFHTRQzNTyahmkaaaVGUaaFcvLI0ZNlVhbFMm9lahey0kzLtCy76Tr/2tkzulYr
+ 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
+ YiO5fvNZVVjbGU4bQ4YZZHiTHUwqwwaWbSliRsvhU9Y2Fw0E2/q2cbDwP7A/iECFB6J+
+ Q0WAigAVASoCvzgC/wHByW5/CmVuZHN0cmVhbQplbmRvYmoKNTUgMCBvYmoKMTg3MQpl
+ bmRvYmoKNjYgMCBvYmoKPDwgL0xlbmd0aCA2NyAwIFIgL1R5cGUgL1hPYmplY3QgL1N1
+ YnR5cGUgL0ltYWdlIC9XaWR0aCAxNzQgL0hlaWdodCAyMzggL0NvbG9yU3BhY2UKL0Rl
+ dmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
+ PgpzdHJlYW0KeAHtnflXU9cWgBUhIfNABjJBQkxCIJiEwUAYjASlgaSANcBDGpmKNTIo
+ MvmogMoSsRVFS8Wn4lCwirVarVO1q//a2+cCigj1eMr1NW+d/YPrutbe+37rW/ucXH7a
+ mzbRoAaoAWrgYwxs/lTxMVCrcxFj3JvYwmq8eU1cHHrtapQP/H8JFAjj4xM+XcTHwxsR
+ +ccAM04BFDA5HC43cSl4bMXyC7hcDgfeCcj4wIiVQeUAJ4/HF0AIhUIRmwH90Wv4PF5i
+ IheI4zF5GVawCqgIVCgSiyVSqYz9kEokYrEIoPk8BIzFi84VjAAnMZEvEIrFgClPUiiU
+ SpVKzWaoVEqlQpEkl8kkiJi/zPvX84uGAFi5wCoC1CSFUq1O1mq1Or1eb2AvoLtOq9Uk
+ q9VKRZJMKhYhXpgHNL7r3wdLsIk8YJXJFSq1Rqs3pBiNprQ0M7uRZjIZU1MMeq1GrVLI
+ pWKhgJfIjMP6dmFmwSyIFYqlcoVaozOkGs1mi9WWbrfbM1BkbnwwfaF/us1qMacZUw0A
+ jHgZvTC968pdgkVigVWfYjRbbPZMR5bT6XK73dmsBTR3u5zOLEeG3WYxG1N0GpVCJhai
+ aYBhWAcX5gCZFYgkcmWyLsW01WZ3OF3ZuXkeT36BdzkKNzKWm3oL8j2evNxs1zaH3Wo2
+ GrRqhUwCuDAM6+GCWrgMGFiNwWi2ZWxz52zP9xaV+HylfhRl7ARqXbrTt6O4yJufl+PK
+ Qrz6ZKV8EXedWUBqOYl8MKvSGEwWe5Y7N7+wZKd/d3mgojIYDIU+ZytCoWCwsiJQvsvv
+ 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
+ 5mUwl/9ZwgW9wCuVJSmUanWyVqvV6fV6A3sB3XVarSZZrVYqkmRSsYgRi8Zg7ftgBe6i
+ XuAVigFYJk9SKJRKlUrNZqhUSqVCkSSXySRikRCxMmL/0ixChtlFuAkcbiKPLxAIRWKx
+ RArQrIdUIhEjUgGft8z6Qdhl3iXgRB5CBmihUMRmQH/0Gj6Pl4hQ0cDCEPzFyC7PwhJv
+ 3BYEnMDhcLmJS8FjK5ZfwOVygBRQP4IVYW9GAwEjAciI+VNFPIAiUlyt7xheREbVDDh0
+ YisW38H8C6LwJmAF6spHVP9JYuVL6TM1QA1QA/93Bv4LHKClggplbmRzdHJlYW0KZW5k
+ b2JqCjY3IDAgb2JqCjM0NDUKZW5kb2JqCjYzIDAgb2JqCjw8IC9MZW5ndGggNjQgMCBS
+ IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTI0IC9IZWlnaHQg
+ MjIgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt1FlPwkAQB/B26c0NBWyxQggUkUPB
+ eARE0SIeMUFBv/9Xcbfdpd0BfeDN2N9bk24m/5nZFYRY3IH/0wEkqZpu+HRK20mFFEj+
+ mSQl0FZPkZIqVuxqwIYs5oCpAGWmRJlQkSjk0poMqoty0qy73f5g0Cd6EV3sZKMDHVNt
+ xgVaTBNr1Oy8LolcdKTl68OJt+A9MvOAF3og7n2z0J3vlphG3BATbHw16jhZlQ+OdNMd
+ L5ar9Xr9SX39iv2FD/hW0AfzTi2Jt/l1u2Qk+NxqzuldTmdBEj9UmNHzaG7WBr47+OuJ
+ eaZeoNfAYnbRMnU+tyjphWrDxbOD8+xsRk0G340sgr8ZeEOw04gzYhga+c4Dw17Tyih8
+ bQHJRrZYii4v22i24pYFt59di+oh40BHVI1y7HJWS/C7JggikmRFgXd35w3X2ANA3wPD
+ SEIpKs1kAumUoWyV5qa/34cIoV1g5v1qxafiDvydDnwD1WuWQwplbmRzdHJlYW0KZW5k
+ b2JqCjY0IDAgb2JqCjM2NwplbmRvYmoKNzcgMCBvYmoKPDwgL0xlbmd0aCA3OCAwIFIg
+ L1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCA0NiAvSGVpZ2h0IDU4
+ IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRl
+ ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7ZRhloMgEIPZxVYU9f7HbZIB3LcO1AM4
+ f2qfHzEEZkJ46knAEvgpdSMPkb8oPYwXECFqxX8DvrExNr6LV90Yp+nkO7jBkezrRV4f
+ 6Jgp8ESWhYc+3mCA73l+i+/ipGHC2JQKTzeeFyZX4JSWBbzkqe7ESGkowwTgdSVOXt4v
+ OKXNBuGchUvdE2/Sgret4RT3tGXElEELL1Zcmq5Net9P8Z626GXJeTsOiCMY7dN3okS0
+ xf04dlm5TcvKbfqbdjTfCBu+vzoxmsY3ZpLL6fcy4TYt792k02xH7+ZtoUj8jLt3lnZP
+ kqnnFQ/1Wl20Q7sod+4gabuyOn3tkLfENRLCv96pzcBErkZEl+6pfYlWAOzSDWdPqEY9
+ b16grnEixxT2lTmRbEiAx4I6rAaj8M8clC6VnS3WWYeXTLLWkDU3dQFXVpXBLzHWAHle
+ PQkME/gAuQYQYQplbmRzdHJlYW0KZW5kb2JqCjc4IDAgb2JqCjM0MgplbmRvYmoKNzEg
+ MCBvYmoKPDwgL0xlbmd0aCA3MiAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0lt
+ YWdlIC9XaWR0aCAyNjAgL0hlaWdodCAxNjYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkg
+ L0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+ eAHtnelXk1cXxRlC5oTMIRNkIBMJhEAkIQyGQRBIRLEoFUUQCsWCOCKKRbRUBEsRlApF
+ QSyDhRfR2qJWu/qvvec+SazGAMV+8crdH8CsBXjuj332vXlY656YGCJCgBAgBAgBQmA7
+ BGLx1naWGvm1aOVxbxWPod4WH4fWErm+rV6Hlg/rptESMBeNRouPRzi2xYH6/cPyYfF0
+ OoPBDImFlcJVMxh0OiwEQGwDAyJAAaDD6lksNgfE5XJ52AmK5kLtbDaLyWRQHIIYtmqC
+ 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
+ UqlUqdVqDW5Sq1UqpVKRJJdJJCIgwKVMAFmwYSOEIyFkBaDA5QMGoUgskUilMpkcO8lk
+ MqlEIhGLhIJE6AI2C5lgawRUJqB+SKAzmCw2h8Pl8fmJAkCBpwSwej6fx0UAIAiCBGKD
+ v+7NPkIyxsWHMDBZCASg4HJ52AmK5kLtbLR+BgCgCMTF/gsEKBWAQhBDAp3OYDBDYmGl
+ cNUMBp1aP2oCAPDvCCCPwNfCdwCHeBr0Bd6i0WjxaP3bAhBqFOBAgUDfTuEAIngpWDn6
+ iNYSWtbHfUI/AGN93KLJdxEChAAhQAjsYAL/B5+bdSgKZW5kc3RyZWFtCmVuZG9iago3
+ MiAwIG9iagozMDQxCmVuZG9iago1NyAwIG9iago8PCAvTGVuZ3RoIDU4IDAgUiAvVHlw
+ ZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDIxNiAvSGVpZ2h0IDE0MiAv
+ Q29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
+ L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae2d+VMT2RbHUZEsJCEJWciGgUgwLIYgGBZh
+ IkHZEhE1wEPJAOFBAQEUELBQtskYYQQEZIiDgPCA0fgQHyqIMOW/9s7tsMQGSpyZmm67
+ +vwg3Qrc87nf7z2dtm6fDgigg54BegboGaBn4GgzcIx8cbTED/4uRHN8N06QJHYTOn4c
+ JXhw6of+7TYSsAQGniRjBAZCbojxW9gwnQAJgIKCGAzmdrCIj51UGIygIMgO4DC0Q/Xx
+ /wdEhUEFARGLxQ6G4HA4XHIEZIISYrNYTCYD2AKPSIZRgVIAhZA4XB4vhM8XkCn4/BAe
+ jwt4bBZCw0T72kpDlQIMGMRksoM5PB4ACUNFIrFYIpGSIyQSsVgkChUKBHwejxPM9pGh
+ debvOfwxsiBQMYCKC1ChIrFUGiaXyxVKpVJFhoA8FHK5LEwqFYtCAY3rR4aH2TvfxmKy
+ gEogFEmkMrlSFa5WR0RGasgSkZERanW4SimXSSUioQDIWExkRpBsD+TLI1hboBaIxeHx
+ hSKpTKE6pdZoorTRZ3Q6XQyKWCIDywAyOROtjdJEqk+pFDKpSMjnIckQ2KFW3MZCYgGV
+ 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
+ g9I+pH2IswQhp7QPaR8SYjzcoLQPaR/iLEHIKe1D2oeEGA83KO1D2oc4SxBy+q0+pOZ+
+ tu9tX+VR9x9+b1xo//y+fZVf2z9PnX2wAV/Rizw7K6FsfMO+5e+F62/fP08Swf4aF/We
+ T4HnpKj3PBFFn/+i6vN61Hy+MpCiz8MGMij6/DJVnzenaH8AqvZzoGj/DfQAGBX7pVC2
+ vw1l+xFBGzMK9o8KoGi/rwCq9mejbj89aFdJwf6HARTtVwkLjJr9RanaDxYTjIL9e4GL
+ mv2WkWC+RtLU6o8dQNV+5siJ2MsCKNZ/Hh6np+b7AjAwn2TUer8DgPkko9r7ONCWB0QG
+ ywyhUef9KQCGkfnQqPS+Gx8ZiIZko9T7iRAZUg05cicAkRSxkw98RQn6Uv1zf6KfJ1n8
+ ORD6p+gZoGeAngF6Big0A/8HKVU+WgplbmRzdHJlYW0KZW5kb2JqCjU4IDAgb2JqCjI0
+ OTgKZW5kb2JqCjY5IDAgb2JqCjw8IC9MZW5ndGggNzAgMCBSIC9UeXBlIC9YT2JqZWN0
+ IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjYwIC9IZWlnaHQgMTY2IC9Db2xvclNwYWNl
+ Ci9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNv
+ ZGUgPj4Kc3RyZWFtCngB7Z3pV5NXF8UZQuaEzCETZCATCYRAJCEMhkEQSESxKBVFEArF
+ gjgiikW0VARLEZQKRUEsg4UX0dqiVrv6r73nPkmsxgDFfvHK3R/ArAV47o999r15WOue
+ mBgiQoAQIAQIAUJgOwRi8dZ2lhr5tWjlcW8Vj6HeFh+H1hK5vq1eh5YP66bREjAXjUaL
+ j0c4tsWB+v3D8mHxdDqDwQyJhZXCVTMYdDosBEBsAwMiQAGgw+pZLDYHxOVyedgJiuZC
+ 7Ww2i8lkUByCGLZqghiKADgAAKDlc3l8fqJAIMRUAkEin8/ncTmIA2BAZtgyGVAKQhPQ
+ mUw2h8vnw+JFYolEKpXJ5NhJJpNJJRKJWCQEEjyEgRGisKkTUBsAAQYQ4AEAsUQqlycp
+ lUqVWq3W4Ca1WqVSKhVJcplEIhIm8rkcFniBssImEEIImCwgIBRJZHKFUq1J1mp1er0B
+ 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
+ gEIQQwKdzmAwQ2JhpXDVDAadWj9qAgDw7wggj8DXwncAh3ga9AXeotFo8Wj92wIQahTg
+ QIFA307hACJ4KVg5+ojWElrWx31CPwBjfdyiyXcRAoQAIUAI7GAC/wefm3UoCmVuZHN0
+ cmVhbQplbmRvYmoKNzAgMCBvYmoKMzA0MQplbmRvYmoKNzQgMCBvYmoKPDwgL0xlbmd0
+ aCA3NSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAzMzYg
+ L0hlaWdodCAxNTAgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25l
+ bnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtnedXU9vWxpUWUklC
+ CqRAQiAhEAihGHoLRbqCQAClF8EAgiIgShOlWBAUhYOCIIrCQfSoWI53nH/tnWuHIhLY
+ 7sv75dy9ng8Kg8mW9fOZa62xGWM+J05gYQKYACaACWACmAD9CJzE2iFwnP989AynXTnT
+ XLsgnBAXqly3UQJDFxdXrF0CLi4uzs4ILSWmhC8BJTzGzY3BcN8Wk7baIcBguLkBFIBK
+ ASmiScB0A5JMJosN4nA4XFoLACAOLBbT3Z1BMLUjJW18giY4E2AilBwuj+fB5wuwBHy+
+ B4/H43LYiCkgRSYl3UnRCQSN7ubuzmJzeDwAKfQUicRiiURKa0kkErFIJPIUCoAqFyFl
+ bBM90qGo1YEmA2hyAaanSCyVeslkMrlCoVDSWQqFXC6TeXtJJYipB4/DZoJHCYseAXQb
+ pzsTaAqEIonUW6ZQ+qhUaj8/Dc3l56dWqXyVSrnMSyr2BKJsFrIo6vlDgcLeCe4Ec3J4
+ fKFI6i1X+qo0mgCtLlCv1wchBdNQxMIBQKBOq/XXqFVKhQwRha5HFj0K6DZOZE6gqfBR
+ aQJ0+mBDiNEYZjKZwmksWL4pzBhqCNYHajVqX6VMKhJ6kAGFbkfuZHM9hGIvuY/aX6c3
+ GMPCI6PM5uiY2B3F0Uo7q46NjYk2n4qMMBkNQYEBfr4Kb4knnwcORXvoIR0P9oSDncDp
+ rVRpdEGhpohT0bHxicnJqRakNJqKWHxqSnJiQlyMORKQBvqrwaLQ82wmw9XlkC0U2dPN
+ nQXulHgr1QH6EFNkdFxiiiUjMys7Jzc3Ly+ftsrLy8vNzck6nZGWmhQfcyrcGKTV+EDP
+ g0OJLdShQZE9GUwOTyj2Vvppg42R0fHJlszsvIKzRcXFJaVWWqu0tKS4qPBMfs7p9JSE
+ 2CiTIVDjCw7lc1nQ8U5Ojo54wp5sOIoAp85gMsclp2flnS22lp+vrK6prQPV01Ro7bU1
+ 1VUXKqzFhQXZGakJ0RGhenCoROiBOt7hDkrYk8Xli6QKtRZwJlhO5xWWVFTW1Dc2t9hs
+ rW1t7bRVW1urzXapuamhtqrCWlSQlZYUExkaqFF6i2ELRQZ10PAn0e7J5gmlclVAsMmc
+ mJZ9priiqq6ppfVy59Wua9099Fb3ta4rHe22i/XV50sLczOSYyNCdGolbKEcMKijhj/p
+ 5MpgcaHbfTR646mEtJyz1gu1TbbLV7p7+/oHBodorsGB/hvXe7o6WpvrqsqKcjOSok3B
+ ASqZhDCoo4aH04iwp0KtC4mMs2SftVbWt7Rf7bkxMDxyZ3RsfILWGh8fG719a/Bmb1eH
+ rbG6vCg3PeGUUa9Reok8OO5uDhqeaHcOH+zpH2SKTj59xlrZcKmju29wZHTi/oPJh1NT
+ 03TW1MPJyft3x24P3ey50tpUXVaYbYmNMGhVMrGAy4KGP7CBAk/U7hK5ShsSGZ+eV3yh
+ /lJnT/+t0buTU49nns7Ozs7RWLD8p08eT0/eHxsZuH61tbHKWpCZZEYGlXqiE8nZAU/U
+ 7p5SpUYfZk7OKqyobeno6R8Zvz89Mzv/bGFhcXHxBX21uLiw8Hx+9sn05MTtwetXbA0X
+ inMtseGGAF9vER/xPHADPYm2Tw+Rt2+AISLOkldS1dR+rX9kYvLR7PzC0vLKyqtXr17T
+ VrD4lZWXS4vP5mYe3r0z0NPZXFN2JiMhKlSHGp7DhA301xs9Oo44ArFMpQs9lZh5trzO
+ drVveHzy8dzzpZXXb96ura2t01iw/LU3qytLC/MAdKT/WlvjhXPZydFheo1CKuSxHPJ0
+ Y8L2qfDTh0UnZ5+rbGrvGRy9/2huYfn1m/WNd5ubm+/prM3Ndxvra6svF+dnJseH+zqb
+ q0vzoOGD/ZVesIE6OJDgNs+Cy7xSExQea8ktrWm5cmPk7vTs8+XXaxubH/76iPXh/cb6
+ 6srC3KP7d/qvtdaVQ8NHhmhhA/WADfTAAY+Od56nl0+AAU73gvK61msDow9m5pderW28
+ //h5C+kLbUUs//PHD+/WV5efP304PtR7ufFC4emkU0bYQA/lyebBcaQNiYLt83zj5d7h
+ ianZhZU3gHPryzesb1+3Pn14t/bqxR+P7o3cuNJcVZydbA4LVMvFfI5Df6LjHY4jozkp
+ q7CyubNv5N6j+aXX65sft75++/vvv3/QWgDg+9etj+83VpefzTwY7e+y1ZTkpsaY9H4K
+ iQB4HriAOsF1iQ88A41mOI6qW67evPNg5tky2PPTl28EzP/QWISXwKF/vVtbWZh9ODbY
+ 3VpnRQdSENzoBdzDeIrlan1YTEpOcY2tq3908unCytt3f219/f7jJ5T/0Eo/LfzH39/A
+ oGuvFuemJoZ62uvL8tPiIoIJnkw3R/7k8MVyP70pJjW3pNZ2bWDsIWyfa8AT7Ln9WFqh
+ 3F3s9uKB55eP79dfv/hjemK4t72hvCA9PtLgD/7kHcKTuH6a0HWprrV7cJzgCdvnDs/d
+ f4BmH/zE89P7P1eB591b1y83VhRkIJ4+XsIjeGqCgGce4jkEx/viq7U9njSjuG+5CCny
+ J+K5NA8HPOKJLqCGgN/haa1r6/mV577n0+6TX3n2dRyTJ+0I7l8w5rmfx3E/+//medyf
+ 51///b/sn2T9Dr+Ng9d1EoX9PDq4f/7reRx3AcigP51HmOdxgf7znx/f9873/TxZbr++
+ oEev57mC7dd1eXZ/Ts+9eLUOb0O+wXX+2D/Nv/8BwPOr/b70+P5IX0dTxdnt+5KngxfK
+ wBNeJwPP4PC4tHxrfTvcl4Dna+D5BXj++2kcfwWI5+cPG3D/RDw7m86fzUyIQi9AgSfj
+ 1194YJ6kwDFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBP
+ SrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhI
+ izFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFP
+ UkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSU
+ CjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBP
+ SrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhIizFPUkSUCjBPSrhI
+ izFPUkSUCv47nmgcdf7ufJudeSx4IMs/aF7Q188woHZnHot9vo3WBwZ8O5jHgudZkZkV
+ eFKYv4R5Hs2T4nywE5gnGc998z/3zwc7fD7tYfPraD8hjOI8QDJ/Yp7759Nifx7dzmRf
+ Pe78z9YD837pfWU6wPN35yfr9833/nkeNTyS7H/xf/PrsHCk3fPo9+d7E/PnY/fPn9+b
+ l05LnnaWOzwpzZ9nwzx/0nyE/00LHr6qfTy38xGmfy8fAeV3qIn8juKd/I6XbzY+fIYB
+ oKC9B9PxI0QABaLY8zvGfyO/w2U3XyY5q8ieL/N4fmmVyJf5Tvd4mR8/IF/m29an9xtv
+ lp89mfydfBmCpzekRe7lH01DgMfbjQ8osMeu77TU9uIh/wjiZSC+A8bT2vOPUsxh+sPz
+ j3bzuRIyCsrr27oHRichn+v12jt7Phdtw7nsC9/agnyuzfXVl8+fTk0MX+9o2svnQoGR
+ jvPOID/OPxhe2OVZay5dJfLjFpZXIfDsA0qP+0RjofX/9f7d+puVRbAn5Me11RPxHUfk
+ xzmjfEOpQqM3RadkF1c2XYZ8wwePUb7hW5RvSOdwQ7T2zc2NP9dWV15AvuHEcN+VlhqI
+ k4qLQPEyh+QbOrsR+ZtqnRHlb1bU2br6bk1MzswtLK2sQvwmEb75Jy1FLH1t7e3qq+XF
+ +SdTd2/3d7c3Vp7LTok2ocBdyN88MN77xImf8mEjYWJ6adXF9m6UD/t49tnC0ssVezjs
+ Kj2FcnEhIHbpxfO5mal7o4O9nS21ZWcyEyHeUC2XCLiO8mFR4MR2fjHEa0N+cV1LZ8/A
+ yMSD6Sez888XUHjxEm0Fi4cA4/m5p48m744O9V1tbahE+cURkF8sOyy/2MkVDnjI11br
+ QiMT0vNLKhtsnb39I2P3JqdnnsxCuvYfNNbcHARsz0w/vD9+e7Cvq62p2nrmdBLclo7K
+ 13ZxY+7lv2edsVY12jp7bgyNjN29D/HvRPj7I1rKnns/Nfng3vid4f7eq20Xa8qLcixx
+ kSj/XSKA7fPgdenECRQIzYbEXQUyaLwlp9Ba1XDpclfvzcFbt0fHJiYm7tJYsPzx0Tsj
+ Q/3Xr3XammoqzuVlJBLx714iSDOFOOgD+e+IJ4PFFYi8fVACfGJ6bqG1su6iraOrp+9m
+ /+DQ0PDw8C2aCpY+NDQ4cLOvp6uzrbmhuvxcfmZyTDjYUy4R8oj494M8T0IiNGFQuUpr
+ MEUnpeecLamorr9oa++40tXd09MLuk5LoZX39HR3Xe1stzU31lywFuZlJsdGhuj8lMie
+ TIbrr2k9KAz+JGp4ZFAvpZ/OEB6daMnKL7JWVNU2NDXbbG3t27pMM+2su63V1nKxsa76
+ grW4ICcDcBr1Gh+ZWIDs6ajdYQN1ckUGFYi9AWhIuDk+JSM7v7DYWlFZXVNbV1/fQKiR
+ ZrKvur6+rq6muvJ8WUlRQW6mJTEGcPr7yqSeHnZ7Hmx3ZFAXVwaT4yGUyJQanSEsMiYh
+ Jf10Tv6ZwuKSUqu1rKyctiors1pLS4qLzhbkZmVYEmNPmUL0Gl+51JPPZSF7OqEG/1XQ
+ 8LCDsrh8TwDqpw0KNUXFxCelpmVkZefm5uUX0Fr5ebm52VmZ6ZbkhFhzhNGgQzhFqNvR
+ 7unInvYdlOHOtgNV+QcGG02R5pi4hKTkVIslLS2dzkqzWFJTkhPjY81R4UaDPsDPR0bg
+ hMMI7HkYT6LjAahQ7KXw9QsIDAoxmiKizOaY2Ni4uLh42goWHxsbE22OijSFhQbrtRqV
+ UibxBHcy3V0PtSdhULSFsrkeApFUpvRV+2sDgwwhRqPJZAqPoLXCw02mMGOoIUivDfAD
+ ml5iIR/hdAOch9gT8YQ7kyu0PIcn8BRLZQoflVoToNUF6vVBwSADXQVrD9Lr9TptgMZP
+ 5QM0JSKBB5cMpx0oONSdhSzqKZJ6yeRKH1+V2k8D8qex0Pr91CpgqZB5S8UiAZ/HYcFR
+ dJQ70XmPHOoC11AgyvMQCEUiidTLWyaXK5S0l0IhlwFLgCkUePA4hDldjmh2+/UJgKKe
+ d3Nngkd5HnyB0FMkEkskUtpLIhGLRMASYHIRTTAnOU5wqN2iyKNMNpvD5QFUvgBJSGcR
+ BPgePMSSzXLfoXnoUfTT5Z6wqIsrMikwZbGBKofDBfFoK7R6LgdIsllMJsB0s3vT6aTj
+ i+dPMIkPkUdhHyWYMhhAFbjSXgQGBsMNWBKNDtek36OJkJ4kkDo526HCE8CttBaBAP5w
+ cXFxhkOIEsxtu24zRd/sjAUEEAkkAPP7ztyGufcX+m6sXQJ7YPBHmAAmgAlgApgAJoAJ
+ YAL/FYH/A0OweYAKZW5kc3RyZWFtCmVuZG9iago3NSAwIG9iago0MTU3CmVuZG9iago3
+ OSAwIG9iago8PCAvTGVuZ3RoIDgwIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJH
+ QiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtWHVYVN323hMMPQzdMIB0
+ I92tdLdSM3SNQ6NISEqJ1EeJIiCCUiKhopQgiogKiKCggIQgKIhiIPcM6Pf94rnP/efu
+ 55mz3/3uFfvstc9Zsw4A9FweBEIgHAAQFBxGtD6ii3V0csaSTwEYIAfUgAFweOBCCTqW
+ lqaQyL9pXyYgaag9lyTZGjwh1Wu5kir+JogtVyXQOuvfKP2h0UTIIQAwCYhg8jnA2iTs
+ eYBtSTgyjBAGyfiSMM7XAw/hUxCWINpa60G4FsJonwPcQcKeB/gBCUfgfEi6kwCgGILx
+ fsEAkK9BWBPvFYqDpkl+8fhQXBCEzwEA1wwKCoHsY0YhXgRHIEK6mB0IHyLtC9RDLbgR
+ ABULyGbsP5zrawBudEG2X/zDiRoDwEgHwNDoP9yW9f5ewViehHoflts3B6PRBYBsZm9v
+ SwjSPw/Abu7e3o/Kvb3dywAgXgHQHYgLJ0bsy0JOYY8B+E/jg3v+rYGAgkMKsDp4BnOB
+ rcPTEaqIPeQEWR9qgHyS4guVELUrTT1ake4FfQwjD9N9FiIbH/srznxuK14W7AR/+SG8
+ kJTwuGi0OLtEg5SOdL+sntwNeQ6FKMVhZVaVY6qlamMaSE0ZLWftNJ1W3bf6aAN1Q58j
+ eUe7jVZNWEy1zfzN0yxqLPutZq2/2TLaidlrO1g74pxCneNcMo4VHi9zLXTLck/0CPf0
+ xTnhj3rJe2N9qHw++77y6/OvCzgXSAiyCpYJoQtZJwyfqCOmhnqGaYazh29FPI6sjUqI
+ doiROok6+fZUd2zl6fS4iHj/BHwi/ox/UlhyUkpRalvaRPp2BlPm4Syr7KCc9HOVuXfO
+ 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
+ 80QY8V2YZfiNSPooYvTYSdVTl05Tx0XFLyU6nhlO1k25lSaf3pahkTmU7ZSzmns6jz6/
+ slC6qLNYs+RemXp5WwXZRdNLBZWzVWLVkTX3a5mvetfduoa+jm+408TcTGh51Cpy82zb
+ hw6rzvbbPHdSutbvOXT39Ir3FfTvDfgPjg1pP6wfZnkcOvJwlPOp77Nrz9+PC0w4vEic
+ rH35cOrd9M/XmBneWfE3Cm9V5zTntRe032kuqi4pLcuuiL3nX0Wvrqx1fohcV1hf26j+
+ 6PSJ6tOdTe8tzFbH52PbYLvyi+6Xua9xO1w7nd/svn38nvlD+EfvT9efO7t5v6R/De3h
+ SfE/qJdI+QNQ6YUEhhCxpnr6+8P/3iUoMByqyfYbA3SlCfY0h+osqAoFYJkQZkmqBVmg
+ 3/fQCBsDqMdA5RDG28/Q6DfG4j30TSDMBfEyMb565hCmgbCpN9HQGsKQHZijv4exJYTR
+ EPb3Craz+c1HEQL3a1ySzFlCmC5Jng3CZV6hBn9kWmN8bR1+6w4Qw63tIHwIkhkLCDEh
+ yZN87eC99H+vDY4MDjQ3hXhozXAmvzAj0vqZICwG5VEPQAQ+wAtIAlOgB/R/X7EQj4XG
+ IdCsFwiF5Bb25f5I2e+P/f6PliSUlUn2IvZ1AsAihIPc/BKJkK0D60MAB3EeIPgPI1Mv
+ syLz889o32Pgvtc/GibQ6H8zB5YOVncw4wfwkNQfHvdHg+Q5qMU74q+QaFV7X6QQUg7K
+ /7pIqExEqgAskgXJASSR8khlpA5SC6kGzamMrLWv/b2Wg73x/PseTaB1eEF5h7QjwX+z
+ /88r8IO+YezX7tAuAxR0NsqaSeh+VGw8qf+fLcwrCqrrAdALIUQT/Xx8w7A60JcLLwms
+ UTBOSgIrJyMrA/4FJe1eNwplbmRzdHJlYW0KZW5kb2JqCjgwIDAgb2JqCjM5MTAKZW5k
+ b2JqCjUzIDAgb2JqClsgL0lDQ0Jhc2VkIDc5IDAgUiBdCmVuZG9iago4MSAwIG9iago8
+ PCAvTGVuZ3RoIDgyIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVy
+ IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtWHVYVN323hMMPQzdMIB0I92tdLdSM3SN
+ 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
+ B5YOVncw4wfwkNQfHvdHg+Q5qMU74q+QaFV7X6QQUg7K/7pIqExEqgAskgXJASSR8khl
+ pA5SC6kGzamMrLWv/b2Wg73x/PseTaB1eEF5h7QjwX+z/88r8IO+YezX7tAuAxR0Nsqa
+ Seh+VGw8qf+fLcwrCqrrAdALIUQT/Xx8w7A60JcLLwmsUTBOSgIrJyMrA/4FJe1eNwpl
+ bmRzdHJlYW0KZW5kb2JqCjg0IDAgb2JqCjM5MTAKZW5kb2JqCjY1IDAgb2JqClsgL0lD
+ Q0Jhc2VkIDgzIDAgUiBdCmVuZG9iago4NSAwIG9iago8PCAvTGVuZ3RoIDg2IDAgUiAv
+ TiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
+ dHJlYW0KeAGtWHVYVN323hMMPQzdMIB0I92tdLdSM3SNQ6NISEqJ1EeJIiCCUiKhopQg
+ iogKiKCggIQgKIhiIPcM6Pf94rnP/efu55mz3/3uFfvstc9Zsw4A9FweBEIgHAAQFBxG
+ tD6ii3V0csaSTwEYIAfUgAFweOBCCTqWlqaQyL9pXyYgaag9lyTZGjwh1Wu5kir+Jogt
+ VyXQOuvfKP2h0UTIIQAwCYhg8jnA2iTseYBtSTgyjBAGyfiSMM7XAw/hUxCWINpa60G4
+ FsJonwPcQcKeB/gBCUfgfEi6kwCgGILxfsEAkK9BWBPvFYqDpkl+8fhQXBCEzwEA1wwK
+ CoHsY0YhXgRHIEK6mB0IHyLtC9RDLbgRABULyGbsP5zrawBudEG2X/zDiRoDwEgHwNDo
+ P9yW9f5ewViehHoflts3B6PRBYBsZm9vSwjSPw/Abu7e3o/Kvb3dywAgXgHQHYgLJ0bs
+ y0JOYY8B+E/jg3v+rYGAgkMKsDp4BnOBrcPTEaqIPeQEWR9qgHyS4guVELUrTT1ake4F
+ fQwjD9N9FiIbH/srznxuK14W7AR/+SG8kJTwuGi0OLtEg5SOdL+sntwNeQ6FKMVhZVaV
+ Y6qlamMaSE0ZLWftNJ1W3bf6aAN1Q58jeUe7jVZNWEy1zfzN0yxqLPutZq2/2TLaidlr
+ O1g74pxCneNcMo4VHi9zLXTLck/0CPf0xTnhj3rJe2N9qHw++77y6/OvCzgXSAiyCpYJ
+ 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
+ 0KC4oaygkqD6TF1EI0lzUdtUp11PXL/KkO/IZSNR45um+maTFgQrGusmWxfoee1yinCR
+ P7bj2u2e5emKV/Sm8XnpVxJgFLgSHB3y80QY8V2YZfiNSPooYvTYSdVTl05Tx0XFLyU6
+ nhlO1k25lSaf3pahkTmU7ZSzmns6jz6/slC6qLNYs+RemXp5WwXZRdNLBZWzVWLVkTX3
+ a5mvetfduoa+jm+408TcTGh51Cpy82zbhw6rzvbbPHdSutbvOXT39Ir3FfTvDfgPjg1p
+ P6wfZnkcOvJwlPOp77Nrz9+PC0w4vEicrH35cOrd9M/XmBneWfE3Cm9V5zTntRe032ku
+ qi4pLcuuiL3nX0Wvrqx1fohcV1hf26j+6PSJ6tOdTe8tzFbH52PbYLvyi+6Xua9xO1w7
+ nd/svn38nvlD+EfvT9efO7t5v6R/De3hSfE/qJdI+QNQ6YUEhhCxpnr6+8P/3iUoMByq
+ yfYbA3SlCfY0h+osqAoFYJkQZkmqBVmg3/fQCBsDqMdA5RDG28/Q6DfG4j30TSDMBfEy
+ Mb565hCmgbCpN9HQGsKQHZijv4exJYTREPb3Craz+c1HEQL3a1ySzFlCmC5Jng3CZV6h
+ Bn9kWmN8bR1+6w4Qw63tIHwIkhkLCDEhyZN87eC99H+vDY4MDjQ3hXhozXAmvzAj0vqZ
+ ICwG5VEPQAQ+wAtIAlOgB/R/X7EQj4XGIdCsFwiF5Bb25f5I2e+P/f6PliSUlUn2IvZ1
+ AsAihIPc/BKJkK0D60MAB3EeIPgPI1MvsyLz889o32Pgvtc/GibQ6H8zB5YOVncw4wfw
+ kNQfHvdHg+Q5qMU74q+QaFV7X6QQUg7K/7pIqExEqgAskgXJASSR8khlpA5SC6kGzamM
+ rLWv/b2Wg73x/PseTaB1eEF5h7QjwX+z/88r8IO+YezX7tAuAxR0NsqaSeh+VGw8qf+f
+ LcwrCqrrAdALIUQT/Xx8w7A60JcLLwmsUTBOSgIrJyMrA/4FJe1eNwplbmRzdHJlYW0K
+ ZW5kb2JqCjg2IDAgb2JqCjM5MTAKZW5kb2JqCjU5IDAgb2JqClsgL0lDQ0Jhc2VkIDg1
+ IDAgUiBdCmVuZG9iago4NyAwIG9iago8PCAvTGVuZ3RoIDg4IDAgUiAvTiAxIC9BbHRl
+ cm5hdGUgL0RldmljZUdyYXkgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
+ hVJPSBRRHP7NNhKEiEGFeIh3CgmVKaysoNp2dVmVbVuV0qIYZ9+6o7Mz05vZNcWTBF2i
+ PHUPomN07NChm5eiwKxL1yCpIAg8dej7zezqKIRveTvf+/39ft97RG2dpu87KUFUc0OV
+ K6Wnbk5Ni4MfKUUd1E5YphX46WJxjLHruZK/u9fWZ9LYst7HtXb79j21lWVgIeottrcQ
+ +iGRZgAfmZ8oZYCzwB2Wr9g+ATxYDqwa8COiAw+auTDT0Zx0pbItkVPmoigqr2I7Sa77
+ +bnGvou1iYP+XI9m1o69s+qq0UzUtPdEobwPrkQZz19U9mw1FKcN45xIQxop8q7V3ytM
+ xxGRKxBKBlI1ZLmfak6ddeB1GLtdupPj+PYQpT7JYKiJtemymR2FfQB2KsvsEPAF6PGy
+ Yg/ngXth/1tRw5PAJ2E/ZId51q0f9heuU+B7hD014M4UrsXx2oofXi0BQ/dUI2iMc03E
+ 09c5c6SI7zHUGZj3RjmmCzF3lqoTN4A7YR9ZqmYKsV37ruol7nsCd9PjO9GbOQtcoBxJ
+ crEV2RTQPAlYFH2LsEkOPD7OHlXgd6iYwBy5idzNKPce1REbZ6NSgVZ6jVfGT+O58cX4
+ ZWwYz4B+rHbXe3z/6eMVdde2Pjz5jXrcOa69nRtVYVZxZQvd/8cyhI/ZJzmmwdOhWVhr
+ 2HbkD5rMTLAMKMR/BT6X+pITVdzV7u24RRLMUD4sbCW6S1RuKdTqPYNKrBwr2AB2cJLE
+ LFocuFNrujl4d9giem35TVey64b++vZ6+9ryHm3KqCkoE82zRGaUsVuj5N142/1mkRGf
+ ODq+572KWsn+SUUQP4U5WiryFFX0VlDWxG9nDn4btn5cP6Xn9UH9PAk9rZ/Rr+ijEb4M
+ dEnPwnNRH6NJ8LBpIeISoIqDM9ROVGONA+Ip8fK0W2SR/Q9AGf1mCmVuZHN0cmVhbQpl
+ bmRvYmoKODggMCBvYmoKNzA0CmVuZG9iagozMCAwIG9iagpbIC9JQ0NCYXNlZCA4NyAw
+ IFIgXQplbmRvYmoKODkgMCBvYmoKPDwgL0xlbmd0aCA5MCAwIFIgL04gMyAvQWx0ZXJu
+ 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
+ BZGil5KFMpBygEqAKpHqHbUx9S0acZoKWmbaTDQKnUgH6BIwCEwaPZq+iIGfoZFRm3Gc
+ KYgZxVzJosMyx5rCJsk2wZ7AIcPxhjOP6yg3kruX5wyvIZYGO8FXyR8qYHiI59CO4IRQ
+ u/BFkSLRXLFs8WyJ85IlUjXSN2UeyM7IfZVnVlBVxCllK3epbKgJqrtplGpOa/Po4HUb
+ 9X4YGBhmHHlkRGasZOJpmmJWY95jMWX50Rppw2IrZqdt7+QQ6pjj1OA84vLpOIurhpu3
+ e67HXc91vICXo3eOz4Dvrr98gF/ghaCnIXCC3Al3Ynbo7bDlCLpIpSj36IyYjpNLsayn
+ jeJi41sS3p8RSDqeXJIymcaa7nT2QsZClmR2VM5ALtv5kLzhApnC0r/QxemlNGUFF4Qr
+ Bi/5XaapaqlxrkVebap3u45p6GuKapG+sXzzSrtfp+StzTu37iZ2m/ay9s3fbxo8NWT8
+ iH14dMTuyfzTmOc8YyMTGZM2U0KvYK/nZgfe1s/nvCMu2axwvq9YE/7QvKH5cWTTbWtj
+ O/4r3U7xd54fFbscv3L2488KdAABVIAnYA+KvTesGHYftgXnh1vDk+Dt8DUEH8IRet6H
+ kAikJjIG2Y7cJlMgiyDrQpGhLFClqPfkauTnyJcp9CmqKCkoCZSvqEypuqmVoEjr0gzT
+ OtG+R5+mY6ZrwlhgPtEXMmgyrDCWM9kw0zI/ZElnNWVjYJtir+YgcupwMXKtcg/wVPGm
+ YAP4bPl1BOQOCQvyCnEKc4hgRcXFVKBs5CF5SqpEuktmQQ59WF2eqNCguKGsoJKg+kxd
+ RCNJc1HbVKddT1y/ypDvyGUjUeObpvpmkxYEKxrrJlsX6HntcopwkT+249rtnuXpilf0
+ pvF56VcSYBS4Ehwd8vNEGPFdmGX4jUj6KGL02EnVU5dOU8dFxS8lOp4ZTtZNuZUmn96W
+ oZE5lO2Us5p7Oo8+v7JQuqizWLPkXpl6eVsF2UXTSwWVs1Vi1ZE192uZr3rX3bqGvo5v
+ uNPE3ExoedQqcvNs24cOq8722zx3UrrW7zl09/SK9xX07w34D44NaT+sH2Z5HDrycJTz
+ qe+za8/fjwtMOLxInKx9+XDq3fTP15gZ3lnxNwpvVec057UXtN9pLqouKS3Lroi9519F
+ r66sdX6IXFdYX9uo/uj0ierTnU3vLcxWx+dj22C78ovul7mvcTtcO53f7L59/J75Q/hH
+ 70/Xnzu7eb+kfw3t4UnxP6iXSPkDUOmFBIYQsaZ6+vvD/94lKDAcqsn2GwN0pQn2NIfq
+ LKgKBWCZEGZJqgVZoN/30AgbA6jHQOUQxtvP0Og3xuI99E0gzAXxMjG+euYQpoGwqTfR
+ 0BrCkB2Yo7+HsSWE0RD29wq2s/nNRxEC92tcksxZQpguSZ4NwmVeoQZ/ZFpjfG0dfusO
+ EMOt7SB8CJIZCwgxIcmTfO3gvfR/rw2ODA40N4V4aM1wJr8wI9L6mSAsBuVRD0AEPsAL
+ SAJToAf0f1+xEI+FxiHQrBcIheQW9uX+SNnvj/3+j5YklJVJ9iL2dQLAIoSD3PwSiZCt
+ A+tDAAdxHiD4DyNTL7Mi8/PPaN9j4L7XPxom0Oh/MweWDlZ3MOMH8JDUHx73R4PkOajF
+ O+KvkGhVe1+kEFIOyv+6SKhMRKoALJIFyQEkkfJIZaQOUgupBs2pjKy1r/29loO98fz7
+ Hk2gdXhBeYe0I8F/s//PK/CDvmHs1+7QLgMUdDbKmknoflRsPKn/ny3MKwqq6wHQCyFE
+ E/18fMOwOtCXCy8JrFEwTkoCKycjKwP+BSXtXjcKZW5kc3RyZWFtCmVuZG9iago5MCAw
+ IG9iagozOTEwCmVuZG9iago2OCAwIG9iagpbIC9JQ0NCYXNlZCA4OSAwIFIgXQplbmRv
+ YmoKOTEgMCBvYmoKPDwgL0xlbmd0aCA5MiAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZp
+ Y2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBrVh1WFTd9t4TDD0M
+ 3TCAdCPdrXS3UjN0jUOjSEhKidRHiSIgglIioaKUIIqICoigoICEICiIYiD3DOj3/eK5
+ z/3n7ueZs9/97hX77LXPWbMOAPRcHgRCIBwAEBQcRrQ+oot1dHLGkk8BGCAH1IABcHjg
+ Qgk6lpamkMi/aV8mIGmoPZck2Ro8IdVruZIq/iaILVcl0Drr3yj9odFEyCEAMAmIYPI5
+ wNok7HmAbUk4MowQBsn4kjDO1wMP4VMQliDaWutBuBbCaJ8D3EHCngf4AQlH4HxIupMA
+ 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
+ KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2cIeU/8NfswMN3gplbmRz
+ dHJlYW0KZW5kb2JqCjk2IDAgb2JqCjc5MgplbmRvYmoKOCAwIG9iagpbIC9JQ0NCYXNl
+ ZCA5NSAwIFIgXQplbmRvYmoKOTcgMCBvYmoKPDwgL0xlbmd0aCA5OCAwIFIgL04gMyAv
+ QWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFt
+ CngBrVh1WFTd9t4TDD0M3TCAdCPdrXS3UjN0jUOjSEhKidRHiSIgglIioaKUIIqICoig
+ oICEICiIYiD3DOj3/eK5z/3n7ueZs9/97hX77LXPWbMOAPRcHgRCIBwAEBQcRrQ+oot1
+ dHLGkk8BGCAH1IABcHjgQgk6lpamkMi/aV8mIGmoPZck2Ro8IdVruZIq/iaILVcl0Drr
+ 3yj9odFEyCEAMAmIYPI5wNok7HmAbUk4MowQBsn4kjDO1wMP4VMQliDaWutBuBbCaJ8D
+ 3EHCngf4AQlH4HxIupMAoBiC8X7BAJCvQVgT7xWKg6ZJfvH4UFwQhM8BANcMCgqB7GNG
+ IV4ERyBCupgdCB8i7QvUQy24EQAVC8hm7D+c62sAbnRBtl/8w4kaA8BIB8DQ6D/clvX+
+ XsFYnoR6H5bbNwej0QWAbGZvb0sI0j8PwG7u3t6Pyr293csAIF4B0B2ICydG7MtCTmGP
+ AfhP44N7/q2BgIJDCrA6eAZzga3D0xGqiD3kBFkfaoB8kuILlRC1K009WpHuBX0MIw/T
+ fRYiGx/7K858biteFuwEf/khvJCU8LhotDi7RIOUjnS/rJ7cDXkOhSjFYWVWlWOqpWpj
+ GkhNGS1n7TSdVt23+mgDdUOfI3lHu41WTVhMtc38zdMsaiz7rWatv9ky2onZaztYO+Kc
+ Qp3jXDKOFR4vcy10y3JP9Aj39MU54Y96yXtjfah8Pvu+8uvzrws4F0gIsgqWCaELWScM
+ n6gjpoZ6hmmGs4dvRTyOrI1KiHaIkTqJOvn2VHds5en0uIh4/wR8Iv6Mf1JYclJKUWpb
+ 2kT6dgZT5uEsq+ygnPRzlbl3zo/lrRUgCjmKpP/SKbYpwZeGlyWX51+4XNF88d6l4cqX
+ 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
+ uZUmn96WoZE5lO2Us5p7Oo8+v7JQuqizWLPkXpl6eVsF2UXTSwWVs1Vi1ZE192uZr3rX
+ 3bqGvo5vuNPE3ExoedQqcvNs24cOq8722zx3UrrW7zl09/SK9xX07w34D44NaT+sH2Z5
+ HDrycJTzqe+za8/fjwtMOLxInKx9+XDq3fTP15gZ3lnxNwpvVec057UXtN9pLqouKS3L
+ roi9519Fr66sdX6IXFdYX9uo/uj0ierTnU3vLcxWx+dj22C78ovul7mvcTtcO53f7L59
+ /J75Q/hH70/Xnzu7eb+kfw3t4UnxP6iXSPkDUOmFBIYQsaZ6+vvD/94lKDAcqsn2GwN0
+ pQn2NIfqLKgKBWCZEGZJqgVZoN/30AgbA6jHQOUQxtvP0Og3xuI99E0gzAXxMjG+euYQ
+ poGwqTfR0BrCkB2Yo7+HsSWE0RD29wq2s/nNRxEC92tcksxZQpguSZ4NwmVeoQZ/ZFpj
+ fG0dfusOEMOt7SB8CJIZCwgxIcmTfO3gvfR/rw2ODA40N4V4aM1wJr8wI9L6mSAsBuVR
+ D0AEPsALSAJToAf0f1+xEI+FxiHQrBcIheQW9uX+SNnvj/3+j5YklJVJ9iL2dQLAIoSD
+ 3PwSiZCtA+tDAAdxHiD4DyNTL7Mi8/PPaN9j4L7XPxom0Oh/MweWDlZ3MOMH8JDUHx73
+ R4PkOajFO+KvkGhVe1+kEFIOyv+6SKhMRKoALJIFyQEkkfJIZaQOUgupBs2pjKy1r/29
+ loO98fz7Hk2gdXhBeYe0I8F/s//PK/CDvmHs1+7QLgMUdDbKmknoflRsPKn/ny3MKwqq
+ 6wHQCyFEE/18fMOwOtCXCy8JrFEwTkoCKycjKwP+BSXtXjcKZW5kc3RyZWFtCmVuZG9i
+ ago5OCAwIG9iagozOTEwCmVuZG9iago3MyAwIG9iagpbIC9JQ0NCYXNlZCA5NyAwIFIg
+ XQplbmRvYmoKNCAwIG9iago8PCAvVHlwZSAvUGFnZXMgL01lZGlhQm94IFswIDAgNjEy
+ IDc5Ml0gL0NvdW50IDEgL0tpZHMgWyAzIDAgUiBdID4+CmVuZG9iago5OSAwIG9iago8
+ PCAvVHlwZSAvQ2F0YWxvZyAvT3V0bGluZXMgMiAwIFIgL1BhZ2VzIDQgMCBSIC9WZXJz
+ aW9uIC8xLjQgPj4KZW5kb2JqCjUyIDAgb2JqCjw8IC9MZW5ndGggMTAwIDAgUiAvRnVu
+ Y3Rpb25UeXBlIDAgL1NpemUgWyAxMzY1IF0gL0JpdHNQZXJTYW1wbGUgOCAvT3JkZXIK
+ MSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRW5jb2RlIFsg
+ MCAxMzY0IF0gL0RlY29kZSBbIDAgMQowIDEgMCAxIF0gL0ZpbHRlciAvRmxhdGVEZWNv
+ ZGUgPj4Kc3RyZWFtCngBrcHJNgIAAEDR//8VqUSKTElkKKRBRYakhGSoRFJri3ds3r3T
+ 6f9+DRPDj2Rs+DZ8GUaGT8nQMDD0DR+Gd8Ob5NXQM7wYuoZnyZPh0dAxPBjahpbk3tA0
+ 3BkahlvDjeTacGWoGy4NF5KaoWqoGM4NZUNJUmQFcMby7JSdsGOWY1l2xA7ZAdtnGbDH
+ dlma7bAU22ZJtsU22QZbZ2sgwVbZCouzGFtmUbbEFlmELYAwC7Egm2cBNvfXDFRB3u0K
+ ZW5kc3RyZWFtCmVuZG9iagoxMDAgMCBvYmoKMTkwCmVuZG9iago1MSAwIG9iago8PCAv
+ TGVuZ3RoIDEwMSAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9TaXplIFsgMTM2NSBdIC9CaXRz
+ UGVyU2FtcGxlIDggL09yZGVyCjEgL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBbIDAgMSAw
+ IDEgMCAxIF0gL0VuY29kZSBbIDAgMTM2NCBdIC9EZWNvZGUgWyAwIDEKMCAxIDAgMSBd
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZXB10IBAAAAwP//lYoQkTQU
+ GVFpJxqUSjRUKBlf4OHuptO5Jmjs/tHI/blfNHQD1Hc/6Nt9oZ77dB/o3b2hruugV9dG
+ L+7ZPaGWe0QProka7h7duVt3g+quhq5dFV25S3eBzt0ZOkUn4hhVxBE6FAeoLEpoHxVF
+ AeVFDu2JLMqIXbQj0mhbbKFNtCFSaF0k0ZpIoLhYRTERRSsigsIoJJZRUATQklhEC3PM
+ AFgkUrwKZW5kc3RyZWFtCmVuZG9iagoxMDEgMCBvYmoKMTc3CmVuZG9iago1MCAwIG9i
+ ago8PCAvTGVuZ3RoIDEwMiAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9TaXplIFsgMTM2NSBd
+ IC9CaXRzUGVyU2FtcGxlIDggL09yZGVyCjEgL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBb
+ IDAgMSAwIDEgMCAxIF0gL0VuY29kZSBbIDAgMTM2NCBdIC9EZWNvZGUgWyAwIDEKMCAx
+ IDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AaXB5zoCAABA0fd/
+ FSRKMhIZDQ2VsiKREUUiQhoP4Pu6P+45kwkYOyPnzxlqv86P8+0MnC/n0+lrH86703Pe
+ nK7z6rxoHaftPDtPTst5dB60e+fOaTq3zo3TcK61unPlXDo158I5d860U+fEqToVckzK
+ pESK5IgUSJ7kSJYcksxMaZIiSXJA9ske2SUJskO2SZxskRjZJBtknayRKFklEbIyU5iE
+ yDJZIkGySAJkgcyTuX+mgvqzxwplbmRzdHJlYW0KZW5kb2JqCjEwMiAwIG9iagoxODUK
+ ZW5kb2JqCjQ5IDAgb2JqCjw8IC9MZW5ndGggMTAzIDAgUiAvRnVuY3Rpb25UeXBlIDAg
+ L1NpemUgWyAxMzY1IF0gL0JpdHNQZXJTYW1wbGUgOCAvT3JkZXIKMSAvRG9tYWluIFsg
+ MCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Rl
+ Y29kZSBbIDAgMQowIDEgMCAxIF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFt
+ CngBpcHnOgIAAEDR938VJEoyEhkNDZWyIpERRSJCGg/g+7o/7jmTCRg7I+fPGWq/zo/z
+ 7QycL+fT6WsfzrvTc96crvPqvGgdp+08O09Oy3l0HrR7585pOrfOjdNwrrW6c+VcOjXn
+ wjl3zrRT58SpOhVyTMqkRIrkiBRInuRIlhySzExpkiJJckD2yR7ZJQmyQ7ZJnGyRGNkk
+ G2SdrJEoWSURsjJTmITIMlkiQbJIAmSBzJO5f6aC+rPHCmVuZHN0cmVhbQplbmRvYmoK
+ MTAzIDAgb2JqCjE4NQplbmRvYmoKNDggMCBvYmoKPDwgL0xlbmd0aCAxMDQgMCBSIC9G
+ dW5jdGlvblR5cGUgMCAvU2l6ZSBbIDEzNjUgXSAvQml0c1BlclNhbXBsZSA4IC9PcmRl
+ cgoxIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9FbmNvZGUg
+ WyAwIDEzNjQgXSAvRGVjb2RlIFsgMCAxCjAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAGtwck2AgAAQNH//xWpRIpMSWQopEFFhqSEZKhEUmuLd2ze
+ vdPp/34NE8OPZGz4NnwZRoZPydAwMPQNH4Z3w5vk1dAzvBi6hmfJk+HR0DE8GNqGluTe
+ 0DTcGRqGW8ON5NpwZagbLg0XkpqhaqgYzg1lQ0lSZAVwxvLslJ2wY5ZjWXbEDtkB22cZ
+ sMd2WZrtsBTbZkm2xTbZBltnayDBVtkKi7MYW2ZRtsQWWYQtgDALsSCbZwE299cMVEHe
+ 7QplbmRzdHJlYW0KZW5kb2JqCjEwNCAwIG9iagoxOTAKZW5kb2JqCjQ3IDAgb2JqCjw8
+ IC9MZW5ndGggMTA1IDAgUiAvRnVuY3Rpb25UeXBlIDAgL1NpemUgWyAxMzY1IF0gL0Jp
+ dHNQZXJTYW1wbGUgOCAvT3JkZXIKMSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAx
+ IDAgMSAwIDEgXSAvRW5jb2RlIFsgMCAxMzY0IF0gL0RlY29kZSBbIDAgMQowIDEgMCAx
+ IF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBpcHnOgIAAEDR938VJEoy
+ EhkNDZWyIpERRSJCGg/g+7o/7jmTCRg7I+fPGWq/zo/z7QycL+fT6WsfzrvTc96crvPq
+ vGgdp+08O09Oy3l0HrR7585pOrfOjdNwrrW6c+VcOjXnwjl3zrRT58SpOhVyTMqkRIrk
+ iBRInuRIlhySzExpkiJJckD2yR7ZJQmyQ7ZJnGyRGNkkG2SdrJEoWSURsjJTmITIMlki
+ QbJIAmSBzJO5f6aC+rPHCmVuZHN0cmVhbQplbmRvYmoKMTA1IDAgb2JqCjE4NQplbmRv
+ YmoKNDYgMCBvYmoKPDwgL0xlbmd0aCAxMDYgMCBSIC9GdW5jdGlvblR5cGUgMCAvU2l6
+ ZSBbIDEzNjUgXSAvQml0c1BlclNhbXBsZSA4IC9PcmRlcgoxIC9Eb21haW4gWyAwIDEg
+ XSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9FbmNvZGUgWyAwIDEzNjQgXSAvRGVjb2Rl
+ IFsgMCAxCjAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1
+ wod2qjAAAND//6zXJ2GFEQKE5RZx4cba2nX06KEISGLhnusfvn3KybeffDXw00/SXvLp
+ 7Wv54e2r7j48tidv99TtySvqbk+X7+62ppt39/rN3dT+6G5u10eXpbM+ln911uVXr84z
+ D86K8fLgVE+cZXWyTCrGCUnvSdzEHYl3ZFHvLVnctxfb8/lfbuw59dnGprq2Z387XdvZ
+ 1nTVyMnSqn9sTXKj2KJuRnHRhRlRHC9MhnNz/OxwbpaemSFVHM6ojmZ4NG3mBI9+HU5w
+ DSM8LGgMo/QgMpiPjQH7/th4NDT6Ne2FxvUI9Zo4RL3L7hDVdoC65TsDRFHvDHL7eodl
+ u69X7+ltxkFPv+7qQXEt6BbtaD7Ttubfem2teqB5adULrt1ALeirblXHV9Oe6rAkrsLW
+ Ucil7ShUiWLnWkTJhha5tKH1sGnDTAua1LEFsfmgjM1cLGMsG/QN2chGhlwayShTQiit
+ I+m+Lul0NV061xirkqqKDBVR/VVRxEehqJSEUMwWIBSgTFWWhWtJkFlKolCel8RcgZdu
+ RYGvyPNiUYHniwNeuA8EkMkDkOYATx1wALQY/wfgnONovnBcbuuFK/2Pa53/AM6GzbYK
+ ZW5kc3RyZWFtCmVuZG9iagoxMDYgMCBvYmoKNDYxCmVuZG9iago0NSAwIG9iago8PCAv
+ TGVuZ3RoIDEwNyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9TaXplIFsgMTM2NSBdIC9CaXRz
+ UGVyU2FtcGxlIDggL09yZGVyCjEgL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBbIDAgMSAw
+ IDEgMCAxIF0gL0VuY29kZSBbIDAgMTM2NCBdIC9EZWNvZGUgWyAwIDEKMCAxIDAgMSBd
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZXB10IBAAAAwP//lYoQkTQU
+ GVFpJxqUSjRUKBlf4OHuptO5Jmjs/tHI/blfNHQD1Hc/6Nt9oZ77dB/o3b2hruugV9dG
+ L+7ZPaGWe0QProka7h7duVt3g+quhq5dFV25S3eBzt0ZOkUn4hhVxBE6FAeoLEpoHxVF
+ AeVFDu2JLMqIXbQj0mhbbKFNtCFSaF0k0ZpIoLhYRTERRSsigsIoJJZRUATQklhEC3PM
+ AFgkUrwKZW5kc3RyZWFtCmVuZG9iagoxMDcgMCBvYmoKMTc3CmVuZG9iago0NCAwIG9i
+ ago8PCAvTGVuZ3RoIDEwOCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9TaXplIFsgMTM2NSBd
+ IC9CaXRzUGVyU2FtcGxlIDggL09yZGVyCjEgL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBb
+ IDAgMSAwIDEgMCAxIF0gL0VuY29kZSBbIDAgMTM2NCBdIC9EZWNvZGUgWyAwIDEKMCAx
+ IDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aa3ByTYCAABA0f//
+ FalEikxJZCikQUWGpIRkqERSa4t3bN690+n/fg0Tw49kbPg2fBlGhk/J0DAw9A0fhnfD
+ m+TV0DO8GLqGZ8mT4dHQMTwY2oaW5N7QNNwZGoZbw43k2nBlqBsuDReSmqFqqBjODWVD
+ SVJkBXDG8uyUnbBjlmNZdsQO2QHbZxmwx3ZZmu2wFNtmSbbFNtkGW2drIMFW2QqLsxhb
+ ZlG2xBZZhC2AMAuxIJtnATb31wxUQd7tCmVuZHN0cmVhbQplbmRvYmoKMTA4IDAgb2Jq
+ CjE5MAplbmRvYmoKNDMgMCBvYmoKPDwgL0xlbmd0aCAxMDkgMCBSIC9GdW5jdGlvblR5
+ cGUgMCAvU2l6ZSBbIDEzNjUgXSAvQml0c1BlclNhbXBsZSA4IC9PcmRlcgoxIC9Eb21h
+ aW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9FbmNvZGUgWyAwIDEzNjQg
+ XSAvRGVjb2RlIFsgMCAxCjAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
+ dHJlYW0KeAG9wodaqmAAAND3f6xKFNl7T9lLUVGza+ODqyXCH+DofCf73GblzcX0c/Pb
+ j0166yL96PpepPXJe3HbdfLeeFgnN48Pa8BVfKj+W8V/8G0Vl5f/R2/Lh9wvo5Z5tO87
+ 3OfdX/Ow4yJ8vfluEZ4Gu0WP82A3/HYeXD/zt/1uMv9uU38DWKR+1SvSu068on6deFd1
+ 10nvsbv6k8vY+Rk5y8fMI6d96OTAszwcdhHOeg1mixvOA3tw354PnPn2wFbm13tW1jX1
+ rDt3rfSymbiP7JhJNXbMIY3YuWbkGOXZ4+rRrBxetPXwAQNb/62lB8daYF3ft7QBTc0f
+ UPXNY89Ur2yoXu+uofaouEZXXXHBHV25f01xNPn8TJMfXpXtWslW21uqZCmgoqWUze+y
+ aAIasngqGLJgSC11SbgsCvoxr4tlDVTgtVNV4E85VWjkObWq8Bwgq/CswpXlHiWWrTIS
+ CyyyTJlppkXmWGDoY5oWAHmarlI8XaUovpGjqJYkxZHkd5YkgQmSrTIEyRAEME4wOEG3
+ x2n8LIZTPZIYRqIdCRQrI+dRAqnFEfTnFMXbYlPkMoxg9SiMNE7RSS0ymQKPp0h1OoY7
+ QjDccgJDtZPRpPN4NC6/dIRexsfPY6gMNY+eodonaPT0BRw3KHwKZW5kc3RyZWFtCmVu
+ ZG9iagoxMDkgMCBvYmoKNDkxCmVuZG9iago0MiAwIG9iago8PCAvTGVuZ3RoIDExMCAw
+ IFIgL0Z1bmN0aW9uVHlwZSAwIC9TaXplIFsgMTM2NSBdIC9CaXRzUGVyU2FtcGxlIDgg
+ L09yZGVyCjEgL0RvbWFpbiBbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0Vu
+ Y29kZSBbIDAgMTM2NCBdIC9EZWNvZGUgWyAwIDEKMCAxIDAgMSBdIC9GaWx0ZXIgL0Zs
+ YXRlRGVjb2RlID4+CnN0cmVhbQp4Aa3ByTYCAABA0f//FalEikxJZCikQUWGpIRkqERS
+ a4t3bN690+n/fg0Tw49kbPg2fBlGhk/J0DAw9A0fhnfDm+TV0DO8GLqGZ8mT4dHQMTwY
+ 2oaW5N7QNNwZGoZbw43k2nBlqBsuDReSmqFqqBjODWVDSVJkBXDG8uyUnbBjlmNZdsQO
+ 2QHbZxmwx3ZZmu2wFNtmSbbFNtkGW2drIMFW2QqLsxhbZlG2xBZZhC2AMAuxIJtnATb3
+ 1wxUQd7tCmVuZHN0cmVhbQplbmRvYmoKMTEwIDAgb2JqCjE5MAplbmRvYmoKNDEgMCBv
+ YmoKPDwgL0xlbmd0aCAxMTEgMCBSIC9GdW5jdGlvblR5cGUgMCAvU2l6ZSBbIDEzNjUg
+ XSAvQml0c1BlclNhbXBsZSA4IC9PcmRlcgoxIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2Ug
+ WyAwIDEgMCAxIDAgMSBdIC9FbmNvZGUgWyAwIDEzNjQgXSAvRGVjb2RlIFsgMCAxCjAg
+ MSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGVwddCAQAAAMD/
+ /5WKEJE0FBlRaScalEo0VCgZX+Dh7qbTuSZo7P7RyP25XzR0A9R3P+jbfaGe+3Qf6N29
+ oa7roFfXRi/u2T2hlntED66JGu4e3blbd4PqroauXRVduUt3gc7dGTpFJ+IYVcQROhQH
+ qCxKaB8VRQHlRQ7tiSzKiF20I9JoW2yhTbQhUmhdJNGaSKC4WEUxEUUrIoLCKCSWUVAE
+ 0JJYRAtzzABYJFK8CmVuZHN0cmVhbQplbmRvYmoKMTExIDAgb2JqCjE3NwplbmRvYmoK
+ MiAwIG9iago8PCAvTGFzdCAxMTIgMCBSIC9GaXJzdCAxMTMgMCBSID4+CmVuZG9iagox
+ MTMgMCBvYmoKPDwgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzU1IDAgXSAv
+ VGl0bGUgKENhbnZhcyAxKSA+PgplbmRvYmoKMTEyIDAgb2JqCjw8IC9Db3VudCAwIC9E
+ ZXN0IFsgMyAwIFIgL1hZWiAwIDc1NSAwIF0gL1RpdGxlIChDYW52YXMgMSkgPj4KZW5k
+ b2JqCjExNCAwIG9iago8PCAvTGVuZ3RoIDExNSAwIFIgL0xlbmd0aDEgOTUwNCAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9Wgt4U1W2XnufZ5I2TdKkeTRpkqZJ
+ mqbvQmlooaG0pTxaSyvQIoUWKBQErViKOAO3KggUxAfyEGZUfPAUCaUDAcTLOCg6L9FR
+ UEYdHNFx/KYfM3N1HkKSu85JqTDfXC/ffH7mdL/32Xutf6+91t5nFQgAJEAPMBCcs7it
+ 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
+ bmiuJRX/Zq4KabAl0lyz5ff+Za4WqXm2NFeLNFeLNNfs4Gx5LgmCqgWNFXd3oXSiCxNd
+ iJmNofGTpzehp765Mkx2SX7NpfC/MYNZIAplbmRzdHJlYW0KZW5kb2JqCjExNSAwIG9i
+ ago2MjcxCmVuZG9iagoxMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9B
+ c2NlbnQgNzcwIC9DYXBIZWlnaHQgNjg0IC9EZXNjZW50IC0yMzAgL0ZsYWdzIDMyCi9G
+ b250QkJveCBbNSAtMjA4IDY3MyA3MjhdIC9Gb250TmFtZSAvSEdCSEFYK0hlbHZldGlj
+ YSAvSXRhbGljQW5nbGUgMCAvU3RlbVYKMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA1
+ MTMgL0ZvbnRGaWxlMiAxMTQgMCBSID4+CmVuZG9iagoxMTcgMCBvYmoKWyAyNzggMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDY2Nwo2NjcgMCA3MjIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCA1MDAKNTU2IDU1NiAyNzgg
+ MCAwIDIyMiAwIDAgMjIyIDAgNTU2IDU1NiA1NTYgMCAzMzMgNTAwIDI3OCA1NTYgNTAw
+ IF0KZW5kb2JqCjMxIDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlw
+ ZSAvQmFzZUZvbnQgL0hHQkhBWCtIZWx2ZXRpY2EgL0ZvbnREZXNjcmlwdG9yCjExNiAw
+ IFIgL1dpZHRocyAxMTcgMCBSIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDExOCAvRW5j
+ b2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjEgMCBvYmoKPDwgL1RpdGxl
+ IChVbnRpdGxlZCkgL0F1dGhvciAoU2NvdHQgTWFpbikgL0NyZWF0b3IgKE9tbmlHcmFm
+ ZmxlIFByb2Zlc3Npb25hbCkKL1Byb2R1Y2VyIChNYWMgT1MgWCAxMC41LjggUXVhcnR6
+ IFBERkNvbnRleHQpIC9DcmVhdGlvbkRhdGUgKEQ6MjAxMDA0MDMyMjUyNTFaMDAnMDAn
+ KQovTW9kRGF0ZSAoRDoyMDEwMDQwMzIyNTI1MVowMCcwMCcpID4+CmVuZG9iagp4cmVm
+ CjAgMTE4CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDA4NDg0NyAwMDAwMCBuIAowMDAw
+ MDc3NjIyIDAwMDAwIG4gCjAwMDAwMDQ3NzggMDAwMDAgbiAKMDAwMDA3MTgxNyAwMDAw
+ MCBuIAowMDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDQ3NTggMDAwMDAgbiAKMDAwMDAw
+ NDg4MiAwMDAwMCBuIAowMDAwMDY3NzEwIDAwMDAwIG4gCjAwMDAwMDU0NTkgMDAwMDAg
+ biAKMDAwMDAwOTI3NiAwMDAwMCBuIAowMDAwMDEwMDI0IDAwMDAwIG4gCjAwMDAwMDgz
+ NzUgMDAwMDAgbiAKMDAwMDAwODk5NiAwMDAwMCBuIAowMDAwMDEyNTEwIDAwMDAwIG4g
+ CjAwMDAwMTI3NDkgMDAwMDAgbiAKMDAwMDAwOTAxNiAwMDAwMCBuIAowMDAwMDA5MjU3
+ IDAwMDAwIG4gCjAwMDAwMDU2MTUgMDAwMDAgbiAKMDAwMDAxMDA0NCAwMDAwMCBuIAow
+ MDAwMDEwODE0IDAwMDAwIG4gCjAwMDAwMTA4MzQgMDAwMDAgbiAKMDAwMDAxMTYwNCAw
+ MDAwMCBuIAowMDAwMDA3NzQ3IDAwMDAwIG4gCjAwMDAwMDgzNTUgMDAwMDAgbiAKMDAw
+ MDAwNzIxMiAwMDAwMCBuIAowMDAwMDA3NzI3IDAwMDAwIG4gCjAwMDAwMDYwOTcgMDAw
+ MDAgbiAKMDAwMDAxMTYyNCAwMDAwMCBuIAowMDAwMDEyNDkwIDAwMDAwIG4gCjAwMDAw
+ NTQ1NDUgMDAwMDAgbiAKMDAwMDA4NDY3MCAwMDAwMCBuIAowMDAwMDA1OTM3IDAwMDAw
+ IG4gCjAwMDAwMDU3NzYgMDAwMDAgbiAKMDAwMDAwNjI1NSAwMDAwMCBuIAowMDAwMDA2
+ ODkyIDAwMDAwIG4gCjAwMDAwMDcwNTEgMDAwMDAgbiAKMDAwMDAwNjczMyAwMDAwMCBu
+ IAowMDAwMDA1MzAxIDAwMDAwIG4gCjAwMDAwMDY0MTYgMDAwMDAgbiAKMDAwMDAwNjU3
+ NSAwMDAwMCBuIAowMDAwMDc3MjA4IDAwMDAwIG4gCjAwMDAwNzY3ODEgMDAwMDAgbiAK
+ MDAwMDA3NjA1MyAwMDAwMCBuIAowMDAwMDc1NjI2IDAwMDAwIG4gCjAwMDAwNzUyMTIg
+ MDAwMDAgbiAKMDAwMDA3NDUxNCAwMDAwMCBuIAowMDAwMDc0MDkyIDAwMDAwIG4gCjAw
+ MDAwNzM2NjUgMDAwMDAgbiAKMDAwMDA3MzI0MyAwMDAwMCBuIAowMDAwMDcyODIxIDAw
+ MDAwIG4gCjAwMDAwNzI0MDcgMDAwMDAgbiAKMDAwMDA3MTk4MCAwMDAwMCBuIAowMDAw
+ MDQxNDY3IDAwMDAwIG4gCjAwMDAwMTcxMTYgMDAwMDAgbiAKMDAwMDAxOTE2MSAwMDAw
+ MCBuIAowMDAwMDY2NzU4IDAwMDAwIG4gCjAwMDAwMjcxNTIgMDAwMDAgbiAKMDAwMDAy
+ OTgyNCAwMDAwMCBuIAowMDAwMDUzNjgwIDAwMDAwIG4gCjAwMDAwMTI3NjggMDAwMDAg
+ biAKMDAwMDAxNzA5NSAwMDAwMCBuIAowMDAwMDQ1NTM4IDAwMDAwIG4gCjAwMDAwMjI4
+ MjIgMDAwMDAgbiAKMDAwMDAyMzM2MiAwMDAwMCBuIAowMDAwMDQ5NjA5IDAwMDAwIG4g
+ CjAwMDAwMTkxODIgMDAwMDAgbiAKMDAwMDAyMjgwMSAwMDAwMCBuIAowMDAwMDU4NjE2
+ IDAwMDAwIG4gCjAwMDAwMjk4NDUgMDAwMDAgbiAKMDAwMDAzMzA2MCAwMDAwMCBuIAow
+ MDAwMDIzOTE2IDAwMDAwIG4gCjAwMDAwMjcxMzEgMDAwMDAgbiAKMDAwMDA3MTc4MCAw
+ MDAwMCBuIAowMDAwMDMzMDgxIDAwMDAwIG4gCjAwMDAwMzc0MTIgMDAwMDAgbiAKMDAw
+ MDA2MjY4NyAwMDAwMCBuIAowMDAwMDIzMzgyIDAwMDAwIG4gCjAwMDAwMjM4OTYgMDAw
+ MDAgbiAKMDAwMDAzNzQzMyAwMDAwMCBuIAowMDAwMDQxNDQ2IDAwMDAwIG4gCjAwMDAw
+ NDE1MDQgMDAwMDAgbiAKMDAwMDA0NTUxNyAwMDAwMCBuIAowMDAwMDQ1NTc1IDAwMDAw
+ IG4gCjAwMDAwNDk1ODggMDAwMDAgbiAKMDAwMDA0OTY0NiAwMDAwMCBuIAowMDAwMDUz
+ NjU5IDAwMDAwIG4gCjAwMDAwNTM3MTcgMDAwMDAgbiAKMDAwMDA1NDUyNSAwMDAwMCBu
+ IAowMDAwMDU0NTgyIDAwMDAwIG4gCjAwMDAwNTg1OTUgMDAwMDAgbiAKMDAwMDA1ODY1
+ MyAwMDAwMCBuIAowMDAwMDYyNjY2IDAwMDAwIG4gCjAwMDAwNjI3MjQgMDAwMDAgbiAK
+ MDAwMDA2NjczNyAwMDAwMCBuIAowMDAwMDY2Nzk1IDAwMDAwIG4gCjAwMDAwNjc2OTAg
+ MDAwMDAgbiAKMDAwMDA2Nzc0NiAwMDAwMCBuIAowMDAwMDcxNzU5IDAwMDAwIG4gCjAw
+ MDAwNzE5MDAgMDAwMDAgbiAKMDAwMDA3MjM4NiAwMDAwMCBuIAowMDAwMDcyODAwIDAw
+ MDAwIG4gCjAwMDAwNzMyMjIgMDAwMDAgbiAKMDAwMDA3MzY0NCAwMDAwMCBuIAowMDAw
+ MDc0MDcxIDAwMDAwIG4gCjAwMDAwNzQ0OTMgMDAwMDAgbiAKMDAwMDA3NTE5MSAwMDAw
+ MCBuIAowMDAwMDc1NjA1IDAwMDAwIG4gCjAwMDAwNzYwMzIgMDAwMDAgbiAKMDAwMDA3
+ Njc2MCAwMDAwMCBuIAowMDAwMDc3MTg3IDAwMDAwIG4gCjAwMDAwNzc2MDEgMDAwMDAg
+ biAKMDAwMDA3Nzc1MSAwMDAwMCBuIAowMDAwMDc3NjcyIDAwMDAwIG4gCjAwMDAwNzc4
+ MzAgMDAwMDAgbiAKMDAwMDA4NDE5MyAwMDAwMCBuIAowMDAwMDg0MjE1IDAwMDAwIG4g
+ CjAwMDAwODQ0MzcgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAxMTggL1Jvb3QgOTkg
+ MCBSIC9JbmZvIDEgMCBSIC9JRCBbIDw4MjFlYjAwZjU5ODQ1N2ExYTFiNjU3MzAyNTI3
+ YzI1OT4KPDgyMWViMDBmNTk4NDU3YTFhMWI2NTczMDI1MjdjMjU5PiBdID4+CnN0YXJ0
+ eHJlZgo4NTA2NAolJUVPRgoxIDAgb2JqCjw8L0F1dGhvciAobWNsZXJvblxuU2NvdHQg
+ TWFpbikvQ3JlYXRpb25EYXRlIChEOjIwMDcxMTA2MjEzMTAwWikvQ3JlYXRvciAoT21u
+ aUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMikvTW9kRGF0ZSAoRDoyMDEwMDQwMjIzMTgw
+ MFopL1Byb2R1Y2VyIChNYWMgT1MgWCAxMC41LjggUXVhcnR6IFBERkNvbnRleHQpL1Rp
+ dGxlIChyZXNvdXJjZV9kZXZpY2VzX2RpYWdyYW0pPj4KZW5kb2JqCnhyZWYKMSAxCjAw
+ MDAwODc1ODQgMDAwMDAgbiAKdHJhaWxlcgo8PC9JRCBbPDgyMWViMDBmNTk4NDU3YTFh
+ MWI2NTczMDI1MjdjMjU5PiA8ODIxZWIwMGY1OTg0NTdhMWExYjY1NzMwMjUyN2MyNTk+
+ XSAvSW5mbyAxIDAgUiAvUHJldiA4NTA2NCAvUm9vdCA5OSAwIFIgL1NpemUgMTE4Pj4K
+ c3RhcnR4cmVmCjg3ODExCiUlRU9GCg==
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ TU0AKgAACJSAP+BACCQWDQeEQmFQuGQ2HQ+IRGJROKRWLQJ/xaNRuOR2PR+QRuMSGSSW
+ TSeUSCRwR2S1pNRpA0GA2NAcDAcVTkCTuIumfS12P6hSmPvSjCukA6lRF9U1rNdr0190
+ SEvJ5vMZjIYhEIBCVgBOKBNv8CP90up1AoEgqFRmDgG4BO5CkQikajQbRFZXsgX18vV4
+ zsGTt8Ol2AAJhAEATFwh+Ph+QR+ZGCYzGyBtZkZ5uIrRbrhsuV2Vd5gEAW6VU19AsGA4
+ HhEJALZP17PM2GIuV9RqlRvF6vMoFcrgXiaeBP5/0LlP7jOdzOVgr1djEVDIhkEhxFiL
+ NPup8g8Ki4ZPFiLt4A0QhkKhcRgpwNN5gDagfEg8IAkDAF6N5rOwBgYCAQiIHQRJAbED
+ hrBKIlqXJdmQaZsCkLYtgVCrjOO5LkKEbZomcfrkhOFoYQuoTjuMcxyHKW5alubBomYG
+ odB8QY8jm3TeAMBoFCAIgiuSf5cFcWQAn4jLTH8AYAiIJYjnoeR5FkV5WBwGIch+Hofo
+ iZcthRLqEH3MCgAbMYGTKqiHQObEEhqiJcl6YBpG8cImiqK0MtPDTmOMoRsGMYIAAKA4
+ TBiGk8RJPR/noeZ6FmWRbHrJwMAuDA9DeNEblGAwGAUHwhOygRaFUVwVhMFIDrUaRqmm
+ IYlCOeZ5HiWxZlgGoXBsGgZBofNdtUyZ+J2AjiAKqBrhhYyC18XFlAlZhz2cJVoATaSC
+ lnaqFrgAImW0hB326TtvjNcKlAchE0hfc7VNU5VsNkARhGMZJrHAcgPhEEAXhmGjTIIj
+ EfqEa5ome4wUBaF0MxMjChKMehWlaWJxm8bYWheGQ/jqN1MAKtVOiEjBdlmW1+oGjIdi
+ CHxRE6T59H4e4XBOFwfB4HwD5oA2bZu1R+50YeeBNnwP6AaGhHtogSaMeOkHFpQh6Zal
+ qh1qFsWwYuqW0JiEGFrObuVqAdIwoBn7Dc4X2Fm9gZ0fqClyXhfmYaprGoZxmCeKwsCM
+ JgnOUgjmIEaZkGMCAKgsDegUPPB/Z0ox6lkWZbnQcZwhOFQWD4OI1YyBIEB9pjlH+fp/
+ UgeriAIAfSFMUBRk0SpLhWFoVDoOQ6iCH4gy1LYQ9xmgDsybRmd9LoUWcc57+IKnjIKv
+ ZZBF5aMWAbvn6sgq0HUavqh765g+zYwYAX7snnl4QefEiJbl2XpVlkWoHgcBqhH4LgyD
+ NaQEwyesnmqZ5nAKAwCBevDB3EAAOUP0fg9h6j3FmLgXg7x2DqA4B8EAfw5BscwAcHgQ
+ AgkYHyPcfAulHAeXsCsF4LRiDBGGBcC4FhkDHGGD8HIQErpZIglsZbwCCnKF5Dk0j8wg
+ w9fmQUWkQSHPRII0IaA4YkADiUr4EsTSkArIKmlNZERMifFGPRIoRwmBKTwwdkY/h9K7
+ HANcaoEXBASAoBSARQmdQCc+4gesBxXi1F0N8bA1QTMTEYH8PKmABgIAMlgIBGBuDXGy
+ AZJC8xxAxBwDQBDNI4j0FyLgWoNgXg3hiRF7IwQZSdTOSSKSCiICQEuJsfgAwChHCUEh
+ wy/R/DoHIOMcg3Btj0aID0IQQnEIfcQ56XhtB7j5F2MMZQADTABIEIUPIco/AIAKzKDL
+ iBhC8GAPiaw/B9j8BmDYGcaAJlGHmLsXQt5LSYSwRFngw35lfk+RVbD35chCIiJASwmh
+ 4D4H0DkHQOS1v0ORF05Y/hyDfG6TMBh9gIxrgA3wfw7R3jwGKMsZ41xnDLBXNsSIhQ/q
+ YAEAYAoOweg+ldK8cw5yZgNcyAgjA9Dfi9F4LmcsmZ20zJCIgRwkQBgNAkO4dY6lggGJ
+ KccBL3QIARAmu0aQzRlCXEWIWjhxKQA9OQP8ZoxhlD0HgPI1QNQeA3AU91SA8xfC/F3T
+ Gc5RBzN+HSPsCADAEj2G48MDgDyaABHmAUCIDhtDYHmCMEgEwDgUr8BEAk7XGi6FgLYX
+ KSQAulAJAQyhBrHWQILZMyZCLLWRlQAU+wEBEB9DvU8AgOAdA7NOAAYIuxfAXAmBUfI+
+ ymj+H2C4F4LlXjxGEMUYNZoZEpHot2a82VFj4AEzQAdQB/gDfYfsbQ8lAgLA4CwElhJ2
+ puGAMAYgxh8jxHYBi7w6LwEIu8Bi8A6CC3jvLeK794SCWNAIBYD4JQ7hsDKpgALpJ9A7
+ RKPAdw7heC3F0BwDoHHJgqdIAQeo9h6DFGQMS3lNMIEeusLh8w7RzDhjSBQoBCMM4bIJ
+ h0luHI04eAA6UAoKAZA4vnfUgZBDdijHzNhYwMl/S7MmP4fieWdMsHsPcZo0xmA9BsD6
+ mWEcjEVwnhXC+IDDkHyYQXJ+TsR4hIIAJYIKcU4rUwOMco5AaF4HLLIDQHAMuQHGBm70
+ sRyAWAqBUeI8h4DvHqPAGQKgZ5FyPnkiEChftrF9hbDGU8mkGwzNYfBBQEaJV2Pk0mUN
+ BEFysAXLGKr6FfEyJ4TIAagDtHYO3OI8AKAVApT0dbggKjqHQOoCwGALRKAHUYCIKwRA
+ sVuXnPWtyHCxFoLYYwzhpDzgaA0pSrx5EI2EuQhuxCC7H2UQQBwEbCE3EIHsOxX2lDiG
+ 7QR0oAyKHKAca22oL9Xa43IQt4g9xhjFGM/sBGRwNasBOCYEpAh7tKHuBYCwBR7jyHuA
+ kCQFQATWAQAwBA7xxDcH2BIEAFjBmSMgYwAA7xzDzASBoCO7dy8ZIaPziVdwJAJAJvvi
+ m/zLgAH4OIbA4AHAgA5wQAg+B6AA0SZMeY6hwDzAkCgDwDCFj/HuOUXwwBvWFHQO4foE
+ gMgUAaPYdg5gEgtCOBocwyxvm+HhWwGwLgDNwHUA0DoFB3D1AsEgHAHuNdnISPwdQ0xe
+ DXHeAYyI+jIANAgA3fA/R2gHBIAaQo+B/j7Hu/sAA/QCgMACPUBAFQCjhHcB8JwPezEK
+ ICAAAA4BAAADAAAAAQBHAAABAQADAAAAAQAXAAABAgADAAAAAwAACUIBAwADAAAAAQAF
+ AAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQADAAAB
+ FgADAAAAAQJnAAABFwAEAAAAAQAACIsBHAADAAAAAQABAAABPQADAAAAAQACAAABUwAD
+ AAAAAwAACUiHcwAHAAARHAAACU4AAAAAAAgACAAIAAEAAQABAAARHGFwcGwCAAAAbW50
+ clJHQiBYWVogB9oAAQAHAAsAEgAaYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAPbWAAEAAAAA0y1hcHBsx3EuwlDphyvgbRiROWxSjQAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAU
+ d3RwdAAAAWgAAAAUY2hhZAAAAXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRS
+ QwAAAcgAAAAOdmNndAAAAdgAAAYSbmRpbgAAB+wAAAY+ZGVzYwAADiwAAABkZHNjbQAA
+ DpAAAAI+bW1vZAAAENAAAAAoY3BydAAAEPgAAAAkWFlaIAAAAAAAAG6vAAA5TwAAAX1Y
+ WVogAAAAAAAAXt0AALO9AAAH11hZWiAAAAAAAAApSgAAEw8AAMnQWFlaIAAAAAAAAPNS
+ AAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADA
+ bGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZj
+ Z3QAAAAAAAAAAAADAQAAAgAAADwA0gFbAe4CiQM6A/8E1gXDBsYH2Aj2CiYLXgyrDjYP
+ 1xF6Ex4UxRZyGCEZ3BuUHVEfFiDWIp0kZCYuJ9UpeSsZLK4uQS/EMUMyszQaNXg2zDgX
+ OVw6mzvUPQQ+MD9aQIhBtELhRA5FPEZnR5NIwEnrSxZMQE1qTohPplDEUd9S+VQTVSpW
+ QFdSWGNZc1p/W4tcll2cXpZfjWCCYXViaGNZZEhlNGYgZwpn9GjcacNqqmuQbHBtUW4w
+ bw9v7nDMcapyh3NidD51GXXzds13qHiBeVd6LnsGe+F8wH2ifol/doBqgWSCZINqhHSF
+ hIaXh7aI1on1ixSMM41Rjm2PiZCikbyS1JPslQOWGpcvmEGZU5pkm3WchZ2UnqOfsaC/
+ ocyi2aPmpPKl/qcJqBOpHqorqzusUK1qroyvtbDpsiWzarS0tgi3YLi9udC647v0vQK+
+ DL8SwBPBDcICwvDD2cS9xZzGd8dOyCfJBsnrys7Lq8yBzVDOF87Xz4rQN9Dg0YDSIdLB
+ 037UQNUB1cLWhNdG2AfYydmL2k3bD9vR3JPdVd4W3tbfluBX4Rnh2+Kg42bkLuT55cbm
+ ledn6DvpEOnn6qnra+wu7O/tsO5w7zDv7/Ct8WvyKfLm86L0X/Ub9df2k/dP+Av4x/mD
+ +j/6+/u1/G79J/3e/pT/Sv//AAAANAC2ATsBuAJGAuQDlARXBSoGEQcLCAsJGwovC1wM
+ wA41D6oRKBKkFCgVsBc4GMkaWRvuHYkfHyC9Ilcj2CVYJs8oRCmuKxUscC3CLw4wTTGG
+ Mrcz5DULNi83OzhIOVM6XjtqPHQ9fT6GP45AlkGdQqVDq0SwRbRGtUeySLBJrUqpS6RM
+ n02XTo9Ph1B/UXRSa1NgVFZVRFYzVyJYEFj9Wela1Fu+XKZdjl5zX1lgPWEgYf9i1mOq
+ ZH1lT2YhZvNnxGiUaWNqMmsAa81sm21pbjVu/m/HcI9xWHIgcuhzr3R3dT12A3bKd5B4
+ VnkceeF6pntsfDV9AH3PfqJ/eoBZgT6CKYMahA+FCYYHhwiIDYkTihiLHYwijSaOKo8u
+ kDGRM5I1kzaUOJU4ljiXNpg0mTKaMZsxnDKdNp47n0SgT6Fcom2jgKSUpaumyKflqQOq
+ H6s7rFetcq6Nr6iwwbHbsvS0DbUltj23VLhquX+6lLunvLi9xr7Qv9XA18HVws7Dw8S2
+ xaTGjMdzyFvJQsopyxDL98zezcTOq8+R0HfRXdJD0yjUDNTv1dPWtteZ2H3ZYdpG2yvc
+ ENz13dzew9+q4JzhqOK548TkyeXG5r7nsOie6YjqcetY7D/tJ+4Q7vrv5vDf8gLzJvRJ
+ 9Wv2i/et+ND59fse/E79gv69//8AAAAiAHcA9gFXAccCQwLJA18EBgS4BXkGRQcVB+8I
+ 2gnyCxQMOw1nDpUPxBD6EjATahSoFekXLRh0GbsbAhw2HWoemx/JIPMiFiMzJEklVyZg
+ J2QoZClfKlcrSywvLQ8t8C7RL7EwjzFtMkszJzQBNNs1tDaNN2Y4PzkQOeI6szuEPFU9
+ Jz34Psg/mUBqQTxCDkLgQ7NEhUVURiNG8kfBSI9JXUoqSvZLwUyMTVZOIE7pT7NQe1FB
+ UgZSylOPVFNVFlXYVppXXFgcWN1ZnVpdWxxb2lyWXVFeC17EX31gNWDrYaJiWGMMY8Bk
+ c2UlZdhmiWc5Z+hol2lFafNqomtQa/xsqW1XbgNusG9ccAlwtHFfcghysXNbdAR0rHVV
+ dfx2pHdLd/J4mXk/eeZ6jHsxe9h8gH0rfdt+jX9IgAiAz4GcgnCDS4QrhQ+F+Ibmh9eI
+ x4m4iqeLl4yGjXWOY49RkD6RLJIZkwaT8pTalcGWp5eLmHCZVJo6myGcC5z4neie3J/T
+ oM6h0KLxpBelPqZkp4qor6nUqvmsHa1BrmSviLCrsc6y8LQQtTC2ULdvuI+5sLrRu/K9
+ FL43v1vAgMGmwszD9sUtxmvHsMkAylrLvM0tzqjQMNHB017VA9ay2GjaJNvm3a7fguGP
+ 4+TmWejj65DuVfEu9Bn3DfoE/QD//wAAbmRpbgAAAAAAAAY2AACl4wAAVqEAAFFbAACn
+ KwAAJqUAABDlAABQDQAAVDkAAkKPAAHZmQABR64AAwEAAAIAAAANACcARgBmAIcAqADJ
+ AOsBDgExAVUBegGdAbwB2wH8Ah0CPwJiAoYCqgLPAvQDGwNBA2gDkAO5A+IECwQ1BGAE
+ jAS4BOQFEgU/BW4FoQXVBgoGQQZ4BrIG7AcoB2cHpwfpCC4IdQi/CQsJWgmsCgEKWAqy
+ Cw4LbgvSDDgMoA0IDXIN3g5KDrkPKA+aEA0QgRD3EW8R6BJjEt8TYhPnFG0U9hWBFg4W
+ nRcvF8MYWxj1GZEaMRrTG3ccHRzQHYceQh8AH8EghSFNIhki6CO7JJElaiZGJyUoDCj1
+ KeIq0ivELLotsy6wL68wsjG4MsAzyzTeNfE3BDgVOSM6LTsxPDA9Kj4gPxJAAkDvQdtC
+ v0OiRIhFb0ZYR0JIL0keSg9LA0v4TPBN6k7lT+JQ4VHkUutT81T9VglXF1gnWTlaTVtj
+ XHtdlV6wX85g7WIOYzNkWWV/ZqNnxWjjaf1rEmwhbSpuLm8tcClxInIWcwlz+nTpdhp3
+ TXiEeb96/nxFfZN+64BNgbuDNIS5hkmH44mHiyGMro5Aj+CRkZNYlT2XSZl3m8WeG6AO
+ ogKj+aXyp+6p7Kvsre+v9bH9tAi2G7gvukS8Wb5pwHbCfsSAxn3IdspszGDOi9C40urV
+ Iddd2Z/b5t4x4IHi1eUr54jp5+xH7qrxEPN79e34Zvrn/XD//wAAAA8ALgBRAHUAmgC/
+ AOQBCwEyAVsBhAGpAcsB7wIUAjoCYAKIArAC2QMDAy0DWQOFA7ED3wQNBDwEawSbBM0E
+ /gUxBWQFnAXVBg8GTAaJBsgHCgdNB5IH2gglCHIIwgkWCWwJxgojCoIK5QtKC7oMKwyf
+ DRUNjA4GDoIPAA+BEAMQiBEOEZcSIhKvE0AT1RRtFQYVohZBFuIXhhgtGNYZgRowGuAb
+ kxxIHQQdwh6DH0YgDCDWIaIicyNGJB4k+CXWJrcnoCiXKZEqjiuOLJItmi6mL7UwyDHe
+ Mvc0FTU6NmM3jji9Oe87JTxfPZs+20AeQWRCr0P7RUVGi0fLSQVKN0tiTIZNpk7BT9pQ
+ 8FIEUxZUKlVAVllXc1iPWa5azlvxXRZePV9mYJFhvmLuZCNlWGaPZ8Zo/Wo0a2lsnm3R
+ bwJwMnFgco5zu3Todg93N3hgeYt6uHvnfRd+SX99gLKB6oMjhF2FmobYiBeJWYqei+SN
+ LY54j8aRGJJvk8yVMJabmA6ZiZsMnJWeJ5/HoWmjDKSyplqoBKmwq1+tEK7DsHiyL7Po
+ tae3abktuvK8ur6CwEzCF8PjxbDHfMlKyxnM0M5Vz+PRetMe1M7Wi9hT2ibcAd3i38bh
+ q+OP5XLnU+kb6p/sJ+2x7z7wzvJf8+/1gPcP+Jn6Hvuf/Rr+j///AAAAFwBBAHAAnwDP
+ AP8BMgFmAZkBxQHzAiICUgKEArcC7AMhA1gDkAPJBAMEPgR6BLcE9QU1BXYFvQYFBk8G
+ mwbqBzsHkAfoCEQIpAkICXAJ3ApMCsALNwu6DEIMzA1ZDeoOfg8VD7AQTxDxEZYSPhLp
+ E50UUxUNFcoWiRdMGBIY2hmlGnIbQRwTHOsdxh6kH4YgayFUIkEjMiQnJR8mGycaKCAp
+ Kyo5K0ssYS18LpovvTDkMg4zPDRyNa427zg1OYE60jwoPYQ+5kBMQbdDK0SkRiFHo0kp
+ SrVMRE3YT3BRDFKwVFtWCVe9WXZbNFz4XsBgjWJeZDZmDGfZaZprSWzpbnlv/HF0cuV0
+ UHWzdxF4cnnUezp8oX4Lf3iA54JYg8yFQoa6iDSJtos9jMmOWY/rkX6TEZSili+XuZk+
+ mr+cPJ22nwWgTKGVot+kKqV3psWoFalmqrqsDq1krrywFbFwssu0KLWKtu24Ubm3ux68
+ hr3uv1fAwcIrw5XE/8Zqx9TJQMqrzBbNc87K0BvRaNKs0+rVI9ZX14LYqNnK2uXb/N0Q
+ 3h/fK+A14TriPuNA5EDlPuY65zfoMekq6iLrDuvp7Lntd+417uzvpfBZ8QrxvPJm8xDz
+ uPRc9QD1ovZC9uL3f/gc+Ln5Vfnw+oz7J/vC/F78+P2T/i/+yf9k//8AAGRlc2MAAAAA
+ AAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAA
+ ABIAAAAMbmJOTwAAABIAAADocHRQVAAAABYAAAD6c3ZTRQAAABAAAAEQZmlGSQAAABAA
+ AAEgZGFESwAAABwAAAEwemhDTgAAAAwAAAFMZnJGUgAAABIAAAFYamFKUAAAAA4AAAFq
+ ZW5VUwAAABIAAAF4cGxQTAAAABIAAAGKcHRCUgAAABgAAAGcZXNFUwAAABIAAAG0emhU
+ VwAAAA4AAAHGcnVSVQAAACQAAAHUa29LUgAAAAwAAAH4ZGVERQAAABAAAAIEbmxOTAAA
+ ABYAAAIUaXRJVAAAABQAAAIqAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAYQAgAEMA
+ bwByAGUAcwBGAOQAcgBnAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEAC0AZgBh
+ AHIAdgBlAHMAawDmAHIAbV9pgnIAIABMAEMARADJAGMAcgBhAG4AIABMAEMARDCrMOkw
+ /AAgAEwAQwBEAEMAbwBsAG8AcgAgAEwAQwBEAEsAbwBsAG8AcgAgAEwAQwBEAEwAQwBE
+ ACAAQwBvAGwAbwByAGkAZABvAEwAQwBEACAAYwBvAGwAbwByX2mCcm2yZnaYb3k6VmgE
+ JgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDnO7LfsACAATABDAEQARgBh
+ AHIAYgAtAEwAQwBEAEsAbABlAHUAcgBlAG4ALQBMAEMARABMAEMARAAgAGMAbwBsAG8A
+ cgBpAABtbW9kAAAAAAAABhAAAJyxAAAAAMV4fYAAAAAAAAAAAAAAAAAAAAAAdGV4dAAA
+ AABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMTAA
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <true/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{121, 142}, {1075, 694}}</string>
+ <key>ListView</key>
+ <false/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>138</integer>
+ <key>VisibleRegion</key>
+ <string>{{-13.3421, 180.263}, {606.579, 384.868}}</string>
+ <key>Zoom</key>
+ <real>1.5199999809265137</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1.5199999809265137</real>
+ <real>3.0299999713897705</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
diff --git a/docs/html/images/resources/resource_devices_diagram1.png b/docs/html/images/resources/resource_devices_diagram1.png
index adbdab6e9173..0b3c856ff859 100644
--- a/docs/html/images/resources/resource_devices_diagram1.png
+++ b/docs/html/images/resources/resource_devices_diagram1.png
Binary files differ
diff --git a/docs/html/images/resources/resource_devices_diagram2.png b/docs/html/images/resources/resource_devices_diagram2.png
index 403dd4feff2c..d32a7811f64c 100644
--- a/docs/html/images/resources/resource_devices_diagram2.png
+++ b/docs/html/images/resources/resource_devices_diagram2.png
Binary files differ
diff --git a/docs/html/images/service_lifecycle.png b/docs/html/images/service_lifecycle.png
index f9602f84a93a..7ab96d7c733a 100644
--- a/docs/html/images/service_lifecycle.png
+++ b/docs/html/images/service_lifecycle.png
Binary files differ
diff --git a/drm/common/ReadWriteUtils.cpp b/drm/common/ReadWriteUtils.cpp
index c16214e2eaff..fd17e98d307a 100644
--- a/drm/common/ReadWriteUtils.cpp
+++ b/drm/common/ReadWriteUtils.cpp
@@ -85,7 +85,7 @@ void ReadWriteUtils::writeToFile(const String8& filePath, const String8& data) {
int size = data.size();
if (FAILURE != ftruncate(fd, size)) {
if (size != write(fd, data.string(), size)) {
- LOGE("Failed to write the data to: %s", filePath.string());
+ ALOGE("Failed to write the data to: %s", filePath.string());
}
}
fclose(file);
@@ -101,7 +101,7 @@ void ReadWriteUtils::appendToFile(const String8& filePath, const String8& data)
int size = data.size();
if (size != write(fd, data.string(), size)) {
- LOGE("Failed to write the data to: %s", filePath.string());
+ ALOGE("Failed to write the data to: %s", filePath.string());
}
fclose(file);
}
diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp
index e34046fe9e31..dfc7fb2c66a7 100644
--- a/drm/jni/android_drm_DrmManagerClient.cpp
+++ b/drm/jni/android_drm_DrmManagerClient.cpp
@@ -169,7 +169,7 @@ JNIOnInfoListener::JNIOnInfoListener(JNIEnv* env, jobject thiz, jobject weak_thi
jclass clazz = env->GetObjectClass(thiz);
if (clazz == NULL) {
- LOGE("Can't find android/drm/DrmManagerClient");
+ ALOGE("Can't find android/drm/DrmManagerClient");
jniThrowException(env, "java/lang/Exception", NULL);
return;
}
diff --git a/drm/libdrmframework/DrmManagerClientImpl.cpp b/drm/libdrmframework/DrmManagerClientImpl.cpp
index 67f58ca8fe20..b222b8f03a97 100644
--- a/drm/libdrmframework/DrmManagerClientImpl.cpp
+++ b/drm/libdrmframework/DrmManagerClientImpl.cpp
@@ -54,7 +54,7 @@ const sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() {
if (binder != 0) {
break;
}
- LOGW("DrmManagerService not published, waiting...");
+ ALOGW("DrmManagerService not published, waiting...");
struct timespec reqt;
reqt.tv_sec = 0;
reqt.tv_nsec = 500000000; //0.5 sec
@@ -342,6 +342,6 @@ DrmManagerClientImpl::DeathNotifier::~DeathNotifier() {
void DrmManagerClientImpl::DeathNotifier::binderDied(const wp<IBinder>& who) {
Mutex::Autolock lock(sMutex);
DrmManagerClientImpl::sDrmManagerService.clear();
- LOGW("DrmManager server died!");
+ ALOGW("DrmManager server died!");
}
diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
index 7799040e3ddb..0273a4b532a4 100644
--- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
+++ b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
@@ -92,12 +92,12 @@ int FwdLockEngine::getConvertedStatus(FwdLockConv_Status_t status) {
case FwdLockConv_Status_InvalidArgument:
case FwdLockConv_Status_UnsupportedFileFormat:
case FwdLockConv_Status_UnsupportedContentTransferEncoding:
- LOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. "
+ ALOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. "
"Returning STATUS_INPUTDATA_ERROR", status);
retStatus = DrmConvertedStatus::STATUS_INPUTDATA_ERROR;
break;
default:
- LOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. "
+ ALOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. "
"Returning STATUS_ERROR", status);
retStatus = DrmConvertedStatus::STATUS_ERROR;
break;
@@ -139,7 +139,7 @@ android::status_t FwdLockEngine::onInitialize(int uniqueId) {
if (FwdLockGlue_InitializeKeyEncryption()) {
LOG_VERBOSE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption succeeded");
} else {
- LOGE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption failed:"
+ ALOGE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption failed:"
"errno = %d", errno);
}
@@ -351,7 +351,7 @@ status_t FwdLockEngine::onOpenConvertSession(int uniqueId,
convertSessionMap.addValue(convertId, newSession);
result = DRM_NO_ERROR;
} else {
- LOGE("FwdLockEngine::onOpenConvertSession -- FwdLockConv_OpenSession failed.");
+ ALOGE("FwdLockEngine::onOpenConvertSession -- FwdLockConv_OpenSession failed.");
delete newSession;
}
}
@@ -448,7 +448,7 @@ status_t FwdLockEngine::onOpenDecryptSession(int uniqueId,
(!decodeSessionMap.isCreated(decryptHandle->decryptId))) {
fileDesc = dup(fd);
} else {
- LOGE("FwdLockEngine::onOpenDecryptSession parameter error");
+ ALOGE("FwdLockEngine::onOpenDecryptSession parameter error");
return result;
}
@@ -550,13 +550,13 @@ status_t FwdLockEngine::onInitializeDecryptUnit(int uniqueId,
DecryptHandle* decryptHandle,
int decryptUnitId,
const DrmBuffer* headerInfo) {
- LOGE("FwdLockEngine::onInitializeDecryptUnit is not supported for this DRM scheme");
+ ALOGE("FwdLockEngine::onInitializeDecryptUnit is not supported for this DRM scheme");
return DRM_ERROR_UNKNOWN;
}
status_t FwdLockEngine::onDecrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
- LOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme");
+ ALOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme");
return DRM_ERROR_UNKNOWN;
}
@@ -565,14 +565,14 @@ status_t FwdLockEngine::onDecrypt(int uniqueId,
int decryptUnitId,
const DrmBuffer* encBuffer,
DrmBuffer** decBuffer) {
- LOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme");
+ ALOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme");
return DRM_ERROR_UNKNOWN;
}
status_t FwdLockEngine::onFinalizeDecryptUnit(int uniqueId,
DecryptHandle* decryptHandle,
int decryptUnitId) {
- LOGE("FwdLockEngine::onFinalizeDecryptUnit is not supported for this DRM scheme");
+ ALOGE("FwdLockEngine::onFinalizeDecryptUnit is not supported for this DRM scheme");
return DRM_ERROR_UNKNOWN;
}
@@ -650,11 +650,11 @@ ssize_t FwdLockEngine::onPread(int uniqueId,
if (((off_t)-1) != decoderSession->offset) {
bytesRead = onRead(uniqueId, decryptHandle, buffer, numBytes);
if (bytesRead < 0) {
- LOGE("FwdLockEngine::onPread error reading");
+ ALOGE("FwdLockEngine::onPread error reading");
}
}
} else {
- LOGE("FwdLockEngine::onPread decryptId not found");
+ ALOGE("FwdLockEngine::onPread decryptId not found");
}
return bytesRead;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index c4ef9931fd4d..bc1db4dc3310 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -47,7 +47,7 @@
#include <gui/SurfaceTextureClient.h>
#include <android_runtime/android_graphics_SurfaceTexture.h>
-//#define LOG_API LOGE
+//#define LOG_API ALOGE
#define LOG_API(...)
using namespace android;
@@ -1333,13 +1333,13 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- LOGE("ERROR: GetEnv failed\n");
+ ALOGE("ERROR: GetEnv failed\n");
goto bail;
}
assert(env != NULL);
if (registerFuncs(env) < 0) {
- LOGE("ERROR: MediaPlayer native registration failed\n");
+ ALOGE("ERROR: MediaPlayer native registration failed\n");
goto bail;
}
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h
index b10604289c7e..98b2c70a82d0 100644
--- a/include/media/AudioTrack.h
+++ b/include/media/AudioTrack.h
@@ -445,6 +445,7 @@ private:
status_t setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount);
audio_io_handle_t getOutput_l();
status_t restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart);
+ bool stopped_l() const { return !mActive; }
sp<IAudioTrack> mAudioTrack;
sp<IMemory> mCblkMemory;
@@ -464,7 +465,7 @@ private:
status_t mStatus;
uint32_t mLatency;
- volatile int32_t mActive;
+ bool mActive; // protected by mLock
callback_t mCbf;
void* mUserData;
@@ -481,7 +482,7 @@ private:
uint32_t mFlags;
int mSessionId;
int mAuxEffectId;
- Mutex mLock;
+ mutable Mutex mLock;
status_t mRestoreStatus;
int mPreviousPriority; // before start()
int mPreviousSchedulingGroup;
diff --git a/include/utils/GenerationCache.h b/include/utils/GenerationCache.h
index da85a9aebbb1..40722d11e394 100644
--- a/include/utils/GenerationCache.h
+++ b/include/utils/GenerationCache.h
@@ -205,7 +205,7 @@ bool GenerationCache<K, V>::removeOldest() {
removeAt(index);
return true;
}
- LOGE("GenerationCache: removeOldest failed to find the item in the cache "
+ ALOGE("GenerationCache: removeOldest failed to find the item in the cache "
"with the given key, but we know it must be in there. "
"Is the key comparator kaput?");
}
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index e045b2c7843c..46420c1316bf 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -1278,7 +1278,7 @@ struct ResTable_config
myDelta += requested->screenHeightDp - screenHeightDp;
otherDelta += requested->screenHeightDp - o.screenHeightDp;
}
- //LOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
+ //ALOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
// screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp,
// requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta);
return (myDelta <= otherDelta);
@@ -1507,11 +1507,11 @@ struct ResTable_config
}
if (screenSizeDp != 0) {
if (screenWidthDp != 0 && screenWidthDp > settings.screenWidthDp) {
- //LOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
+ //ALOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
return false;
}
if (screenHeightDp != 0 && screenHeightDp > settings.screenHeightDp) {
- //LOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
+ //ALOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
return false;
}
}
@@ -1531,9 +1531,9 @@ struct ResTable_config
// For compatibility, we count a request for KEYSHIDDEN_NO as also
// matching the more recent KEYSHIDDEN_SOFT. Basically
// KEYSHIDDEN_NO means there is some kind of keyboard available.
- //LOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden);
+ //ALOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden);
if (keysHidden != KEYSHIDDEN_NO || setKeysHidden != KEYSHIDDEN_SOFT) {
- //LOGI("No match!");
+ //ALOGI("No match!");
return false;
}
}
diff --git a/libs/binder/Binder.cpp b/libs/binder/Binder.cpp
index 9945f9188f52..e20d8a3c9106 100644
--- a/libs/binder/Binder.cpp
+++ b/libs/binder/Binder.cpp
@@ -89,7 +89,7 @@ const String16& BBinder::getInterfaceDescriptor() const
// This is a local static rather than a global static,
// to avoid static initializer ordering issues.
static String16 sEmptyDescriptor;
- LOGW("reached BBinder::getInterfaceDescriptor (this=%p)", this);
+ ALOGW("reached BBinder::getInterfaceDescriptor (this=%p)", this);
return sEmptyDescriptor;
}
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp
index e8fb1d9b7d7f..47a62db41d25 100644
--- a/libs/binder/BpBinder.cpp
+++ b/libs/binder/BpBinder.cpp
@@ -50,7 +50,7 @@ void BpBinder::ObjectManager::attach(
e.func = func;
if (mObjects.indexOfKey(objectID) >= 0) {
- LOGE("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object ID already in use",
+ ALOGE("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object ID already in use",
objectID, this, object);
return;
}
diff --git a/libs/binder/CursorWindow.cpp b/libs/binder/CursorWindow.cpp
index 07333787cbb0..a6e5f711da54 100644
--- a/libs/binder/CursorWindow.cpp
+++ b/libs/binder/CursorWindow.cpp
@@ -150,7 +150,7 @@ status_t CursorWindow::setNumColumns(uint32_t numColumns) {
uint32_t cur = mHeader->numColumns;
if ((cur > 0 || mHeader->numRows > 0) && cur != numColumns) {
- LOGE("Trying to go from %d columns to %d", cur, numColumns);
+ ALOGE("Trying to go from %d columns to %d", cur, numColumns);
return INVALID_OPERATION;
}
mHeader->numColumns = numColumns;
@@ -209,7 +209,7 @@ uint32_t CursorWindow::alloc(size_t size, bool aligned) {
uint32_t offset = mHeader->freeOffset + padding;
uint32_t nextFreeOffset = offset + size;
if (nextFreeOffset > mSize) {
- LOGW("Window is full: requested allocation %d bytes, "
+ ALOGW("Window is full: requested allocation %d bytes, "
"free space %d bytes, window size %d bytes",
size, freeSpace(), mSize);
return 0;
@@ -255,14 +255,14 @@ CursorWindow::RowSlot* CursorWindow::allocRowSlot() {
CursorWindow::FieldSlot* CursorWindow::getFieldSlot(uint32_t row, uint32_t column) {
if (row >= mHeader->numRows || column >= mHeader->numColumns) {
- LOGE("Failed to read row %d, column %d from a CursorWindow which "
+ ALOGE("Failed to read row %d, column %d from a CursorWindow which "
"has %d rows, %d columns.",
row, column, mHeader->numRows, mHeader->numColumns);
return NULL;
}
RowSlot* rowSlot = getRowSlot(row);
if (!rowSlot) {
- LOGE("Failed to find rowSlot for row %d.", row);
+ ALOGE("Failed to find rowSlot for row %d.", row);
return NULL;
}
FieldSlot* fieldDir = static_cast<FieldSlot*>(offsetToPtr(rowSlot->offset));
diff --git a/libs/binder/IMemory.cpp b/libs/binder/IMemory.cpp
index 2111fe80c3ab..cd2451a67652 100644
--- a/libs/binder/IMemory.cpp
+++ b/libs/binder/IMemory.cpp
@@ -298,11 +298,11 @@ void BpMemoryHeap::assertReallyMapped() const
uint32_t flags = reply.readInt32();
uint32_t offset = reply.readInt32();
- LOGE_IF(err, "binder=%p transaction failed fd=%d, size=%ld, err=%d (%s)",
+ ALOGE_IF(err, "binder=%p transaction failed fd=%d, size=%ld, err=%d (%s)",
asBinder().get(), parcel_fd, size, err, strerror(-err));
int fd = dup( parcel_fd );
- LOGE_IF(fd==-1, "cannot dup fd=%d, size=%ld, err=%d (%s)",
+ ALOGE_IF(fd==-1, "cannot dup fd=%d, size=%ld, err=%d (%s)",
parcel_fd, size, err, strerror(errno));
int access = PROT_READ;
@@ -315,7 +315,7 @@ void BpMemoryHeap::assertReallyMapped() const
mRealHeap = true;
mBase = mmap(0, size, access, MAP_SHARED, fd, offset);
if (mBase == MAP_FAILED) {
- LOGE("cannot map BpMemoryHeap (binder=%p), size=%ld, fd=%d (%s)",
+ ALOGE("cannot map BpMemoryHeap (binder=%p), size=%ld, fd=%d (%s)",
asBinder().get(), size, fd, strerror(errno));
close(fd);
} else {
@@ -446,7 +446,7 @@ void HeapCache::free_heap(const wp<IBinder>& binder)
mHeapCache.removeItemsAt(i);
}
} else {
- LOGE("free_heap binder=%p not found!!!", binder.unsafe_get());
+ ALOGE("free_heap binder=%p not found!!!", binder.unsafe_get());
}
}
}
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp
index 641134a5d2e1..a42c33694a33 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -493,7 +493,7 @@ void IPCThreadState::joinThreadPool(bool isMain)
void IPCThreadState::stopProcess(bool immediate)
{
- //LOGI("**** STOPPING PROCESS");
+ //ALOGI("**** STOPPING PROCESS");
flushCommands();
int fd = mProcess->mDriverFD;
mProcess->mDriverFD = -1;
@@ -530,9 +530,9 @@ status_t IPCThreadState::transact(int32_t handle,
if ((flags & TF_ONE_WAY) == 0) {
#if 0
if (code == 4) { // relayout
- LOGI(">>>>>> CALLING transaction 4");
+ ALOGI(">>>>>> CALLING transaction 4");
} else {
- LOGI(">>>>>> CALLING transaction %d", code);
+ ALOGI(">>>>>> CALLING transaction %d", code);
}
#endif
if (reply) {
@@ -543,9 +543,9 @@ status_t IPCThreadState::transact(int32_t handle,
}
#if 0
if (code == 4) { // relayout
- LOGI("<<<<<< RETURNING transaction 4");
+ ALOGI("<<<<<< RETURNING transaction 4");
} else {
- LOGI("<<<<<< RETURNING transaction %d", code);
+ ALOGI("<<<<<< RETURNING transaction %d", code);
}
#endif
@@ -1009,7 +1009,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
}
}
- //LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
+ //ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
Parcel reply;
IF_LOG_TRANSACTIONS() {
@@ -1033,7 +1033,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
if (error < NO_ERROR) reply.setError(error);
}
- //LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
+ //ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
// mCallingPid, origPid, origUid);
if ((tr.flags & TF_ONE_WAY) == 0) {
@@ -1110,7 +1110,7 @@ void IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, size_t data
const size_t* objects, size_t objectsSize,
void* cookie)
{
- //LOGI("Freeing parcel %p", &parcel);
+ //ALOGI("Freeing parcel %p", &parcel);
IF_LOG_COMMANDS() {
alog << "Writing BC_FREE_BUFFER for " << data << endl;
}
diff --git a/libs/binder/IServiceManager.cpp b/libs/binder/IServiceManager.cpp
index 1fa4c3579cc5..33b305dccbb1 100644
--- a/libs/binder/IServiceManager.cpp
+++ b/libs/binder/IServiceManager.cpp
@@ -78,7 +78,7 @@ bool checkPermission(const String16& permission, pid_t pid, uid_t uid)
bool res = pc->checkPermission(permission, pid, uid);
if (res) {
if (startTime != 0) {
- LOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
+ ALOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
(int)((uptimeMillis()-startTime)/1000),
String8(permission).string(), uid, pid);
}
@@ -87,7 +87,7 @@ bool checkPermission(const String16& permission, pid_t pid, uid_t uid)
// Is this a permission failure, or did the controller go away?
if (pc->asBinder()->isBinderAlive()) {
- LOGW("Permission failure: %s from uid=%d pid=%d",
+ ALOGW("Permission failure: %s from uid=%d pid=%d",
String8(permission).string(), uid, pid);
return false;
}
@@ -106,7 +106,7 @@ bool checkPermission(const String16& permission, pid_t pid, uid_t uid)
// Wait for the permission controller to come back...
if (startTime == 0) {
startTime = uptimeMillis();
- LOGI("Waiting to check permission %s from uid=%d pid=%d",
+ ALOGI("Waiting to check permission %s from uid=%d pid=%d",
String8(permission).string(), uid, pid);
}
sleep(1);
@@ -136,7 +136,7 @@ public:
for (n = 0; n < 5; n++){
sp<IBinder> svc = checkService(name);
if (svc != NULL) return svc;
- LOGI("Waiting for service %s...\n", String8(name).string());
+ ALOGI("Waiting for service %s...\n", String8(name).string());
sleep(1);
}
return NULL;
diff --git a/libs/binder/MemoryDealer.cpp b/libs/binder/MemoryDealer.cpp
index f299924bf786..8d0e0a7413ab 100644
--- a/libs/binder/MemoryDealer.cpp
+++ b/libs/binder/MemoryDealer.cpp
@@ -210,7 +210,7 @@ Allocation::~Allocation()
#ifdef MADV_REMOVE
if (size) {
int err = madvise(start_ptr, size, MADV_REMOVE);
- LOGW_IF(err, "madvise(%p, %u, MADV_REMOVE) returned %s",
+ ALOGW_IF(err, "madvise(%p, %u, MADV_REMOVE) returned %s",
start_ptr, size, err<0 ? strerror(errno) : "Ok");
}
#endif
@@ -348,7 +348,7 @@ ssize_t SimpleBestFitAllocator::alloc(size_t size, uint32_t flags)
mList.insertBefore(free_chunk, split);
}
- LOGE_IF((flags&PAGE_ALIGNED) &&
+ ALOGE_IF((flags&PAGE_ALIGNED) &&
((free_chunk->start*kMemoryAlign)&(pagesize-1)),
"PAGE_ALIGNED requested, but page is not aligned!!!");
diff --git a/libs/binder/MemoryHeapBase.cpp b/libs/binder/MemoryHeapBase.cpp
index e17137470051..d1cbf1cbae85 100644
--- a/libs/binder/MemoryHeapBase.cpp
+++ b/libs/binder/MemoryHeapBase.cpp
@@ -53,7 +53,7 @@ MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name)
const size_t pagesize = getpagesize();
size = ((size + pagesize-1) & ~(pagesize-1));
int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size);
- LOGE_IF(fd<0, "error creating ashmem region: %s", strerror(errno));
+ ALOGE_IF(fd<0, "error creating ashmem region: %s", strerror(errno));
if (fd >= 0) {
if (mapfd(fd, size) == NO_ERROR) {
if (flags & READ_ONLY) {
@@ -72,7 +72,7 @@ MemoryHeapBase::MemoryHeapBase(const char* device, size_t size, uint32_t flags)
open_flags |= O_SYNC;
int fd = open(device, open_flags);
- LOGE_IF(fd<0, "error opening %s: %s", device, strerror(errno));
+ ALOGE_IF(fd<0, "error opening %s: %s", device, strerror(errno));
if (fd >= 0) {
const size_t pagesize = getpagesize();
size = ((size + pagesize-1) & ~(pagesize-1));
@@ -127,7 +127,7 @@ status_t MemoryHeapBase::mapfd(int fd, size_t size, uint32_t offset)
void* base = (uint8_t*)mmap(0, size,
PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset);
if (base == MAP_FAILED) {
- LOGE("mmap(fd=%d, size=%u) failed (%s)",
+ ALOGE("mmap(fd=%d, size=%u) failed (%s)",
fd, uint32_t(size), strerror(errno));
close(fd);
return -errno;
diff --git a/libs/binder/MemoryHeapPmem.cpp b/libs/binder/MemoryHeapPmem.cpp
index 03322ea5d9c4..66bcf4d2c729 100644
--- a/libs/binder/MemoryHeapPmem.cpp
+++ b/libs/binder/MemoryHeapPmem.cpp
@@ -79,7 +79,7 @@ SubRegionMemory::SubRegionMemory(const sp<MemoryHeapPmem>& heap,
int our_fd = heap->heapID();
struct pmem_region sub = { offset, size };
int err = ioctl(our_fd, PMEM_MAP, &sub);
- LOGE_IF(err<0, "PMEM_MAP failed (%s), "
+ ALOGE_IF(err<0, "PMEM_MAP failed (%s), "
"mFD=%d, sub.offset=%lu, sub.size=%lu",
strerror(errno), our_fd, sub.offset, sub.len);
}
@@ -115,7 +115,7 @@ void SubRegionMemory::revoke()
sub.offset = mOffset;
sub.len = mSize;
int err = ioctl(our_fd, PMEM_UNMAP, &sub);
- LOGE_IF(err<0, "PMEM_UNMAP failed (%s), "
+ ALOGE_IF(err<0, "PMEM_UNMAP failed (%s), "
"mFD=%d, sub.offset=%lu, sub.size=%lu",
strerror(errno), our_fd, sub.offset, sub.len);
mSize = 0;
@@ -133,11 +133,11 @@ MemoryHeapPmem::MemoryHeapPmem(const sp<MemoryHeapBase>& pmemHeap,
#ifdef HAVE_ANDROID_OS
if (device) {
int fd = open(device, O_RDWR | (flags & NO_CACHING ? O_SYNC : 0));
- LOGE_IF(fd<0, "couldn't open %s (%s)", device, strerror(errno));
+ ALOGE_IF(fd<0, "couldn't open %s (%s)", device, strerror(errno));
if (fd >= 0) {
int err = ioctl(fd, PMEM_CONNECT, pmemHeap->heapID());
if (err < 0) {
- LOGE("PMEM_CONNECT failed (%s), mFD=%d, sub-fd=%d",
+ ALOGE("PMEM_CONNECT failed (%s), mFD=%d, sub-fd=%d",
strerror(errno), fd, pmemHeap->heapID());
close(fd);
} else {
@@ -194,7 +194,7 @@ status_t MemoryHeapPmem::slap()
int our_fd = getHeapID();
struct pmem_region sub = { 0, size };
int err = ioctl(our_fd, PMEM_MAP, &sub);
- LOGE_IF(err<0, "PMEM_MAP failed (%s), "
+ ALOGE_IF(err<0, "PMEM_MAP failed (%s), "
"mFD=%d, sub.offset=%lu, sub.size=%lu",
strerror(errno), our_fd, sub.offset, sub.len);
return -errno;
@@ -212,7 +212,7 @@ status_t MemoryHeapPmem::unslap()
int our_fd = getHeapID();
struct pmem_region sub = { 0, size };
int err = ioctl(our_fd, PMEM_UNMAP, &sub);
- LOGE_IF(err<0, "PMEM_UNMAP failed (%s), "
+ ALOGE_IF(err<0, "PMEM_UNMAP failed (%s), "
"mFD=%d, sub.offset=%lu, sub.size=%lu",
strerror(errno), our_fd, sub.offset, sub.len);
return -errno;
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 4ec224364149..dea14bb97016 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -139,7 +139,7 @@ void release_object(const sp<ProcessState>& proc,
}
}
- LOGE("Invalid object type 0x%08lx", obj.type);
+ ALOGE("Invalid object type 0x%08lx", obj.type);
}
inline static status_t finish_flatten_binder(
@@ -159,7 +159,7 @@ status_t flatten_binder(const sp<ProcessState>& proc,
if (!local) {
BpBinder *proxy = binder->remoteBinder();
if (proxy == NULL) {
- LOGE("null proxy");
+ ALOGE("null proxy");
}
const int32_t handle = proxy ? proxy->handle() : 0;
obj.type = BINDER_TYPE_HANDLE;
@@ -192,7 +192,7 @@ status_t flatten_binder(const sp<ProcessState>& proc,
if (!local) {
BpBinder *proxy = real->remoteBinder();
if (proxy == NULL) {
- LOGE("null proxy");
+ ALOGE("null proxy");
}
const int32_t handle = proxy ? proxy->handle() : 0;
obj.type = BINDER_TYPE_WEAK_HANDLE;
@@ -213,7 +213,7 @@ status_t flatten_binder(const sp<ProcessState>& proc,
// The OpenBinder implementation uses a dynamic_cast<> here,
// but we can't do that with the different reference counting
// implementation we are using.
- LOGE("Unable to unflatten Binder weak reference!");
+ ALOGE("Unable to unflatten Binder weak reference!");
obj.type = BINDER_TYPE_BINDER;
obj.binder = NULL;
obj.cookie = NULL;
@@ -504,7 +504,7 @@ bool Parcel::enforceInterface(const String16& interface,
if (str == interface) {
return true;
} else {
- LOGW("**** enforceInterface() expected '%s' but read '%s'\n",
+ ALOGW("**** enforceInterface() expected '%s' but read '%s'\n",
String8(interface).string(), String8(str).string());
return false;
}
@@ -1018,7 +1018,7 @@ String16 Parcel::readString16() const
size_t len;
const char16_t* str = readString16Inplace(&len);
if (str) return String16(str, len);
- LOGE("Reading a NULL string not supported here.");
+ ALOGE("Reading a NULL string not supported here.");
return String16();
}
@@ -1096,7 +1096,7 @@ int Parcel::readFileDescriptor() const
if (flat) {
switch (flat->type) {
case BINDER_TYPE_FD:
- //LOGI("Returning file descriptor %ld from parcel %p\n", flat->handle, this);
+ //ALOGI("Returning file descriptor %ld from parcel %p\n", flat->handle, this);
return flat->handle;
}
}
@@ -1216,7 +1216,7 @@ const flat_binder_object* Parcel::readObject(bool nullMetaData) const
return obj;
}
}
- LOGW("Attempt to read object from Parcel %p at offset %d that is not in the object list",
+ ALOGW("Attempt to read object from Parcel %p at offset %d that is not in the object list",
this, DPOS);
}
return NULL;
@@ -1226,14 +1226,14 @@ void Parcel::closeFileDescriptors()
{
size_t i = mObjectsSize;
if (i > 0) {
- //LOGI("Closing file descriptors for %d objects...", mObjectsSize);
+ //ALOGI("Closing file descriptors for %d objects...", mObjectsSize);
}
while (i > 0) {
i--;
const flat_binder_object* flat
= reinterpret_cast<flat_binder_object*>(mData+mObjects[i]);
if (flat->type == BINDER_TYPE_FD) {
- //LOGI("Closing fd: %ld\n", flat->handle);
+ //ALOGI("Closing fd: %ld\n", flat->handle);
close(flat->handle);
}
}
@@ -1266,7 +1266,7 @@ void Parcel::ipcSetDataReference(const uint8_t* data, size_t dataSize,
mError = NO_ERROR;
mData = const_cast<uint8_t*>(data);
mDataSize = mDataCapacity = dataSize;
- //LOGI("setDataReference Setting data size of %p to %lu (pid=%d)\n", this, mDataSize, getpid());
+ //ALOGI("setDataReference Setting data size of %p to %lu (pid=%d)\n", this, mDataSize, getpid());
mDataPos = 0;
ALOGV("setDataReference Setting data pos of %p to %d\n", this, mDataPos);
mObjects = const_cast<size_t*>(objects);
@@ -1340,7 +1340,7 @@ void Parcel::freeData()
void Parcel::freeDataNoInit()
{
if (mOwner) {
- //LOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
+ //ALOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
} else {
releaseObjects();
@@ -1446,7 +1446,7 @@ status_t Parcel::continueWrite(size_t desired)
if (objects && mObjects) {
memcpy(objects, mObjects, objectsSize*sizeof(size_t));
}
- //LOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
+ //ALOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
mOwner = NULL;
@@ -1511,7 +1511,7 @@ status_t Parcel::continueWrite(size_t desired)
if(!(mDataCapacity == 0 && mObjects == NULL
&& mObjectsCapacity == 0)) {
- LOGE("continueWrite: %d/%p/%d/%d", mDataCapacity, mObjects, mObjectsCapacity, desired);
+ ALOGE("continueWrite: %d/%p/%d/%d", mDataCapacity, mObjects, mObjectsCapacity, desired);
}
mData = data;
diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp
index f06a59ea6656..f96fe50e03f3 100644
--- a/libs/binder/ProcessState.cpp
+++ b/libs/binder/ProcessState.cpp
@@ -109,7 +109,7 @@ sp<IBinder> ProcessState::getContextObject(const String16& name, const sp<IBinde
// Don't attempt to retrieve contexts if we manage them
if (mManagesContexts) {
- LOGE("getContextObject(%s) failed, but we manage the contexts!\n",
+ ALOGE("getContextObject(%s) failed, but we manage the contexts!\n",
String8(name).string());
return NULL;
}
@@ -160,7 +160,7 @@ bool ProcessState::becomeContextManager(context_check_func checkFunc, void* user
} else if (result == -1) {
mBinderContextCheckFunc = NULL;
mBinderContextUserData = NULL;
- LOGE("Binder ioctl to become context manager failed: %s\n", strerror(errno));
+ ALOGE("Binder ioctl to become context manager failed: %s\n", strerror(errno));
}
}
return mManagesContexts;
@@ -302,22 +302,22 @@ static int open_driver()
int vers;
status_t result = ioctl(fd, BINDER_VERSION, &vers);
if (result == -1) {
- LOGE("Binder ioctl to obtain version failed: %s", strerror(errno));
+ ALOGE("Binder ioctl to obtain version failed: %s", strerror(errno));
close(fd);
fd = -1;
}
if (result != 0 || vers != BINDER_CURRENT_PROTOCOL_VERSION) {
- LOGE("Binder driver protocol does not match user space protocol!");
+ ALOGE("Binder driver protocol does not match user space protocol!");
close(fd);
fd = -1;
}
size_t maxThreads = 15;
result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
if (result == -1) {
- LOGE("Binder ioctl to set max threads failed: %s", strerror(errno));
+ ALOGE("Binder ioctl to set max threads failed: %s", strerror(errno));
}
} else {
- LOGW("Opening '/dev/binder' failed: %s\n", strerror(errno));
+ ALOGW("Opening '/dev/binder' failed: %s\n", strerror(errno));
}
return fd;
}
@@ -340,7 +340,7 @@ ProcessState::ProcessState()
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
if (mVMStart == MAP_FAILED) {
// *sigh*
- LOGE("Using /dev/binder failed: unable to mmap transaction memory.\n");
+ ALOGE("Using /dev/binder failed: unable to mmap transaction memory.\n");
close(mDriverFD);
mDriverFD = -1;
}
diff --git a/libs/camera/Camera.cpp b/libs/camera/Camera.cpp
index eef1dd2ef2c1..ee458f19fd25 100644
--- a/libs/camera/Camera.cpp
+++ b/libs/camera/Camera.cpp
@@ -47,7 +47,7 @@ const sp<ICameraService>& Camera::getCameraService()
binder = sm->getService(String16("media.camera"));
if (binder != 0)
break;
- LOGW("CameraService not published, waiting...");
+ ALOGW("CameraService not published, waiting...");
usleep(500000); // 0.5 s
} while(true);
if (mDeathNotifier == NULL) {
@@ -56,7 +56,7 @@ const sp<ICameraService>& Camera::getCameraService()
binder->linkToDeath(mDeathNotifier);
mCameraService = interface_cast<ICameraService>(binder);
}
- LOGE_IF(mCameraService==0, "no CameraService!?");
+ ALOGE_IF(mCameraService==0, "no CameraService!?");
return mCameraService;
}
@@ -72,7 +72,7 @@ sp<Camera> Camera::create(const sp<ICamera>& camera)
{
ALOGV("create");
if (camera == 0) {
- LOGE("camera remote is a NULL pointer");
+ ALOGE("camera remote is a NULL pointer");
return 0;
}
@@ -397,13 +397,13 @@ void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<
if (listener != NULL) {
listener->postDataTimestamp(timestamp, msgType, dataPtr);
} else {
- LOGW("No listener was set. Drop a recording frame.");
+ ALOGW("No listener was set. Drop a recording frame.");
releaseRecordingFrame(dataPtr);
}
}
void Camera::binderDied(const wp<IBinder>& who) {
- LOGW("ICamera died");
+ ALOGW("ICamera died");
notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0);
}
@@ -411,7 +411,7 @@ void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
ALOGV("binderDied");
Mutex::Autolock _l(Camera::mLock);
Camera::mCameraService.clear();
- LOGW("Camera server died!");
+ ALOGW("Camera server died!");
}
sp<ICameraRecordingProxy> Camera::getRecordingProxy() {
diff --git a/libs/camera/CameraParameters.cpp b/libs/camera/CameraParameters.cpp
index 209d84a98bbd..059a8a5fa5e4 100644
--- a/libs/camera/CameraParameters.cpp
+++ b/libs/camera/CameraParameters.cpp
@@ -231,12 +231,12 @@ void CameraParameters::set(const char *key, const char *value)
{
// XXX i think i can do this with strspn()
if (strchr(key, '=') || strchr(key, ';')) {
- //XXX LOGE("Key \"%s\"contains invalid character (= or ;)", key);
+ //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
return;
}
if (strchr(value, '=') || strchr(key, ';')) {
- //XXX LOGE("Value \"%s\"contains invalid character (= or ;)", value);
+ //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
return;
}
@@ -294,7 +294,7 @@ static int parse_pair(const char *str, int *first, int *second, char delim,
int w = (int)strtol(str, &end, 10);
// If a delimeter does not immediately follow, give up.
if (*end != delim) {
- LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
+ ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
return -1;
}
@@ -324,7 +324,7 @@ static void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
int success = parse_pair(sizeStartPtr, &width, &height, 'x',
&sizeStartPtr);
if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
- LOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
+ ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
return;
}
sizes.push(Size(width, height));
diff --git a/libs/cpustats/ThreadCpuUsage.cpp b/libs/cpustats/ThreadCpuUsage.cpp
index 4bfbdf306428..ffee039e1ee1 100644
--- a/libs/cpustats/ThreadCpuUsage.cpp
+++ b/libs/cpustats/ThreadCpuUsage.cpp
@@ -31,7 +31,7 @@ bool ThreadCpuUsage::setEnabled(bool isEnabled)
if (isEnabled) {
rc = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &mPreviousTs);
if (rc) {
- LOGE("clock_gettime(CLOCK_THREAD_CPUTIME_ID) errno=%d", errno);
+ ALOGE("clock_gettime(CLOCK_THREAD_CPUTIME_ID) errno=%d", errno);
isEnabled = false;
} else {
mWasEverEnabled = true;
@@ -39,7 +39,7 @@ bool ThreadCpuUsage::setEnabled(bool isEnabled)
if (!mMonotonicKnown) {
rc = clock_gettime(CLOCK_MONOTONIC, &mMonotonicTs);
if (rc) {
- LOGE("clock_gettime(CLOCK_MONOTONIC) errno=%d", errno);
+ ALOGE("clock_gettime(CLOCK_MONOTONIC) errno=%d", errno);
} else {
mMonotonicKnown = true;
}
@@ -50,7 +50,7 @@ bool ThreadCpuUsage::setEnabled(bool isEnabled)
struct timespec ts;
rc = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
if (rc) {
- LOGE("clock_gettime(CLOCK_THREAD_CPUTIME_ID) errno=%d", errno);
+ ALOGE("clock_gettime(CLOCK_THREAD_CPUTIME_ID) errno=%d", errno);
} else {
long long delta = (ts.tv_sec - mPreviousTs.tv_sec) * 1000000000LL +
(ts.tv_nsec - mPreviousTs.tv_nsec);
@@ -86,7 +86,7 @@ void ThreadCpuUsage::sample()
int rc;
rc = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
if (rc) {
- LOGE("clock_gettime(CLOCK_THREAD_CPUTIME_ID) errno=%d", errno);
+ ALOGE("clock_gettime(CLOCK_THREAD_CPUTIME_ID) errno=%d", errno);
} else {
long long delta = (ts.tv_sec - mPreviousTs.tv_sec) * 1000000000LL +
(ts.tv_nsec - mPreviousTs.tv_nsec);
@@ -99,7 +99,7 @@ void ThreadCpuUsage::sample()
mStatistics.sample((double) mAccumulator);
mAccumulator = 0;
} else {
- LOGW("Can't add sample because measurements have never been enabled");
+ ALOGW("Can't add sample because measurements have never been enabled");
}
}
@@ -111,7 +111,7 @@ long long ThreadCpuUsage::elapsed() const
int rc;
rc = clock_gettime(CLOCK_MONOTONIC, &ts);
if (rc) {
- LOGE("clock_gettime(CLOCK_MONOTONIC) errno=%d", errno);
+ ALOGE("clock_gettime(CLOCK_MONOTONIC) errno=%d", errno);
elapsed = 0;
} else {
// mMonotonicTs is updated only at first enable and resetStatistics
@@ -119,7 +119,7 @@ long long ThreadCpuUsage::elapsed() const
(ts.tv_nsec - mMonotonicTs.tv_nsec);
}
} else {
- LOGW("Can't compute elapsed time because measurements have never been enabled");
+ ALOGW("Can't compute elapsed time because measurements have never been enabled");
elapsed = 0;
}
return elapsed;
@@ -132,7 +132,7 @@ void ThreadCpuUsage::resetStatistics()
int rc;
rc = clock_gettime(CLOCK_MONOTONIC, &mMonotonicTs);
if (rc) {
- LOGE("clock_gettime(CLOCK_MONOTONIC) errno=%d", errno);
+ ALOGE("clock_gettime(CLOCK_MONOTONIC) errno=%d", errno);
mMonotonicKnown = false;
}
}
diff --git a/libs/gui/BitTube.cpp b/libs/gui/BitTube.cpp
index fa8d0eabca1d..785da39b955d 100644
--- a/libs/gui/BitTube.cpp
+++ b/libs/gui/BitTube.cpp
@@ -40,7 +40,7 @@ BitTube::BitTube()
fcntl(mSendFd, F_SETFL, O_NONBLOCK);
} else {
mReceiveFd = -errno;
- LOGE("BitTube: pipe creation failed (%s)", strerror(-mReceiveFd));
+ ALOGE("BitTube: pipe creation failed (%s)", strerror(-mReceiveFd));
}
}
@@ -52,7 +52,7 @@ BitTube::BitTube(const Parcel& data)
fcntl(mReceiveFd, F_SETFL, O_NONBLOCK);
} else {
mReceiveFd = -errno;
- LOGE("BitTube(Parcel): can't dup filedescriptor (%s)",
+ ALOGE("BitTube(Parcel): can't dup filedescriptor (%s)",
strerror(-mReceiveFd));
}
}
diff --git a/libs/gui/DisplayEventReceiver.cpp b/libs/gui/DisplayEventReceiver.cpp
index fee1febb9bb1..3b3ccaaf74c5 100644
--- a/libs/gui/DisplayEventReceiver.cpp
+++ b/libs/gui/DisplayEventReceiver.cpp
@@ -81,7 +81,7 @@ status_t DisplayEventReceiver::requestNextVsync() {
ssize_t DisplayEventReceiver::getEvents(DisplayEventReceiver::Event* events,
size_t count) {
ssize_t size = mDataChannel->read(events, sizeof(events[0])*count);
- LOGE_IF(size<0,
+ ALOGE_IF(size<0,
"DisplayEventReceiver::getEvents error (%s)",
strerror(-size));
if (size >= 0) {
diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp
index ca7c8f88e1ae..95b23793440d 100644
--- a/libs/gui/ISurfaceComposer.cpp
+++ b/libs/gui/ISurfaceComposer.cpp
@@ -148,27 +148,27 @@ public:
err = data.writeInterfaceToken(
ISurfaceComposer::getInterfaceDescriptor());
if (err != NO_ERROR) {
- LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
+ ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
"interface descriptor: %s (%d)", strerror(-err), -err);
return false;
}
err = data.writeStrongBinder(surfaceTexture->asBinder());
if (err != NO_ERROR) {
- LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
+ ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
"strong binder to parcel: %s (%d)", strerror(-err), -err);
return false;
}
err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
&reply);
if (err != NO_ERROR) {
- LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
+ ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
"performing transaction: %s (%d)", strerror(-err), -err);
return false;
}
int32_t result = 0;
err = reply.readInt32(&result);
if (err != NO_ERROR) {
- LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
+ ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
"retrieving result: %s (%d)", strerror(-err), -err);
return false;
}
@@ -188,7 +188,7 @@ public:
BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
data, &reply);
if (err != NO_ERROR) {
- LOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
+ ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
"transaction: %s (%d)", strerror(-err), -err);
return result;
}
diff --git a/libs/gui/SensorEventQueue.cpp b/libs/gui/SensorEventQueue.cpp
index ee21c45c5935..b95dd90230ad 100644
--- a/libs/gui/SensorEventQueue.cpp
+++ b/libs/gui/SensorEventQueue.cpp
@@ -70,12 +70,12 @@ ssize_t SensorEventQueue::write(ASensorEvent const* events, size_t numEvents)
ssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents)
{
ssize_t size = mSensorChannel->read(events, numEvents*sizeof(events[0]));
- LOGE_IF(size<0 && size!=-EAGAIN,
+ ALOGE_IF(size<0 && size!=-EAGAIN,
"SensorChannel::read error (%s)", strerror(-size));
if (size >= 0) {
if (size % sizeof(events[0])) {
// partial read!!! should never happen.
- LOGE("SensorEventQueue partial read (event-size=%u, read=%d)",
+ ALOGE("SensorEventQueue partial read (event-size=%u, read=%d)",
sizeof(events[0]), int(size));
return -EINVAL;
}
@@ -104,7 +104,7 @@ status_t SensorEventQueue::waitForEvent() const
do {
result = looper->pollOnce(-1);
if (result == ALOOPER_EVENT_ERROR) {
- LOGE("SensorEventQueue::waitForEvent error (errno=%d)", errno);
+ ALOGE("SensorEventQueue::waitForEvent error (errno=%d)", errno);
result = -EPIPE; // unknown error, so we make up one
break;
}
diff --git a/libs/gui/SensorManager.cpp b/libs/gui/SensorManager.cpp
index dafcdea2331e..b80da5681396 100644
--- a/libs/gui/SensorManager.cpp
+++ b/libs/gui/SensorManager.cpp
@@ -78,7 +78,7 @@ status_t SensorManager::assertStateLocked() const {
class DeathObserver : public IBinder::DeathRecipient {
SensorManager& mSensorManger;
virtual void binderDied(const wp<IBinder>& who) {
- LOGW("sensorservice died [%p]", who.unsafe_get());
+ ALOGW("sensorservice died [%p]", who.unsafe_get());
mSensorManger.sensorManagerDied();
}
public:
@@ -137,7 +137,7 @@ sp<SensorEventQueue> SensorManager::createEventQueue()
mSensorServer->createSensorEventConnection();
if (connection == NULL) {
// SensorService just died.
- LOGE("createEventQueue: connection is NULL. SensorService died.");
+ ALOGE("createEventQueue: connection is NULL. SensorService died.");
continue;
}
queue = new SensorEventQueue(connection);
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp
index ff45fa34706b..337950c3e6ee 100644
--- a/libs/gui/Surface.cpp
+++ b/libs/gui/Surface.cpp
@@ -167,7 +167,7 @@ status_t SurfaceControl::setFreezeTint(uint32_t tint) {
status_t SurfaceControl::validate() const
{
if (mToken<0 || mClient==0) {
- LOGE("invalid token (%d, identity=%u) or client (%p)",
+ ALOGE("invalid token (%d, identity=%u) or client (%p)",
mToken, mIdentity, mClient.get());
return NO_INIT;
}
@@ -254,7 +254,7 @@ status_t Surface::writeToParcel(
} else if (surface != 0 &&
(surface->mSurface != NULL ||
surface->getISurfaceTexture() != NULL)) {
- LOGE("Parceling invalid surface with non-NULL ISurface/ISurfaceTexture as NULL: "
+ ALOGE("Parceling invalid surface with non-NULL ISurface/ISurfaceTexture as NULL: "
"mSurface = %p, surfaceTexture = %p, mIdentity = %d, ",
surface->mSurface.get(), surface->getISurfaceTexture().get(),
surface->mIdentity);
@@ -304,7 +304,7 @@ void Surface::cleanCachedSurfacesLocked() {
void Surface::init(const sp<ISurfaceTexture>& surfaceTexture)
{
if (mSurface != NULL || surfaceTexture != NULL) {
- LOGE_IF(surfaceTexture==0, "got a NULL ISurfaceTexture from ISurface");
+ ALOGE_IF(surfaceTexture==0, "got a NULL ISurfaceTexture from ISurface");
if (surfaceTexture != NULL) {
setISurfaceTexture(surfaceTexture);
setUsage(GraphicBuffer::USAGE_HW_RENDER);
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index fa0ee8c9a257..3abe84ad8b6e 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -64,9 +64,9 @@
// Macros for including the SurfaceTexture name in log messages
#define ST_LOGV(x, ...) ALOGV("[%s] "x, mName.string(), ##__VA_ARGS__)
#define ST_LOGD(x, ...) ALOGD("[%s] "x, mName.string(), ##__VA_ARGS__)
-#define ST_LOGI(x, ...) LOGI("[%s] "x, mName.string(), ##__VA_ARGS__)
-#define ST_LOGW(x, ...) LOGW("[%s] "x, mName.string(), ##__VA_ARGS__)
-#define ST_LOGE(x, ...) LOGE("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGI(x, ...) ALOGI("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGW(x, ...) ALOGW("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGE(x, ...) ALOGE("[%s] "x, mName.string(), ##__VA_ARGS__)
namespace android {
@@ -352,7 +352,7 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
}
// if buffer is FREE it CANNOT be current
- LOGW_IF((state == BufferSlot::FREE) && (mCurrentTexture==i),
+ ALOGW_IF((state == BufferSlot::FREE) && (mCurrentTexture==i),
"dequeueBuffer: buffer %d is both FREE and current!",
i);
@@ -493,9 +493,9 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
// synchronizing access to it. It's too late at this point to abort the
// dequeue operation.
if (result == EGL_FALSE) {
- LOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError());
+ ALOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError());
} else if (result == EGL_TIMEOUT_EXPIRED_KHR) {
- LOGE("dequeueBuffer: timeout waiting for fence");
+ ALOGE("dequeueBuffer: timeout waiting for fence");
}
eglDestroySyncKHR(dpy, fence);
}
@@ -804,7 +804,7 @@ status_t SurfaceTexture::updateTexImage() {
EGLSyncKHR fence = eglCreateSyncKHR(dpy, EGL_SYNC_FENCE_KHR,
NULL);
if (fence == EGL_NO_SYNC_KHR) {
- LOGE("updateTexImage: error creating fence: %#x",
+ ALOGE("updateTexImage: error creating fence: %#x",
eglGetError());
return -EINVAL;
}
@@ -992,7 +992,7 @@ void SurfaceTexture::freeBufferLocked(int i) {
}
void SurfaceTexture::freeAllBuffersLocked() {
- LOGW_IF(!mQueue.isEmpty(),
+ ALOGW_IF(!mQueue.isEmpty(),
"freeAllBuffersLocked called but mQueue is not empty");
mCurrentTexture = INVALID_BUFFER_SLOT;
for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
@@ -1001,7 +1001,7 @@ void SurfaceTexture::freeAllBuffersLocked() {
}
void SurfaceTexture::freeAllBuffersExceptHeadLocked() {
- LOGW_IF(!mQueue.isEmpty(),
+ ALOGW_IF(!mQueue.isEmpty(),
"freeAllBuffersExceptCurrentLocked called but mQueue is not empty");
int head = -1;
if (!mQueue.empty()) {
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index b6f3c11ff159..d0934ba8aa73 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -157,7 +157,7 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
if ((result & ISurfaceTexture::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) {
result = mSurfaceTexture->requestBuffer(buf, &gbuf);
if (result != NO_ERROR) {
- LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed: %d",
+ ALOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed: %d",
result);
return result;
}
@@ -202,7 +202,7 @@ int SurfaceTextureClient::getSlotFromBufferLocked(
return i;
}
}
- LOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
+ ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
return BAD_VALUE;
}
@@ -230,7 +230,7 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
status_t err = mSurfaceTexture->queueBuffer(i, timestamp,
&mDefaultWidth, &mDefaultHeight, &mTransformHint);
if (err != OK) {
- LOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
+ ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
}
return err;
}
@@ -452,7 +452,7 @@ int SurfaceTextureClient::setCrop(Rect const* rect)
}
status_t err = mSurfaceTexture->setCrop(*rect);
- LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
+ ALOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
return err;
}
@@ -463,7 +463,7 @@ int SurfaceTextureClient::setBufferCount(int bufferCount)
Mutex::Autolock lock(mMutex);
status_t err = mSurfaceTexture->setBufferCount(bufferCount);
- LOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s",
+ ALOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s",
bufferCount, strerror(-err));
if (err == NO_ERROR) {
@@ -488,7 +488,7 @@ int SurfaceTextureClient::setBuffersDimensions(int w, int h)
mReqHeight = h;
status_t err = mSurfaceTexture->setCrop(Rect(0, 0));
- LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
+ ALOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
return err;
}
@@ -512,7 +512,7 @@ int SurfaceTextureClient::setScalingMode(int mode)
Mutex::Autolock lock(mMutex);
// mode is validated on the server
status_t err = mSurfaceTexture->setScalingMode(mode);
- LOGE_IF(err, "ISurfaceTexture::setScalingMode(%d) returned %s",
+ ALOGE_IF(err, "ISurfaceTexture::setScalingMode(%d) returned %s",
mode, strerror(-err));
return err;
@@ -553,11 +553,11 @@ static status_t copyBlt(
status_t err;
uint8_t const * src_bits = NULL;
err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), (void**)&src_bits);
- LOGE_IF(err, "error locking src buffer %s", strerror(-err));
+ ALOGE_IF(err, "error locking src buffer %s", strerror(-err));
uint8_t* dst_bits = NULL;
err = dst->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), (void**)&dst_bits);
- LOGE_IF(err, "error locking dst buffer %s", strerror(-err));
+ ALOGE_IF(err, "error locking dst buffer %s", strerror(-err));
Region::const_iterator head(reg.begin());
Region::const_iterator tail(reg.end());
@@ -600,7 +600,7 @@ status_t SurfaceTextureClient::lock(
ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds)
{
if (mLockedBuffer != 0) {
- LOGE("Surface::lock failed, already locked");
+ ALOGE("Surface::lock failed, already locked");
return INVALID_OPERATION;
}
@@ -615,11 +615,11 @@ status_t SurfaceTextureClient::lock(
ANativeWindowBuffer* out;
status_t err = dequeueBuffer(&out);
- LOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err));
+ ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err));
if (err == NO_ERROR) {
sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out));
err = lockBuffer(backBuffer.get());
- LOGE_IF(err, "lockBuffer (handle=%p) failed (%s)",
+ ALOGE_IF(err, "lockBuffer (handle=%p) failed (%s)",
backBuffer->handle, strerror(-err));
if (err == NO_ERROR) {
const Rect bounds(backBuffer->width, backBuffer->height);
@@ -663,7 +663,7 @@ status_t SurfaceTextureClient::lock(
GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
newDirtyRegion.bounds(), &vaddr);
- LOGW_IF(res, "failed locking buffer (handle = %p)",
+ ALOGW_IF(res, "failed locking buffer (handle = %p)",
backBuffer->handle);
mLockedBuffer = backBuffer;
@@ -680,15 +680,15 @@ status_t SurfaceTextureClient::lock(
status_t SurfaceTextureClient::unlockAndPost()
{
if (mLockedBuffer == 0) {
- LOGE("Surface::unlockAndPost failed, no locked buffer");
+ ALOGE("Surface::unlockAndPost failed, no locked buffer");
return INVALID_OPERATION;
}
status_t err = mLockedBuffer->unlock();
- LOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle);
+ ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle);
err = queueBuffer(mLockedBuffer.get());
- LOGE_IF(err, "queueBuffer (handle=%p) failed (%s)",
+ ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)",
mLockedBuffer->handle, strerror(-err));
mPostedBuffer = mLockedBuffer;
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index fa1e9b8f1f1e..d1af1a3161a8 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -50,7 +50,7 @@ Caches::Caches(): Singleton<Caches>(), mInitialized(false) {
GLint maxTextureUnits;
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) {
- LOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
+ ALOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
}
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index b8ba23d3f44d..656a384ff60c 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -1210,10 +1210,8 @@ void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
// see if it matters.
// If we make a copy, then drawTextDecorations() should *not* make
// its own copy as it does right now.
+ // Beware: this needs Glyph encoding (already done on the Paint constructor)
paint->setAntiAlias(true);
-#if RENDER_TEXT_AS_GLYPHS
- paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-#endif
addPaint(paint);
addFloat(length < 0.0f ? paint->measureText(text, bytesCount) : length);
}
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index 8462307ae8a4..790c1438b51e 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -150,7 +150,7 @@ void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
for (cacheX = glyph->mStartX, bX = nPenX; cacheX < endX; cacheX++, bX++) {
for (cacheY = glyph->mStartY, bY = nPenY; cacheY < endY; cacheY++, bY++) {
if (bX < 0 || bY < 0 || bX >= (int32_t) bitmapW || bY >= (int32_t) bitmapH) {
- LOGE("Skipping invalid index");
+ ALOGE("Skipping invalid index");
continue;
}
uint8_t tempCol = cacheBuffer[cacheY * cacheWidth + cacheX];
@@ -191,7 +191,7 @@ void Font::render(SkPaint* paint, const char* text, uint32_t start, uint32_t len
void Font::measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
int numGlyphs, Rect *bounds) {
if (bounds == NULL) {
- LOGE("No return rectangle provided to measure text");
+ ALOGE("No return rectangle provided to measure text");
return;
}
bounds->set(1e6, -1e6, -1e6, 1e6);
@@ -475,7 +475,7 @@ void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyp
cachedGlyph->mIsValid = false;
// If the glyph is too tall, don't cache it
if (glyph.fHeight + TEXTURE_BORDER_SIZE > mCacheLines[mCacheLines.size() - 1]->mMaxHeight) {
- LOGE("Font size to large to fit in cache. width, height = %i, %i",
+ ALOGE("Font size to large to fit in cache. width, height = %i, %i",
(int) glyph.fWidth, (int) glyph.fHeight);
return;
}
@@ -871,7 +871,7 @@ bool FontRenderer::renderText(SkPaint* paint, const Rect* clip, const char *text
checkInit();
if (!mCurrentFont) {
- LOGE("No font set");
+ ALOGE("No font set");
return false;
}
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
index a88a59a0b480..3678788d5d50 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -154,7 +154,7 @@ Texture* GradientCache::addLinearGradient(GradientCacheEntry& gradient,
void GradientCache::generateTexture(SkBitmap* bitmap, Texture* texture) {
SkAutoLockPixels autoLock(*bitmap);
if (!bitmap->readyToDraw()) {
- LOGE("Cannot generate texture from shader");
+ ALOGE("Cannot generate texture from shader");
return;
}
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index f12239659ad4..e320eb2e0047 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -185,14 +185,14 @@ Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque
Caches& caches = Caches::getInstance();
GLuint fbo = caches.fboCache.get();
if (!fbo) {
- LOGW("Could not obtain an FBO");
+ ALOGW("Could not obtain an FBO");
return NULL;
}
caches.activeTexture(0);
Layer* layer = caches.layerCache.get(width, height);
if (!layer) {
- LOGW("Could not obtain a layer");
+ ALOGW("Could not obtain a layer");
return NULL;
}
@@ -360,7 +360,7 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) {
GLuint fbo = caches.fboCache.get();
if (!fbo) {
- LOGW("Could not obtain an FBO");
+ ALOGW("Could not obtain an FBO");
return false;
}
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 910195360d73..12ed2054c3d3 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -172,7 +172,7 @@ void OpenGLRenderer::finish() {
ALOGD("GL error from OpenGLRenderer: 0x%x", status);
switch (status) {
case GL_OUT_OF_MEMORY:
- LOGE(" OpenGLRenderer is out of memory!");
+ ALOGE(" OpenGLRenderer is out of memory!");
break;
}
}
@@ -538,7 +538,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, sp<Snapshot> sna
#if DEBUG_LAYERS_AS_REGIONS
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
- LOGE("Framebuffer incomplete (GL error code 0x%x)", status);
+ ALOGE("Framebuffer incomplete (GL error code 0x%x)", status);
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
layer->deleteTexture();
@@ -569,7 +569,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, sp<Snapshot> sna
*/
void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) {
if (!current->layer) {
- LOGE("Attempting to compose a layer that does not exist");
+ ALOGE("Attempting to compose a layer that does not exist");
return;
}
diff --git a/libs/hwui/Program.cpp b/libs/hwui/Program.cpp
index 701314d3c0b8..984461ca68d2 100644
--- a/libs/hwui/Program.cpp
+++ b/libs/hwui/Program.cpp
@@ -55,13 +55,13 @@ Program::Program(const ProgramDescription& description, const char* vertex, cons
GLint status;
glGetProgramiv(mProgramId, GL_LINK_STATUS, &status);
if (status != GL_TRUE) {
- LOGE("Error while linking shaders:");
+ ALOGE("Error while linking shaders:");
GLint infoLen = 0;
glGetProgramiv(mProgramId, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1) {
GLchar log[infoLen];
glGetProgramInfoLog(mProgramId, infoLen, 0, &log[0]);
- LOGE("%s", log);
+ ALOGE("%s", log);
}
glDetachShader(mProgramId, mVertexShader);
@@ -142,7 +142,7 @@ GLuint Program::buildShader(const char* source, GLenum type) {
// use a fixed size instead
GLchar log[512];
glGetShaderInfoLog(shader, sizeof(log), 0, &log[0]);
- LOGE("Error while compiling shader: %s", log);
+ ALOGE("Error while compiling shader: %s", log);
glDeleteShader(shader);
return 0;
}
diff --git a/libs/hwui/ShapeCache.h b/libs/hwui/ShapeCache.h
index 2c0f3ab0910b..30ce69081244 100644
--- a/libs/hwui/ShapeCache.h
+++ b/libs/hwui/ShapeCache.h
@@ -503,7 +503,7 @@ PathTexture* ShapeCache<Entry>::addTexture(const Entry& entry, const SkPath *pat
const uint32_t height = uint32_t(pathHeight + offset * 2.0 + 0.5);
if (width > mMaxTextureSize || height > mMaxTextureSize) {
- LOGW("Shape %s too large to be rendered into a texture (%dx%d, max=%dx%d)",
+ ALOGW("Shape %s too large to be rendered into a texture (%dx%d, max=%dx%d)",
mName, width, height, mMaxTextureSize, mMaxTextureSize);
return NULL;
}
@@ -571,7 +571,7 @@ template<class Entry>
void ShapeCache<Entry>::generateTexture(SkBitmap& bitmap, Texture* texture) {
SkAutoLockPixels alp(bitmap);
if (!bitmap.readyToDraw()) {
- LOGE("Cannot generate texture from bitmap");
+ ALOGE("Cannot generate texture from bitmap");
return;
}
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index 237911bebcfa..cc09aaec32d4 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -125,7 +125,7 @@ Texture* TextureCache::get(SkBitmap* bitmap) {
if (!texture) {
if (bitmap->width() > mMaxTextureSize || bitmap->height() > mMaxTextureSize) {
- LOGW("Bitmap too large to be uploaded into a texture (%dx%d, max=%dx%d)",
+ ALOGW("Bitmap too large to be uploaded into a texture (%dx%d, max=%dx%d)",
bitmap->width(), bitmap->height(), mMaxTextureSize, mMaxTextureSize);
return NULL;
}
@@ -202,7 +202,7 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool rege
SkAutoLockPixels alp(*bitmap);
if (!bitmap->readyToDraw()) {
- LOGE("Cannot generate texture from bitmap");
+ ALOGE("Cannot generate texture from bitmap");
return;
}
@@ -249,7 +249,7 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool rege
texture->blend = !bitmap->isOpaque();
break;
default:
- LOGW("Unsupported bitmap config: %d", bitmap->getConfig());
+ ALOGW("Unsupported bitmap config: %d", bitmap->getConfig());
break;
}
diff --git a/libs/rs/driver/rsdAllocation.cpp b/libs/rs/driver/rsdAllocation.cpp
index e79cd0f3cc3a..1f70e660f720 100644
--- a/libs/rs/driver/rsdAllocation.cpp
+++ b/libs/rs/driver/rsdAllocation.cpp
@@ -172,7 +172,7 @@ static void AllocateRenderTarget(const Context *rsc, const Allocation *alloc) {
if (!drv->renderTargetID) {
// This should generally not happen
- LOGE("allocateRenderTarget failed to gen mRenderTargetID");
+ ALOGE("allocateRenderTarget failed to gen mRenderTargetID");
rsc->dumpDebug();
return;
}
@@ -195,7 +195,7 @@ static void UploadToBufferObject(const Context *rsc, const Allocation *alloc) {
RSD_CALL_GL(glGenBuffers, 1, &drv->bufferID);
}
if (!drv->bufferID) {
- LOGE("Upload to buffer object failed");
+ ALOGE("Upload to buffer object failed");
drv->uploadDeferred = true;
return;
}
@@ -460,7 +460,7 @@ void rsdAllocationData2D_alloc_script(const android::renderscript::Context *rsc,
uint8_t *srcPtr = getOffsetPtr(srcAlloc, srcXoff, srcYoff + i, srcLod, srcFace);
memcpy(dstPtr, srcPtr, w * elementSize);
- //LOGE("COPIED dstXoff(%u), dstYoff(%u), dstLod(%u), dstFace(%u), w(%u), h(%u), srcXoff(%u), srcYoff(%u), srcLod(%u), srcFace(%u)",
+ //ALOGE("COPIED dstXoff(%u), dstYoff(%u), dstLod(%u), dstFace(%u), w(%u), h(%u), srcXoff(%u), srcYoff(%u), srcLod(%u), srcFace(%u)",
// dstXoff, dstYoff, dstLod, dstFace, w, h, srcXoff, srcYoff, srcLod, srcFace);
}
}
diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp
index 917b419fd16b..24bb288c0fcf 100644
--- a/libs/rs/driver/rsdBcc.cpp
+++ b/libs/rs/driver/rsdBcc.cpp
@@ -69,7 +69,7 @@ bool rsdScriptInit(const Context *rsc,
uint8_t const *bitcode,
size_t bitcodeSize,
uint32_t flags) {
- //LOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc);
+ //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc);
pthread_mutex_lock(&rsdgInitMutex);
@@ -93,14 +93,14 @@ bool rsdScriptInit(const Context *rsc,
drv->ME = new bcinfo::MetadataExtractor((const char*)drv->mScriptText,
drv->mScriptTextLength);
if (!drv->ME->extract()) {
- LOGE("bcinfo: failed to read script metadata");
+ ALOGE("bcinfo: failed to read script metadata");
goto error;
}
- //LOGE("mBccScript %p", script->mBccScript);
+ //ALOGE("mBccScript %p", script->mBccScript);
if (bccRegisterSymbolCallback(drv->mBccScript, &rsdLookupRuntimeStub, script) != 0) {
- LOGE("bcc: FAILS to register symbol callback");
+ ALOGE("bcc: FAILS to register symbol callback");
goto error;
}
@@ -108,17 +108,17 @@ bool rsdScriptInit(const Context *rsc,
resName,
(char const *)drv->mScriptText,
drv->mScriptTextLength, 0) != 0) {
- LOGE("bcc: FAILS to read bitcode");
+ ALOGE("bcc: FAILS to read bitcode");
goto error;
}
if (bccLinkFile(drv->mBccScript, "/system/lib/libclcore.bc", 0) != 0) {
- LOGE("bcc: FAILS to link bitcode");
+ ALOGE("bcc: FAILS to link bitcode");
goto error;
}
if (bccPrepareExecutable(drv->mBccScript, cacheDir, resName, 0) != 0) {
- LOGE("bcc: FAILS to prepare executable");
+ ALOGE("bcc: FAILS to prepare executable");
goto error;
}
@@ -234,8 +234,8 @@ static void wc_xy(void *usr, uint32_t idx) {
return;
}
- //LOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
- //LOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut);
+ //ALOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
+ //ALOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut);
for (p.y = yStart; p.y < yEnd; p.y++) {
uint32_t offset = mtls->dimX * p.y;
p.out = mtls->ptrOut + (mtls->eStrideOut * offset);
@@ -265,8 +265,8 @@ static void wc_x(void *usr, uint32_t idx) {
return;
}
- //LOGE("usr slice %i idx %i, x %i,%i", slice, idx, xStart, xEnd);
- //LOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut);
+ //ALOGE("usr slice %i idx %i, x %i,%i", slice, idx, xStart, xEnd);
+ //ALOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut);
p.out = mtls->ptrOut + (mtls->eStrideOut * xStart);
p.in = mtls->ptrIn + (mtls->eStrideIn * xStart);
@@ -372,7 +372,7 @@ void rsdScriptInvokeForEach(const Context *rsc,
rsdLaunchThreads(mrsc, wc_x, &mtls);
}
- //LOGE("launch 1");
+ //ALOGE("launch 1");
} else {
RsForEachStubParamStruct p;
memset(&p, 0, sizeof(p));
@@ -380,7 +380,7 @@ void rsdScriptInvokeForEach(const Context *rsc,
p.usr_len = mtls.usrLen;
uint32_t sig = mtls.sig;
- //LOGE("launch 3");
+ //ALOGE("launch 3");
outer_foreach_t fn = dc->mForEachLaunch[sig];
for (p.ar[0] = mtls.arrayStart; p.ar[0] < mtls.arrayEnd; p.ar[0]++) {
for (p.z = mtls.zStart; p.z < mtls.zEnd; p.z++) {
@@ -432,7 +432,7 @@ void rsdScriptInvokeFunction(const Context *dc, Script *script,
const void *params,
size_t paramLength) {
DrvScript *drv = (DrvScript *)script->mHal.drv;
- //LOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength);
+ //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength);
Script * oldTLS = setTLS(script);
((void (*)(const void *, uint32_t))
@@ -444,7 +444,7 @@ void rsdScriptSetGlobalVar(const Context *dc, const Script *script,
uint32_t slot, void *data, size_t dataLength) {
DrvScript *drv = (DrvScript *)script->mHal.drv;
//rsAssert(!script->mFieldIsObject[slot]);
- //LOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
+ //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot];
if (!destPtr) {
@@ -458,7 +458,7 @@ void rsdScriptSetGlobalVar(const Context *dc, const Script *script,
void rsdScriptSetGlobalBind(const Context *dc, const Script *script, uint32_t slot, void *data) {
DrvScript *drv = (DrvScript *)script->mHal.drv;
//rsAssert(!script->mFieldIsObject[slot]);
- //LOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
+ //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot];
if (!destPtr) {
@@ -472,7 +472,7 @@ void rsdScriptSetGlobalBind(const Context *dc, const Script *script, uint32_t sl
void rsdScriptSetGlobalObj(const Context *dc, const Script *script, uint32_t slot, ObjectBase *data) {
DrvScript *drv = (DrvScript *)script->mHal.drv;
//rsAssert(script->mFieldIsObject[slot]);
- //LOGE("setGlobalObj %p %p %i %p", dc, script, slot, data);
+ //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data);
int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot];
if (!destPtr) {
diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp
index 9292fa15a05a..b514e2182883 100644
--- a/libs/rs/driver/rsdCore.cpp
+++ b/libs/rs/driver/rsdCore.cpp
@@ -146,7 +146,7 @@ static void * HelperThreadProc(void *vrsc) {
int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
if (status) {
- LOGE("pthread_setspecific %i", status);
+ ALOGE("pthread_setspecific %i", status);
}
#if 0
@@ -156,7 +156,7 @@ static void * HelperThreadProc(void *vrsc) {
cpuset.bits[idx / 64] |= 1ULL << (idx % 64);
int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx],
sizeof(cpuset), &cpuset);
- LOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret));
+ ALOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret));
#endif
while (!dc->mExit) {
@@ -191,7 +191,7 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal));
if (!dc) {
- LOGE("Calloc for driver hal failed.");
+ ALOGE("Calloc for driver hal failed.");
return false;
}
rsc->mHal.drv = dc;
@@ -200,7 +200,7 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
if (!rsdgThreadTLSKeyCount) {
int status = pthread_key_create(&rsdgThreadTLSKey, NULL);
if (status) {
- LOGE("Failed to init thread tls key.");
+ ALOGE("Failed to init thread tls key.");
pthread_mutex_unlock(&rsdgInitMutex);
return false;
}
@@ -214,7 +214,7 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
dc->mTlsStruct.mScript = NULL;
int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
if (status) {
- LOGE("pthread_setspecific %i", status);
+ ALOGE("pthread_setspecific %i", status);
}
@@ -236,7 +236,7 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
pthread_attr_t threadAttr;
status = pthread_attr_init(&threadAttr);
if (status) {
- LOGE("Failed to init thread attribute.");
+ ALOGE("Failed to init thread attribute.");
return false;
}
@@ -244,7 +244,7 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
status = pthread_create(&dc->mWorkers.mThreadId[ct], &threadAttr, HelperThreadProc, rsc);
if (status) {
dc->mWorkers.mCount = ct;
- LOGE("Created fewer than expected number of RS threads.");
+ ALOGE("Created fewer than expected number of RS threads.");
break;
}
}
diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp
index d4deefb1e475..b53a68cf9efd 100644
--- a/libs/rs/driver/rsdGL.cpp
+++ b/libs/rs/driver/rsdGL.cpp
@@ -107,14 +107,14 @@ static void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) {
}
static void DumpDebug(RsdHal *dc) {
- LOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion);
- LOGE(" EGL context %p surface %p, Display=%p", dc->gl.egl.context, dc->gl.egl.surface,
+ ALOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion);
+ ALOGE(" EGL context %p surface %p, Display=%p", dc->gl.egl.context, dc->gl.egl.surface,
dc->gl.egl.display);
- LOGE(" GL vendor: %s", dc->gl.gl.vendor);
- LOGE(" GL renderer: %s", dc->gl.gl.renderer);
- LOGE(" GL Version: %s", dc->gl.gl.version);
- LOGE(" GL Extensions: %s", dc->gl.gl.extensions);
- LOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion);
+ ALOGE(" GL vendor: %s", dc->gl.gl.vendor);
+ ALOGE(" GL renderer: %s", dc->gl.gl.renderer);
+ ALOGE(" GL Version: %s", dc->gl.gl.version);
+ ALOGE(" GL Extensions: %s", dc->gl.gl.extensions);
+ ALOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion);
ALOGV("MAX Textures %i, %i %i", dc->gl.gl.maxVertexTextureUnits,
dc->gl.gl.maxFragmentTextureImageUnits, dc->gl.gl.maxTextureImageUnits);
@@ -223,7 +223,7 @@ bool rsdGLInit(const Context *rsc) {
configAttribs, configs, numConfigs, &n);
if (!ret || !n) {
checkEglError("eglChooseConfig", ret);
- LOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc);
+ ALOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc);
}
// The first config is guaranteed to over-satisfy the constraints
@@ -268,7 +268,7 @@ bool rsdGLInit(const Context *rsc) {
EGL_NO_CONTEXT, context_attribs2);
checkEglError("eglCreateContext");
if (dc->gl.egl.context == EGL_NO_CONTEXT) {
- LOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
+ ALOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
rsc->setWatchdogGL(NULL, 0, NULL);
return false;
}
@@ -281,7 +281,7 @@ bool rsdGLInit(const Context *rsc) {
pbuffer_attribs);
checkEglError("eglCreatePbufferSurface");
if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
- LOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE");
+ ALOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE");
rsdGLShutdown(rsc);
rsc->setWatchdogGL(NULL, 0, NULL);
return false;
@@ -291,7 +291,7 @@ bool rsdGLInit(const Context *rsc) {
ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
dc->gl.egl.surfaceDefault, dc->gl.egl.context);
if (ret == EGL_FALSE) {
- LOGE("eglMakeCurrent returned EGL_FALSE");
+ ALOGE("eglMakeCurrent returned EGL_FALSE");
checkEglError("eglMakeCurrent", ret);
rsdGLShutdown(rsc);
rsc->setWatchdogGL(NULL, 0, NULL);
@@ -320,7 +320,7 @@ bool rsdGLInit(const Context *rsc) {
}
if (!verptr) {
- LOGE("Error, OpenGL ES Lite not supported");
+ ALOGE("Error, OpenGL ES Lite not supported");
rsdGLShutdown(rsc);
rsc->setWatchdogGL(NULL, 0, NULL);
return false;
@@ -402,7 +402,7 @@ bool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow
dc->gl.wndSurface, NULL);
checkEglError("eglCreateWindowSurface");
if (dc->gl.egl.surface == EGL_NO_SURFACE) {
- LOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
+ ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
}
rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
@@ -439,7 +439,7 @@ void rsdGLCheckError(const android::renderscript::Context *rsc,
}
}
- LOGE("%p, %s", rsc, buf);
+ ALOGE("%p, %s", rsc, buf);
}
}
diff --git a/libs/rs/driver/rsdMeshObj.cpp b/libs/rs/driver/rsdMeshObj.cpp
index 24a718331776..99d79dceda79 100644
--- a/libs/rs/driver/rsdMeshObj.cpp
+++ b/libs/rs/driver/rsdMeshObj.cpp
@@ -133,7 +133,7 @@ bool RsdMeshObj::init() {
void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex,
uint32_t start, uint32_t len) const {
if (len < 1 || primIndex >= mRSMesh->mHal.state.primitivesCount || mAttribCount == 0) {
- LOGE("Invalid mesh or parameters");
+ ALOGE("Invalid mesh or parameters");
return;
}
diff --git a/libs/rs/driver/rsdProgramStore.cpp b/libs/rs/driver/rsdProgramStore.cpp
index af44b026dd12..fca9ba9e11e8 100644
--- a/libs/rs/driver/rsdProgramStore.cpp
+++ b/libs/rs/driver/rsdProgramStore.cpp
@@ -70,7 +70,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) {
drv->depthFunc = GL_NOTEQUAL;
break;
default:
- LOGE("Unknown depth function.");
+ ALOGE("Unknown depth function.");
goto error;
}
@@ -111,7 +111,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) {
drv->blendSrc = GL_SRC_ALPHA_SATURATE;
break;
default:
- LOGE("Unknown blend src mode.");
+ ALOGE("Unknown blend src mode.");
goto error;
}
@@ -141,7 +141,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) {
drv->blendDst = GL_ONE_MINUS_DST_ALPHA;
break;
default:
- LOGE("Unknown blend dst mode.");
+ ALOGE("Unknown blend dst mode.");
goto error;
}
diff --git a/libs/rs/driver/rsdRuntimeMath.cpp b/libs/rs/driver/rsdRuntimeMath.cpp
index b927ed217b07..e31553969329 100644
--- a/libs/rs/driver/rsdRuntimeMath.cpp
+++ b/libs/rs/driver/rsdRuntimeMath.cpp
@@ -122,7 +122,7 @@ static float SC_min_f32(float v, float v2) {
}
static float SC_mix_f32(float start, float stop, float amount) {
- //LOGE("lerpf %f %f %f", start, stop, amount);
+ //ALOGE("lerpf %f %f %f", start, stop, amount);
return start + (stop - start) * amount;
}
diff --git a/libs/rs/driver/rsdRuntimeStubs.cpp b/libs/rs/driver/rsdRuntimeStubs.cpp
index b457d8be276b..14c297004f44 100644
--- a/libs/rs/driver/rsdRuntimeStubs.cpp
+++ b/libs/rs/driver/rsdRuntimeStubs.cpp
@@ -686,7 +686,7 @@ void* rsdLookupRuntimeStub(void* pContext, char const* name) {
s->mHal.info.isThreadable &= sym->threadable;
return sym->mPtr;
}
- LOGE("ScriptC sym lookup failed for %s", name);
+ ALOGE("ScriptC sym lookup failed for %s", name);
return NULL;
}
diff --git a/libs/rs/driver/rsdShader.cpp b/libs/rs/driver/rsdShader.cpp
index e9ce7c208cd0..a10deb41a734 100644
--- a/libs/rs/driver/rsdShader.cpp
+++ b/libs/rs/driver/rsdShader.cpp
@@ -190,7 +190,7 @@ bool RsdShader::loadShader(const Context *rsc) {
char* buf = (char*) malloc(infoLen);
if (buf) {
RSD_CALL_GL(glGetShaderInfoLog, mShaderID, infoLen, NULL, buf);
- LOGE("Could not compile shader \n%s\n", buf);
+ ALOGE("Could not compile shader \n%s\n", buf);
free(buf);
}
RSD_CALL_GL(glDeleteShader, mShaderID);
@@ -287,9 +287,9 @@ void RsdShader::logUniform(const Element *field, const float *fd, uint32_t array
rsAssert(0);
}
}
- LOGE("Element size %u data=%p", elementSize, fd);
+ ALOGE("Element size %u data=%p", elementSize, fd);
fd += elementSize;
- LOGE("New data=%p", fd);
+ ALOGE("New data=%p", fd);
}
}
@@ -404,7 +404,7 @@ void RsdShader::setupTextures(const Context *rsc, RsdShaderCache *sc) {
uint32_t numTexturesToBind = mRSProgram->mHal.state.texturesCount;
uint32_t numTexturesAvailable = dc->gl.gl.maxFragmentTextureImageUnits;
if (numTexturesToBind >= numTexturesAvailable) {
- LOGE("Attempting to bind %u textures on shader id %u, but only %u are available",
+ ALOGE("Attempting to bind %u textures on shader id %u, but only %u are available",
mRSProgram->mHal.state.texturesCount, (uint32_t)this, numTexturesAvailable);
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind more textuers than available");
numTexturesToBind = numTexturesAvailable;
@@ -422,7 +422,7 @@ void RsdShader::setupTextures(const Context *rsc, RsdShaderCache *sc) {
DrvAllocation *drvTex = (DrvAllocation *)mRSProgram->mHal.state.textures[ct]->mHal.drv;
if (drvTex->glTarget != GL_TEXTURE_2D && drvTex->glTarget != GL_TEXTURE_CUBE_MAP) {
- LOGE("Attempting to bind unknown texture to shader id %u, texture unit %u", (uint)this, ct);
+ ALOGE("Attempting to bind unknown texture to shader id %u, texture unit %u", (uint)this, ct);
rsc->setError(RS_ERROR_BAD_SHADER, "Non-texture allocation bound to a shader");
}
RSD_CALL_GL(glBindTexture, drvTex->glTarget, drvTex->textureID);
@@ -450,7 +450,7 @@ void RsdShader::setupUserConstants(const Context *rsc, RsdShaderCache *sc, bool
for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) {
Allocation *alloc = mRSProgram->mHal.state.constants[ct];
if (!alloc) {
- LOGE("Attempting to set constants on shader id %u, but alloc at slot %u is not set",
+ ALOGE("Attempting to set constants on shader id %u, but alloc at slot %u is not set",
(uint32_t)this, ct);
rsc->setError(RS_ERROR_BAD_SHADER, "No constant allocation bound");
continue;
diff --git a/libs/rs/driver/rsdShaderCache.cpp b/libs/rs/driver/rsdShaderCache.cpp
index 2871a12231a5..f6236e794a07 100644
--- a/libs/rs/driver/rsdShaderCache.cpp
+++ b/libs/rs/driver/rsdShaderCache.cpp
@@ -135,7 +135,7 @@ bool RsdShaderCache::link(const Context *rsc) {
}
//ALOGV("RsdShaderCache miss");
- //LOGE("e0 %x", glGetError());
+ //ALOGE("e0 %x", glGetError());
ProgramEntry *e = new ProgramEntry(vtx->getAttribCount(),
vtx->getUniformCount(),
frag->getUniformCount());
@@ -147,7 +147,7 @@ bool RsdShaderCache::link(const Context *rsc) {
if (e->program) {
GLuint pgm = e->program;
glAttachShader(pgm, vtx->getShaderID());
- //LOGE("e1 %x", glGetError());
+ //ALOGE("e1 %x", glGetError());
glAttachShader(pgm, frag->getShaderID());
glBindAttribLocation(pgm, 0, "ATTRIB_position");
@@ -155,9 +155,9 @@ bool RsdShaderCache::link(const Context *rsc) {
glBindAttribLocation(pgm, 2, "ATTRIB_normal");
glBindAttribLocation(pgm, 3, "ATTRIB_texture0");
- //LOGE("e2 %x", glGetError());
+ //ALOGE("e2 %x", glGetError());
glLinkProgram(pgm);
- //LOGE("e3 %x", glGetError());
+ //ALOGE("e3 %x", glGetError());
GLint linkStatus = GL_FALSE;
glGetProgramiv(pgm, GL_LINK_STATUS, &linkStatus);
if (linkStatus != GL_TRUE) {
@@ -167,7 +167,7 @@ bool RsdShaderCache::link(const Context *rsc) {
char* buf = (char*) malloc(bufLength);
if (buf) {
glGetProgramInfoLog(pgm, bufLength, NULL, buf);
- LOGE("Could not link program:\n%s\n", buf);
+ ALOGE("Could not link program:\n%s\n", buf);
free(buf);
}
}
@@ -205,7 +205,7 @@ bool RsdShaderCache::link(const Context *rsc) {
glGetActiveUniform(pgm, ct, maxNameLength, &uniformList[ct]->writtenLength,
&uniformList[ct]->arraySize, &uniformList[ct]->type,
uniformList[ct]->name);
- //LOGE("GL UNI idx=%u, arraySize=%u, name=%s", ct,
+ //ALOGE("GL UNI idx=%u, arraySize=%u, name=%s", ct,
// uniformList[ct]->arraySize, uniformList[ct]->name);
}
}
diff --git a/libs/rs/rsAdapter.cpp b/libs/rs/rsAdapter.cpp
index 6e8ca705110e..177fb6028009 100644
--- a/libs/rs/rsAdapter.cpp
+++ b/libs/rs/rsAdapter.cpp
@@ -140,7 +140,7 @@ void * Adapter2D::getElement(uint32_t x, uint32_t y) const {
rsAssert(mAllocation->getPtr());
rsAssert(mAllocation->getType());
if (mFace != 0 && !mAllocation->getType()->getDimFaces()) {
- LOGE("Adapter wants cubemap face, but allocation has none");
+ ALOGE("Adapter wants cubemap face, but allocation has none");
return NULL;
}
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index c1192fefff7a..2773d5c661c5 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -75,7 +75,7 @@ void Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod,
const uint32_t eSize = mHal.state.type->getElementSizeBytes();
if ((count * eSize) != sizeBytes) {
- LOGE("Allocation::subData called with mismatched size expected %i, got %i",
+ ALOGE("Allocation::subData called with mismatched size expected %i, got %i",
(count * eSize), sizeBytes);
mHal.state.type->dumpLOGV("type info");
return;
@@ -90,10 +90,10 @@ void Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod,
const uint32_t eSize = mHal.state.elementSizeBytes;
const uint32_t lineSize = eSize * w;
- //LOGE("data2d %p, %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes);
+ //ALOGE("data2d %p, %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes);
if ((lineSize * h) != sizeBytes) {
- LOGE("Allocation size mismatch, expected %i, got %i", (lineSize * h), sizeBytes);
+ ALOGE("Allocation size mismatch, expected %i, got %i", (lineSize * h), sizeBytes);
rsAssert(!"Allocation::subData called with mismatched size");
return;
}
@@ -112,20 +112,20 @@ void Allocation::elementData(Context *rsc, uint32_t x, const void *data,
uint32_t eSize = mHal.state.elementSizeBytes;
if (cIdx >= mHal.state.type->getElement()->getFieldCount()) {
- LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
+ ALOGE("Error Allocation::subElementData component %i out of range.", cIdx);
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
return;
}
if (x >= mHal.state.dimensionX) {
- LOGE("Error Allocation::subElementData X offset %i out of range.", x);
+ ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
return;
}
const Element * e = mHal.state.type->getElement()->getField(cIdx);
if (sizeBytes != e->getSizeBytes()) {
- LOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes());
+ ALOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes());
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
return;
}
@@ -139,19 +139,19 @@ void Allocation::elementData(Context *rsc, uint32_t x, uint32_t y,
uint32_t eSize = mHal.state.elementSizeBytes;
if (x >= mHal.state.dimensionX) {
- LOGE("Error Allocation::subElementData X offset %i out of range.", x);
+ ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
return;
}
if (y >= mHal.state.dimensionY) {
- LOGE("Error Allocation::subElementData X offset %i out of range.", x);
+ ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
return;
}
if (cIdx >= mHal.state.type->getElement()->getFieldCount()) {
- LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
+ ALOGE("Error Allocation::subElementData component %i out of range.", cIdx);
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
return;
}
@@ -159,7 +159,7 @@ void Allocation::elementData(Context *rsc, uint32_t x, uint32_t y,
const Element * e = mHal.state.type->getElement()->getField(cIdx);
if (sizeBytes != e->getSizeBytes()) {
- LOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes());
+ ALOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes());
rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
return;
}
@@ -299,7 +299,7 @@ Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
// First make sure we are reading the correct object
RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
if (classID != RS_A3D_CLASS_ID_ALLOCATION) {
- LOGE("allocation loading skipped due to invalid class id\n");
+ ALOGE("allocation loading skipped due to invalid class id\n");
return NULL;
}
@@ -321,7 +321,7 @@ Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
uint32_t packedSize = alloc->getPackedSize();
if (dataSize != type->getSizeBytes() &&
dataSize != packedSize) {
- LOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
+ ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
ObjectBase::checkDelete(alloc);
ObjectBase::checkDelete(type);
return NULL;
@@ -409,7 +409,7 @@ void Allocation::resize1D(Context *rsc, uint32_t dimX) {
}
void Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
- LOGE("not implemented");
+ ALOGE("not implemented");
}
/////////////////
@@ -587,7 +587,7 @@ RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype,
RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages);
Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
if (texAlloc == NULL) {
- LOGE("Memory allocation failure");
+ ALOGE("Memory allocation failure");
return NULL;
}
@@ -611,7 +611,7 @@ RsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype,
RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages);
Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
if (texAlloc == NULL) {
- LOGE("Memory allocation failure");
+ ALOGE("Memory allocation failure");
return NULL;
}
diff --git a/libs/rs/rsAnimation.cpp b/libs/rs/rsAnimation.cpp
index 48b4f029c6d0..a4093d9f423a 100644
--- a/libs/rs/rsAnimation.cpp
+++ b/libs/rs/rsAnimation.cpp
@@ -126,7 +126,7 @@ RsAnimation rsi_AnimationCreate(Context *rsc,
RsAnimationInterpolation interp,
RsAnimationEdge pre,
RsAnimationEdge post) {
- //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
+ //ALOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
Animation *a = NULL;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post);
if (a != NULL) {
a->incUserRef();
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 293fc3ad953b..ad2ff0ff0dac 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -40,7 +40,7 @@ bool Context::initGLThread() {
if (!mHal.funcs.initGraphics(this)) {
pthread_mutex_unlock(&gInitMutex);
- LOGE("%p initGraphics failed", this);
+ ALOGE("%p initGraphics failed", this);
return false;
}
@@ -219,7 +219,7 @@ void * Context::threadProc(void *vrsc) {
if (!rsdHalInit(rsc, 0, 0)) {
rsc->setError(RS_ERROR_FATAL_DRIVER, "Failed initializing GL");
- LOGE("Hal init failed");
+ ALOGE("Hal init failed");
return NULL;
}
rsc->mHal.funcs.setPriority(rsc, rsc->mThreadPriority);
@@ -322,10 +322,10 @@ void Context::destroyWorkerThreadResources() {
void Context::printWatchdogInfo(void *ctx) {
Context *rsc = (Context *)ctx;
if (rsc->watchdog.command && rsc->watchdog.file) {
- LOGE("RS watchdog timeout: %i %s line %i %s", rsc->watchdog.inRoot,
+ ALOGE("RS watchdog timeout: %i %s line %i %s", rsc->watchdog.inRoot,
rsc->watchdog.command, rsc->watchdog.line, rsc->watchdog.file);
} else {
- LOGE("RS watchdog timeout: %i", rsc->watchdog.inRoot);
+ ALOGE("RS watchdog timeout: %i", rsc->watchdog.inRoot);
}
}
@@ -403,7 +403,7 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
status = pthread_attr_init(&threadAttr);
if (status) {
- LOGE("Failed to init thread attribute.");
+ ALOGE("Failed to init thread attribute.");
return false;
}
@@ -414,7 +414,7 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
status = pthread_create(&mThreadId, &threadAttr, threadProc, this);
if (status) {
- LOGE("Failed to start rs context thread.");
+ ALOGE("Failed to start rs context thread.");
return false;
}
while (!mRunning && (mError == RS_ERROR_NONE)) {
@@ -422,7 +422,7 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
}
if (mError != RS_ERROR_NONE) {
- LOGE("Errors during thread init");
+ ALOGE("Errors during thread init");
return false;
}
@@ -602,12 +602,12 @@ void Context::setError(RsError e, const char *msg) const {
void Context::dumpDebug() const {
- LOGE("RS Context debug %p", this);
- LOGE("RS Context debug");
+ ALOGE("RS Context debug %p", this);
+ ALOGE("RS Context debug");
- LOGE(" RS width %i, height %i", mWidth, mHeight);
- LOGE(" RS running %i, exit %i, paused %i", mRunning, mExit, mPaused);
- LOGE(" RS pThreadID %li, nativeThreadID %i", (long int)mThreadId, mNativeThreadId);
+ ALOGE(" RS width %i, height %i", mWidth, mHeight);
+ ALOGE(" RS running %i, exit %i, paused %i", mRunning, mExit, mPaused);
+ ALOGE(" RS pThreadID %li, nativeThreadID %i", (long int)mThreadId, mNativeThreadId);
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -628,7 +628,7 @@ void rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) {
Sampler *s = static_cast<Sampler *>(vs);
if (slot > RS_MAX_SAMPLER_SLOT) {
- LOGE("Invalid sampler slot");
+ ALOGE("Invalid sampler slot");
return;
}
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index c6582c9dffbc..61c29f952f5f 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -50,13 +50,13 @@ namespace renderscript {
#define CHECK_OBJ(o) { \
GET_TLS(); \
if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \
- LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \
+ ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \
} \
}
#define CHECK_OBJ_OR_NULL(o) { \
GET_TLS(); \
if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \
- LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \
+ ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \
} \
}
#else
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 56c31b66405d..dff958532538 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -107,7 +107,7 @@ Element *Element::createFromStream(Context *rsc, IStream *stream) {
// First make sure we are reading the correct object
RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
if (classID != RS_A3D_CLASS_ID_ELEMENT) {
- LOGE("element loading skipped due to invalid class id\n");
+ ALOGE("element loading skipped due to invalid class id\n");
return NULL;
}
diff --git a/libs/rs/rsFBOCache.cpp b/libs/rs/rsFBOCache.cpp
index f4a8bc6d7b30..d50f3e08de6c 100644
--- a/libs/rs/rsFBOCache.cpp
+++ b/libs/rs/rsFBOCache.cpp
@@ -46,12 +46,12 @@ void FBOCache::deinit(Context *rsc) {
void FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
if (slot >= mHal.state.colorTargetsCount) {
- LOGE("Invalid render target index");
+ ALOGE("Invalid render target index");
return;
}
if (a != NULL) {
if (!a->getIsTexture()) {
- LOGE("Invalid Color Target");
+ ALOGE("Invalid Color Target");
return;
}
}
@@ -63,7 +63,7 @@ void FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
void FBOCache::bindDepthTarget(Context *rsc, Allocation *a) {
if (a != NULL) {
if (!a->getIsRenderTarget()) {
- LOGE("Invalid Depth Target");
+ ALOGE("Invalid Depth Target");
return;
}
}
diff --git a/libs/rs/rsFifoSocket.cpp b/libs/rs/rsFifoSocket.cpp
index 8b8008d5c0a2..163a44be0992 100644
--- a/libs/rs/rsFifoSocket.cpp
+++ b/libs/rs/rsFifoSocket.cpp
@@ -48,31 +48,31 @@ void FifoSocket::writeAsync(const void *data, size_t bytes) {
if (bytes == 0) {
return;
}
- //LOGE("writeAsync %p %i", data, bytes);
+ //ALOGE("writeAsync %p %i", data, bytes);
size_t ret = ::send(sv[0], data, bytes, 0);
- //LOGE("writeAsync ret %i", ret);
+ //ALOGE("writeAsync ret %i", ret);
rsAssert(ret == bytes);
}
void FifoSocket::writeWaitReturn(void *retData, size_t retBytes) {
- //LOGE("writeWaitReturn %p %i", retData, retBytes);
+ //ALOGE("writeWaitReturn %p %i", retData, retBytes);
size_t ret = ::recv(sv[0], retData, retBytes, 0);
- //LOGE("writeWaitReturn %i", ret);
+ //ALOGE("writeWaitReturn %i", ret);
rsAssert(ret == retBytes);
}
size_t FifoSocket::read(void *data, size_t bytes) {
- //LOGE("read %p %i", data, bytes);
+ //ALOGE("read %p %i", data, bytes);
size_t ret = ::recv(sv[1], data, bytes, 0);
rsAssert(ret == bytes);
- //LOGE("read ret %i", ret);
+ //ALOGE("read ret %i", ret);
return ret;
}
void FifoSocket::readReturn(const void *data, size_t bytes) {
- LOGE("readReturn %p %Zu", data, bytes);
+ ALOGE("readReturn %p %Zu", data, bytes);
size_t ret = ::send(sv[1], data, bytes, 0);
- LOGE("readReturn %Zu", ret);
+ ALOGE("readReturn %Zu", ret);
rsAssert(ret == bytes);
}
diff --git a/libs/rs/rsFileA3D.cpp b/libs/rs/rsFileA3D.cpp
index 530e79e2b0c8..ac658c8e53ff 100644
--- a/libs/rs/rsFileA3D.cpp
+++ b/libs/rs/rsFileA3D.cpp
@@ -278,17 +278,17 @@ ObjectBase *FileA3D::initializeFromEntry(size_t index) {
bool FileA3D::writeFile(const char *filename) {
if (!mWriteStream) {
- LOGE("No objects to write\n");
+ ALOGE("No objects to write\n");
return false;
}
if (mWriteStream->getPos() == 0) {
- LOGE("No objects to write\n");
+ ALOGE("No objects to write\n");
return false;
}
FILE *writeHandle = fopen(filename, "wb");
if (!writeHandle) {
- LOGE("Couldn't open the file for writing\n");
+ ALOGE("Couldn't open the file for writing\n");
return false;
}
@@ -335,7 +335,7 @@ bool FileA3D::writeFile(const char *filename) {
int status = fclose(writeHandle);
if (status != 0) {
- LOGE("Couldn't close file\n");
+ ALOGE("Couldn't close file\n");
return false;
}
@@ -364,7 +364,7 @@ void FileA3D::appendToFile(ObjectBase *obj) {
RsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) {
FileA3D *fa3d = static_cast<FileA3D *>(file);
if (!fa3d) {
- LOGE("Can't load entry. No valid file");
+ ALOGE("Can't load entry. No valid file");
return NULL;
}
@@ -389,13 +389,13 @@ void rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uin
FileA3D *fa3d = static_cast<FileA3D *>(file);
if (!fa3d) {
- LOGE("Can't load index entries. No valid file");
+ ALOGE("Can't load index entries. No valid file");
return;
}
uint32_t numFileEntries = fa3d->getNumIndexEntries();
if (numFileEntries != numEntries || numEntries == 0 || fileEntries == NULL) {
- LOGE("Can't load index entries. Invalid number requested");
+ ALOGE("Can't load index entries. Invalid number requested");
return;
}
@@ -408,7 +408,7 @@ void rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uin
RsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) {
if (data == NULL) {
- LOGE("File load failed. Asset stream is NULL");
+ ALOGE("File load failed. Asset stream is NULL");
return NULL;
}
@@ -432,7 +432,7 @@ RsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) {
RsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) {
if (path == NULL) {
- LOGE("File load failed. Path is NULL");
+ ALOGE("File load failed. Path is NULL");
return NULL;
}
@@ -446,7 +446,7 @@ RsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) {
fa3d->load(f);
fclose(f);
} else {
- LOGE("Could not open file %s", path);
+ ALOGE("Could not open file %s", path);
}
return fa3d;
diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp
index 7b3aa70a9f94..4f21b3b0140d 100644
--- a/libs/rs/rsFont.cpp
+++ b/libs/rs/rsFont.cpp
@@ -39,7 +39,7 @@ Font::Font(Context *rsc) : ObjectBase(rsc), mCachedGlyphs(NULL) {
bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data, uint32_t dataLen) {
#ifndef ANDROID_RS_SERIALIZE
if (mInitialized) {
- LOGE("Reinitialization of fonts not supported");
+ ALOGE("Reinitialization of fonts not supported");
return false;
}
@@ -51,7 +51,7 @@ bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data
}
if (error) {
- LOGE("Unable to initialize font %s", name);
+ ALOGE("Unable to initialize font %s", name);
return false;
}
@@ -61,7 +61,7 @@ bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data
error = FT_Set_Char_Size(mFace, (FT_F26Dot6)(fontSize * 64.0f), 0, dpi, 0);
if (error) {
- LOGE("Unable to set font size on %s", name);
+ ALOGE("Unable to set font size on %s", name);
return false;
}
@@ -124,7 +124,7 @@ void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int32_t x, int32_t y,
for (cacheX = glyph->mBitmapMinX, bX = nPenX; cacheX < endX; cacheX++, bX++) {
for (cacheY = glyph->mBitmapMinY, bY = nPenY; cacheY < endY; cacheY++, bY++) {
if (bX < 0 || bY < 0 || bX >= (int32_t) bitmapW || bY >= (int32_t) bitmapH) {
- LOGE("Skipping invalid index");
+ ALOGE("Skipping invalid index");
continue;
}
uint8_t tempCol = cacheBuffer[cacheY * cacheWidth + cacheX];
@@ -165,7 +165,7 @@ void Font::renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
if (mode == Font::MEASURE) {
if (bounds == NULL) {
- LOGE("No return rectangle provided to measure text");
+ ALOGE("No return rectangle provided to measure text");
return;
}
// Reset min and max of the bounding box to something large
@@ -237,7 +237,7 @@ void Font::updateGlyphCache(CachedGlyphInfo *glyph) {
#ifndef ANDROID_RS_SERIALIZE
FT_Error error = FT_Load_Glyph( mFace, glyph->mGlyphIndex, FT_LOAD_RENDER );
if (error) {
- LOGE("Couldn't load glyph.");
+ ALOGE("Couldn't load glyph.");
return;
}
@@ -378,7 +378,7 @@ FT_Library FontState::getLib() {
if (!mLibrary) {
FT_Error error = FT_Init_FreeType(&mLibrary);
if (error) {
- LOGE("Unable to initialize freetype");
+ ALOGE("Unable to initialize freetype");
return NULL;
}
}
@@ -409,7 +409,7 @@ void FontState::flushAllAndInvalidate() {
bool FontState::cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) {
// If the glyph is too tall, don't cache it
if ((uint32_t)bitmap->rows > mCacheLines[mCacheLines.size()-1]->mMaxHeight) {
- LOGE("Font size to large to fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows);
+ ALOGE("Font size to large to fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows);
return false;
}
@@ -439,7 +439,7 @@ bool FontState::cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *r
// if we still don't fit, something is wrong and we shouldn't draw
if (!bitmapFit) {
- LOGE("Bitmap doesn't fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows);
+ ALOGE("Bitmap doesn't fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows);
return false;
}
}
@@ -471,7 +471,7 @@ bool FontState::cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *r
// Some debug code
/*for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
- LOGE("Cache Line: H: %u Empty Space: %f",
+ ALOGE("Cache Line: H: %u Empty Space: %f",
mCacheLines[i]->mMaxHeight,
(1.0f - (float)mCacheLines[i]->mCurrentCol/(float)mCacheLines[i]->mMaxWidth)*100.0f);
@@ -659,9 +659,9 @@ void FontState::appendMeshQuad(float x1, float y1, float z1,
}
/*LOGE("V0 x: %f y: %f z: %f", x1, y1, z1);
- LOGE("V1 x: %f y: %f z: %f", x2, y2, z2);
- LOGE("V2 x: %f y: %f z: %f", x3, y3, z3);
- LOGE("V3 x: %f y: %f z: %f", x4, y4, z4);*/
+ ALOGE("V1 x: %f y: %f z: %f", x2, y2, z2);
+ ALOGE("V2 x: %f y: %f z: %f", x3, y3, z3);
+ ALOGE("V3 x: %f y: %f z: %f", x4, y4, z4);*/
(*currentPos++) = x1;
(*currentPos++) = y1;
@@ -742,7 +742,7 @@ void FontState::renderText(const char *text, uint32_t len, int32_t x, int32_t y,
currentFont = mDefault.get();
}
if (!currentFont) {
- LOGE("Unable to initialize any fonts");
+ ALOGE("Unable to initialize any fonts");
return;
}
diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp
index ce69a603f353..0466d8bbf04e 100644
--- a/libs/rs/rsLocklessFifo.cpp
+++ b/libs/rs/rsLocklessFifo.cpp
@@ -45,12 +45,12 @@ bool LocklessCommandFifo::init(uint32_t sizeInBytes) {
// Add room for a buffer reset command
mBuffer = static_cast<uint8_t *>(malloc(sizeInBytes + 4));
if (!mBuffer) {
- LOGE("LocklessFifo allocation failure");
+ ALOGE("LocklessFifo allocation failure");
return false;
}
if (!mSignalToControl.init() || !mSignalToWorker.init()) {
- LOGE("Signal setup failed");
+ ALOGE("Signal setup failed");
free(mBuffer);
return false;
}
diff --git a/libs/rs/rsMesh.cpp b/libs/rs/rsMesh.cpp
index bf9284f56aaf..67c729925135 100644
--- a/libs/rs/rsMesh.cpp
+++ b/libs/rs/rsMesh.cpp
@@ -107,7 +107,7 @@ Mesh *Mesh::createFromStream(Context *rsc, IStream *stream) {
// First make sure we are reading the correct object
RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
if (classID != RS_A3D_CLASS_ID_MESH) {
- LOGE("mesh loading skipped due to invalid class id");
+ ALOGE("mesh loading skipped due to invalid class id");
return NULL;
}
@@ -178,7 +178,7 @@ void Mesh::render(Context *rsc) const {
void Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const {
if (primIndex >= mHal.state.primitivesCount) {
- LOGE("Invalid primitive index");
+ ALOGE("Invalid primitive index");
return;
}
@@ -192,7 +192,7 @@ void Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const {
void Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const {
if (len < 1 || primIndex >= mHal.state.primitivesCount) {
- LOGE("Invalid mesh or parameters");
+ ALOGE("Invalid mesh or parameters");
return;
}
@@ -241,7 +241,7 @@ void Mesh::computeBBox() {
mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6;
mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6;
if (!posPtr) {
- LOGE("Unable to compute bounding box");
+ ALOGE("Unable to compute bounding box");
mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f;
mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f;
return;
diff --git a/libs/rs/rsMutex.cpp b/libs/rs/rsMutex.cpp
index 2105288218bf..6512372a3ed6 100644
--- a/libs/rs/rsMutex.cpp
+++ b/libs/rs/rsMutex.cpp
@@ -30,7 +30,7 @@ Mutex::~Mutex() {
bool Mutex::init() {
int status = pthread_mutex_init(&mMutex, NULL);
if (status) {
- LOGE("Mutex::Mutex init failure");
+ ALOGE("Mutex::Mutex init failure");
return false;
}
return true;
@@ -40,7 +40,7 @@ bool Mutex::lock() {
int status;
status = pthread_mutex_lock(&mMutex);
if (status) {
- LOGE("Mutex: error %i locking.", status);
+ ALOGE("Mutex: error %i locking.", status);
return false;
}
return true;
@@ -50,7 +50,7 @@ bool Mutex::unlock() {
int status;
status = pthread_mutex_unlock(&mMutex);
if (status) {
- LOGE("Mutex error %i unlocking.", status);
+ ALOGE("Mutex error %i unlocking.", status);
return false;
}
return true;
diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp
index addf932a8e67..6a64582bcb8c 100644
--- a/libs/rs/rsObjectBase.cpp
+++ b/libs/rs/rsObjectBase.cpp
@@ -204,14 +204,14 @@ void ObjectBase::zeroAllUserRef(Context *rsc) {
// This operation can be slow, only to be called during context cleanup.
const ObjectBase * o = rsc->mObjHead;
while (o) {
- //LOGE("o %p", o);
+ //ALOGE("o %p", o);
if (o->zeroUserRef()) {
// deleted the object and possibly others, restart from head.
o = rsc->mObjHead;
- //LOGE("o head %p", o);
+ //ALOGE("o head %p", o);
} else {
o = o->mNext;
- //LOGE("o next %p", o);
+ //ALOGE("o next %p", o);
}
}
diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp
index a9fd8776e5fd..8061515e24fa 100644
--- a/libs/rs/rsProgram.cpp
+++ b/libs/rs/rsProgram.cpp
@@ -139,13 +139,13 @@ void Program::initMemberVars() {
void Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) {
if (alloc != NULL) {
if (slot >= mHal.state.constantsCount) {
- LOGE("Attempt to bind alloc at slot %u, on shader id %u, but const count is %u",
+ ALOGE("Attempt to bind alloc at slot %u, on shader id %u, but const count is %u",
slot, (uint32_t)this, mHal.state.constantsCount);
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation");
return;
}
if (alloc->getType() != mConstantTypes[slot].get()) {
- LOGE("Attempt to bind alloc at slot %u, on shader id %u, but types mismatch",
+ ALOGE("Attempt to bind alloc at slot %u, on shader id %u, but types mismatch",
slot, (uint32_t)this);
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation");
return;
@@ -167,13 +167,13 @@ void Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) {
void Program::bindTexture(Context *rsc, uint32_t slot, Allocation *a) {
if (slot >= mHal.state.texturesCount) {
- LOGE("Attempt to bind texture to slot %u but tex count is %u", slot, mHal.state.texturesCount);
+ ALOGE("Attempt to bind texture to slot %u but tex count is %u", slot, mHal.state.texturesCount);
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind texture");
return;
}
if (a && a->getType()->getDimFaces() && mHal.state.textureTargets[slot] != RS_TEXTURE_CUBE) {
- LOGE("Attempt to bind cubemap to slot %u but 2d texture needed", slot);
+ ALOGE("Attempt to bind cubemap to slot %u but 2d texture needed", slot);
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind cubemap to 2d texture slot");
return;
}
@@ -186,7 +186,7 @@ void Program::bindTexture(Context *rsc, uint32_t slot, Allocation *a) {
void Program::bindSampler(Context *rsc, uint32_t slot, Sampler *s) {
if (slot >= mHal.state.texturesCount) {
- LOGE("Attempt to bind sampler to slot %u but tex count is %u", slot, mHal.state.texturesCount);
+ ALOGE("Attempt to bind sampler to slot %u but tex count is %u", slot, mHal.state.texturesCount);
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind sampler");
return;
}
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index 81eedc424994..4e73ca63e90b 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -38,12 +38,12 @@ ProgramFragment::~ProgramFragment() {
void ProgramFragment::setConstantColor(Context *rsc, float r, float g, float b, float a) {
if (isUserProgram()) {
- LOGE("Attempting to set fixed function emulation color on user program");
+ ALOGE("Attempting to set fixed function emulation color on user program");
rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set fixed function emulation color on user program");
return;
}
if (mHal.state.constants[0] == NULL) {
- LOGE("Unable to set fixed function emulation color because allocation is missing");
+ ALOGE("Unable to set fixed function emulation color because allocation is missing");
rsc->setError(RS_ERROR_BAD_SHADER, "Unable to set fixed function emulation color because allocation is missing");
return;
}
@@ -63,7 +63,7 @@ void ProgramFragment::setup(Context *rsc, ProgramFragmentState *state) {
for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) {
if (!mHal.state.textures[ct]) {
- LOGE("No texture bound for shader id %u, texture unit %u", (uint)this, ct);
+ ALOGE("No texture bound for shader id %u, texture unit %u", (uint)this, ct);
rsc->setError(RS_ERROR_BAD_SHADER, "No texture bound");
continue;
}
@@ -131,7 +131,7 @@ RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc, const char * shaderTex
size_t paramLength) {
ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
pf->incUserRef();
- //LOGE("rsi_ProgramFragmentCreate %p", pf);
+ //ALOGE("rsi_ProgramFragmentCreate %p", pf);
return pf;
}
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 7fc128e8d243..357dbe32e18e 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -41,9 +41,9 @@ Script::~Script() {
}
void Script::setSlot(uint32_t slot, Allocation *a) {
- //LOGE("setSlot %i %p", slot, a);
+ //ALOGE("setSlot %i %p", slot, a);
if (slot >= mHal.info.exportedVariableCount) {
- LOGE("Script::setSlot unable to set allocation, invalid slot index");
+ ALOGE("Script::setSlot unable to set allocation, invalid slot index");
return;
}
@@ -56,21 +56,21 @@ void Script::setSlot(uint32_t slot, Allocation *a) {
}
void Script::setVar(uint32_t slot, const void *val, size_t len) {
- //LOGE("setVar %i %p %i", slot, val, len);
+ //ALOGE("setVar %i %p %i", slot, val, len);
if (slot >= mHal.info.exportedVariableCount) {
- LOGE("Script::setVar unable to set allocation, invalid slot index");
+ ALOGE("Script::setVar unable to set allocation, invalid slot index");
return;
}
mRSC->mHal.funcs.script.setGlobalVar(mRSC, this, slot, (void *)val, len);
}
void Script::setVarObj(uint32_t slot, ObjectBase *val) {
- //LOGE("setVarObj %i %p", slot, val);
+ //ALOGE("setVarObj %i %p", slot, val);
if (slot >= mHal.info.exportedVariableCount) {
- LOGE("Script::setVarObj unable to set allocation, invalid slot index");
+ ALOGE("Script::setVarObj unable to set allocation, invalid slot index");
return;
}
- //LOGE("setvarobj %i %p", slot, val);
+ //ALOGE("setvarobj %i %p", slot, val);
mRSC->mHal.funcs.script.setGlobalObj(mRSC, this, slot, val);
}
@@ -87,7 +87,7 @@ void rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint3
Script *s = static_cast<Script *>(vs);
Allocation *a = static_cast<Allocation *>(va);
s->setSlot(slot, a);
- //LOGE("rsi_ScriptBindAllocation %i %p %p", slot, a, a->getPtr());
+ //ALOGE("rsi_ScriptBindAllocation %i %p %p", slot, a, a->getPtr());
}
void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, size_t length) {
@@ -96,7 +96,7 @@ void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, si
// freeing/duplicating the actual string for the environment.
char *tz = (char *) malloc(length + 1);
if (!tz) {
- LOGE("Couldn't allocate memory for timezone buffer");
+ ALOGE("Couldn't allocate memory for timezone buffer");
return;
}
strncpy(tz, timeZone, length);
@@ -104,7 +104,7 @@ void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, si
if (setenv("TZ", tz, 1) == 0) {
tzset();
} else {
- LOGE("Error setting timezone");
+ ALOGE("Error setting timezone");
}
free(tz);
}
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index ce3c643c32a3..afc8ba01129e 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -72,7 +72,7 @@ void ScriptC::setupScript(Context *rsc) {
}
const Allocation *ScriptC::ptrToAllocation(const void *ptr) const {
- //LOGE("ptr to alloc %p", ptr);
+ //ALOGE("ptr to alloc %p", ptr);
if (!ptr) {
return NULL;
}
@@ -83,7 +83,7 @@ const Allocation *ScriptC::ptrToAllocation(const void *ptr) const {
return mSlots[ct].get();
}
}
- LOGE("ScriptC::ptrToAllocation, failed to find %p", ptr);
+ ALOGE("ScriptC::ptrToAllocation, failed to find %p", ptr);
return NULL;
}
@@ -181,7 +181,7 @@ static void* symbolLookup(void* pContext, char const* name) {
s->mHal.info.isThreadable &= sym->threadable;
return sym->mPtr;
}
- LOGE("ScriptC sym lookup failed for %s", name);
+ ALOGE("ScriptC sym lookup failed for %s", name);
return NULL;
}
*/
@@ -197,12 +197,12 @@ bool ScriptC::runCompiler(Context *rsc,
const uint8_t *bitcode,
size_t bitcodeLen) {
- //LOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen);
+ //ALOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen);
#ifndef ANDROID_RS_SERIALIZE
uint32_t sdkVersion = 0;
bcinfo::BitcodeWrapper bcWrapper((const char *)bitcode, bitcodeLen);
if (!bcWrapper.unwrap()) {
- LOGE("Bitcode is not in proper container format (raw or wrapper)");
+ ALOGE("Bitcode is not in proper container format (raw or wrapper)");
return false;
}
@@ -223,7 +223,7 @@ bool ScriptC::runCompiler(Context *rsc,
BT = new bcinfo::BitcodeTranslator((const char *)bitcode, bitcodeLen,
sdkVersion);
if (!BT->translate()) {
- LOGE("Failed to translate bitcode from version: %u", sdkVersion);
+ ALOGE("Failed to translate bitcode from version: %u", sdkVersion);
delete BT;
BT = NULL;
return false;
@@ -247,12 +247,12 @@ bool ScriptC::runCompiler(Context *rsc,
for (size_t i=0; i < mHal.info.exportedPragmaCount; ++i) {
const char * key = mHal.info.exportedPragmaKeyList[i];
const char * value = mHal.info.exportedPragmaValueList[i];
- //LOGE("pragma %s %s", keys[i], values[i]);
+ //ALOGE("pragma %s %s", keys[i], values[i]);
if (!strcmp(key, "version")) {
if (!strcmp(value, "1")) {
continue;
}
- LOGE("Invalid version pragma value: %s\n", value);
+ ALOGE("Invalid version pragma value: %s\n", value);
return false;
}
@@ -264,7 +264,7 @@ bool ScriptC::runCompiler(Context *rsc,
mEnviroment.mVertex.clear();
continue;
}
- LOGE("Unrecognized value %s passed to stateVertex", value);
+ ALOGE("Unrecognized value %s passed to stateVertex", value);
return false;
}
@@ -276,7 +276,7 @@ bool ScriptC::runCompiler(Context *rsc,
mEnviroment.mRaster.clear();
continue;
}
- LOGE("Unrecognized value %s passed to stateRaster", value);
+ ALOGE("Unrecognized value %s passed to stateRaster", value);
return false;
}
@@ -288,7 +288,7 @@ bool ScriptC::runCompiler(Context *rsc,
mEnviroment.mFragment.clear();
continue;
}
- LOGE("Unrecognized value %s passed to stateFragment", value);
+ ALOGE("Unrecognized value %s passed to stateFragment", value);
return false;
}
@@ -300,7 +300,7 @@ bool ScriptC::runCompiler(Context *rsc,
mEnviroment.mFragmentStore.clear();
continue;
}
- LOGE("Unrecognized value %s passed to stateStore", value);
+ ALOGE("Unrecognized value %s passed to stateStore", value);
return false;
}
}
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index ec15bc0233a5..183e207c7470 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -115,7 +115,7 @@ float rsrGetDt(Context *rsc, Script *sc) {
//////////////////////////////////////////////////////////////////////////////
void rsrSetObject(const Context *rsc, const Script *sc, ObjectBase **dst, ObjectBase * src) {
- //LOGE("rsiSetObject %p,%p %p", vdst, *vdst, vsrc);
+ //ALOGE("rsiSetObject %p,%p %p", vdst, *vdst, vsrc);
if (src) {
CHECK_OBJ(src);
src->incSysRef();
@@ -128,7 +128,7 @@ void rsrSetObject(const Context *rsc, const Script *sc, ObjectBase **dst, Object
}
void rsrClearObject(const Context *rsc, const Script *sc, ObjectBase **dst) {
- //LOGE("rsiClearObject %p,%p", vdst, *vdst);
+ //ALOGE("rsiClearObject %p,%p", vdst, *vdst);
if (dst[0]) {
CHECK_OBJ(dst[0]);
dst[0]->decSysRef();
@@ -142,12 +142,12 @@ bool rsrIsObject(const Context *rsc, const Script *sc, const ObjectBase *src) {
uint32_t rsrToClient(Context *rsc, Script *sc, int cmdID, void *data, int len) {
- //LOGE("SC_toClient %i %i %i", cmdID, len);
+ //ALOGE("SC_toClient %i %i %i", cmdID, len);
return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false);
}
uint32_t rsrToClientBlocking(Context *rsc, Script *sc, int cmdID, void *data, int len) {
- //LOGE("SC_toClientBlocking %i %i", cmdID, len);
+ //ALOGE("SC_toClientBlocking %i %i", cmdID, len);
return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true);
}
diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp
index 26e2374719ce..79647922d5c1 100644
--- a/libs/rs/rsScriptC_LibGL.cpp
+++ b/libs/rs/rsScriptC_LibGL.cpp
@@ -147,11 +147,11 @@ void rsrDrawQuadTexCoords(Context *rsc, Script *sc,
return;
}
- //LOGE("Quad");
- //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
- //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
- //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
- //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
+ //ALOGE("Quad");
+ //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
+ //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
+ //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
+ //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
@@ -196,7 +196,7 @@ void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
}
void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
- //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
+ //ALOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
}
diff --git a/libs/rs/rsSignal.cpp b/libs/rs/rsSignal.cpp
index 413ac2bb201e..3f6a13c9b654 100644
--- a/libs/rs/rsSignal.cpp
+++ b/libs/rs/rsSignal.cpp
@@ -32,13 +32,13 @@ Signal::~Signal() {
bool Signal::init() {
int status = pthread_mutex_init(&mMutex, NULL);
if (status) {
- LOGE("LocklessFifo mutex init failure");
+ ALOGE("LocklessFifo mutex init failure");
return false;
}
status = pthread_cond_init(&mCondition, NULL);
if (status) {
- LOGE("LocklessFifo condition init failure");
+ ALOGE("LocklessFifo condition init failure");
pthread_mutex_destroy(&mMutex);
return false;
}
@@ -51,7 +51,7 @@ void Signal::set() {
status = pthread_mutex_lock(&mMutex);
if (status) {
- LOGE("LocklessCommandFifo: error %i locking for set condition.", status);
+ ALOGE("LocklessCommandFifo: error %i locking for set condition.", status);
return;
}
@@ -59,12 +59,12 @@ void Signal::set() {
status = pthread_cond_signal(&mCondition);
if (status) {
- LOGE("LocklessCommandFifo: error %i on set condition.", status);
+ ALOGE("LocklessCommandFifo: error %i on set condition.", status);
}
status = pthread_mutex_unlock(&mMutex);
if (status) {
- LOGE("LocklessCommandFifo: error %i unlocking for set condition.", status);
+ ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status);
}
}
@@ -74,7 +74,7 @@ bool Signal::wait(uint64_t timeout) {
status = pthread_mutex_lock(&mMutex);
if (status) {
- LOGE("LocklessCommandFifo: error %i locking for condition.", status);
+ ALOGE("LocklessCommandFifo: error %i locking for condition.", status);
return false;
}
@@ -96,13 +96,13 @@ bool Signal::wait(uint64_t timeout) {
ret = true;
} else {
if (status != ETIMEDOUT) {
- LOGE("LocklessCommandFifo: error %i waiting for condition.", status);
+ ALOGE("LocklessCommandFifo: error %i waiting for condition.", status);
}
}
status = pthread_mutex_unlock(&mMutex);
if (status) {
- LOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
+ ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
}
return ret;
diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp
index 13e789dabd34..8ba1a0e4294d 100644
--- a/libs/rs/rsThreadIO.cpp
+++ b/libs/rs/rsThreadIO.cpp
@@ -40,22 +40,22 @@ void ThreadIO::init(bool useSocket) {
}
void ThreadIO::shutdown() {
- //LOGE("shutdown 1");
+ //ALOGE("shutdown 1");
mToCore.shutdown();
- //LOGE("shutdown 2");
+ //ALOGE("shutdown 2");
}
void ThreadIO::coreFlush() {
- //LOGE("coreFlush 1");
+ //ALOGE("coreFlush 1");
if (mUsingSocket) {
} else {
mToCore.flush();
}
- //LOGE("coreFlush 2");
+ //ALOGE("coreFlush 2");
}
void * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) {
- //LOGE("coreHeader %i %i", cmdID, dataLen);
+ //ALOGE("coreHeader %i %i", cmdID, dataLen);
if (mUsingSocket) {
CoreCmdHeader hdr;
hdr.bytes = dataLen;
@@ -67,40 +67,40 @@ void * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) {
mCoreDataPtr = (uint8_t *)mToCore.reserve(dataLen);
mCoreDataBasePtr = mCoreDataPtr;
}
- //LOGE("coreHeader ret %p", mCoreDataPtr);
+ //ALOGE("coreHeader ret %p", mCoreDataPtr);
return mCoreDataPtr;
}
void ThreadIO::coreData(const void *data, size_t dataLen) {
- //LOGE("coreData %p %i", data, dataLen);
+ //ALOGE("coreData %p %i", data, dataLen);
mToCoreSocket.writeAsync(data, dataLen);
- //LOGE("coreData ret %p", mCoreDataPtr);
+ //ALOGE("coreData ret %p", mCoreDataPtr);
}
void ThreadIO::coreCommit() {
- //LOGE("coreCommit %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
+ //ALOGE("coreCommit %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
if (mUsingSocket) {
} else {
rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
mToCore.commit(mCoreCommandID, mCoreCommandSize);
}
- //LOGE("coreCommit ret");
+ //ALOGE("coreCommit ret");
}
void ThreadIO::coreCommitSync() {
- //LOGE("coreCommitSync %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
+ //ALOGE("coreCommitSync %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
if (mUsingSocket) {
} else {
rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
mToCore.commitSync(mCoreCommandID, mCoreCommandSize);
}
- //LOGE("coreCommitSync ret");
+ //ALOGE("coreCommitSync ret");
}
void ThreadIO::clientShutdown() {
- //LOGE("coreShutdown 1");
+ //ALOGE("coreShutdown 1");
mToClient.shutdown();
- //LOGE("coreShutdown 2");
+ //ALOGE("coreShutdown 2");
}
void ThreadIO::coreSetReturn(const void *data, size_t dataLen) {
@@ -149,7 +149,7 @@ bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand, uint64_t time
if (cmdID >= (sizeof(gPlaybackFuncs) / sizeof(void *))) {
rsAssert(cmdID < (sizeof(gPlaybackFuncs) / sizeof(void *)));
- LOGE("playCoreCommands error con %p, cmd %i", con, cmdID);
+ ALOGE("playCoreCommands error con %p, cmd %i", con, cmdID);
mToCore.printDebugData();
}
gPlaybackFuncs[cmdID](con, data, cmdSize << 2);
@@ -193,8 +193,8 @@ RsMessageToClientType ThreadIO::getClientPayload(void *data, size_t *receiveLen,
uint32_t bytesData = 0;
uint32_t commandID = 0;
const uint32_t *d = (const uint32_t *)mToClient.get(&commandID, &bytesData);
- //LOGE("getMessageToClient 3 %i %i", commandID, bytesData);
- //LOGE("getMessageToClient %i %i", commandID, *subID);
+ //ALOGE("getMessageToClient 3 %i %i", commandID, bytesData);
+ //ALOGE("getMessageToClient %i %i", commandID, *subID);
if (bufferLen >= receiveLen[0]) {
memcpy(data, d+1, receiveLen[0]);
mToClient.next();
@@ -224,14 +224,14 @@ bool ThreadIO::sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const v
}
}
- //LOGE("sendMessageToClient 2");
+ //ALOGE("sendMessageToClient 2");
uint32_t *p = (uint32_t *)mToClient.reserve(dataLen + sizeof(usrID));
p[0] = usrID;
if (dataLen > 0) {
memcpy(p+1, data, dataLen);
}
mToClient.commit(cmdID, dataLen + sizeof(usrID));
- //LOGE("sendMessageToClient 3");
+ //ALOGE("sendMessageToClient 3");
return true;
}
return false;
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index 271c9e2361a4..79664700b908 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -167,7 +167,7 @@ Type *Type::createFromStream(Context *rsc, IStream *stream) {
// First make sure we are reading the correct object
RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
if (classID != RS_A3D_CLASS_ID_TYPE) {
- LOGE("type loading skipped due to invalid class id\n");
+ ALOGE("type loading skipped due to invalid class id\n");
return NULL;
}
diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h
index 3a6c85a87410..db6f59204d12 100644
--- a/libs/rs/rsUtils.h
+++ b/libs/rs/rsUtils.h
@@ -40,7 +40,7 @@ namespace android {
namespace renderscript {
#if 1
-#define rsAssert(v) do {if(!(v)) LOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
+#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
#else
#define rsAssert(v) while (0)
#endif
diff --git a/libs/rs/rsg_generator.c b/libs/rs/rsg_generator.c
index b3f6c55625fa..6b84e561bbfe 100644
--- a/libs/rs/rsg_generator.c
+++ b/libs/rs/rsg_generator.c
@@ -235,7 +235,7 @@ void printApiCpp(FILE *f) {
}
}
- //fprintf(f, " LOGE(\"add command %s\\n\");\n", api->name);
+ //fprintf(f, " ALOGE(\"add command %s\\n\");\n", api->name);
if (hasInlineDataPointers(api)) {
fprintf(f, " RS_CMD_%s *cmd = NULL;\n", api->name);
fprintf(f, " if (dataSize < 1024) {;\n");
@@ -441,7 +441,7 @@ void printPlaybackCpp(FILE *f) {
fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
- //fprintf(f, " LOGE(\"play command %s\\n\");\n", api->name);
+ //fprintf(f, " ALOGE(\"play command %s\\n\");\n", api->name);
fprintf(f, " const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
fprintf(f, " ");
@@ -469,7 +469,7 @@ void printPlaybackCpp(FILE *f) {
fprintf(f, "void rspr_%s(Context *con, Fifo *f, uint8_t *scratch, size_t scratchSize) {\n", api->name);
- //fprintf(f, " LOGE(\"play command %s\\n\");\n", api->name);
+ //fprintf(f, " ALOGE(\"play command %s\\n\");\n", api->name);
fprintf(f, " RS_CMD_%s cmd;\n", api->name);
fprintf(f, " f->read(&cmd, sizeof(cmd));\n");
diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp
index 89497302a25f..f5ed9813ec77 100644
--- a/libs/ui/FramebufferNativeWindow.cpp
+++ b/libs/ui/FramebufferNativeWindow.cpp
@@ -85,10 +85,10 @@ FramebufferNativeWindow::FramebufferNativeWindow()
int err;
int i;
err = framebuffer_open(module, &fbDev);
- LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err));
+ ALOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err));
err = gralloc_open(module, &grDev);
- LOGE_IF(err, "couldn't open gralloc HAL (%s)", strerror(-err));
+ ALOGE_IF(err, "couldn't open gralloc HAL (%s)", strerror(-err));
// bail out if we can't initialize the modules
if (!fbDev || !grDev)
@@ -113,7 +113,7 @@ FramebufferNativeWindow::FramebufferNativeWindow()
fbDev->width, fbDev->height, fbDev->format,
GRALLOC_USAGE_HW_FB, &buffers[i]->handle, &buffers[i]->stride);
- LOGE_IF(err, "fb buffer %d allocation failed w=%d, h=%d, err=%s",
+ ALOGE_IF(err, "fb buffer %d allocation failed w=%d, h=%d, err=%s",
i, fbDev->width, fbDev->height, strerror(-err));
if (err)
@@ -133,7 +133,7 @@ FramebufferNativeWindow::FramebufferNativeWindow()
const_cast<int&>(ANativeWindow::maxSwapInterval) =
fbDev->maxSwapInterval;
} else {
- LOGE("Couldn't get gralloc module");
+ ALOGE("Couldn't get gralloc module");
}
ANativeWindow::setSwapInterval = setSwapInterval;
diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp
index 54a3ffa5663c..f549a3795f0e 100644
--- a/libs/ui/GraphicBuffer.cpp
+++ b/libs/ui/GraphicBuffer.cpp
@@ -167,7 +167,7 @@ status_t GraphicBuffer::lock(uint32_t usage, const Rect& rect, void** vaddr)
{
if (rect.left < 0 || rect.right > this->width ||
rect.top < 0 || rect.bottom > this->height) {
- LOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
+ ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
rect.left, rect.top, rect.right, rect.bottom,
this->width, this->height);
return BAD_VALUE;
diff --git a/libs/ui/GraphicBufferAllocator.cpp b/libs/ui/GraphicBufferAllocator.cpp
index b2b70c172374..d3447377fe9b 100644
--- a/libs/ui/GraphicBufferAllocator.cpp
+++ b/libs/ui/GraphicBufferAllocator.cpp
@@ -38,7 +38,7 @@ GraphicBufferAllocator::GraphicBufferAllocator()
{
hw_module_t const* module;
int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
- LOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
+ ALOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
if (err == 0) {
gralloc_open(module, &mAllocDev);
}
@@ -101,7 +101,7 @@ status_t GraphicBufferAllocator::alloc(uint32_t w, uint32_t h, PixelFormat forma
err = mAllocDev->alloc(mAllocDev, w, h, format, usage, handle, stride);
- LOGW_IF(err, "alloc(%u, %u, %d, %08x, ...) failed %d (%s)",
+ ALOGW_IF(err, "alloc(%u, %u, %d, %08x, ...) failed %d (%s)",
w, h, format, usage, err, strerror(-err));
if (err == NO_ERROR) {
@@ -132,7 +132,7 @@ status_t GraphicBufferAllocator::free(buffer_handle_t handle)
err = mAllocDev->free(mAllocDev, handle);
- LOGW_IF(err, "free(...) failed %d (%s)", err, strerror(-err));
+ ALOGW_IF(err, "free(...) failed %d (%s)", err, strerror(-err));
if (err == NO_ERROR) {
Mutex::Autolock _l(sLock);
KeyedVector<buffer_handle_t, alloc_rec_t>& list(sAllocList);
diff --git a/libs/ui/GraphicBufferMapper.cpp b/libs/ui/GraphicBufferMapper.cpp
index 07c067474d54..b173c854d9c2 100644
--- a/libs/ui/GraphicBufferMapper.cpp
+++ b/libs/ui/GraphicBufferMapper.cpp
@@ -38,7 +38,7 @@ GraphicBufferMapper::GraphicBufferMapper()
{
hw_module_t const* module;
int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
- LOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
+ ALOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
if (err == 0) {
mAllocMod = (gralloc_module_t const *)module;
}
@@ -50,7 +50,7 @@ status_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle)
err = mAllocMod->registerBuffer(mAllocMod, handle);
- LOGW_IF(err, "registerBuffer(%p) failed %d (%s)",
+ ALOGW_IF(err, "registerBuffer(%p) failed %d (%s)",
handle, err, strerror(-err));
return err;
}
@@ -61,7 +61,7 @@ status_t GraphicBufferMapper::unregisterBuffer(buffer_handle_t handle)
err = mAllocMod->unregisterBuffer(mAllocMod, handle);
- LOGW_IF(err, "unregisterBuffer(%p) failed %d (%s)",
+ ALOGW_IF(err, "unregisterBuffer(%p) failed %d (%s)",
handle, err, strerror(-err));
return err;
}
@@ -75,7 +75,7 @@ status_t GraphicBufferMapper::lock(buffer_handle_t handle,
bounds.left, bounds.top, bounds.width(), bounds.height(),
vaddr);
- LOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
+ ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
return err;
}
@@ -85,7 +85,7 @@ status_t GraphicBufferMapper::unlock(buffer_handle_t handle)
err = mAllocMod->unlock(mAllocMod, handle);
- LOGW_IF(err, "unlock(...) failed %d (%s)", err, strerror(-err));
+ ALOGW_IF(err, "unlock(...) failed %d (%s)", err, strerror(-err));
return err;
}
diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp
index 267a9f767c8b..263c8d919889 100644
--- a/libs/ui/Input.cpp
+++ b/libs/ui/Input.cpp
@@ -345,7 +345,7 @@ status_t PointerCoords::writeToParcel(Parcel* parcel) const {
#endif
void PointerCoords::tooManyAxes(int axis) {
- LOGW("Could not set value for axis %d because the PointerCoords structure is full and "
+ ALOGW("Could not set value for axis %d because the PointerCoords structure is full and "
"cannot contain more than %d axis values.", axis, int(MAX_AXES));
}
diff --git a/libs/ui/InputTransport.cpp b/libs/ui/InputTransport.cpp
index 00716d74bf85..09cbb318cd93 100644
--- a/libs/ui/InputTransport.cpp
+++ b/libs/ui/InputTransport.cpp
@@ -88,12 +88,12 @@ status_t InputChannel::openInputChannelPair(const String8& name,
int serverAshmemFd = ashmem_create_region(ashmemName.string(), DEFAULT_MESSAGE_BUFFER_SIZE);
if (serverAshmemFd < 0) {
result = -errno;
- LOGE("channel '%s' ~ Could not create shared memory region. errno=%d",
+ ALOGE("channel '%s' ~ Could not create shared memory region. errno=%d",
name.string(), errno);
} else {
result = ashmem_set_prot_region(serverAshmemFd, PROT_READ | PROT_WRITE);
if (result < 0) {
- LOGE("channel '%s' ~ Error %d trying to set protection of ashmem fd %d.",
+ ALOGE("channel '%s' ~ Error %d trying to set protection of ashmem fd %d.",
name.string(), result, serverAshmemFd);
} else {
// Dup the file descriptor because the server and client input channel objects that
@@ -102,19 +102,19 @@ status_t InputChannel::openInputChannelPair(const String8& name,
clientAshmemFd = dup(serverAshmemFd);
if (clientAshmemFd < 0) {
result = -errno;
- LOGE("channel '%s' ~ Could not dup() shared memory region fd. errno=%d",
+ ALOGE("channel '%s' ~ Could not dup() shared memory region fd. errno=%d",
name.string(), errno);
} else {
int forward[2];
if (pipe(forward)) {
result = -errno;
- LOGE("channel '%s' ~ Could not create forward pipe. errno=%d",
+ ALOGE("channel '%s' ~ Could not create forward pipe. errno=%d",
name.string(), errno);
} else {
int reverse[2];
if (pipe(reverse)) {
result = -errno;
- LOGE("channel '%s' ~ Could not create reverse pipe. errno=%d",
+ ALOGE("channel '%s' ~ Could not create reverse pipe. errno=%d",
name.string(), errno);
} else {
String8 serverChannelName = name;
@@ -220,7 +220,7 @@ status_t InputPublisher::initialize() {
int ashmemFd = mChannel->getAshmemFd();
int result = ashmem_get_size_region(ashmemFd);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d getting size of ashmem fd %d.",
+ ALOGE("channel '%s' publisher ~ Error %d getting size of ashmem fd %d.",
mChannel->getName().string(), result, ashmemFd);
return UNKNOWN_ERROR;
}
@@ -229,7 +229,7 @@ status_t InputPublisher::initialize() {
mSharedMessage = static_cast<InputMessage*>(mmap(NULL, mAshmemSize,
PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0));
if (! mSharedMessage) {
- LOGE("channel '%s' publisher ~ mmap failed on ashmem fd %d.",
+ ALOGE("channel '%s' publisher ~ mmap failed on ashmem fd %d.",
mChannel->getName().string(), ashmemFd);
return NO_MEMORY;
}
@@ -253,7 +253,7 @@ status_t InputPublisher::reset() {
if (mSharedMessage->consumed) {
result = sem_post(& mSharedMessage->semaphore);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d in sem_post.",
+ ALOGE("channel '%s' publisher ~ Error %d in sem_post.",
mChannel->getName().string(), errno);
return UNKNOWN_ERROR;
}
@@ -261,7 +261,7 @@ status_t InputPublisher::reset() {
result = sem_destroy(& mSharedMessage->semaphore);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d in sem_destroy.",
+ ALOGE("channel '%s' publisher ~ Error %d in sem_destroy.",
mChannel->getName().string(), errno);
return UNKNOWN_ERROR;
}
@@ -273,7 +273,7 @@ status_t InputPublisher::reset() {
int ashmemFd = mChannel->getAshmemFd();
result = ashmem_unpin_region(ashmemFd, 0, 0);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d unpinning ashmem fd %d.",
+ ALOGE("channel '%s' publisher ~ Error %d unpinning ashmem fd %d.",
mChannel->getName().string(), result, ashmemFd);
return UNKNOWN_ERROR;
}
@@ -291,7 +291,7 @@ status_t InputPublisher::publishInputEvent(
int32_t deviceId,
int32_t source) {
if (mPinned) {
- LOGE("channel '%s' publisher ~ Attempted to publish a new event but publisher has "
+ ALOGE("channel '%s' publisher ~ Attempted to publish a new event but publisher has "
"not yet been reset.", mChannel->getName().string());
return INVALID_OPERATION;
}
@@ -302,7 +302,7 @@ status_t InputPublisher::publishInputEvent(
int ashmemFd = mChannel->getAshmemFd();
int result = ashmem_pin_region(ashmemFd, 0, 0);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d pinning ashmem fd %d.",
+ ALOGE("channel '%s' publisher ~ Error %d pinning ashmem fd %d.",
mChannel->getName().string(), result, ashmemFd);
return UNKNOWN_ERROR;
}
@@ -311,7 +311,7 @@ status_t InputPublisher::publishInputEvent(
result = sem_init(& mSharedMessage->semaphore, 1, 1);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d in sem_init.",
+ ALOGE("channel '%s' publisher ~ Error %d in sem_init.",
mChannel->getName().string(), errno);
return UNKNOWN_ERROR;
}
@@ -390,7 +390,7 @@ status_t InputPublisher::publishMotionEvent(
#endif
if (pointerCount > MAX_POINTERS || pointerCount < 1) {
- LOGE("channel '%s' publisher ~ Invalid number of pointers provided: %d.",
+ ALOGE("channel '%s' publisher ~ Invalid number of pointers provided: %d.",
mChannel->getName().string(), pointerCount);
return BAD_VALUE;
}
@@ -444,7 +444,7 @@ status_t InputPublisher::appendMotionSample(
#endif
if (! mPinned || ! mMotionEventSampleDataTail) {
- LOGE("channel '%s' publisher ~ Cannot append motion sample because there is no current "
+ ALOGE("channel '%s' publisher ~ Cannot append motion sample because there is no current "
"AMOTION_EVENT_ACTION_MOVE or AMOTION_EVENT_ACTION_HOVER_MOVE event.",
mChannel->getName().string());
return INVALID_OPERATION;
@@ -478,7 +478,7 @@ status_t InputPublisher::appendMotionSample(
#endif
return FAILED_TRANSACTION;
} else {
- LOGE("channel '%s' publisher ~ Error %d in sem_trywait.",
+ ALOGE("channel '%s' publisher ~ Error %d in sem_trywait.",
mChannel->getName().string(), errno);
return UNKNOWN_ERROR;
}
@@ -496,7 +496,7 @@ status_t InputPublisher::appendMotionSample(
if (mWasDispatched) {
result = sem_post(& mSharedMessage->semaphore);
if (result < 0) {
- LOGE("channel '%s' publisher ~ Error %d in sem_post.",
+ ALOGE("channel '%s' publisher ~ Error %d in sem_post.",
mChannel->getName().string(), errno);
return UNKNOWN_ERROR;
}
@@ -531,7 +531,7 @@ status_t InputPublisher::receiveFinishedSignal(bool* outHandled) {
} else if (signal == INPUT_SIGNAL_FINISHED_UNHANDLED) {
*outHandled = false;
} else {
- LOGE("channel '%s' publisher ~ Received unexpected signal '%c' from consumer",
+ ALOGE("channel '%s' publisher ~ Received unexpected signal '%c' from consumer",
mChannel->getName().string(), signal);
return UNKNOWN_ERROR;
}
@@ -559,7 +559,7 @@ status_t InputConsumer::initialize() {
int ashmemFd = mChannel->getAshmemFd();
int result = ashmem_get_size_region(ashmemFd);
if (result < 0) {
- LOGE("channel '%s' consumer ~ Error %d getting size of ashmem fd %d.",
+ ALOGE("channel '%s' consumer ~ Error %d getting size of ashmem fd %d.",
mChannel->getName().string(), result, ashmemFd);
return UNKNOWN_ERROR;
}
@@ -569,7 +569,7 @@ status_t InputConsumer::initialize() {
mSharedMessage = static_cast<InputMessage*>(mmap(NULL, mAshmemSize,
PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0));
if (! mSharedMessage) {
- LOGE("channel '%s' consumer ~ mmap failed on ashmem fd %d.",
+ ALOGE("channel '%s' consumer ~ mmap failed on ashmem fd %d.",
mChannel->getName().string(), ashmemFd);
return NO_MEMORY;
}
@@ -589,19 +589,19 @@ status_t InputConsumer::consume(InputEventFactoryInterface* factory, InputEvent*
int result = ashmem_pin_region(ashmemFd, 0, 0);
if (result != ASHMEM_NOT_PURGED) {
if (result == ASHMEM_WAS_PURGED) {
- LOGE("channel '%s' consumer ~ Error %d pinning ashmem fd %d because it was purged "
+ ALOGE("channel '%s' consumer ~ Error %d pinning ashmem fd %d because it was purged "
"which probably indicates that the publisher and consumer are out of sync.",
mChannel->getName().string(), result, ashmemFd);
return INVALID_OPERATION;
}
- LOGE("channel '%s' consumer ~ Error %d pinning ashmem fd %d.",
+ ALOGE("channel '%s' consumer ~ Error %d pinning ashmem fd %d.",
mChannel->getName().string(), result, ashmemFd);
return UNKNOWN_ERROR;
}
if (mSharedMessage->consumed) {
- LOGE("channel '%s' consumer ~ The current message has already been consumed.",
+ ALOGE("channel '%s' consumer ~ The current message has already been consumed.",
mChannel->getName().string());
return INVALID_OPERATION;
}
@@ -611,7 +611,7 @@ status_t InputConsumer::consume(InputEventFactoryInterface* factory, InputEvent*
// consumed). Eventually the publisher will reinitialize the semaphore for the next message.
result = sem_wait(& mSharedMessage->semaphore);
if (result < 0) {
- LOGE("channel '%s' consumer ~ Error %d in sem_wait.",
+ ALOGE("channel '%s' consumer ~ Error %d in sem_wait.",
mChannel->getName().string(), errno);
return UNKNOWN_ERROR;
}
@@ -640,7 +640,7 @@ status_t InputConsumer::consume(InputEventFactoryInterface* factory, InputEvent*
}
default:
- LOGE("channel '%s' consumer ~ Received message of unknown type %d",
+ ALOGE("channel '%s' consumer ~ Received message of unknown type %d",
mChannel->getName().string(), mSharedMessage->type);
return UNKNOWN_ERROR;
}
@@ -671,7 +671,7 @@ status_t InputConsumer::receiveDispatchSignal() {
return result;
}
if (signal != INPUT_SIGNAL_DISPATCH) {
- LOGE("channel '%s' consumer ~ Received unexpected signal '%c' from publisher",
+ ALOGE("channel '%s' consumer ~ Received unexpected signal '%c' from publisher",
mChannel->getName().string(), signal);
return UNKNOWN_ERROR;
}
diff --git a/libs/ui/KeyCharacterMap.cpp b/libs/ui/KeyCharacterMap.cpp
index e1d5e8b4efbd..485234c2abbc 100644
--- a/libs/ui/KeyCharacterMap.cpp
+++ b/libs/ui/KeyCharacterMap.cpp
@@ -95,11 +95,11 @@ status_t KeyCharacterMap::load(const String8& filename, KeyCharacterMap** outMap
Tokenizer* tokenizer;
status_t status = Tokenizer::open(filename, &tokenizer);
if (status) {
- LOGE("Error %d opening key character map file %s.", status, filename.string());
+ ALOGE("Error %d opening key character map file %s.", status, filename.string());
} else {
KeyCharacterMap* map = new KeyCharacterMap();
if (!map) {
- LOGE("Error allocating key character map.");
+ ALOGE("Error allocating key character map.");
status = NO_MEMORY;
} else {
#if DEBUG_PARSER_PERFORMANCE
@@ -474,7 +474,7 @@ status_t KeyCharacterMap::Parser::parse() {
status_t status = parseKey();
if (status) return status;
} else {
- LOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(),
keywordToken.string());
return BAD_VALUE;
}
@@ -490,7 +490,7 @@ status_t KeyCharacterMap::Parser::parse() {
mTokenizer->skipDelimiters(WHITESPACE);
if (!mTokenizer->isEol()) {
- LOGE("%s: Expected end of line, got '%s'.",
+ ALOGE("%s: Expected end of line, got '%s'.",
mTokenizer->getLocation().string(),
mTokenizer->peekRemainderOfLine().string());
return BAD_VALUE;
@@ -501,13 +501,13 @@ status_t KeyCharacterMap::Parser::parse() {
}
if (mState != STATE_TOP) {
- LOGE("%s: Unterminated key description at end of file.",
+ ALOGE("%s: Unterminated key description at end of file.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
if (mMap->mType == KEYBOARD_TYPE_UNKNOWN) {
- LOGE("%s: Missing required keyboard 'type' declaration.",
+ ALOGE("%s: Missing required keyboard 'type' declaration.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -517,7 +517,7 @@ status_t KeyCharacterMap::Parser::parse() {
status_t KeyCharacterMap::Parser::parseType() {
if (mMap->mType != KEYBOARD_TYPE_UNKNOWN) {
- LOGE("%s: Duplicate keyboard 'type' declaration.",
+ ALOGE("%s: Duplicate keyboard 'type' declaration.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -535,7 +535,7 @@ status_t KeyCharacterMap::Parser::parseType() {
} else if (typeToken == "SPECIAL_FUNCTION") {
type = KEYBOARD_TYPE_SPECIAL_FUNCTION;
} else {
- LOGE("%s: Expected keyboard type label, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected keyboard type label, got '%s'.", mTokenizer->getLocation().string(),
typeToken.string());
return BAD_VALUE;
}
@@ -551,12 +551,12 @@ status_t KeyCharacterMap::Parser::parseKey() {
String8 keyCodeToken = mTokenizer->nextToken(WHITESPACE);
int32_t keyCode = getKeyCodeByLabel(keyCodeToken.string());
if (!keyCode) {
- LOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(),
keyCodeToken.string());
return BAD_VALUE;
}
if (mMap->mKeys.indexOfKey(keyCode) >= 0) {
- LOGE("%s: Duplicate entry for key code '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Duplicate entry for key code '%s'.", mTokenizer->getLocation().string(),
keyCodeToken.string());
return BAD_VALUE;
}
@@ -564,7 +564,7 @@ status_t KeyCharacterMap::Parser::parseKey() {
mTokenizer->skipDelimiters(WHITESPACE);
String8 openBraceToken = mTokenizer->nextToken(WHITESPACE);
if (openBraceToken != "{") {
- LOGE("%s: Expected '{' after key code label, got '%s'.",
+ ALOGE("%s: Expected '{' after key code label, got '%s'.",
mTokenizer->getLocation().string(), openBraceToken.string());
return BAD_VALUE;
}
@@ -597,7 +597,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
int32_t metaState;
status_t status = parseModifier(token, &metaState);
if (status) {
- LOGE("%s: Expected a property name or modifier, got '%s'.",
+ ALOGE("%s: Expected a property name or modifier, got '%s'.",
mTokenizer->getLocation().string(), token.string());
return status;
}
@@ -616,7 +616,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
}
}
- LOGE("%s: Expected ',' or ':' after property name.",
+ ALOGE("%s: Expected ',' or ':' after property name.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -634,12 +634,12 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
char16_t character;
status_t status = parseCharacterLiteral(&character);
if (status || !character) {
- LOGE("%s: Invalid character literal for key.",
+ ALOGE("%s: Invalid character literal for key.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
if (haveCharacter) {
- LOGE("%s: Cannot combine multiple character literals or 'none'.",
+ ALOGE("%s: Cannot combine multiple character literals or 'none'.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -649,7 +649,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
token = mTokenizer->nextToken(WHITESPACE);
if (token == "none") {
if (haveCharacter) {
- LOGE("%s: Cannot combine multiple character literals or 'none'.",
+ ALOGE("%s: Cannot combine multiple character literals or 'none'.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -659,20 +659,20 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
token = mTokenizer->nextToken(WHITESPACE);
int32_t keyCode = getKeyCodeByLabel(token.string());
if (!keyCode) {
- LOGE("%s: Invalid key code label for fallback behavior, got '%s'.",
+ ALOGE("%s: Invalid key code label for fallback behavior, got '%s'.",
mTokenizer->getLocation().string(),
token.string());
return BAD_VALUE;
}
if (haveFallback) {
- LOGE("%s: Cannot combine multiple fallback key codes.",
+ ALOGE("%s: Cannot combine multiple fallback key codes.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
behavior.fallbackKeyCode = keyCode;
haveFallback = true;
} else {
- LOGE("%s: Expected a key behavior after ':'.",
+ ALOGE("%s: Expected a key behavior after ':'.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -688,7 +688,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
switch (property.property) {
case PROPERTY_LABEL:
if (key->label) {
- LOGE("%s: Duplicate label for key.",
+ ALOGE("%s: Duplicate label for key.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -699,7 +699,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
break;
case PROPERTY_NUMBER:
if (key->number) {
- LOGE("%s: Duplicate number for key.",
+ ALOGE("%s: Duplicate number for key.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -711,7 +711,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
case PROPERTY_META: {
for (Behavior* b = key->firstBehavior; b; b = b->next) {
if (b->metaState == property.metaState) {
- LOGE("%s: Duplicate key behavior for modifier.",
+ ALOGE("%s: Duplicate key behavior for modifier.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -757,7 +757,7 @@ status_t KeyCharacterMap::Parser::parseModifier(const String8& token, int32_t* o
return BAD_VALUE;
}
if (combinedMeta & metaState) {
- LOGE("%s: Duplicate modifier combination '%s'.",
+ ALOGE("%s: Duplicate modifier combination '%s'.",
mTokenizer->getLocation().string(), token.string());
return BAD_VALUE;
}
@@ -831,7 +831,7 @@ status_t KeyCharacterMap::Parser::parseCharacterLiteral(char16_t* outCharacter)
}
Error:
- LOGE("%s: Malformed character literal.", mTokenizer->getLocation().string());
+ ALOGE("%s: Malformed character literal.", mTokenizer->getLocation().string());
return BAD_VALUE;
}
diff --git a/libs/ui/KeyLayoutMap.cpp b/libs/ui/KeyLayoutMap.cpp
index 7ba654a5746e..44a94207c1c2 100644
--- a/libs/ui/KeyLayoutMap.cpp
+++ b/libs/ui/KeyLayoutMap.cpp
@@ -53,11 +53,11 @@ status_t KeyLayoutMap::load(const String8& filename, KeyLayoutMap** outMap) {
Tokenizer* tokenizer;
status_t status = Tokenizer::open(filename, &tokenizer);
if (status) {
- LOGE("Error %d opening key layout map file %s.", status, filename.string());
+ ALOGE("Error %d opening key layout map file %s.", status, filename.string());
} else {
KeyLayoutMap* map = new KeyLayoutMap();
if (!map) {
- LOGE("Error allocating key layout map.");
+ ALOGE("Error allocating key layout map.");
status = NO_MEMORY;
} else {
#if DEBUG_PARSER_PERFORMANCE
@@ -164,14 +164,14 @@ status_t KeyLayoutMap::Parser::parse() {
status_t status = parseAxis();
if (status) return status;
} else {
- LOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(),
keywordToken.string());
return BAD_VALUE;
}
mTokenizer->skipDelimiters(WHITESPACE);
if (!mTokenizer->isEol()) {
- LOGE("%s: Expected end of line, got '%s'.",
+ ALOGE("%s: Expected end of line, got '%s'.",
mTokenizer->getLocation().string(),
mTokenizer->peekRemainderOfLine().string());
return BAD_VALUE;
@@ -188,12 +188,12 @@ status_t KeyLayoutMap::Parser::parseKey() {
char* end;
int32_t scanCode = int32_t(strtol(scanCodeToken.string(), &end, 0));
if (*end) {
- LOGE("%s: Expected key scan code number, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected key scan code number, got '%s'.", mTokenizer->getLocation().string(),
scanCodeToken.string());
return BAD_VALUE;
}
if (mMap->mKeys.indexOfKey(scanCode) >= 0) {
- LOGE("%s: Duplicate entry for key scan code '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Duplicate entry for key scan code '%s'.", mTokenizer->getLocation().string(),
scanCodeToken.string());
return BAD_VALUE;
}
@@ -202,7 +202,7 @@ status_t KeyLayoutMap::Parser::parseKey() {
String8 keyCodeToken = mTokenizer->nextToken(WHITESPACE);
int32_t keyCode = getKeyCodeByLabel(keyCodeToken.string());
if (!keyCode) {
- LOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(),
keyCodeToken.string());
return BAD_VALUE;
}
@@ -215,12 +215,12 @@ status_t KeyLayoutMap::Parser::parseKey() {
String8 flagToken = mTokenizer->nextToken(WHITESPACE);
uint32_t flag = getKeyFlagByLabel(flagToken.string());
if (!flag) {
- LOGE("%s: Expected key flag label, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected key flag label, got '%s'.", mTokenizer->getLocation().string(),
flagToken.string());
return BAD_VALUE;
}
if (flags & flag) {
- LOGE("%s: Duplicate key flag '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Duplicate key flag '%s'.", mTokenizer->getLocation().string(),
flagToken.string());
return BAD_VALUE;
}
@@ -242,12 +242,12 @@ status_t KeyLayoutMap::Parser::parseAxis() {
char* end;
int32_t scanCode = int32_t(strtol(scanCodeToken.string(), &end, 0));
if (*end) {
- LOGE("%s: Expected axis scan code number, got '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Expected axis scan code number, got '%s'.", mTokenizer->getLocation().string(),
scanCodeToken.string());
return BAD_VALUE;
}
if (mMap->mAxes.indexOfKey(scanCode) >= 0) {
- LOGE("%s: Duplicate entry for axis scan code '%s'.", mTokenizer->getLocation().string(),
+ ALOGE("%s: Duplicate entry for axis scan code '%s'.", mTokenizer->getLocation().string(),
scanCodeToken.string());
return BAD_VALUE;
}
@@ -263,7 +263,7 @@ status_t KeyLayoutMap::Parser::parseAxis() {
String8 axisToken = mTokenizer->nextToken(WHITESPACE);
axisInfo.axis = getAxisByLabel(axisToken.string());
if (axisInfo.axis < 0) {
- LOGE("%s: Expected inverted axis label, got '%s'.",
+ ALOGE("%s: Expected inverted axis label, got '%s'.",
mTokenizer->getLocation().string(), axisToken.string());
return BAD_VALUE;
}
@@ -274,7 +274,7 @@ status_t KeyLayoutMap::Parser::parseAxis() {
String8 splitToken = mTokenizer->nextToken(WHITESPACE);
axisInfo.splitValue = int32_t(strtol(splitToken.string(), &end, 0));
if (*end) {
- LOGE("%s: Expected split value, got '%s'.",
+ ALOGE("%s: Expected split value, got '%s'.",
mTokenizer->getLocation().string(), splitToken.string());
return BAD_VALUE;
}
@@ -283,7 +283,7 @@ status_t KeyLayoutMap::Parser::parseAxis() {
String8 lowAxisToken = mTokenizer->nextToken(WHITESPACE);
axisInfo.axis = getAxisByLabel(lowAxisToken.string());
if (axisInfo.axis < 0) {
- LOGE("%s: Expected low axis label, got '%s'.",
+ ALOGE("%s: Expected low axis label, got '%s'.",
mTokenizer->getLocation().string(), lowAxisToken.string());
return BAD_VALUE;
}
@@ -292,14 +292,14 @@ status_t KeyLayoutMap::Parser::parseAxis() {
String8 highAxisToken = mTokenizer->nextToken(WHITESPACE);
axisInfo.highAxis = getAxisByLabel(highAxisToken.string());
if (axisInfo.highAxis < 0) {
- LOGE("%s: Expected high axis label, got '%s'.",
+ ALOGE("%s: Expected high axis label, got '%s'.",
mTokenizer->getLocation().string(), highAxisToken.string());
return BAD_VALUE;
}
} else {
axisInfo.axis = getAxisByLabel(token.string());
if (axisInfo.axis < 0) {
- LOGE("%s: Expected axis label, 'split' or 'invert', got '%s'.",
+ ALOGE("%s: Expected axis label, 'split' or 'invert', got '%s'.",
mTokenizer->getLocation().string(), token.string());
return BAD_VALUE;
}
@@ -316,12 +316,12 @@ status_t KeyLayoutMap::Parser::parseAxis() {
String8 flatToken = mTokenizer->nextToken(WHITESPACE);
axisInfo.flatOverride = int32_t(strtol(flatToken.string(), &end, 0));
if (*end) {
- LOGE("%s: Expected flat value, got '%s'.",
+ ALOGE("%s: Expected flat value, got '%s'.",
mTokenizer->getLocation().string(), flatToken.string());
return BAD_VALUE;
}
} else {
- LOGE("%s: Expected keyword 'flat', got '%s'.",
+ ALOGE("%s: Expected keyword 'flat', got '%s'.",
mTokenizer->getLocation().string(), keywordToken.string());
return BAD_VALUE;
}
diff --git a/libs/ui/Keyboard.cpp b/libs/ui/Keyboard.cpp
index 10bb39c57518..e4611f71cbd1 100644
--- a/libs/ui/Keyboard.cpp
+++ b/libs/ui/Keyboard.cpp
@@ -50,7 +50,7 @@ status_t KeyMap::load(const InputDeviceIdentifier& deviceIdenfifier,
keyLayoutName)) {
status_t status = loadKeyLayout(deviceIdenfifier, keyLayoutName);
if (status == NAME_NOT_FOUND) {
- LOGE("Configuration for keyboard device '%s' requested keyboard layout '%s' but "
+ ALOGE("Configuration for keyboard device '%s' requested keyboard layout '%s' but "
"it was not found.",
deviceIdenfifier.name.string(), keyLayoutName.string());
}
@@ -61,7 +61,7 @@ status_t KeyMap::load(const InputDeviceIdentifier& deviceIdenfifier,
keyCharacterMapName)) {
status_t status = loadKeyCharacterMap(deviceIdenfifier, keyCharacterMapName);
if (status == NAME_NOT_FOUND) {
- LOGE("Configuration for keyboard device '%s' requested keyboard character "
+ ALOGE("Configuration for keyboard device '%s' requested keyboard character "
"map '%s' but it was not found.",
deviceIdenfifier.name.string(), keyLayoutName.string());
}
@@ -90,7 +90,7 @@ status_t KeyMap::load(const InputDeviceIdentifier& deviceIdenfifier,
}
// Give up!
- LOGE("Could not determine key map for device '%s' and no default key maps were found!",
+ ALOGE("Could not determine key map for device '%s' and no default key maps were found!",
deviceIdenfifier.name.string());
return NAME_NOT_FOUND;
}
diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp
index d9ad86372568..8cd047afb8db 100644
--- a/libs/ui/Region.cpp
+++ b/libs/ui/Region.cpp
@@ -69,7 +69,7 @@ Region::Region(const Rect& rhs)
Region::Region(const void* buffer)
{
status_t err = read(buffer);
- LOGE_IF(err<0, "error %s reading Region from buffer", strerror(err));
+ ALOGE_IF(err<0, "error %s reading Region from buffer", strerror(err));
}
Region::~Region()
@@ -338,15 +338,15 @@ bool Region::validate(const Region& reg, const char* name)
b.bottom = b.bottom > cur->bottom ? b.bottom : cur->bottom;
if (cur->top == prev->top) {
if (cur->bottom != prev->bottom) {
- LOGE("%s: invalid span %p", name, cur);
+ ALOGE("%s: invalid span %p", name, cur);
result = false;
} else if (cur->left < prev->right) {
- LOGE("%s: spans overlap horizontally prev=%p, cur=%p",
+ ALOGE("%s: spans overlap horizontally prev=%p, cur=%p",
name, prev, cur);
result = false;
}
} else if (cur->top < prev->bottom) {
- LOGE("%s: spans overlap vertically prev=%p, cur=%p",
+ ALOGE("%s: spans overlap vertically prev=%p, cur=%p",
name, prev, cur);
result = false;
}
@@ -355,7 +355,7 @@ bool Region::validate(const Region& reg, const char* name)
}
if (b != reg.getBounds()) {
result = false;
- LOGE("%s: invalid bounds [%d,%d,%d,%d] vs. [%d,%d,%d,%d]", name,
+ ALOGE("%s: invalid bounds [%d,%d,%d,%d] vs. [%d,%d,%d,%d]", name,
b.left, b.top, b.right, b.bottom,
reg.getBounds().left, reg.getBounds().top,
reg.getBounds().right, reg.getBounds().bottom);
@@ -480,7 +480,7 @@ void Region::boolean_operation(int op, Region& dst,
const Rect& rhs, int dx, int dy)
{
if (!rhs.isValid()) {
- LOGE("Region::boolean_operation(op=%d) invalid Rect={%d,%d,%d,%d}",
+ ALOGE("Region::boolean_operation(op=%d) invalid Rect={%d,%d,%d,%d}",
op, rhs.left, rhs.top, rhs.right, rhs.bottom);
return;
}
diff --git a/libs/ui/VirtualKeyMap.cpp b/libs/ui/VirtualKeyMap.cpp
index 90c092dd6c11..62d5b593b27c 100644
--- a/libs/ui/VirtualKeyMap.cpp
+++ b/libs/ui/VirtualKeyMap.cpp
@@ -51,11 +51,11 @@ status_t VirtualKeyMap::load(const String8& filename, VirtualKeyMap** outMap) {
Tokenizer* tokenizer;
status_t status = Tokenizer::open(filename, &tokenizer);
if (status) {
- LOGE("Error %d opening virtual key map file %s.", status, filename.string());
+ ALOGE("Error %d opening virtual key map file %s.", status, filename.string());
} else {
VirtualKeyMap* map = new VirtualKeyMap();
if (!map) {
- LOGE("Error allocating virtual key map.");
+ ALOGE("Error allocating virtual key map.");
status = NO_MEMORY;
} else {
#if DEBUG_PARSER_PERFORMANCE
@@ -104,7 +104,7 @@ status_t VirtualKeyMap::Parser::parse() {
do {
String8 token = mTokenizer->nextToken(WHITESPACE_OR_FIELD_DELIMITER);
if (token != "0x01") {
- LOGE("%s: Unknown virtual key type, expected 0x01.",
+ ALOGE("%s: Unknown virtual key type, expected 0x01.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -116,7 +116,7 @@ status_t VirtualKeyMap::Parser::parse() {
&& parseNextIntField(&defn.width)
&& parseNextIntField(&defn.height);
if (!success) {
- LOGE("%s: Expected 5 colon-delimited integers in virtual key definition.",
+ ALOGE("%s: Expected 5 colon-delimited integers in virtual key definition.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -130,7 +130,7 @@ status_t VirtualKeyMap::Parser::parse() {
} while (consumeFieldDelimiterAndSkipWhitespace());
if (!mTokenizer->isEol()) {
- LOGE("%s: Expected end of line, got '%s'.",
+ ALOGE("%s: Expected end of line, got '%s'.",
mTokenizer->getLocation().string(),
mTokenizer->peekRemainderOfLine().string());
return BAD_VALUE;
@@ -162,7 +162,7 @@ bool VirtualKeyMap::Parser::parseNextIntField(int32_t* outValue) {
char* end;
*outValue = strtol(token.string(), &end, 0);
if (token.isEmpty() || *end != '\0') {
- LOGE("Expected an integer, got '%s'.", token.string());
+ ALOGE("Expected an integer, got '%s'.", token.string());
return false;
}
return true;
diff --git a/libs/utils/Asset.cpp b/libs/utils/Asset.cpp
index 7c34c6a35173..50e701aa8d89 100644
--- a/libs/utils/Asset.cpp
+++ b/libs/utils/Asset.cpp
@@ -89,7 +89,7 @@ Asset::Asset(void)
gTail->mNext = this;
gTail = this;
}
- //LOGI("Creating Asset %p #%d\n", this, gCount);
+ //ALOGI("Creating Asset %p #%d\n", this, gCount);
}
Asset::~Asset(void)
@@ -109,7 +109,7 @@ Asset::~Asset(void)
mPrev->mNext = mNext;
}
mNext = mPrev = NULL;
- //LOGI("Destroying Asset in %p #%d\n", this, gCount);
+ //ALOGI("Destroying Asset in %p #%d\n", this, gCount);
}
/*
@@ -327,14 +327,14 @@ off64_t Asset::handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t m
newOffset = maxPosn + offset;
break;
default:
- LOGW("unexpected whence %d\n", whence);
+ ALOGW("unexpected whence %d\n", whence);
// this was happening due to an off64_t size mismatch
assert(false);
return (off64_t) -1;
}
if (newOffset < 0 || newOffset > maxPosn) {
- LOGW("seek out of range: want %ld, end=%ld\n",
+ ALOGW("seek out of range: want %ld, end=%ld\n",
(long) newOffset, (long) maxPosn);
return (off64_t) -1;
}
@@ -473,7 +473,7 @@ ssize_t _FileAsset::read(void* buf, size_t count)
/* read from the file */
//printf("file read\n");
if (ftell(mFp) != mStart + mOffset) {
- LOGE("Hosed: %ld != %ld+%ld\n",
+ ALOGE("Hosed: %ld != %ld+%ld\n",
ftell(mFp), (long) mStart, (long) mOffset);
assert(false);
}
@@ -581,7 +581,7 @@ const void* _FileAsset::getBuffer(bool wordAligned)
buf = new unsigned char[allocLen];
if (buf == NULL) {
- LOGE("alloc of %ld bytes failed\n", (long) allocLen);
+ ALOGE("alloc of %ld bytes failed\n", (long) allocLen);
return NULL;
}
@@ -590,7 +590,7 @@ const void* _FileAsset::getBuffer(bool wordAligned)
long oldPosn = ftell(mFp);
fseek(mFp, mStart, SEEK_SET);
if (fread(buf, 1, mLength, mFp) != (size_t) mLength) {
- LOGE("failed reading %ld bytes\n", (long) mLength);
+ ALOGE("failed reading %ld bytes\n", (long) mLength);
delete[] buf;
return NULL;
}
@@ -658,7 +658,7 @@ const void* _FileAsset::ensureAlignment(FileMap* map)
getAssetSource(), (int)mLength);
unsigned char* buf = new unsigned char[mLength];
if (buf == NULL) {
- LOGE("alloc of %ld bytes failed\n", (long) mLength);
+ ALOGE("alloc of %ld bytes failed\n", (long) mLength);
return NULL;
}
memcpy(buf, data, mLength);
@@ -855,7 +855,7 @@ const void* _CompressedAsset::getBuffer(bool wordAligned)
*/
buf = new unsigned char[mUncompressedLen];
if (buf == NULL) {
- LOGW("alloc %ld bytes failed\n", (long) mUncompressedLen);
+ ALOGW("alloc %ld bytes failed\n", (long) mUncompressedLen);
goto bail;
}
diff --git a/libs/utils/AssetManager.cpp b/libs/utils/AssetManager.cpp
index e7c4d475767c..47a2b9953fcc 100644
--- a/libs/utils/AssetManager.cpp
+++ b/libs/utils/AssetManager.cpp
@@ -117,14 +117,14 @@ AssetManager::AssetManager(CacheMode cacheMode)
mCacheMode(cacheMode), mCacheValid(false)
{
int count = android_atomic_inc(&gCount)+1;
- //LOGI("Creating AssetManager %p #%d\n", this, count);
+ //ALOGI("Creating AssetManager %p #%d\n", this, count);
memset(mConfig, 0, sizeof(ResTable_config));
}
AssetManager::~AssetManager(void)
{
int count = android_atomic_dec(&gCount);
- //LOGI("Destroying AssetManager in %p #%d\n", this, count);
+ //ALOGI("Destroying AssetManager in %p #%d\n", this, count);
delete mConfig;
delete mResources;
@@ -151,7 +151,7 @@ bool AssetManager::addAssetPath(const String8& path, void** cookie)
ap.path = path;
ap.type = ::getFileType(path.string());
if (ap.type != kFileTypeDirectory && ap.type != kFileTypeRegular) {
- LOGW("Asset path %s is neither a directory nor file (type=%d).",
+ ALOGW("Asset path %s is neither a directory nor file (type=%d).",
path.string(), (int)ap.type);
return false;
}
@@ -200,7 +200,7 @@ bool AssetManager::addAssetPath(const String8& path, void** cookie)
if (addOverlay) {
mAssetPaths.add(oap);
} else {
- LOGW("failed to add overlay package %s\n", overlayPath.string());
+ ALOGW("failed to add overlay package %s\n", overlayPath.string());
}
}
}
@@ -216,17 +216,17 @@ bool AssetManager::isIdmapStaleLocked(const String8& originalPath, const String8
if (errno == ENOENT) {
return true; // non-existing idmap is always stale
} else {
- LOGW("failed to stat file %s: %s\n", idmapPath.string(), strerror(errno));
+ ALOGW("failed to stat file %s: %s\n", idmapPath.string(), strerror(errno));
return false;
}
}
if (st.st_size < ResTable::IDMAP_HEADER_SIZE_BYTES) {
- LOGW("file %s has unexpectedly small size=%zd\n", idmapPath.string(), (size_t)st.st_size);
+ ALOGW("file %s has unexpectedly small size=%zd\n", idmapPath.string(), (size_t)st.st_size);
return false;
}
int fd = TEMP_FAILURE_RETRY(::open(idmapPath.string(), O_RDONLY));
if (fd == -1) {
- LOGW("failed to open file %s: %s\n", idmapPath.string(), strerror(errno));
+ ALOGW("failed to open file %s: %s\n", idmapPath.string(), strerror(errno));
return false;
}
char buf[ResTable::IDMAP_HEADER_SIZE_BYTES];
@@ -300,24 +300,24 @@ bool AssetManager::createIdmapFileLocked(const String8& originalPath, const Stri
ap.path = *paths[i];
Asset* ass = openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, ap);
if (ass == NULL) {
- LOGW("failed to find resources.arsc in %s\n", ap.path.string());
+ ALOGW("failed to find resources.arsc in %s\n", ap.path.string());
goto error;
}
tables[i].add(ass, (void*)1, false);
}
if (!getZipEntryCrcLocked(originalPath, "resources.arsc", &originalCrc)) {
- LOGW("failed to retrieve crc for resources.arsc in %s\n", originalPath.string());
+ ALOGW("failed to retrieve crc for resources.arsc in %s\n", originalPath.string());
goto error;
}
if (!getZipEntryCrcLocked(overlayPath, "resources.arsc", &overlayCrc)) {
- LOGW("failed to retrieve crc for resources.arsc in %s\n", overlayPath.string());
+ ALOGW("failed to retrieve crc for resources.arsc in %s\n", overlayPath.string());
goto error;
}
if (tables[0].createIdmap(tables[1], originalCrc, overlayCrc,
(void**)&data, &size) != NO_ERROR) {
- LOGW("failed to generate idmap data for file %s\n", idmapPath.string());
+ ALOGW("failed to generate idmap data for file %s\n", idmapPath.string());
goto error;
}
@@ -326,13 +326,13 @@ bool AssetManager::createIdmapFileLocked(const String8& originalPath, const Stri
// installd).
fd = TEMP_FAILURE_RETRY(::open(idmapPath.string(), O_WRONLY | O_CREAT | O_TRUNC, 0644));
if (fd == -1) {
- LOGW("failed to write idmap file %s (open: %s)\n", idmapPath.string(), strerror(errno));
+ ALOGW("failed to write idmap file %s (open: %s)\n", idmapPath.string(), strerror(errno));
goto error_free;
}
for (;;) {
ssize_t written = TEMP_FAILURE_RETRY(write(fd, data + offset, size));
if (written < 0) {
- LOGW("failed to write idmap file %s (write: %s)\n", idmapPath.string(),
+ ALOGW("failed to write idmap file %s (write: %s)\n", idmapPath.string(),
strerror(errno));
goto error_close;
}
@@ -686,7 +686,7 @@ const ResTable* AssetManager::getResTable(bool required) const
}
}
- if (required && !rt) LOGW("Unable to find resources file resources.arsc");
+ if (required && !rt) ALOGW("Unable to find resources file resources.arsc");
if (!rt) {
mResources = rt = new ResTable();
}
@@ -727,7 +727,7 @@ Asset* AssetManager::openIdmapLocked(const struct asset_path& ap) const
if (ass) {
ALOGV("loading idmap %s\n", ap.idmap.string());
} else {
- LOGW("failed to load idmap %s\n", ap.idmap.string());
+ ALOGW("failed to load idmap %s\n", ap.idmap.string());
}
}
return ass;
@@ -1074,13 +1074,13 @@ Asset* AssetManager::openAssetFromZipLocked(const ZipFileRO* pZipFile,
if (!pZipFile->getEntryInfo(entry, &method, &uncompressedLen, NULL, NULL,
NULL, NULL))
{
- LOGW("getEntryInfo failed\n");
+ ALOGW("getEntryInfo failed\n");
return NULL;
}
FileMap* dataMap = pZipFile->createEntryFileMap(entry);
if (dataMap == NULL) {
- LOGW("create map from entry failed\n");
+ ALOGW("create map from entry failed\n");
return NULL;
}
@@ -1096,7 +1096,7 @@ Asset* AssetManager::openAssetFromZipLocked(const ZipFileRO* pZipFile,
}
if (pAsset == NULL) {
/* unexpected */
- LOGW("create from segment failed\n");
+ ALOGW("create from segment failed\n");
}
return pAsset;
@@ -1427,7 +1427,7 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg
pZip = mZipSet.getZip(ap.path);
if (pZip == NULL) {
- LOGW("Failure opening zip %s\n", ap.path.string());
+ ALOGW("Failure opening zip %s\n", ap.path.string());
return false;
}
@@ -1461,7 +1461,7 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg
entry = pZip->findEntryByIndex(i);
if (pZip->getEntryFileName(entry, nameBuf, sizeof(nameBuf)) != 0) {
// TODO: fix this if we expect to have long names
- LOGE("ARGH: name too long?\n");
+ ALOGE("ARGH: name too long?\n");
continue;
}
//printf("Comparing %s in %s?\n", nameBuf, dirName.string());
@@ -1780,7 +1780,7 @@ AssetManager::SharedZip::SharedZip(const String8& path, time_t modWhen)
: mPath(path), mZipFile(NULL), mModWhen(modWhen),
mResourceTableAsset(NULL), mResourceTable(NULL)
{
- //LOGI("Creating SharedZip %p %s\n", this, (const char*)mPath);
+ //ALOGI("Creating SharedZip %p %s\n", this, (const char*)mPath);
mZipFile = new ZipFileRO;
ALOGV("+++ opening zip '%s'\n", mPath.string());
if (mZipFile->open(mPath.string()) != NO_ERROR) {
@@ -1858,7 +1858,7 @@ bool AssetManager::SharedZip::isUpToDate()
AssetManager::SharedZip::~SharedZip()
{
- //LOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath);
+ //ALOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath);
if (mResourceTable != NULL) {
delete mResourceTable;
}
diff --git a/libs/utils/BackupData.cpp b/libs/utils/BackupData.cpp
index 5afe2dc05c5d..f956306136a1 100644
--- a/libs/utils/BackupData.cpp
+++ b/libs/utils/BackupData.cpp
@@ -78,7 +78,7 @@ BackupDataWriter::write_padding_for(int n)
paddingSize = padding_extra(n);
if (paddingSize > 0) {
uint32_t padding = 0xbcbcbcbc;
- if (DEBUG) LOGI("writing %d padding bytes for %d", paddingSize, n);
+ if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n);
amt = write(m_fd, &padding, paddingSize);
if (amt != paddingSize) {
m_status = errno;
@@ -125,7 +125,7 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize)
header.keyLen = tolel(keyLen);
header.dataSize = tolel(dataSize);
- if (DEBUG) LOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
+ if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
amt = write(m_fd, &header, sizeof(entity_header_v1));
if (amt != sizeof(entity_header_v1)) {
m_status = errno;
@@ -133,7 +133,7 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize)
}
m_pos += amt;
- if (DEBUG) LOGI("writing entity header key, %d bytes", keyLen+1);
+ if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1);
amt = write(m_fd, k.string(), keyLen+1);
if (amt != keyLen+1) {
m_status = errno;
diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp
index aee7ff08946d..f77a8917c7f9 100644
--- a/libs/utils/BackupHelpers.cpp
+++ b/libs/utils/BackupHelpers.cpp
@@ -100,7 +100,7 @@ read_snapshot_file(int fd, KeyedVector<String8,FileState>* snapshot)
bytesRead += amt;
if (header.magic0 != MAGIC0 || header.magic1 != MAGIC1) {
- LOGW("read_snapshot_file header.magic0=0x%08x magic1=0x%08x", header.magic0, header.magic1);
+ ALOGW("read_snapshot_file header.magic0=0x%08x magic1=0x%08x", header.magic0, header.magic1);
return 1;
}
@@ -110,7 +110,7 @@ read_snapshot_file(int fd, KeyedVector<String8,FileState>* snapshot)
amt = read(fd, &file, sizeof(FileState));
if (amt != sizeof(FileState)) {
- LOGW("read_snapshot_file FileState truncated/error with read at %d bytes\n", bytesRead);
+ ALOGW("read_snapshot_file FileState truncated/error with read at %d bytes\n", bytesRead);
return 1;
}
bytesRead += amt;
@@ -129,13 +129,13 @@ read_snapshot_file(int fd, KeyedVector<String8,FileState>* snapshot)
free(filename);
}
if (amt != nameBufSize) {
- LOGW("read_snapshot_file filename truncated/error with read at %d bytes\n", bytesRead);
+ ALOGW("read_snapshot_file filename truncated/error with read at %d bytes\n", bytesRead);
return 1;
}
}
if (header.totalSize != bytesRead) {
- LOGW("read_snapshot_file length mismatch: header.totalSize=%d bytesRead=%d\n",
+ ALOGW("read_snapshot_file length mismatch: header.totalSize=%d bytesRead=%d\n",
header.totalSize, bytesRead);
return 1;
}
@@ -166,7 +166,7 @@ write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot)
amt = write(fd, &header, sizeof(header));
if (amt != sizeof(header)) {
- LOGW("write_snapshot_file error writing header %s", strerror(errno));
+ ALOGW("write_snapshot_file error writing header %s", strerror(errno));
return errno;
}
@@ -178,14 +178,14 @@ write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot)
amt = write(fd, &r.s, sizeof(FileState));
if (amt != sizeof(FileState)) {
- LOGW("write_snapshot_file error writing header %s", strerror(errno));
+ ALOGW("write_snapshot_file error writing header %s", strerror(errno));
return 1;
}
// filename is not NULL terminated, but it is padded
amt = write(fd, name.string(), nameLen);
if (amt != nameLen) {
- LOGW("write_snapshot_file error writing filename %s", strerror(errno));
+ ALOGW("write_snapshot_file error writing filename %s", strerror(errno));
return 1;
}
int paddingLen = ROUND_UP[nameLen % 4];
@@ -193,7 +193,7 @@ write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot)
int padding = 0xabababab;
amt = write(fd, &padding, paddingLen);
if (amt != paddingLen) {
- LOGW("write_snapshot_file error writing %d bytes of filename padding %s",
+ ALOGW("write_snapshot_file error writing %d bytes of filename padding %s",
paddingLen, strerror(errno));
return 1;
}
@@ -232,7 +232,7 @@ write_update_file(BackupDataWriter* dataStream, int fd, int mode, const String8&
lseek(fd, 0, SEEK_SET);
if (sizeof(metadata) != 16) {
- LOGE("ERROR: metadata block is the wrong size!");
+ ALOGE("ERROR: metadata block is the wrong size!");
}
bytesLeft = fileSize + sizeof(metadata);
@@ -280,7 +280,7 @@ write_update_file(BackupDataWriter* dataStream, int fd, int mode, const String8&
}
}
}
- LOGE("write_update_file size mismatch for %s. expected=%d actual=%d."
+ ALOGE("write_update_file size mismatch for %s. expected=%d actual=%d."
" You aren't doing proper locking!", realFilename, fileSize, fileSize-bytesLeft);
}
@@ -525,7 +525,7 @@ int write_tarfile(const String8& packageName, const String8& domain,
struct stat64 s;
if (lstat64(filepath.string(), &s) != 0) {
err = errno;
- LOGE("Error %d (%s) from lstat64(%s)", err, strerror(err), filepath.string());
+ ALOGE("Error %d (%s) from lstat64(%s)", err, strerror(err), filepath.string());
return err;
}
@@ -540,7 +540,7 @@ int write_tarfile(const String8& packageName, const String8& domain,
int fd = open(filepath.string(), O_RDONLY);
if (fd < 0) {
err = errno;
- LOGE("Error %d (%s) from open(%s)", err, strerror(err), filepath.string());
+ ALOGE("Error %d (%s) from open(%s)", err, strerror(err), filepath.string());
return err;
}
@@ -551,7 +551,7 @@ int write_tarfile(const String8& packageName, const String8& domain,
char* paxData = buf + 1024;
if (buf == NULL) {
- LOGE("Out of mem allocating transfer buffer");
+ ALOGE("Out of mem allocating transfer buffer");
err = ENOMEM;
goto cleanup;
}
@@ -591,7 +591,7 @@ int write_tarfile(const String8& packageName, const String8& domain,
} else if (S_ISREG(s.st_mode)) {
type = '0'; // tar magic: '0' == normal file
} else {
- LOGW("Error: unknown file mode 0%o [%s]", s.st_mode, filepath.string());
+ ALOGW("Error: unknown file mode 0%o [%s]", s.st_mode, filepath.string());
goto cleanup;
}
buf[156] = type;
@@ -628,7 +628,7 @@ int write_tarfile(const String8& packageName, const String8& domain,
// [ 329 : 8 ] and [ 337 : 8 ] devmajor/devminor, not used
- LOGI(" Name: %s", fullname.string());
+ ALOGI(" Name: %s", fullname.string());
// If we're using a pax extended header, build & write that here; lengths are
// already preflighted
@@ -688,11 +688,11 @@ int write_tarfile(const String8& packageName, const String8& domain,
ssize_t nRead = read(fd, buf, toRead);
if (nRead < 0) {
err = errno;
- LOGE("Unable to read file [%s], err=%d (%s)", filepath.string(),
+ ALOGE("Unable to read file [%s], err=%d (%s)", filepath.string(),
err, strerror(err));
break;
} else if (nRead == 0) {
- LOGE("EOF but expect %lld more bytes in [%s]", (long long) toWrite,
+ ALOGE("EOF but expect %lld more bytes in [%s]", (long long) toWrite,
filepath.string());
err = EIO;
break;
@@ -759,7 +759,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
file_metadata_v1 metadata;
amt = in->ReadEntityData(&metadata, sizeof(metadata));
if (amt != sizeof(metadata)) {
- LOGW("Could not read metadata for %s -- %ld / %s", filename.string(),
+ ALOGW("Could not read metadata for %s -- %ld / %s", filename.string(),
(long)amt, strerror(errno));
return EIO;
}
@@ -768,7 +768,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
if (metadata.version > CURRENT_METADATA_VERSION) {
if (!m_loggedUnknownMetadata) {
m_loggedUnknownMetadata = true;
- LOGW("Restoring file with unsupported metadata version %d (currently %d)",
+ ALOGW("Restoring file with unsupported metadata version %d (currently %d)",
metadata.version, CURRENT_METADATA_VERSION);
}
}
@@ -778,7 +778,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
crc = crc32(0L, Z_NULL, 0);
fd = open(filename.string(), O_CREAT|O_RDWR|O_TRUNC, mode);
if (fd == -1) {
- LOGW("Could not open file %s -- %s", filename.string(), strerror(errno));
+ ALOGW("Could not open file %s -- %s", filename.string(), strerror(errno));
return errno;
}
@@ -786,7 +786,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
err = write(fd, buf, amt);
if (err != amt) {
close(fd);
- LOGW("Error '%s' writing '%s'", strerror(errno), filename.string());
+ ALOGW("Error '%s' writing '%s'", strerror(errno), filename.string());
return errno;
}
crc = crc32(crc, (Bytef*)buf, amt);
@@ -797,7 +797,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
// Record for the snapshot
err = stat(filename.string(), &st);
if (err != 0) {
- LOGW("Error stating file that we just created %s", filename.string());
+ ALOGW("Error stating file that we just created %s", filename.string());
return errno;
}
diff --git a/libs/utils/BlobCache.cpp b/libs/utils/BlobCache.cpp
index 497082869268..e52cf2f84539 100644
--- a/libs/utils/BlobCache.cpp
+++ b/libs/utils/BlobCache.cpp
@@ -69,11 +69,11 @@ void BlobCache::set(const void* key, size_t keySize, const void* value,
return;
}
if (keySize == 0) {
- LOGW("set: not caching because keySize is 0");
+ ALOGW("set: not caching because keySize is 0");
return;
}
if (valueSize <= 0) {
- LOGW("set: not caching because valueSize is 0");
+ ALOGW("set: not caching because valueSize is 0");
return;
}
@@ -183,13 +183,13 @@ size_t BlobCache::getFdCount() const {
status_t BlobCache::flatten(void* buffer, size_t size, int fds[], size_t count)
const {
if (count != 0) {
- LOGE("flatten: nonzero fd count: %d", count);
+ ALOGE("flatten: nonzero fd count: %d", count);
return BAD_VALUE;
}
// Write the cache header
if (size < sizeof(Header)) {
- LOGE("flatten: not enough room for cache header");
+ ALOGE("flatten: not enough room for cache header");
return BAD_VALUE;
}
Header* header = reinterpret_cast<Header*>(buffer);
@@ -210,7 +210,7 @@ status_t BlobCache::flatten(void* buffer, size_t size, int fds[], size_t count)
size_t entrySize = sizeof(EntryHeader) + keySize + valueSize;
if (byteOffset + entrySize > size) {
- LOGE("flatten: not enough room for cache entries");
+ ALOGE("flatten: not enough room for cache entries");
return BAD_VALUE;
}
@@ -234,18 +234,18 @@ status_t BlobCache::unflatten(void const* buffer, size_t size, int fds[],
mCacheEntries.clear();
if (count != 0) {
- LOGE("unflatten: nonzero fd count: %d", count);
+ ALOGE("unflatten: nonzero fd count: %d", count);
return BAD_VALUE;
}
// Read the cache header
if (size < sizeof(Header)) {
- LOGE("unflatten: not enough room for cache header");
+ ALOGE("unflatten: not enough room for cache header");
return BAD_VALUE;
}
const Header* header = reinterpret_cast<const Header*>(buffer);
if (header->mMagicNumber != blobCacheMagic) {
- LOGE("unflatten: bad magic number: %d", header->mMagicNumber);
+ ALOGE("unflatten: bad magic number: %d", header->mMagicNumber);
return BAD_VALUE;
}
if (header->mBlobCacheVersion != blobCacheVersion ||
@@ -261,7 +261,7 @@ status_t BlobCache::unflatten(void const* buffer, size_t size, int fds[],
for (size_t i = 0; i < numEntries; i++) {
if (byteOffset + sizeof(EntryHeader) > size) {
mCacheEntries.clear();
- LOGE("unflatten: not enough room for cache entry headers");
+ ALOGE("unflatten: not enough room for cache entry headers");
return BAD_VALUE;
}
@@ -273,7 +273,7 @@ status_t BlobCache::unflatten(void const* buffer, size_t size, int fds[],
if (byteOffset + entrySize > size) {
mCacheEntries.clear();
- LOGE("unflatten: not enough room for cache entry headers");
+ ALOGE("unflatten: not enough room for cache entry headers");
return BAD_VALUE;
}
diff --git a/libs/utils/FileMap.cpp b/libs/utils/FileMap.cpp
index b2a61f1223f9..9ce370e0ebda 100644
--- a/libs/utils/FileMap.cpp
+++ b/libs/utils/FileMap.cpp
@@ -108,7 +108,7 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le
mFileHandle = (HANDLE) _get_osfhandle(fd);
mFileMapping = CreateFileMapping( mFileHandle, NULL, protect, 0, 0, NULL);
if (mFileMapping == NULL) {
- LOGE("CreateFileMapping(%p, %lx) failed with error %ld\n",
+ ALOGE("CreateFileMapping(%p, %lx) failed with error %ld\n",
mFileHandle, protect, GetLastError() );
return false;
}
@@ -123,7 +123,7 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le
(DWORD)(adjOffset),
adjLength );
if (mBasePtr == NULL) {
- LOGE("MapViewOfFile(%ld, %ld) failed with error %ld\n",
+ ALOGE("MapViewOfFile(%ld, %ld) failed with error %ld\n",
adjOffset, adjLength, GetLastError() );
CloseHandle(mFileMapping);
mFileMapping = INVALID_HANDLE_VALUE;
@@ -147,7 +147,7 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le
#if NOT_USING_KLIBC
mPageSize = sysconf(_SC_PAGESIZE);
if (mPageSize == -1) {
- LOGE("could not get _SC_PAGESIZE\n");
+ ALOGE("could not get _SC_PAGESIZE\n");
return false;
}
#else
@@ -175,7 +175,7 @@ try_again:
goto try_again;
}
- LOGE("mmap(%ld,%ld) failed: %s\n",
+ ALOGE("mmap(%ld,%ld) failed: %s\n",
(long) adjOffset, (long) adjLength, strerror(errno));
return false;
}
@@ -217,7 +217,7 @@ int FileMap::advise(MapAdvice advice)
cc = madvise(mBasePtr, mBaseLength, sysAdvice);
if (cc != 0)
- LOGW("madvise(%d) failed: %s\n", sysAdvice, strerror(errno));
+ ALOGW("madvise(%d) failed: %s\n", sysAdvice, strerror(errno));
return cc;
#else
return -1;
diff --git a/libs/utils/Looper.cpp b/libs/utils/Looper.cpp
index 1bc92cf88cf9..d1aa664bcae0 100644
--- a/libs/utils/Looper.cpp
+++ b/libs/utils/Looper.cpp
@@ -163,7 +163,7 @@ sp<Looper> Looper::prepare(int opts) {
Looper::setForThread(looper);
}
if (looper->getAllowNonCallbacks() != allowNonCallbacks) {
- LOGW("Looper already prepared for this thread with a different value for the "
+ ALOGW("Looper already prepared for this thread with a different value for the "
"ALOOPER_PREPARE_ALLOW_NON_CALLBACKS option.");
}
return looper;
@@ -262,7 +262,7 @@ int Looper::pollInner(int timeoutMillis) {
if (errno == EINTR) {
goto Done;
}
- LOGW("Poll failed with an unexpected error, errno=%d", errno);
+ ALOGW("Poll failed with an unexpected error, errno=%d", errno);
result = ALOOPER_POLL_ERROR;
goto Done;
}
@@ -289,7 +289,7 @@ int Looper::pollInner(int timeoutMillis) {
if (epollEvents & EPOLLIN) {
awoken();
} else {
- LOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents);
+ ALOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents);
}
} else {
ssize_t requestIndex = mRequests.indexOfKey(fd);
@@ -301,7 +301,7 @@ int Looper::pollInner(int timeoutMillis) {
if (epollEvents & EPOLLHUP) events |= ALOOPER_EVENT_HANGUP;
pushResponse(events, mRequests.valueAt(requestIndex));
} else {
- LOGW("Ignoring unexpected epoll events 0x%x on fd %d that is "
+ ALOGW("Ignoring unexpected epoll events 0x%x on fd %d that is "
"no longer registered.", epollEvents, fd);
}
}
@@ -317,7 +317,7 @@ Done: ;
if (pollEvents & POLLIN) {
awoken();
} else {
- LOGW("Ignoring unexpected poll events 0x%x on wake read pipe.", pollEvents);
+ ALOGW("Ignoring unexpected poll events 0x%x on wake read pipe.", pollEvents);
}
} else {
int events = 0;
@@ -468,7 +468,7 @@ void Looper::wake() {
if (nWrite != 1) {
if (errno != EAGAIN) {
- LOGW("Could not write wake signal, errno=%d", errno);
+ ALOGW("Could not write wake signal, errno=%d", errno);
}
}
}
@@ -520,12 +520,12 @@ int Looper::addFd(int fd, int ident, int events, ALooper_callbackFunc callback,
if (! callback) {
if (! mAllowNonCallbacks) {
- LOGE("Invalid attempt to set NULL callback but not allowed for this looper.");
+ ALOGE("Invalid attempt to set NULL callback but not allowed for this looper.");
return -1;
}
if (ident < 0) {
- LOGE("Invalid attempt to set NULL callback with ident <= 0.");
+ ALOGE("Invalid attempt to set NULL callback with ident <= 0.");
return -1;
}
}
@@ -553,14 +553,14 @@ int Looper::addFd(int fd, int ident, int events, ALooper_callbackFunc callback,
if (requestIndex < 0) {
int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, & eventItem);
if (epollResult < 0) {
- LOGE("Error adding epoll events for fd %d, errno=%d", fd, errno);
+ ALOGE("Error adding epoll events for fd %d, errno=%d", fd, errno);
return -1;
}
mRequests.add(fd, request);
} else {
int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_MOD, fd, & eventItem);
if (epollResult < 0) {
- LOGE("Error modifying epoll events for fd %d, errno=%d", fd, errno);
+ ALOGE("Error modifying epoll events for fd %d, errno=%d", fd, errno);
return -1;
}
mRequests.replaceValueAt(requestIndex, request);
@@ -611,7 +611,7 @@ int Looper::removeFd(int fd) {
int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, NULL);
if (epollResult < 0) {
- LOGE("Error removing epoll events for fd %d, errno=%d", fd, errno);
+ ALOGE("Error removing epoll events for fd %d, errno=%d", fd, errno);
return -1;
}
diff --git a/libs/utils/ObbFile.cpp b/libs/utils/ObbFile.cpp
index 2907b5666b67..ddf59914b87d 100644
--- a/libs/utils/ObbFile.cpp
+++ b/libs/utils/ObbFile.cpp
@@ -90,14 +90,14 @@ bool ObbFile::readFrom(const char* filename)
fd = ::open(filename, O_RDONLY);
if (fd < 0) {
- LOGW("couldn't open file %s: %s", filename, strerror(errno));
+ ALOGW("couldn't open file %s: %s", filename, strerror(errno));
goto out;
}
success = readFrom(fd);
close(fd);
if (!success) {
- LOGW("failed to read from %s (fd=%d)\n", filename, fd);
+ ALOGW("failed to read from %s (fd=%d)\n", filename, fd);
}
out:
@@ -107,7 +107,7 @@ out:
bool ObbFile::readFrom(int fd)
{
if (fd < 0) {
- LOGW("attempt to read from invalid fd\n");
+ ALOGW("attempt to read from invalid fd\n");
return false;
}
@@ -120,9 +120,9 @@ bool ObbFile::parseObbFile(int fd)
if (fileLength < kFooterMinSize) {
if (fileLength < 0) {
- LOGW("error seeking in ObbFile: %s\n", strerror(errno));
+ ALOGW("error seeking in ObbFile: %s\n", strerror(errno));
} else {
- LOGW("file is only %lld (less than %d minimum)\n", fileLength, kFooterMinSize);
+ ALOGW("file is only %lld (less than %d minimum)\n", fileLength, kFooterMinSize);
}
return false;
}
@@ -136,13 +136,13 @@ bool ObbFile::parseObbFile(int fd)
char *footer = new char[kFooterTagSize];
actual = TEMP_FAILURE_RETRY(read(fd, footer, kFooterTagSize));
if (actual != kFooterTagSize) {
- LOGW("couldn't read footer signature: %s\n", strerror(errno));
+ ALOGW("couldn't read footer signature: %s\n", strerror(errno));
return false;
}
unsigned int fileSig = get4LE((unsigned char*)footer + sizeof(int32_t));
if (fileSig != kSignature) {
- LOGW("footer didn't match magic string (expected 0x%08x; got 0x%08x)\n",
+ ALOGW("footer didn't match magic string (expected 0x%08x; got 0x%08x)\n",
kSignature, fileSig);
return false;
}
@@ -150,13 +150,13 @@ bool ObbFile::parseObbFile(int fd)
footerSize = get4LE((unsigned char*)footer);
if (footerSize > (size_t)fileLength - kFooterTagSize
|| footerSize > kMaxBufSize) {
- LOGW("claimed footer size is too large (0x%08zx; file size is 0x%08llx)\n",
+ ALOGW("claimed footer size is too large (0x%08zx; file size is 0x%08llx)\n",
footerSize, fileLength);
return false;
}
if (footerSize < (kFooterMinSize - kFooterTagSize)) {
- LOGW("claimed footer size is too small (0x%zx; minimum size is 0x%x)\n",
+ ALOGW("claimed footer size is too small (0x%zx; minimum size is 0x%x)\n",
footerSize, kFooterMinSize - kFooterTagSize);
return false;
}
@@ -164,7 +164,7 @@ bool ObbFile::parseObbFile(int fd)
off64_t fileOffset = fileLength - footerSize - kFooterTagSize;
if (lseek64(fd, fileOffset, SEEK_SET) != fileOffset) {
- LOGW("seek %lld failed: %s\n", fileOffset, strerror(errno));
+ ALOGW("seek %lld failed: %s\n", fileOffset, strerror(errno));
return false;
}
@@ -172,27 +172,27 @@ bool ObbFile::parseObbFile(int fd)
char* scanBuf = (char*)malloc(footerSize);
if (scanBuf == NULL) {
- LOGW("couldn't allocate scanBuf: %s\n", strerror(errno));
+ ALOGW("couldn't allocate scanBuf: %s\n", strerror(errno));
return false;
}
actual = TEMP_FAILURE_RETRY(read(fd, scanBuf, footerSize));
// readAmount is guaranteed to be less than kMaxBufSize
if (actual != (ssize_t)footerSize) {
- LOGI("couldn't read ObbFile footer: %s\n", strerror(errno));
+ ALOGI("couldn't read ObbFile footer: %s\n", strerror(errno));
free(scanBuf);
return false;
}
#ifdef DEBUG
for (int i = 0; i < footerSize; ++i) {
- LOGI("char: 0x%02x\n", scanBuf[i]);
+ ALOGI("char: 0x%02x\n", scanBuf[i]);
}
#endif
uint32_t sigVersion = get4LE((unsigned char*)scanBuf);
if (sigVersion != kSigVersion) {
- LOGW("Unsupported ObbFile version %d\n", sigVersion);
+ ALOGW("Unsupported ObbFile version %d\n", sigVersion);
free(scanBuf);
return false;
}
@@ -205,7 +205,7 @@ bool ObbFile::parseObbFile(int fd)
size_t packageNameLen = get4LE((unsigned char*)scanBuf + kPackageNameLenOffset);
if (packageNameLen == 0
|| packageNameLen > (footerSize - kPackageNameOffset)) {
- LOGW("bad ObbFile package name length (0x%04zx; 0x%04zx possible)\n",
+ ALOGW("bad ObbFile package name length (0x%04zx; 0x%04zx possible)\n",
packageNameLen, footerSize - kPackageNameOffset);
free(scanBuf);
return false;
@@ -217,7 +217,7 @@ bool ObbFile::parseObbFile(int fd)
free(scanBuf);
#ifdef DEBUG
- LOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion);
+ ALOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion);
#endif
return true;
@@ -237,7 +237,7 @@ bool ObbFile::writeTo(const char* filename)
out:
if (!success) {
- LOGW("failed to write to %s: %s\n", filename, strerror(errno));
+ ALOGW("failed to write to %s: %s\n", filename, strerror(errno));
}
return success;
}
@@ -251,7 +251,7 @@ bool ObbFile::writeTo(int fd)
lseek64(fd, 0, SEEK_END);
if (mPackageName.size() == 0 || mVersion == -1) {
- LOGW("tried to write uninitialized ObbFile data\n");
+ ALOGW("tried to write uninitialized ObbFile data\n");
return false;
}
@@ -260,48 +260,48 @@ bool ObbFile::writeTo(int fd)
put4LE(intBuf, kSigVersion);
if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- LOGW("couldn't write signature version: %s\n", strerror(errno));
+ ALOGW("couldn't write signature version: %s\n", strerror(errno));
return false;
}
put4LE(intBuf, mVersion);
if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- LOGW("couldn't write package version\n");
+ ALOGW("couldn't write package version\n");
return false;
}
put4LE(intBuf, mFlags);
if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- LOGW("couldn't write package version\n");
+ ALOGW("couldn't write package version\n");
return false;
}
if (write(fd, mSalt, sizeof(mSalt)) != (ssize_t)sizeof(mSalt)) {
- LOGW("couldn't write salt: %s\n", strerror(errno));
+ ALOGW("couldn't write salt: %s\n", strerror(errno));
return false;
}
size_t packageNameLen = mPackageName.size();
put4LE(intBuf, packageNameLen);
if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- LOGW("couldn't write package name length: %s\n", strerror(errno));
+ ALOGW("couldn't write package name length: %s\n", strerror(errno));
return false;
}
if (write(fd, mPackageName.string(), packageNameLen) != (ssize_t)packageNameLen) {
- LOGW("couldn't write package name: %s\n", strerror(errno));
+ ALOGW("couldn't write package name: %s\n", strerror(errno));
return false;
}
put4LE(intBuf, kPackageNameOffset + packageNameLen);
if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- LOGW("couldn't write footer size: %s\n", strerror(errno));
+ ALOGW("couldn't write footer size: %s\n", strerror(errno));
return false;
}
put4LE(intBuf, kSignature);
if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- LOGW("couldn't write footer magic signature: %s\n", strerror(errno));
+ ALOGW("couldn't write footer magic signature: %s\n", strerror(errno));
return false;
}
@@ -322,7 +322,7 @@ bool ObbFile::removeFrom(const char* filename)
out:
if (!success) {
- LOGW("failed to remove signature from %s: %s\n", filename, strerror(errno));
+ ALOGW("failed to remove signature from %s: %s\n", filename, strerror(errno));
}
return success;
}
diff --git a/libs/utils/PropertyMap.cpp b/libs/utils/PropertyMap.cpp
index 99603abca5a5..55207027bfe8 100644
--- a/libs/utils/PropertyMap.cpp
+++ b/libs/utils/PropertyMap.cpp
@@ -84,7 +84,7 @@ bool PropertyMap::tryGetProperty(const String8& key, int32_t& outValue) const {
char* end;
int value = strtol(stringValue.string(), & end, 10);
if (*end != '\0') {
- LOGW("Property key '%s' has invalid value '%s'. Expected an integer.",
+ ALOGW("Property key '%s' has invalid value '%s'. Expected an integer.",
key.string(), stringValue.string());
return false;
}
@@ -101,7 +101,7 @@ bool PropertyMap::tryGetProperty(const String8& key, float& outValue) const {
char* end;
float value = strtof(stringValue.string(), & end);
if (*end != '\0') {
- LOGW("Property key '%s' has invalid value '%s'. Expected a float.",
+ ALOGW("Property key '%s' has invalid value '%s'. Expected a float.",
key.string(), stringValue.string());
return false;
}
@@ -121,11 +121,11 @@ status_t PropertyMap::load(const String8& filename, PropertyMap** outMap) {
Tokenizer* tokenizer;
status_t status = Tokenizer::open(filename, &tokenizer);
if (status) {
- LOGE("Error %d opening property file %s.", status, filename.string());
+ ALOGE("Error %d opening property file %s.", status, filename.string());
} else {
PropertyMap* map = new PropertyMap();
if (!map) {
- LOGE("Error allocating property map.");
+ ALOGE("Error allocating property map.");
status = NO_MEMORY;
} else {
#if DEBUG_PARSER_PERFORMANCE
@@ -172,14 +172,14 @@ status_t PropertyMap::Parser::parse() {
if (!mTokenizer->isEol() && mTokenizer->peekChar() != '#') {
String8 keyToken = mTokenizer->nextToken(WHITESPACE_OR_PROPERTY_DELIMITER);
if (keyToken.isEmpty()) {
- LOGE("%s: Expected non-empty property key.", mTokenizer->getLocation().string());
+ ALOGE("%s: Expected non-empty property key.", mTokenizer->getLocation().string());
return BAD_VALUE;
}
mTokenizer->skipDelimiters(WHITESPACE);
if (mTokenizer->nextChar() != '=') {
- LOGE("%s: Expected '=' between property key and value.",
+ ALOGE("%s: Expected '=' between property key and value.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -188,21 +188,21 @@ status_t PropertyMap::Parser::parse() {
String8 valueToken = mTokenizer->nextToken(WHITESPACE);
if (valueToken.find("\\", 0) >= 0 || valueToken.find("\"", 0) >= 0) {
- LOGE("%s: Found reserved character '\\' or '\"' in property value.",
+ ALOGE("%s: Found reserved character '\\' or '\"' in property value.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
mTokenizer->skipDelimiters(WHITESPACE);
if (!mTokenizer->isEol()) {
- LOGE("%s: Expected end of line, got '%s'.",
+ ALOGE("%s: Expected end of line, got '%s'.",
mTokenizer->getLocation().string(),
mTokenizer->peekRemainderOfLine().string());
return BAD_VALUE;
}
if (mMap->hasProperty(keyToken)) {
- LOGE("%s: Duplicate property value for key '%s'.",
+ ALOGE("%s: Duplicate property value for key '%s'.",
mTokenizer->getLocation().string(), keyToken.string());
return BAD_VALUE;
}
diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp
index 0b7dd92e3297..ad0939e574b2 100644
--- a/libs/utils/RefBase.cpp
+++ b/libs/utils/RefBase.cpp
@@ -98,7 +98,7 @@ public:
#if DEBUG_REFS_FATAL_SANITY_CHECKS
LOG_ALWAYS_FATAL("Strong references remain!");
#else
- LOGE("Strong references remain:");
+ ALOGE("Strong references remain:");
#endif
ref_entry* refs = mStrongRefs;
while (refs) {
@@ -116,7 +116,7 @@ public:
#if DEBUG_REFS_FATAL_SANITY_CHECKS
LOG_ALWAYS_FATAL("Weak references remain:");
#else
- LOGE("Weak references remain!");
+ ALOGE("Weak references remain!");
#endif
ref_entry* refs = mWeakRefs;
while (refs) {
@@ -129,7 +129,7 @@ public:
}
}
if (dumpStack) {
- LOGE("above errors at:");
+ ALOGE("above errors at:");
CallStack stack;
stack.update();
stack.dump();
@@ -205,7 +205,7 @@ public:
close(rc);
ALOGD("STACK TRACE for %p saved in %s", this, name);
}
- else LOGE("FAILED TO PRINT STACK TRACE for %p in %s: %s", this,
+ else ALOGE("FAILED TO PRINT STACK TRACE for %p in %s: %s", this,
name, strerror(errno));
}
}
@@ -263,7 +263,7 @@ private:
id, mBase, this);
#endif
- LOGE("RefBase: removing id %p on RefBase %p"
+ ALOGE("RefBase: removing id %p on RefBase %p"
"(weakref_type %p) that doesn't exist!",
id, mBase, this);
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 559afd8b11bd..15b83bbd2cfa 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -107,20 +107,20 @@ static status_t validate_chunk(const ResChunk_header* chunk,
if ((ssize_t)size <= (dataEnd-((const uint8_t*)chunk))) {
return NO_ERROR;
}
- LOGW("%s data size %p extends beyond resource end %p.",
+ ALOGW("%s data size %p extends beyond resource end %p.",
name, (void*)size,
(void*)(dataEnd-((const uint8_t*)chunk)));
return BAD_TYPE;
}
- LOGW("%s size 0x%x or headerSize 0x%x is not on an integer boundary.",
+ ALOGW("%s size 0x%x or headerSize 0x%x is not on an integer boundary.",
name, (int)size, (int)headerSize);
return BAD_TYPE;
}
- LOGW("%s size %p is smaller than header size %p.",
+ ALOGW("%s size %p is smaller than header size %p.",
name, (void*)size, (void*)(int)headerSize);
return BAD_TYPE;
}
- LOGW("%s header size %p is too small.",
+ ALOGW("%s header size %p is too small.",
name, (void*)(int)headerSize);
return BAD_TYPE;
}
@@ -221,11 +221,11 @@ static void deserializeInternal(const void* inData, Res_png_9patch* outData) {
static bool assertIdmapHeader(const uint32_t* map, size_t sizeBytes)
{
if (sizeBytes < ResTable::IDMAP_HEADER_SIZE_BYTES) {
- LOGW("idmap assertion failed: size=%d bytes\n", sizeBytes);
+ ALOGW("idmap assertion failed: size=%d bytes\n", sizeBytes);
return false;
}
if (*map != htodl(IDMAP_MAGIC)) { // htodl: map data expected to be in correct endianess
- LOGW("idmap assertion failed: invalid magic found (is 0x%08x, expected 0x%08x)\n",
+ ALOGW("idmap assertion failed: invalid magic found (is 0x%08x, expected 0x%08x)\n",
*map, htodl(IDMAP_MAGIC));
return false;
}
@@ -246,11 +246,11 @@ static status_t idmapLookup(const uint32_t* map, size_t sizeBytes, uint32_t key,
const uint32_t typeCount = *map;
if (type > typeCount) {
- LOGW("Resource ID map: type=%d exceeds number of types=%d\n", type, typeCount);
+ ALOGW("Resource ID map: type=%d exceeds number of types=%d\n", type, typeCount);
return UNKNOWN_ERROR;
}
if (typeCount > size) {
- LOGW("Resource ID map: number of types=%d exceeds size of map=%d\n", typeCount, size);
+ ALOGW("Resource ID map: number of types=%d exceeds size of map=%d\n", typeCount, size);
return UNKNOWN_ERROR;
}
const uint32_t typeOffset = map[type];
@@ -259,7 +259,7 @@ static status_t idmapLookup(const uint32_t* map, size_t sizeBytes, uint32_t key,
return NO_ERROR;
}
if (typeOffset + 1 > size) {
- LOGW("Resource ID map: type offset=%d exceeds reasonable value, size of map=%d\n",
+ ALOGW("Resource ID map: type offset=%d exceeds reasonable value, size of map=%d\n",
typeOffset, size);
return UNKNOWN_ERROR;
}
@@ -271,7 +271,7 @@ static status_t idmapLookup(const uint32_t* map, size_t sizeBytes, uint32_t key,
}
const uint32_t index = typeOffset + 2 + entry - entryOffset;
if (index > size) {
- LOGW("Resource ID map: entry index=%d exceeds size of map=%d\n", index, size);
+ ALOGW("Resource ID map: entry index=%d exceeds size of map=%d\n", index, size);
*outValue = 0;
return NO_ERROR;
}
@@ -296,7 +296,7 @@ static status_t getIdmapPackageId(const uint32_t* map, size_t mapSize, uint32_t
Res_png_9patch* Res_png_9patch::deserialize(const void* inData)
{
if (sizeof(void*) != sizeof(int32_t)) {
- LOGE("Cannot deserialize on non 32-bit system\n");
+ ALOGE("Cannot deserialize on non 32-bit system\n");
return NULL;
}
deserializeInternal(inData, (Res_png_9patch*) inData);
@@ -358,7 +358,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
if (mHeader->header.headerSize > mHeader->header.size
|| mHeader->header.size > size) {
- LOGW("Bad string block: header size %d or total size %d is larger than data size %d\n",
+ ALOGW("Bad string block: header size %d or total size %d is larger than data size %d\n",
(int)mHeader->header.headerSize, (int)mHeader->header.size, (int)size);
return (mError=BAD_TYPE);
}
@@ -370,7 +370,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
if ((mHeader->stringCount*sizeof(uint32_t) < mHeader->stringCount) // uint32 overflow?
|| (mHeader->header.headerSize+(mHeader->stringCount*sizeof(uint32_t)))
> size) {
- LOGW("Bad string block: entry of %d items extends past data size %d\n",
+ ALOGW("Bad string block: entry of %d items extends past data size %d\n",
(int)(mHeader->header.headerSize+(mHeader->stringCount*sizeof(uint32_t))),
(int)size);
return (mError=BAD_TYPE);
@@ -388,7 +388,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
mStrings = (const void*)
(((const uint8_t*)data)+mHeader->stringsStart);
if (mHeader->stringsStart >= (mHeader->header.size-sizeof(uint16_t))) {
- LOGW("Bad string block: string pool starts at %d, after total size %d\n",
+ ALOGW("Bad string block: string pool starts at %d, after total size %d\n",
(int)mHeader->stringsStart, (int)mHeader->header.size);
return (mError=BAD_TYPE);
}
@@ -398,13 +398,13 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
} else {
// check invariant: styles starts before end of data
if (mHeader->stylesStart >= (mHeader->header.size-sizeof(uint16_t))) {
- LOGW("Bad style block: style block starts at %d past data size of %d\n",
+ ALOGW("Bad style block: style block starts at %d past data size of %d\n",
(int)mHeader->stylesStart, (int)mHeader->header.size);
return (mError=BAD_TYPE);
}
// check invariant: styles follow the strings
if (mHeader->stylesStart <= mHeader->stringsStart) {
- LOGW("Bad style block: style block starts at %d, before strings at %d\n",
+ ALOGW("Bad style block: style block starts at %d, before strings at %d\n",
(int)mHeader->stylesStart, (int)mHeader->stringsStart);
return (mError=BAD_TYPE);
}
@@ -414,7 +414,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
// check invariant: stringCount > 0 requires a string pool to exist
if (mStringPoolSize == 0) {
- LOGW("Bad string block: stringCount is %d but pool size is 0\n", (int)mHeader->stringCount);
+ ALOGW("Bad string block: stringCount is %d but pool size is 0\n", (int)mHeader->stringCount);
return (mError=BAD_TYPE);
}
@@ -437,7 +437,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
((uint8_t*)mStrings)[mStringPoolSize-1] != 0) ||
(!mHeader->flags&ResStringPool_header::UTF8_FLAG &&
((char16_t*)mStrings)[mStringPoolSize-1] != 0)) {
- LOGW("Bad string block: last string is not 0-terminated\n");
+ ALOGW("Bad string block: last string is not 0-terminated\n");
return (mError=BAD_TYPE);
}
} else {
@@ -449,12 +449,12 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
mEntryStyles = mEntries + mHeader->stringCount;
// invariant: integer overflow in calculating mEntryStyles
if (mEntryStyles < mEntries) {
- LOGW("Bad string block: integer overflow finding styles\n");
+ ALOGW("Bad string block: integer overflow finding styles\n");
return (mError=BAD_TYPE);
}
if (((const uint8_t*)mEntryStyles-(const uint8_t*)mHeader) > (int)size) {
- LOGW("Bad string block: entry of %d styles extends past data size %d\n",
+ ALOGW("Bad string block: entry of %d styles extends past data size %d\n",
(int)((const uint8_t*)mEntryStyles-(const uint8_t*)mHeader),
(int)size);
return (mError=BAD_TYPE);
@@ -462,7 +462,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
mStyles = (const uint32_t*)
(((const uint8_t*)data)+mHeader->stylesStart);
if (mHeader->stylesStart >= mHeader->header.size) {
- LOGW("Bad string block: style pool starts %d, after total size %d\n",
+ ALOGW("Bad string block: style pool starts %d, after total size %d\n",
(int)mHeader->stylesStart, (int)mHeader->header.size);
return (mError=BAD_TYPE);
}
@@ -487,7 +487,7 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
};
if (memcmp(&mStyles[mStylePoolSize-(sizeof(endSpan)/sizeof(uint32_t))],
&endSpan, sizeof(endSpan)) != 0) {
- LOGW("Bad string block: last style is not 0xFFFFFFFF-terminated\n");
+ ALOGW("Bad string block: last style is not 0xFFFFFFFF-terminated\n");
return (mError=BAD_TYPE);
}
} else {
@@ -581,7 +581,7 @@ const uint16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const
if ((uint32_t)(str+*u16len-strings) < mStringPoolSize) {
return str;
} else {
- LOGW("Bad string block: string #%d extends to %d, past end at %d\n",
+ ALOGW("Bad string block: string #%d extends to %d, past end at %d\n",
(int)idx, (int)(str+*u16len-strings), (int)mStringPoolSize);
}
} else {
@@ -601,7 +601,7 @@ const uint16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const
ssize_t actualLen = utf8_to_utf16_length(u8str, u8len);
if (actualLen < 0 || (size_t)actualLen != *u16len) {
- LOGW("Bad string block: string #%lld decoded length is not correct "
+ ALOGW("Bad string block: string #%lld decoded length is not correct "
"%lld vs %llu\n",
(long long)idx, (long long)actualLen, (long long)*u16len);
return NULL;
@@ -609,7 +609,7 @@ const uint16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const
char16_t *u16str = (char16_t *)calloc(*u16len+1, sizeof(char16_t));
if (!u16str) {
- LOGW("No memory when trying to allocate decode cache for string #%d\n",
+ ALOGW("No memory when trying to allocate decode cache for string #%d\n",
(int)idx);
return NULL;
}
@@ -618,13 +618,13 @@ const uint16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const
mCache[idx] = u16str;
return u16str;
} else {
- LOGW("Bad string block: string #%lld extends to %lld, past end at %lld\n",
+ ALOGW("Bad string block: string #%lld extends to %lld, past end at %lld\n",
(long long)idx, (long long)(u8str+u8len-strings),
(long long)mStringPoolSize);
}
}
} else {
- LOGW("Bad string block: string #%d entry is at %d, past end at %d\n",
+ ALOGW("Bad string block: string #%d entry is at %d, past end at %d\n",
(int)idx, (int)(off*sizeof(uint16_t)),
(int)(mStringPoolSize*sizeof(uint16_t)));
}
@@ -646,12 +646,12 @@ const char* ResStringPool::string8At(size_t idx, size_t* outLen) const
if ((uint32_t)(str+encLen-strings) < mStringPoolSize) {
return (const char*)str;
} else {
- LOGW("Bad string block: string #%d extends to %d, past end at %d\n",
+ ALOGW("Bad string block: string #%d extends to %d, past end at %d\n",
(int)idx, (int)(str+encLen-strings), (int)mStringPoolSize);
}
}
} else {
- LOGW("Bad string block: string #%d entry is at %d, past end at %d\n",
+ ALOGW("Bad string block: string #%d entry is at %d, past end at %d\n",
(int)idx, (int)(off*sizeof(uint16_t)),
(int)(mStringPoolSize*sizeof(uint16_t)));
}
@@ -671,7 +671,7 @@ const ResStringPool_span* ResStringPool::styleAt(size_t idx) const
if (off < mStylePoolSize) {
return (const ResStringPool_span*)(mStyles+off);
} else {
- LOGW("Bad string block: style #%d entry is at %d, past end at %d\n",
+ ALOGW("Bad string block: style #%d entry is at %d, past end at %d\n",
(int)idx, (int)(off*sizeof(uint32_t)),
(int)(mStylePoolSize*sizeof(uint32_t)));
}
@@ -1087,7 +1087,7 @@ ResXMLParser::event_code_t ResXMLParser::nextNode()
do {
const ResXMLTree_node* next = (const ResXMLTree_node*)
(((const uint8_t*)mCurNode) + dtohl(mCurNode->header.size));
- //LOGW("Next node: prev=%p, next=%p\n", mCurNode, next);
+ //ALOGW("Next node: prev=%p, next=%p\n", mCurNode, next);
if (((const uint8_t*)next) >= mTree.mDataEnd) {
mCurNode = NULL;
@@ -1120,14 +1120,14 @@ ResXMLParser::event_code_t ResXMLParser::nextNode()
minExtSize = sizeof(ResXMLTree_cdataExt);
break;
default:
- LOGW("Unknown XML block: header type %d in node at %d\n",
+ ALOGW("Unknown XML block: header type %d in node at %d\n",
(int)dtohs(next->header.type),
(int)(((const uint8_t*)next)-((const uint8_t*)mTree.mHeader)));
continue;
}
if ((totalSize-headerSize) < minExtSize) {
- LOGW("Bad XML block: header type 0x%x in node at 0x%x has size %d, need %d\n",
+ ALOGW("Bad XML block: header type 0x%x in node at 0x%x has size %d, need %d\n",
(int)dtohs(next->header.type),
(int)(((const uint8_t*)next)-((const uint8_t*)mTree.mHeader)),
(int)(totalSize-headerSize), (int)minExtSize);
@@ -1164,7 +1164,7 @@ ResXMLTree::ResXMLTree()
: ResXMLParser(*this)
, mError(NO_INIT), mOwnedData(NULL)
{
- //LOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
+ //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
restart();
}
@@ -1172,13 +1172,13 @@ ResXMLTree::ResXMLTree(const void* data, size_t size, bool copyData)
: ResXMLParser(*this)
, mError(NO_INIT), mOwnedData(NULL)
{
- //LOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
+ //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
setTo(data, size, copyData);
}
ResXMLTree::~ResXMLTree()
{
- //LOGI("Destroying ResXMLTree in %p #%d\n", this, android_atomic_dec(&gCount)-1);
+ //ALOGI("Destroying ResXMLTree in %p #%d\n", this, android_atomic_dec(&gCount)-1);
uninit();
}
@@ -1199,7 +1199,7 @@ status_t ResXMLTree::setTo(const void* data, size_t size, bool copyData)
mHeader = (const ResXMLTree_header*)data;
mSize = dtohl(mHeader->header.size);
if (dtohs(mHeader->header.headerSize) > mSize || mSize > size) {
- LOGW("Bad XML block: header size %d or total size %d is larger than data size %d\n",
+ ALOGW("Bad XML block: header size %d or total size %d is larger than data size %d\n",
(int)dtohs(mHeader->header.headerSize),
(int)dtohl(mHeader->header.size), (int)size);
mError = BAD_TYPE;
@@ -1259,7 +1259,7 @@ status_t ResXMLTree::setTo(const void* data, size_t size, bool copyData)
}
if (mRootNode == NULL) {
- LOGW("Bad XML block: no root element node found\n");
+ ALOGW("Bad XML block: no root element node found\n");
mError = BAD_TYPE;
goto done;
}
@@ -1313,12 +1313,12 @@ status_t ResXMLTree::validateNode(const ResXMLTree_node* node) const
if ((dtohs(attrExt->attributeStart)+attrSize) <= (size-headerSize)) {
return NO_ERROR;
}
- LOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n",
+ ALOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n",
(unsigned int)(dtohs(attrExt->attributeStart)+attrSize),
(unsigned int)(size-headerSize));
}
else {
- LOGW("Bad XML start block: node header size 0x%x, size 0x%x\n",
+ ALOGW("Bad XML start block: node header size 0x%x, size 0x%x\n",
(unsigned int)headerSize, (unsigned int)size);
}
return BAD_TYPE;
@@ -1342,21 +1342,21 @@ status_t ResXMLTree::validateNode(const ResXMLTree_node* node) const
<= (size-headerSize)) {
return NO_ERROR;
}
- LOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n",
+ ALOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n",
((int)dtohs(node->attributeSize))*dtohs(node->attributeCount),
(int)(size-headerSize));
return BAD_TYPE;
}
- LOGW("Bad XML block: node at 0x%x extends beyond data end 0x%x\n",
+ ALOGW("Bad XML block: node at 0x%x extends beyond data end 0x%x\n",
(int)(((const uint8_t*)node)-((const uint8_t*)mHeader)), (int)mSize);
return BAD_TYPE;
}
- LOGW("Bad XML block: node at 0x%x header size 0x%x smaller than total size 0x%x\n",
+ ALOGW("Bad XML block: node at 0x%x header size 0x%x smaller than total size 0x%x\n",
(int)(((const uint8_t*)node)-((const uint8_t*)mHeader)),
(int)headerSize, (int)size);
return BAD_TYPE;
}
- LOGW("Bad XML block: node at 0x%x header size 0x%x too small\n",
+ ALOGW("Bad XML block: node at 0x%x header size 0x%x too small\n",
(int)(((const uint8_t*)node)-((const uint8_t*)mHeader)),
(int)headerSize);
return BAD_TYPE;
@@ -1574,7 +1574,7 @@ status_t ResTable::Theme::applyStyle(uint32_t resID, bool force)
if (curPackage != p) {
const ssize_t pidx = mTable.getResourcePackageIndex(attrRes);
if (pidx < 0) {
- LOGE("Style contains key with bad package: 0x%08x\n", attrRes);
+ ALOGE("Style contains key with bad package: 0x%08x\n", attrRes);
bag++;
continue;
}
@@ -1594,7 +1594,7 @@ status_t ResTable::Theme::applyStyle(uint32_t resID, bool force)
}
if (curType != t) {
if (t >= curPI->numTypes) {
- LOGE("Style contains key with bad type: 0x%08x\n", attrRes);
+ ALOGE("Style contains key with bad type: 0x%08x\n", attrRes);
bag++;
continue;
}
@@ -1612,7 +1612,7 @@ status_t ResTable::Theme::applyStyle(uint32_t resID, bool force)
numEntries = curPI->types[t].numEntries;
}
if (e >= numEntries) {
- LOGE("Style contains key with bad entry: 0x%08x\n", attrRes);
+ ALOGE("Style contains key with bad entry: 0x%08x\n", attrRes);
bag++;
continue;
}
@@ -1631,7 +1631,7 @@ status_t ResTable::Theme::applyStyle(uint32_t resID, bool force)
mTable.unlock();
- //LOGI("Applying style 0x%08x (force=%d) theme %p...\n", resID, force, this);
+ //ALOGI("Applying style 0x%08x (force=%d) theme %p...\n", resID, force, this);
//dumpToLog();
return NO_ERROR;
@@ -1639,7 +1639,7 @@ status_t ResTable::Theme::applyStyle(uint32_t resID, bool force)
status_t ResTable::Theme::setTo(const Theme& other)
{
- //LOGI("Setting theme %p from theme %p...\n", this, &other);
+ //ALOGI("Setting theme %p from theme %p...\n", this, &other);
//dumpToLog();
//other.dumpToLog();
@@ -1670,7 +1670,7 @@ status_t ResTable::Theme::setTo(const Theme& other)
}
}
- //LOGI("Final theme:");
+ //ALOGI("Final theme:");
//dumpToLog();
return NO_ERROR;
@@ -1712,7 +1712,7 @@ ssize_t ResTable::Theme::getAttribute(uint32_t resID, Res_value* outValue,
resID = te.value.data;
continue;
}
- LOGW("Too many attribute references, stopped at: 0x%08x\n", resID);
+ ALOGW("Too many attribute references, stopped at: 0x%08x\n", resID);
return BAD_INDEX;
} else if (type != Res_value::TYPE_NULL) {
*outValue = te.value;
@@ -1752,21 +1752,21 @@ ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue,
void ResTable::Theme::dumpToLog() const
{
- LOGI("Theme %p:\n", this);
+ ALOGI("Theme %p:\n", this);
for (size_t i=0; i<Res_MAXPACKAGE; i++) {
package_info* pi = mPackages[i];
if (pi == NULL) continue;
- LOGI(" Package #0x%02x:\n", (int)(i+1));
+ ALOGI(" Package #0x%02x:\n", (int)(i+1));
for (size_t j=0; j<pi->numTypes; j++) {
type_info& ti = pi->types[j];
if (ti.numEntries == 0) continue;
- LOGI(" Type #0x%02x:\n", (int)(j+1));
+ ALOGI(" Type #0x%02x:\n", (int)(j+1));
for (size_t k=0; k<ti.numEntries; k++) {
theme_entry& te = ti.entries[k];
if (te.value.dataType == Res_value::TYPE_NULL) continue;
- LOGI(" 0x%08x: t=0x%x, d=0x%08x (block=%d)\n",
+ ALOGI(" 0x%08x: t=0x%x, d=0x%08x (block=%d)\n",
(int)Res_MAKEID(i, j, k),
te.value.dataType, (int)te.value.data, (int)te.stringBlock);
}
@@ -1779,7 +1779,7 @@ ResTable::ResTable()
{
memset(&mParams, 0, sizeof(mParams));
memset(mPackageMap, 0, sizeof(mPackageMap));
- //LOGI("Creating ResTable %p\n", this);
+ //ALOGI("Creating ResTable %p\n", this);
}
ResTable::ResTable(const void* data, size_t size, void* cookie, bool copyData)
@@ -1789,12 +1789,12 @@ ResTable::ResTable(const void* data, size_t size, void* cookie, bool copyData)
memset(mPackageMap, 0, sizeof(mPackageMap));
add(data, size, cookie, copyData);
LOG_FATAL_IF(mError != NO_ERROR, "Error parsing resource table");
- //LOGI("Creating ResTable %p\n", this);
+ //ALOGI("Creating ResTable %p\n", this);
}
ResTable::~ResTable()
{
- //LOGI("Destroying ResTable in %p\n", this);
+ //ALOGI("Destroying ResTable in %p\n", this);
uninit();
}
@@ -1813,7 +1813,7 @@ status_t ResTable::add(Asset* asset, void* cookie, bool copyData, const void* id
{
const void* data = asset->getBuffer(true);
if (data == NULL) {
- LOGW("Unable to get buffer of resource asset file");
+ ALOGW("Unable to get buffer of resource asset file");
return UNKNOWN_ERROR;
}
size_t size = (size_t)asset->getLength();
@@ -1881,20 +1881,20 @@ status_t ResTable::add(const void* data, size_t size, void* cookie,
header->header = (const ResTable_header*)data;
header->size = dtohl(header->header->header.size);
- //LOGI("Got size 0x%x, again size 0x%x, raw size 0x%x\n", header->size,
+ //ALOGI("Got size 0x%x, again size 0x%x, raw size 0x%x\n", header->size,
// dtohl(header->header->header.size), header->header->header.size);
LOAD_TABLE_NOISY(LOGV("Loading ResTable @%p:\n", header->header));
LOAD_TABLE_NOISY(printHexData(2, header->header, header->size < 256 ? header->size : 256,
16, 16, 0, false, printToLogFunc));
if (dtohs(header->header->header.headerSize) > header->size
|| header->size > size) {
- LOGW("Bad resource table: header size 0x%x or total size 0x%x is larger than data size 0x%x\n",
+ ALOGW("Bad resource table: header size 0x%x or total size 0x%x is larger than data size 0x%x\n",
(int)dtohs(header->header->header.headerSize),
(int)header->size, (int)size);
return (mError=BAD_TYPE);
}
if (((dtohs(header->header->header.headerSize)|header->size)&0x3) != 0) {
- LOGW("Bad resource table: header size 0x%x or total size 0x%x is not on an integer boundary\n",
+ ALOGW("Bad resource table: header size 0x%x or total size 0x%x is not on an integer boundary\n",
(int)dtohs(header->header->header.headerSize),
(int)header->size);
return (mError=BAD_TYPE);
@@ -1927,11 +1927,11 @@ status_t ResTable::add(const void* data, size_t size, void* cookie,
return (mError=err);
}
} else {
- LOGW("Multiple string chunks found in resource table.");
+ ALOGW("Multiple string chunks found in resource table.");
}
} else if (ctype == RES_TABLE_PACKAGE_TYPE) {
if (curPackage >= dtohl(header->header->packageCount)) {
- LOGW("More package chunks were found than the %d declared in the header.",
+ ALOGW("More package chunks were found than the %d declared in the header.",
dtohl(header->header->packageCount));
return (mError=BAD_TYPE);
}
@@ -1949,7 +1949,7 @@ status_t ResTable::add(const void* data, size_t size, void* cookie,
}
curPackage++;
} else {
- LOGW("Unknown chunk type %p in table at %p.\n",
+ ALOGW("Unknown chunk type %p in table at %p.\n",
(void*)(int)(ctype),
(void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header)));
}
@@ -1958,13 +1958,13 @@ status_t ResTable::add(const void* data, size_t size, void* cookie,
}
if (curPackage < dtohl(header->header->packageCount)) {
- LOGW("Fewer package chunks (%d) were found than the %d declared in the header.",
+ ALOGW("Fewer package chunks (%d) were found than the %d declared in the header.",
(int)curPackage, dtohl(header->header->packageCount));
return (mError=BAD_TYPE);
}
mError = header->values.getError();
if (mError != NO_ERROR) {
- LOGW("No string values found in resource table!");
+ ALOGW("No string values found in resource table!");
}
TABLE_NOISY(LOGV("Returning from add with mError=%d\n", mError));
@@ -2011,20 +2011,20 @@ bool ResTable::getResourceName(uint32_t resID, resource_name* outName) const
if (p < 0) {
if (Res_GETPACKAGE(resID)+1 == 0) {
- LOGW("No package identifier when getting name for resource number 0x%08x", resID);
+ ALOGW("No package identifier when getting name for resource number 0x%08x", resID);
} else {
- LOGW("No known package when getting name for resource number 0x%08x", resID);
+ ALOGW("No known package when getting name for resource number 0x%08x", resID);
}
return false;
}
if (t < 0) {
- LOGW("No type identifier when getting name for resource number 0x%08x", resID);
+ ALOGW("No type identifier when getting name for resource number 0x%08x", resID);
return false;
}
const PackageGroup* const grp = mPackageGroups[p];
if (grp == NULL) {
- LOGW("Bad identifier when getting name for resource number 0x%08x", resID);
+ ALOGW("Bad identifier when getting name for resource number 0x%08x", resID);
return false;
}
if (grp->packages.size() > 0) {
@@ -2067,14 +2067,14 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
if (p < 0) {
if (Res_GETPACKAGE(resID)+1 == 0) {
- LOGW("No package identifier when getting value for resource number 0x%08x", resID);
+ ALOGW("No package identifier when getting value for resource number 0x%08x", resID);
} else {
- LOGW("No known package when getting value for resource number 0x%08x", resID);
+ ALOGW("No known package when getting value for resource number 0x%08x", resID);
}
return BAD_INDEX;
}
if (t < 0) {
- LOGW("No type identifier when getting value for resource number 0x%08x", resID);
+ ALOGW("No type identifier when getting value for resource number 0x%08x", resID);
return BAD_INDEX;
}
@@ -2089,7 +2089,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
// recently added.
const PackageGroup* const grp = mPackageGroups[p];
if (grp == NULL) {
- LOGW("Bad identifier when getting value for resource number 0x%08x", resID);
+ ALOGW("Bad identifier when getting value for resource number 0x%08x", resID);
return BAD_INDEX;
}
@@ -2099,7 +2099,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
if (density > 0) {
overrideConfig = (ResTable_config*) malloc(sizeof(ResTable_config));
if (overrideConfig == NULL) {
- LOGE("Couldn't malloc ResTable_config for overrides: %s", strerror(errno));
+ ALOGE("Couldn't malloc ResTable_config for overrides: %s", strerror(errno));
return BAD_INDEX;
}
memcpy(overrideConfig, &mParams, sizeof(ResTable_config));
@@ -2141,7 +2141,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
// overlay package did not specify a default.
// Non-overlay packages are still required to provide a default.
if (offset < 0 && ip == 0) {
- LOGW("Failure getting entry for 0x%08x (t=%d e=%d) in package %zd (error %d)\n",
+ ALOGW("Failure getting entry for 0x%08x (t=%d e=%d) in package %zd (error %d)\n",
resID, T, E, ip, (int)offset);
rc = offset;
goto out;
@@ -2151,7 +2151,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
if ((dtohs(entry->flags)&entry->FLAG_COMPLEX) != 0) {
if (!mayBeBag) {
- LOGW("Requesting resource %p failed because it is complex\n",
+ ALOGW("Requesting resource %p failed because it is complex\n",
(void*)resID);
}
continue;
@@ -2161,7 +2161,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
<< HexDump(type, dtohl(type->header.size)) << endl);
if ((size_t)offset > (dtohl(type->header.size)-sizeof(Res_value))) {
- LOGW("ResTable_item at %d is beyond type chunk data %d",
+ ALOGW("ResTable_item at %d is beyond type chunk data %d",
(int)offset, dtohl(type->header.size));
rc = BAD_TYPE;
goto out;
@@ -2307,23 +2307,23 @@ ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag,
const int e = Res_GETENTRY(resID);
if (p < 0) {
- LOGW("Invalid package identifier when getting bag for resource number 0x%08x", resID);
+ ALOGW("Invalid package identifier when getting bag for resource number 0x%08x", resID);
return BAD_INDEX;
}
if (t < 0) {
- LOGW("No type identifier when getting bag for resource number 0x%08x", resID);
+ ALOGW("No type identifier when getting bag for resource number 0x%08x", resID);
return BAD_INDEX;
}
//printf("Get bag: id=0x%08x, p=%d, t=%d\n", resID, p, t);
PackageGroup* const grp = mPackageGroups[p];
if (grp == NULL) {
- LOGW("Bad identifier when getting bag for resource number 0x%08x", resID);
+ ALOGW("Bad identifier when getting bag for resource number 0x%08x", resID);
return false;
}
if (t >= (int)grp->typeCount) {
- LOGW("Type identifier 0x%x is larger than type count 0x%x",
+ ALOGW("Type identifier 0x%x is larger than type count 0x%x",
t+1, (int)grp->typeCount);
return BAD_INDEX;
}
@@ -2334,7 +2334,7 @@ ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag,
const size_t NENTRY = typeConfigs->entryCount;
if (e >= (int)NENTRY) {
- LOGW("Entry identifier 0x%x is larger than entry count 0x%x",
+ ALOGW("Entry identifier 0x%x is larger than entry count 0x%x",
e, (int)typeConfigs->entryCount);
return BAD_INDEX;
}
@@ -2350,10 +2350,10 @@ ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag,
*outTypeSpecFlags = set->typeSpecFlags;
}
*outBag = (bag_entry*)(set+1);
- //LOGI("Found existing bag for: %p\n", (void*)resID);
+ //ALOGI("Found existing bag for: %p\n", (void*)resID);
return set->numAttrs;
}
- LOGW("Attempt to retrieve bag 0x%08x which is invalid or in a cycle.",
+ ALOGW("Attempt to retrieve bag 0x%08x which is invalid or in a cycle.",
resID);
return BAD_INDEX;
}
@@ -2429,7 +2429,7 @@ ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag,
}
if ((dtohs(entry->flags)&entry->FLAG_COMPLEX) == 0) {
- LOGW("Skipping entry %p in package table %d because it is not complex!\n",
+ ALOGW("Skipping entry %p in package table %d because it is not complex!\n",
(void*)resID, (int)ip);
continue;
}
@@ -2505,7 +2505,7 @@ ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag,
TABLE_NOISY(printf("Now at %p\n", (void*)curOff));
if ((size_t)curOff > (dtohl(type->header.size)-sizeof(ResTable_map))) {
- LOGW("ResTable_map at %d is beyond type chunk data %d",
+ ALOGW("ResTable_map at %d is beyond type chunk data %d",
(int)curOff, dtohl(type->header.size));
return BAD_TYPE;
}
@@ -2676,7 +2676,7 @@ nope:
&& name[6] == '_') {
int index = atoi(String8(name + 7, nameLen - 7).string());
if (Res_CHECKID(index)) {
- LOGW("Array resource index: %d is too large.",
+ ALOGW("Array resource index: %d is too large.",
index);
return 0;
}
@@ -2792,12 +2792,12 @@ nope:
offset += typeOffset;
if (offset > (dtohl(ty->header.size)-sizeof(ResTable_entry))) {
- LOGW("ResTable_entry at %d is beyond type chunk data %d",
+ ALOGW("ResTable_entry at %d is beyond type chunk data %d",
offset, dtohl(ty->header.size));
return 0;
}
if ((offset&0x3) != 0) {
- LOGW("ResTable_entry at %d (pkg=%d type=%d ent=%d) is not on an integer boundary when looking for %s:%s/%s",
+ ALOGW("ResTable_entry at %d (pkg=%d type=%d ent=%d) is not on an integer boundary when looking for %s:%s/%s",
(int)offset, (int)group->id, (int)ti+1, (int)i,
String8(package, packageLen).string(),
String8(type, typeLen).string(),
@@ -2808,7 +2808,7 @@ nope:
const ResTable_entry* const entry = (const ResTable_entry*)
(((const uint8_t*)ty) + offset);
if (dtohs(entry->size) < sizeof(*entry)) {
- LOGW("ResTable_entry size %d is too small", dtohs(entry->size));
+ ALOGW("ResTable_entry size %d is too small", dtohs(entry->size));
return BAD_TYPE;
}
@@ -3935,7 +3935,7 @@ ssize_t ResTable::getEntry(
}
if ((size_t)entryIndex >= allTypes->entryCount) {
- LOGW("getEntry failing because entryIndex %d is beyond type entryCount %d",
+ ALOGW("getEntry failing because entryIndex %d is beyond type entryCount %d",
entryIndex, (int)allTypes->entryCount);
return BAD_TYPE;
}
@@ -4039,12 +4039,12 @@ ssize_t ResTable::getEntry(
<< ", offset=" << (void*)offset << endl);
if (offset > (dtohl(type->header.size)-sizeof(ResTable_entry))) {
- LOGW("ResTable_entry at 0x%x is beyond type chunk data 0x%x",
+ ALOGW("ResTable_entry at 0x%x is beyond type chunk data 0x%x",
offset, dtohl(type->header.size));
return BAD_TYPE;
}
if ((offset&0x3) != 0) {
- LOGW("ResTable_entry at 0x%x is not on an integer boundary",
+ ALOGW("ResTable_entry at 0x%x is not on an integer boundary",
offset);
return BAD_TYPE;
}
@@ -4052,7 +4052,7 @@ ssize_t ResTable::getEntry(
const ResTable_entry* const entry = (const ResTable_entry*)
(((const uint8_t*)type) + offset);
if (dtohs(entry->size) < sizeof(*entry)) {
- LOGW("ResTable_entry size 0x%x is too small", dtohs(entry->size));
+ ALOGW("ResTable_entry size 0x%x is too small", dtohs(entry->size));
return BAD_TYPE;
}
@@ -4077,22 +4077,22 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
const size_t pkgSize = dtohl(pkg->header.size);
if (dtohl(pkg->typeStrings) >= pkgSize) {
- LOGW("ResTable_package type strings at %p are past chunk size %p.",
+ ALOGW("ResTable_package type strings at %p are past chunk size %p.",
(void*)dtohl(pkg->typeStrings), (void*)pkgSize);
return (mError=BAD_TYPE);
}
if ((dtohl(pkg->typeStrings)&0x3) != 0) {
- LOGW("ResTable_package type strings at %p is not on an integer boundary.",
+ ALOGW("ResTable_package type strings at %p is not on an integer boundary.",
(void*)dtohl(pkg->typeStrings));
return (mError=BAD_TYPE);
}
if (dtohl(pkg->keyStrings) >= pkgSize) {
- LOGW("ResTable_package key strings at %p are past chunk size %p.",
+ ALOGW("ResTable_package key strings at %p are past chunk size %p.",
(void*)dtohl(pkg->keyStrings), (void*)pkgSize);
return (mError=BAD_TYPE);
}
if ((dtohl(pkg->keyStrings)&0x3) != 0) {
- LOGW("ResTable_package key strings at %p is not on an integer boundary.",
+ ALOGW("ResTable_package key strings at %p is not on an integer boundary.",
(void*)dtohl(pkg->keyStrings));
return (mError=BAD_TYPE);
}
@@ -4195,7 +4195,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
if ((dtohl(typeSpec->entryCount) > (INT32_MAX/sizeof(uint32_t))
|| dtohs(typeSpec->header.headerSize)+(sizeof(uint32_t)*dtohl(typeSpec->entryCount))
> typeSpecSize)) {
- LOGW("ResTable_typeSpec entry index to %p extends beyond chunk end %p.",
+ ALOGW("ResTable_typeSpec entry index to %p extends beyond chunk end %p.",
(void*)(dtohs(typeSpec->header.headerSize)
+(sizeof(uint32_t)*dtohl(typeSpec->entryCount))),
(void*)typeSpecSize);
@@ -4203,7 +4203,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
}
if (typeSpec->id == 0) {
- LOGW("ResTable_type has an id of 0.");
+ ALOGW("ResTable_type has an id of 0.");
return (mError=BAD_TYPE);
}
@@ -4215,7 +4215,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
t = new Type(header, package, dtohl(typeSpec->entryCount));
package->types.editItemAt(typeSpec->id-1) = t;
} else if (dtohl(typeSpec->entryCount) != t->entryCount) {
- LOGW("ResTable_typeSpec entry count inconsistent: given %d, previously %d",
+ ALOGW("ResTable_typeSpec entry count inconsistent: given %d, previously %d",
(int)dtohl(typeSpec->entryCount), (int)t->entryCount);
return (mError=BAD_TYPE);
}
@@ -4240,7 +4240,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
(void*)typeSize));
if (dtohs(type->header.headerSize)+(sizeof(uint32_t)*dtohl(type->entryCount))
> typeSize) {
- LOGW("ResTable_type entry index to %p extends beyond chunk end %p.",
+ ALOGW("ResTable_type entry index to %p extends beyond chunk end %p.",
(void*)(dtohs(type->header.headerSize)
+(sizeof(uint32_t)*dtohl(type->entryCount))),
(void*)typeSize);
@@ -4248,12 +4248,12 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
}
if (dtohl(type->entryCount) != 0
&& dtohl(type->entriesStart) > (typeSize-sizeof(ResTable_entry))) {
- LOGW("ResTable_type entriesStart at %p extends beyond chunk end %p.",
+ ALOGW("ResTable_type entriesStart at %p extends beyond chunk end %p.",
(void*)dtohl(type->entriesStart), (void*)typeSize);
return (mError=BAD_TYPE);
}
if (type->id == 0) {
- LOGW("ResTable_type has an id of 0.");
+ ALOGW("ResTable_type has an id of 0.");
return (mError=BAD_TYPE);
}
@@ -4265,7 +4265,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
t = new Type(header, package, dtohl(type->entryCount));
package->types.editItemAt(type->id-1) = t;
} else if (dtohl(type->entryCount) != t->entryCount) {
- LOGW("ResTable_type entry count inconsistent: given %d, previously %d",
+ ALOGW("ResTable_type entry count inconsistent: given %d, previously %d",
(int)dtohl(type->entryCount), (int)t->entryCount);
return (mError=BAD_TYPE);
}
@@ -4273,7 +4273,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
TABLE_GETENTRY(
ResTable_config thisConfig;
thisConfig.copyFromDtoH(type->config);
- LOGI("Adding config to type %d: imsi:%d/%d lang:%c%c cnt:%c%c "
+ ALOGI("Adding config to type %d: imsi:%d/%d lang:%c%c cnt:%c%c "
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d "
"swdp:%d wdp:%d hdp:%d\n",
type->id,
@@ -4346,7 +4346,7 @@ status_t ResTable::createIdmap(const ResTable& overlay, uint32_t originalCrc, ui
| (0x0000ffff & (entryIndex));
resource_name resName;
if (!this->getResourceName(resID, &resName)) {
- LOGW("idmap: resource 0x%08x has spec but lacks values, skipping\n", resID);
+ ALOGW("idmap: resource 0x%08x has spec but lacks values, skipping\n", resID);
continue;
}
diff --git a/libs/utils/Static.cpp b/libs/utils/Static.cpp
index ceca43552bc8..bfcb2da456b4 100644
--- a/libs/utils/Static.cpp
+++ b/libs/utils/Static.cpp
@@ -57,8 +57,8 @@ protected:
virtual status_t writeLines(const struct iovec& vec, size_t N)
{
//android_writevLog(&vec, N); <-- this is now a no-op
- if (N != 1) LOGI("WARNING: writeLines N=%d\n", N);
- LOGI("%.*s", vec.iov_len, (const char*) vec.iov_base);
+ if (N != 1) ALOGI("WARNING: writeLines N=%d\n", N);
+ ALOGI("%.*s", vec.iov_len, (const char*) vec.iov_base);
return NO_ERROR;
}
};
diff --git a/libs/utils/StreamingZipInflater.cpp b/libs/utils/StreamingZipInflater.cpp
index 59a46f977c7f..8512170ae900 100644
--- a/libs/utils/StreamingZipInflater.cpp
+++ b/libs/utils/StreamingZipInflater.cpp
@@ -138,7 +138,7 @@ ssize_t StreamingZipInflater::read(void* outBuf, size_t count) {
if (mInflateState.avail_in == 0) {
int err = readNextChunk();
if (err < 0) {
- LOGE("Unable to access asset data: %d", err);
+ ALOGE("Unable to access asset data: %d", err);
if (!mStreamNeedsInit) {
::inflateEnd(&mInflateState);
initInflateState();
@@ -165,7 +165,7 @@ ssize_t StreamingZipInflater::read(void* outBuf, size_t count) {
if (result == Z_OK) result = ::inflate(&mInflateState, Z_SYNC_FLUSH);
if (result < 0) {
// Whoops, inflation failed
- LOGE("Error inflating asset: %d", result);
+ ALOGE("Error inflating asset: %d", result);
::inflateEnd(&mInflateState);
initInflateState();
return -1;
@@ -195,7 +195,7 @@ int StreamingZipInflater::readNextChunk() {
//ALOGV("Reading input chunk, size %08x didread %08x", toRead, didRead);
if (didRead < 0) {
// TODO: error
- LOGE("Error reading asset data");
+ ALOGE("Error reading asset data");
return didRead;
} else {
mInNextChunkOffset += didRead;
diff --git a/libs/utils/SystemClock.cpp b/libs/utils/SystemClock.cpp
index 89a052fb97a4..8b8ac103151d 100644
--- a/libs/utils/SystemClock.cpp
+++ b/libs/utils/SystemClock.cpp
@@ -69,20 +69,20 @@ int setCurrentTimeMillis(int64_t millis)
#ifdef HAVE_ANDROID_OS
fd = open("/dev/alarm", O_RDWR);
if(fd < 0) {
- LOGW("Unable to open alarm driver: %s\n", strerror(errno));
+ ALOGW("Unable to open alarm driver: %s\n", strerror(errno));
return -1;
}
ts.tv_sec = tv.tv_sec;
ts.tv_nsec = tv.tv_usec * 1000;
res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts);
if(res < 0) {
- LOGW("Unable to set rtc to %ld: %s\n", tv.tv_sec, strerror(errno));
+ ALOGW("Unable to set rtc to %ld: %s\n", tv.tv_sec, strerror(errno));
ret = -1;
}
close(fd);
#else
if (settimeofday(&tv, NULL) != 0) {
- LOGW("Unable to set clock to %d.%d: %s\n",
+ ALOGW("Unable to set clock to %d.%d: %s\n",
(int) tv.tv_sec, (int) tv.tv_usec, strerror(errno));
ret = -1;
}
diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp
index fe4b8e62b2ca..e343c623521b 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -163,7 +163,7 @@ int androidCreateRawThreadEtc(android_thread_func_t entryFunction,
(android_pthread_entry)entryFunction, userData);
pthread_attr_destroy(&attr);
if (result != 0) {
- LOGE("androidCreateRawThreadEtc failed (entry=%p, res=%d, errno=%d)\n"
+ ALOGE("androidCreateRawThreadEtc failed (entry=%p, res=%d, errno=%d)\n"
"(android threadPriority=%d)",
entryFunction, result, errno, threadPriority);
return 0;
@@ -870,7 +870,7 @@ status_t Thread::requestExitAndWait()
{
Mutex::Autolock _l(mLock);
if (mThread == getThreadId()) {
- LOGW(
+ ALOGW(
"Thread (this=%p): don't call waitForExit() from this "
"Thread object's thread. It's a guaranteed deadlock!",
this);
@@ -894,7 +894,7 @@ status_t Thread::join()
{
Mutex::Autolock _l(mLock);
if (mThread == getThreadId()) {
- LOGW(
+ ALOGW(
"Thread (this=%p): don't call join() from this "
"Thread object's thread. It's a guaranteed deadlock!",
this);
diff --git a/libs/utils/Tokenizer.cpp b/libs/utils/Tokenizer.cpp
index 68752b412a59..efda2bfffd56 100644
--- a/libs/utils/Tokenizer.cpp
+++ b/libs/utils/Tokenizer.cpp
@@ -55,12 +55,12 @@ status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) {
int fd = ::open(filename.string(), O_RDONLY);
if (fd < 0) {
result = -errno;
- LOGE("Error opening file '%s', %s.", filename.string(), strerror(errno));
+ ALOGE("Error opening file '%s', %s.", filename.string(), strerror(errno));
} else {
struct stat stat;
if (fstat(fd, &stat)) {
result = -errno;
- LOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno));
+ ALOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno));
} else {
size_t length = size_t(stat.st_size);
@@ -80,7 +80,7 @@ status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) {
ssize_t nrd = read(fd, buffer, length);
if (nrd < 0) {
result = -errno;
- LOGE("Error reading file '%s', %s.", filename.string(), strerror(errno));
+ ALOGE("Error reading file '%s', %s.", filename.string(), strerror(errno));
delete[] buffer;
buffer = NULL;
} else {
diff --git a/libs/utils/ZipFileRO.cpp b/libs/utils/ZipFileRO.cpp
index 306935271aea..1498aac07e1e 100644
--- a/libs/utils/ZipFileRO.cpp
+++ b/libs/utils/ZipFileRO.cpp
@@ -120,7 +120,7 @@ int ZipFileRO::entryToIndex(const ZipEntryRO entry) const
{
long ent = ((long) entry) - kZipEntryAdj;
if (ent < 0 || ent >= mHashTableSize || mHashTable[ent].name == NULL) {
- LOGW("Invalid ZipEntryRO %p (%ld)\n", entry, ent);
+ ALOGW("Invalid ZipEntryRO %p (%ld)\n", entry, ent);
return -1;
}
return ent;
@@ -142,7 +142,7 @@ status_t ZipFileRO::open(const char* zipFileName)
*/
fd = ::open(zipFileName, O_RDONLY | O_BINARY);
if (fd < 0) {
- LOGW("Unable to open zip '%s': %s\n", zipFileName, strerror(errno));
+ ALOGW("Unable to open zip '%s': %s\n", zipFileName, strerror(errno));
return NAME_NOT_FOUND;
}
@@ -194,7 +194,7 @@ bool ZipFileRO::mapCentralDirectory(void)
unsigned char* scanBuf = (unsigned char*) malloc(readAmount);
if (scanBuf == NULL) {
- LOGW("couldn't allocate scanBuf: %s", strerror(errno));
+ ALOGW("couldn't allocate scanBuf: %s", strerror(errno));
free(scanBuf);
return false;
}
@@ -203,14 +203,14 @@ bool ZipFileRO::mapCentralDirectory(void)
* Make sure this is a Zip archive.
*/
if (lseek64(mFd, 0, SEEK_SET) != 0) {
- LOGW("seek to start failed: %s", strerror(errno));
+ ALOGW("seek to start failed: %s", strerror(errno));
free(scanBuf);
return false;
}
ssize_t actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, sizeof(int32_t)));
if (actual != (ssize_t) sizeof(int32_t)) {
- LOGI("couldn't read first signature from zip archive: %s", strerror(errno));
+ ALOGI("couldn't read first signature from zip archive: %s", strerror(errno));
free(scanBuf);
return false;
}
@@ -218,7 +218,7 @@ bool ZipFileRO::mapCentralDirectory(void)
{
unsigned int header = get4LE(scanBuf);
if (header == kEOCDSignature) {
- LOGI("Found Zip archive, but it looks empty\n");
+ ALOGI("Found Zip archive, but it looks empty\n");
free(scanBuf);
return false;
} else if (header != kLFHSignature) {
@@ -243,13 +243,13 @@ bool ZipFileRO::mapCentralDirectory(void)
off64_t searchStart = mFileLength - readAmount;
if (lseek64(mFd, searchStart, SEEK_SET) != searchStart) {
- LOGW("seek %ld failed: %s\n", (long) searchStart, strerror(errno));
+ ALOGW("seek %ld failed: %s\n", (long) searchStart, strerror(errno));
free(scanBuf);
return false;
}
actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, readAmount));
if (actual != (ssize_t) readAmount) {
- LOGW("Zip: read " ZD ", expected " ZD ". Failed: %s\n",
+ ALOGW("Zip: read " ZD ", expected " ZD ". Failed: %s\n",
(ZD_TYPE) actual, (ZD_TYPE) readAmount, strerror(errno));
free(scanBuf);
return false;
@@ -290,12 +290,12 @@ bool ZipFileRO::mapCentralDirectory(void)
// Verify that they look reasonable.
if ((long long) dirOffset + (long long) dirSize > (long long) eocdOffset) {
- LOGW("bad offsets (dir %ld, size %u, eocd %ld)\n",
+ ALOGW("bad offsets (dir %ld, size %u, eocd %ld)\n",
(long) dirOffset, dirSize, (long) eocdOffset);
return false;
}
if (numEntries == 0) {
- LOGW("empty archive?\n");
+ ALOGW("empty archive?\n");
return false;
}
@@ -304,12 +304,12 @@ bool ZipFileRO::mapCentralDirectory(void)
mDirectoryMap = new FileMap();
if (mDirectoryMap == NULL) {
- LOGW("Unable to create directory map: %s", strerror(errno));
+ ALOGW("Unable to create directory map: %s", strerror(errno));
return false;
}
if (!mDirectoryMap->create(mFileName, mFd, dirOffset, dirSize, true)) {
- LOGW("Unable to map '%s' (" ZD " to " ZD "): %s\n", mFileName,
+ ALOGW("Unable to map '%s' (" ZD " to " ZD "): %s\n", mFileName,
(ZD_TYPE) dirOffset, (ZD_TYPE) (dirOffset + dirSize), strerror(errno));
return false;
}
@@ -341,17 +341,17 @@ bool ZipFileRO::parseZipArchive(void)
const unsigned char* ptr = cdPtr;
for (int i = 0; i < numEntries; i++) {
if (get4LE(ptr) != kCDESignature) {
- LOGW("Missed a central dir sig (at %d)\n", i);
+ ALOGW("Missed a central dir sig (at %d)\n", i);
goto bail;
}
if (ptr + kCDELen > cdPtr + cdLength) {
- LOGW("Ran off the end (at %d)\n", i);
+ ALOGW("Ran off the end (at %d)\n", i);
goto bail;
}
long localHdrOffset = (long) get4LE(ptr + kCDELocalOffset);
if (localHdrOffset >= mDirectoryOffset) {
- LOGW("bad LFH offset %ld at entry %d\n", localHdrOffset, i);
+ ALOGW("bad LFH offset %ld at entry %d\n", localHdrOffset, i);
goto bail;
}
@@ -367,7 +367,7 @@ bool ZipFileRO::parseZipArchive(void)
ptr += kCDELen + fileNameLen + extraLen + commentLen;
if ((size_t)(ptr - cdPtr) > cdLength) {
- LOGW("bad CD advance (%d vs " ZD ") at entry %d\n",
+ ALOGW("bad CD advance (%d vs " ZD ") at entry %d\n",
(int) (ptr - cdPtr), (ZD_TYPE) cdLength, i);
goto bail;
}
@@ -452,7 +452,7 @@ ZipEntryRO ZipFileRO::findEntryByName(const char* fileName) const
ZipEntryRO ZipFileRO::findEntryByIndex(int idx) const
{
if (idx < 0 || idx >= mNumEntries) {
- LOGW("Invalid index %d\n", idx);
+ ALOGW("Invalid index %d\n", idx);
return NULL;
}
@@ -527,7 +527,7 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
if (pOffset != NULL) {
long localHdrOffset = get4LE(ptr + kCDELocalOffset);
if (localHdrOffset + kLFHLen >= cdOffset) {
- LOGE("ERROR: bad local hdr offset in zip\n");
+ ALOGE("ERROR: bad local hdr offset in zip\n");
return false;
}
@@ -544,12 +544,12 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
TEMP_FAILURE_RETRY(pread64(mFd, lfhBuf, sizeof(lfhBuf), localHdrOffset));
if (actual != sizeof(lfhBuf)) {
- LOGW("failed reading lfh from offset %ld\n", localHdrOffset);
+ ALOGW("failed reading lfh from offset %ld\n", localHdrOffset);
return false;
}
if (get4LE(lfhBuf) != kLFHSignature) {
- LOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; "
+ ALOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; "
"got: data=0x%08lx\n",
localHdrOffset, kLFHSignature, get4LE(lfhBuf));
return false;
@@ -567,20 +567,20 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
AutoMutex _l(mFdLock);
if (lseek64(mFd, localHdrOffset, SEEK_SET) != localHdrOffset) {
- LOGW("failed seeking to lfh at offset %ld\n", localHdrOffset);
+ ALOGW("failed seeking to lfh at offset %ld\n", localHdrOffset);
return false;
}
ssize_t actual =
TEMP_FAILURE_RETRY(read(mFd, lfhBuf, sizeof(lfhBuf)));
if (actual != sizeof(lfhBuf)) {
- LOGW("failed reading lfh from offset %ld\n", localHdrOffset);
+ ALOGW("failed reading lfh from offset %ld\n", localHdrOffset);
return false;
}
if (get4LE(lfhBuf) != kLFHSignature) {
off64_t actualOffset = lseek64(mFd, 0, SEEK_CUR);
- LOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; "
+ ALOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; "
"got: offset=" ZD " data=0x%08lx\n",
localHdrOffset, kLFHSignature, (ZD_TYPE) actualOffset, get4LE(lfhBuf));
return false;
@@ -591,13 +591,13 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
off64_t dataOffset = localHdrOffset + kLFHLen
+ get2LE(lfhBuf + kLFHNameLen) + get2LE(lfhBuf + kLFHExtraLen);
if (dataOffset >= cdOffset) {
- LOGW("bad data offset %ld in zip\n", (long) dataOffset);
+ ALOGW("bad data offset %ld in zip\n", (long) dataOffset);
return false;
}
/* check lengths */
if ((off64_t)(dataOffset + compLen) > cdOffset) {
- LOGW("bad compressed length in zip (%ld + " ZD " > %ld)\n",
+ ALOGW("bad compressed length in zip (%ld + " ZD " > %ld)\n",
(long) dataOffset, (ZD_TYPE) compLen, (long) cdOffset);
return false;
}
@@ -605,7 +605,7 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
if (method == kCompressStored &&
(off64_t)(dataOffset + uncompLen) > cdOffset)
{
- LOGE("ERROR: bad uncompressed length in zip (%ld + " ZD " > %ld)\n",
+ ALOGE("ERROR: bad uncompressed length in zip (%ld + " ZD " > %ld)\n",
(long) dataOffset, (ZD_TYPE) uncompLen, (long) cdOffset);
return false;
}
@@ -754,14 +754,14 @@ bool ZipFileRO::uncompressEntry(ZipEntryRO entry, int fd) const
if (method == kCompressStored) {
ssize_t actual = write(fd, ptr, uncompLen);
if (actual < 0) {
- LOGE("Write failed: %s\n", strerror(errno));
+ ALOGE("Write failed: %s\n", strerror(errno));
goto unmap;
} else if ((size_t) actual != uncompLen) {
- LOGE("Partial write during uncompress (" ZD " of " ZD ")\n",
+ ALOGE("Partial write during uncompress (" ZD " of " ZD ")\n",
(ZD_TYPE) actual, (ZD_TYPE) uncompLen);
goto unmap;
} else {
- LOGI("+++ successful write\n");
+ ALOGI("+++ successful write\n");
}
} else {
if (!inflateBuffer(fd, ptr, uncompLen, compLen))
@@ -806,10 +806,10 @@ bail:
zerr = inflateInit2(&zstream, -MAX_WBITS);
if (zerr != Z_OK) {
if (zerr == Z_VERSION_ERROR) {
- LOGE("Installed zlib is not compatible with linked version (%s)\n",
+ ALOGE("Installed zlib is not compatible with linked version (%s)\n",
ZLIB_VERSION);
} else {
- LOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
+ ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
}
goto bail;
}
@@ -819,7 +819,7 @@ bail:
*/
zerr = inflate(&zstream, Z_FINISH);
if (zerr != Z_STREAM_END) {
- LOGW("Zip inflate failed, zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n",
+ ALOGW("Zip inflate failed, zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n",
zerr, zstream.next_in, zstream.avail_in,
zstream.next_out, zstream.avail_out);
goto z_bail;
@@ -827,7 +827,7 @@ bail:
/* paranoia */
if (zstream.total_out != uncompLen) {
- LOGW("Size mismatch on inflated file (%ld vs " ZD ")\n",
+ ALOGW("Size mismatch on inflated file (%ld vs " ZD ")\n",
zstream.total_out, (ZD_TYPE) uncompLen);
goto z_bail;
}
@@ -873,10 +873,10 @@ bail:
zerr = inflateInit2(&zstream, -MAX_WBITS);
if (zerr != Z_OK) {
if (zerr == Z_VERSION_ERROR) {
- LOGE("Installed zlib is not compatible with linked version (%s)\n",
+ ALOGE("Installed zlib is not compatible with linked version (%s)\n",
ZLIB_VERSION);
} else {
- LOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
+ ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
}
goto bail;
}
@@ -890,7 +890,7 @@ bail:
*/
zerr = inflate(&zstream, Z_NO_FLUSH);
if (zerr != Z_OK && zerr != Z_STREAM_END) {
- LOGW("zlib inflate: zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n",
+ ALOGW("zlib inflate: zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n",
zerr, zstream.next_in, zstream.avail_in,
zstream.next_out, zstream.avail_out);
goto z_bail;
@@ -903,7 +903,7 @@ bail:
long writeSize = zstream.next_out - writeBuf;
int cc = write(fd, writeBuf, writeSize);
if (cc != (int) writeSize) {
- LOGW("write failed in inflate (%d vs %ld)\n", cc, writeSize);
+ ALOGW("write failed in inflate (%d vs %ld)\n", cc, writeSize);
goto z_bail;
}
@@ -916,7 +916,7 @@ bail:
/* paranoia */
if (zstream.total_out != uncompLen) {
- LOGW("Size mismatch on inflated file (%ld vs " ZD ")\n",
+ ALOGW("Size mismatch on inflated file (%ld vs " ZD ")\n",
zstream.total_out, (ZD_TYPE) uncompLen);
goto z_bail;
}
diff --git a/libs/utils/ZipUtils.cpp b/libs/utils/ZipUtils.cpp
index cc5c68a65e91..2dbdc1d3800a 100644
--- a/libs/utils/ZipUtils.cpp
+++ b/libs/utils/ZipUtils.cpp
@@ -77,10 +77,10 @@ using namespace android;
zerr = inflateInit2(&zstream, -MAX_WBITS);
if (zerr != Z_OK) {
if (zerr == Z_VERSION_ERROR) {
- LOGE("Installed zlib is not compatible with linked version (%s)\n",
+ ALOGE("Installed zlib is not compatible with linked version (%s)\n",
ZLIB_VERSION);
} else {
- LOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
+ ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
}
goto bail;
}
@@ -124,7 +124,7 @@ using namespace android;
assert(zerr == Z_STREAM_END); /* other errors should've been caught */
if ((long) zstream.total_out != uncompressedLen) {
- LOGW("Size mismatch on inflated file (%ld vs %ld)\n",
+ ALOGW("Size mismatch on inflated file (%ld vs %ld)\n",
zstream.total_out, uncompressedLen);
goto z_bail;
}
@@ -189,10 +189,10 @@ bail:
zerr = inflateInit2(&zstream, -MAX_WBITS);
if (zerr != Z_OK) {
if (zerr == Z_VERSION_ERROR) {
- LOGE("Installed zlib is not compatible with linked version (%s)\n",
+ ALOGE("Installed zlib is not compatible with linked version (%s)\n",
ZLIB_VERSION);
} else {
- LOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
+ ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
}
goto bail;
}
@@ -236,7 +236,7 @@ bail:
assert(zerr == Z_STREAM_END); /* other errors should've been caught */
if ((long) zstream.total_out != uncompressedLen) {
- LOGW("Size mismatch on inflated file (%ld vs %ld)\n",
+ ALOGW("Size mismatch on inflated file (%ld vs %ld)\n",
zstream.total_out, uncompressedLen);
goto z_bail;
}
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 386986eb07cf..55074aadf724 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -396,6 +396,7 @@ public class MediaScanner
setDefaultRingtoneFileNames();
mExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
+ //mClient.testGenreNameConverter();
}
private void setDefaultRingtoneFileNames() {
@@ -623,9 +624,37 @@ public class MediaScanner
mCompilation = parseSubstring(value, 0, 0);
} else if (name.equalsIgnoreCase("isdrm")) {
mIsDrm = (parseSubstring(value, 0, 0) == 1);
+ } else {
+ //Log.v(TAG, "unknown tag: " + name + " (" + mProcessGenres + ")");
}
}
+ private boolean convertGenreCode(String input, String expected) {
+ String output = getGenreName(input);
+ if (output.equals(expected)) {
+ return true;
+ } else {
+ Log.d(TAG, "'" + input + "' -> '" + output + "', expected '" + expected + "'");
+ return false;
+ }
+ }
+ private void testGenreNameConverter() {
+ convertGenreCode("2", "Country");
+ convertGenreCode("(2)", "Country");
+ convertGenreCode("(2", "(2");
+ convertGenreCode("2 Foo", "Country");
+ convertGenreCode("(2) Foo", "Country");
+ convertGenreCode("(2 Foo", "(2 Foo");
+ convertGenreCode("2Foo", "2Foo");
+ convertGenreCode("(2)Foo", "Country");
+ convertGenreCode("200 Foo", "Foo");
+ convertGenreCode("(200) Foo", "Foo");
+ convertGenreCode("200Foo", "200Foo");
+ convertGenreCode("(200)Foo", "Foo");
+ convertGenreCode("200)Foo", "200)Foo");
+ convertGenreCode("200) Foo", "200) Foo");
+ }
+
public String getGenreName(String genreTagValue) {
if (genreTagValue == null) {
@@ -633,18 +662,23 @@ public class MediaScanner
}
final int length = genreTagValue.length();
- if (length > 0 && genreTagValue.charAt(0) == '(') {
+ if (length > 0) {
+ boolean parenthesized = false;
StringBuffer number = new StringBuffer();
- int i = 1;
- for (; i < length - 1; ++i) {
+ int i = 0;
+ for (; i < length; ++i) {
char c = genreTagValue.charAt(i);
- if (Character.isDigit(c)) {
+ if (i == 0 && c == '(') {
+ parenthesized = true;
+ } else if (Character.isDigit(c)) {
number.append(c);
} else {
break;
}
}
- if (genreTagValue.charAt(i) == ')') {
+ char charAfterNumber = i < length ? genreTagValue.charAt(i) : ' ';
+ if ((parenthesized && charAfterNumber == ')')
+ || !parenthesized && Character.isWhitespace(charAfterNumber)) {
try {
short genreIndex = Short.parseShort(number.toString());
if (genreIndex >= 0) {
@@ -655,7 +689,13 @@ public class MediaScanner
} else if (genreIndex < 0xFF && (i + 1) < length) {
// genre is valid but unknown,
// if there is a string after the value we take it
- return genreTagValue.substring(i + 1);
+ if (parenthesized && charAfterNumber == ')') {
+ i++;
+ }
+ String ret = genreTagValue.substring(i).trim();
+ if (ret.length() != 0) {
+ return ret;
+ }
} else {
// else return the number, without parentheses
return number.toString();
diff --git a/media/java/android/media/ThumbnailUtils.java b/media/java/android/media/ThumbnailUtils.java
index b320515dfbac..8eb933247472 100644
--- a/media/java/android/media/ThumbnailUtils.java
+++ b/media/java/android/media/ThumbnailUtils.java
@@ -104,8 +104,10 @@ public class ThumbnailUtils {
}
if (bitmap == null) {
+ FileInputStream stream = null;
try {
- FileDescriptor fd = new FileInputStream(filePath).getFD();
+ stream = new FileInputStream(filePath);
+ FileDescriptor fd = stream.getFD();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
options.inJustDecodeBounds = true;
@@ -125,7 +127,16 @@ public class ThumbnailUtils {
Log.e(TAG, "", ex);
} catch (OutOfMemoryError oom) {
Log.e(TAG, "Unable to decode file " + filePath + ". OutOfMemoryError.", oom);
+ } finally {
+ try {
+ if (stream != null) {
+ stream.close();
+ }
+ } catch (IOException ex) {
+ Log.e(TAG, "", ex);
+ }
}
+
}
if (kind == Images.Thumbnails.MICRO_KIND) {
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index f749d5149a1f..0dc3b65f7137 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -153,13 +153,13 @@ static void android_media_MediaMetadataRetriever_setDataSourceFD(JNIEnv *env, jo
int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
if (offset < 0 || length < 0 || fd < 0) {
if (offset < 0) {
- LOGE("negative offset (%lld)", offset);
+ ALOGE("negative offset (%lld)", offset);
}
if (length < 0) {
- LOGE("negative length (%lld)", length);
+ ALOGE("negative length (%lld)", length);
}
if (fd < 0) {
- LOGE("invalid file descriptor");
+ ALOGE("invalid file descriptor");
}
jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
return;
@@ -238,7 +238,7 @@ static jobject android_media_MediaMetadataRetriever_getFrameAtTime(JNIEnv *env,
videoFrame = static_cast<VideoFrame *>(frameMemory->pointer());
}
if (videoFrame == NULL) {
- LOGE("getFrameAtTime: videoFrame is a NULL pointer");
+ ALOGE("getFrameAtTime: videoFrame is a NULL pointer");
return NULL;
}
@@ -322,7 +322,7 @@ static jbyteArray android_media_MediaMetadataRetriever_getEmbeddedPicture(
mediaAlbumArt = static_cast<MediaAlbumArt *>(albumArtMemory->pointer());
}
if (mediaAlbumArt == NULL) {
- LOGE("getEmbeddedPicture: Call to getEmbeddedPicture failed.");
+ ALOGE("getEmbeddedPicture: Call to getEmbeddedPicture failed.");
return NULL;
}
@@ -330,7 +330,7 @@ static jbyteArray android_media_MediaMetadataRetriever_getEmbeddedPicture(
char* data = (char*) mediaAlbumArt + sizeof(MediaAlbumArt);
jbyteArray array = env->NewByteArray(len);
if (!array) { // OutOfMemoryError exception has already been thrown.
- LOGE("getEmbeddedPicture: OutOfMemoryError is thrown.");
+ ALOGE("getEmbeddedPicture: OutOfMemoryError is thrown.");
} else {
jbyte* bytes = env->GetByteArrayElements(array, NULL);
if (bytes != NULL) {
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 0272a032a060..39fd9a948531 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -80,7 +80,7 @@ JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobjec
// that posts events to the application thread.
jclass clazz = env->GetObjectClass(thiz);
if (clazz == NULL) {
- LOGE("Can't find android/media/MediaPlayer");
+ ALOGE("Can't find android/media/MediaPlayer");
jniThrowException(env, "java/lang/Exception", NULL);
return;
}
@@ -405,7 +405,7 @@ android_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz)
}
int w;
if (0 != mp->getVideoWidth(&w)) {
- LOGE("getVideoWidth failed");
+ ALOGE("getVideoWidth failed");
w = 0;
}
ALOGV("getVideoWidth: %d", w);
@@ -422,7 +422,7 @@ android_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz)
}
int h;
if (0 != mp->getVideoHeight(&h)) {
- LOGE("getVideoHeight failed");
+ ALOGE("getVideoHeight failed");
h = 0;
}
ALOGV("getVideoHeight: %d", h);
@@ -659,7 +659,7 @@ android_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
ALOGV("native_finalize");
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
if (mp != NULL) {
- LOGW("MediaPlayer finalized without being released");
+ ALOGW("MediaPlayer finalized without being released");
}
android_media_MediaPlayer_release(env, thiz);
}
@@ -826,58 +826,58 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- LOGE("ERROR: GetEnv failed\n");
+ ALOGE("ERROR: GetEnv failed\n");
goto bail;
}
assert(env != NULL);
if (register_android_media_MediaPlayer(env) < 0) {
- LOGE("ERROR: MediaPlayer native registration failed\n");
+ ALOGE("ERROR: MediaPlayer native registration failed\n");
goto bail;
}
if (register_android_media_MediaRecorder(env) < 0) {
- LOGE("ERROR: MediaRecorder native registration failed\n");
+ ALOGE("ERROR: MediaRecorder native registration failed\n");
goto bail;
}
if (register_android_media_MediaScanner(env) < 0) {
- LOGE("ERROR: MediaScanner native registration failed\n");
+ ALOGE("ERROR: MediaScanner native registration failed\n");
goto bail;
}
if (register_android_media_MediaMetadataRetriever(env) < 0) {
- LOGE("ERROR: MediaMetadataRetriever native registration failed\n");
+ ALOGE("ERROR: MediaMetadataRetriever native registration failed\n");
goto bail;
}
if (register_android_media_AmrInputStream(env) < 0) {
- LOGE("ERROR: AmrInputStream native registration failed\n");
+ ALOGE("ERROR: AmrInputStream native registration failed\n");
goto bail;
}
if (register_android_media_ResampleInputStream(env) < 0) {
- LOGE("ERROR: ResampleInputStream native registration failed\n");
+ ALOGE("ERROR: ResampleInputStream native registration failed\n");
goto bail;
}
if (register_android_media_MediaProfiles(env) < 0) {
- LOGE("ERROR: MediaProfiles native registration failed");
+ ALOGE("ERROR: MediaProfiles native registration failed");
goto bail;
}
if (register_android_mtp_MtpDatabase(env) < 0) {
- LOGE("ERROR: MtpDatabase native registration failed");
+ ALOGE("ERROR: MtpDatabase native registration failed");
goto bail;
}
if (register_android_mtp_MtpDevice(env) < 0) {
- LOGE("ERROR: MtpDevice native registration failed");
+ ALOGE("ERROR: MtpDevice native registration failed");
goto bail;
}
if (register_android_mtp_MtpServer(env) < 0) {
- LOGE("ERROR: MtpServer native registration failed");
+ ALOGE("ERROR: MtpServer native registration failed");
goto bail;
}
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index 31ef046d814a..acc65f1b1837 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -77,7 +77,7 @@ JNIMediaRecorderListener::JNIMediaRecorderListener(JNIEnv* env, jobject thiz, jo
// that posts events to the application thread.
jclass clazz = env->GetObjectClass(thiz);
if (clazz == NULL) {
- LOGE("Can't find android/media/MediaRecorder");
+ ALOGE("Can't find android/media/MediaRecorder");
jniThrowException(env, "java/lang/Exception", NULL);
return;
}
@@ -229,7 +229,7 @@ android_media_MediaRecorder_setParameter(JNIEnv *env, jobject thiz, jstring para
ALOGV("setParameter()");
if (params == NULL)
{
- LOGE("Invalid or empty params string. This parameter will be ignored.");
+ ALOGE("Invalid or empty params string. This parameter will be ignored.");
return;
}
@@ -238,7 +238,7 @@ android_media_MediaRecorder_setParameter(JNIEnv *env, jobject thiz, jstring para
const char* params8 = env->GetStringUTFChars(params, NULL);
if (params8 == NULL)
{
- LOGE("Failed to covert jstring to String8. This parameter will be ignored.");
+ ALOGE("Failed to covert jstring to String8. This parameter will be ignored.");
return;
}
@@ -323,12 +323,12 @@ android_media_MediaRecorder_prepare(JNIEnv *env, jobject thiz)
// The application may misbehave and
// the preview surface becomes unavailable
if (native_surface.get() == 0) {
- LOGE("Application lost the surface");
+ ALOGE("Application lost the surface");
jniThrowException(env, "java/io/IOException", "invalid preview surface");
return;
}
- LOGI("prepare: surface=%p (identity=%d)", native_surface.get(), native_surface->getIdentity());
+ ALOGI("prepare: surface=%p (identity=%d)", native_surface.get(), native_surface->getIdentity());
if (process_media_recorder_call(env, mr->setPreviewSurface(native_surface), "java/lang/RuntimeException", "setPreviewSurface failed.")) {
return;
}
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index 67c85ccd9403..5d27966f491a 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -48,7 +48,7 @@ static fields_t fields;
static status_t checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
return UNKNOWN_ERROR;
@@ -118,7 +118,7 @@ public:
env->FindClass(kClassMediaScannerClient);
if (mediaScannerClientInterface == NULL) {
- LOGE("Class %s not found", kClassMediaScannerClient);
+ ALOGE("Class %s not found", kClassMediaScannerClient);
} else {
mScanFileMethodID = env->GetMethodID(
mediaScannerClientInterface,
@@ -257,7 +257,7 @@ android_media_MediaScanner_processDirectory(
MyMediaScannerClient myClient(env, client);
MediaScanResult result = mp->processDirectory(pathStr, myClient);
if (result == MEDIA_SCAN_RESULT_ERROR) {
- LOGE("An error occurred while scanning directory '%s'.", pathStr);
+ ALOGE("An error occurred while scanning directory '%s'.", pathStr);
}
env->ReleaseStringUTFChars(path, pathStr);
}
@@ -297,7 +297,7 @@ android_media_MediaScanner_processFile(
MyMediaScannerClient myClient(env, client);
MediaScanResult result = mp->processFile(pathStr, mimeTypeStr, myClient);
if (result == MEDIA_SCAN_RESULT_ERROR) {
- LOGE("An error occurred while scanning file '%s'.", pathStr);
+ ALOGE("An error occurred while scanning file '%s'.", pathStr);
}
env->ReleaseStringUTFChars(path, pathStr);
if (mimeType) {
diff --git a/media/jni/android_media_Utils.cpp b/media/jni/android_media_Utils.cpp
index 27e46a4c8c6c..47963b101b7d 100644
--- a/media/jni/android_media_Utils.cpp
+++ b/media/jni/android_media_Utils.cpp
@@ -39,7 +39,7 @@ bool ConvertKeyValueArraysToKeyedVector(
}
if (failed) {
- LOGE("keys and values arrays have different length");
+ ALOGE("keys and values arrays have different length");
jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
return false;
}
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index 4dbcb90435d5..99e543bfbf16 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -174,7 +174,7 @@ public:
static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
}
@@ -439,7 +439,7 @@ MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle,
break;
}
default:
- LOGE("unsupported type in getObjectPropertyValue\n");
+ ALOGE("unsupported type in getObjectPropertyValue\n");
result = MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
}
out:
@@ -508,7 +508,7 @@ MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle,
break;
}
default:
- LOGE("unsupported type in getObjectPropertyValue\n");
+ ALOGE("unsupported type in getObjectPropertyValue\n");
return MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
}
@@ -579,7 +579,7 @@ MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property
break;
}
default:
- LOGE("unsupported type in getDevicePropertyValue\n");
+ ALOGE("unsupported type in getDevicePropertyValue\n");
return MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT;
}
@@ -631,7 +631,7 @@ MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property
break;
}
default:
- LOGE("unsupported type in setDevicePropertyValue\n");
+ ALOGE("unsupported type in setDevicePropertyValue\n");
return MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
}
@@ -724,7 +724,7 @@ MtpResponseCode MyMtpDatabase::getObjectPropertyList(MtpObjectHandle handle,
break;
}
default:
- LOGE("bad or unsupported data type in MyMtpDatabase::getObjectPropertyList");
+ ALOGE("bad or unsupported data type in MyMtpDatabase::getObjectPropertyList");
break;
}
}
@@ -957,7 +957,7 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle,
int count = references->size();
jintArray array = env->NewIntArray(count);
if (!array) {
- LOGE("out of memory in setObjectReferences");
+ ALOGE("out of memory in setObjectReferences");
return false;
}
jint* handles = env->GetIntArrayElements(array, 0);
@@ -1044,7 +1044,7 @@ MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) {
result->setDefaultValue(str);
env->ReleaseCharArrayElements(mStringBuffer, str, 0);
} else {
- LOGE("unable to read device property, response: %04X", ret);
+ ALOGE("unable to read device property, response: %04X", ret);
}
break;
}
@@ -1113,151 +1113,151 @@ int register_android_mtp_MtpDatabase(JNIEnv *env)
clazz = env->FindClass("android/mtp/MtpDatabase");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpDatabase");
+ ALOGE("Can't find android/mtp/MtpDatabase");
return -1;
}
method_beginSendObject = env->GetMethodID(clazz, "beginSendObject", "(Ljava/lang/String;IIIJJ)I");
if (method_beginSendObject == NULL) {
- LOGE("Can't find beginSendObject");
+ ALOGE("Can't find beginSendObject");
return -1;
}
method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V");
if (method_endSendObject == NULL) {
- LOGE("Can't find endSendObject");
+ ALOGE("Can't find endSendObject");
return -1;
}
method_getObjectList = env->GetMethodID(clazz, "getObjectList", "(III)[I");
if (method_getObjectList == NULL) {
- LOGE("Can't find getObjectList");
+ ALOGE("Can't find getObjectList");
return -1;
}
method_getNumObjects = env->GetMethodID(clazz, "getNumObjects", "(III)I");
if (method_getNumObjects == NULL) {
- LOGE("Can't find getNumObjects");
+ ALOGE("Can't find getNumObjects");
return -1;
}
method_getSupportedPlaybackFormats = env->GetMethodID(clazz, "getSupportedPlaybackFormats", "()[I");
if (method_getSupportedPlaybackFormats == NULL) {
- LOGE("Can't find getSupportedPlaybackFormats");
+ ALOGE("Can't find getSupportedPlaybackFormats");
return -1;
}
method_getSupportedCaptureFormats = env->GetMethodID(clazz, "getSupportedCaptureFormats", "()[I");
if (method_getSupportedCaptureFormats == NULL) {
- LOGE("Can't find getSupportedCaptureFormats");
+ ALOGE("Can't find getSupportedCaptureFormats");
return -1;
}
method_getSupportedObjectProperties = env->GetMethodID(clazz, "getSupportedObjectProperties", "(I)[I");
if (method_getSupportedObjectProperties == NULL) {
- LOGE("Can't find getSupportedObjectProperties");
+ ALOGE("Can't find getSupportedObjectProperties");
return -1;
}
method_getSupportedDeviceProperties = env->GetMethodID(clazz, "getSupportedDeviceProperties", "()[I");
if (method_getSupportedDeviceProperties == NULL) {
- LOGE("Can't find getSupportedDeviceProperties");
+ ALOGE("Can't find getSupportedDeviceProperties");
return -1;
}
method_setObjectProperty = env->GetMethodID(clazz, "setObjectProperty", "(IIJLjava/lang/String;)I");
if (method_setObjectProperty == NULL) {
- LOGE("Can't find setObjectProperty");
+ ALOGE("Can't find setObjectProperty");
return -1;
}
method_getDeviceProperty = env->GetMethodID(clazz, "getDeviceProperty", "(I[J[C)I");
if (method_getDeviceProperty == NULL) {
- LOGE("Can't find getDeviceProperty");
+ ALOGE("Can't find getDeviceProperty");
return -1;
}
method_setDeviceProperty = env->GetMethodID(clazz, "setDeviceProperty", "(IJLjava/lang/String;)I");
if (method_setDeviceProperty == NULL) {
- LOGE("Can't find setDeviceProperty");
+ ALOGE("Can't find setDeviceProperty");
return -1;
}
method_getObjectPropertyList = env->GetMethodID(clazz, "getObjectPropertyList",
"(JIJII)Landroid/mtp/MtpPropertyList;");
if (method_getObjectPropertyList == NULL) {
- LOGE("Can't find getObjectPropertyList");
+ ALOGE("Can't find getObjectPropertyList");
return -1;
}
method_getObjectInfo = env->GetMethodID(clazz, "getObjectInfo", "(I[I[C[J)Z");
if (method_getObjectInfo == NULL) {
- LOGE("Can't find getObjectInfo");
+ ALOGE("Can't find getObjectInfo");
return -1;
}
method_getObjectFilePath = env->GetMethodID(clazz, "getObjectFilePath", "(I[C[J)I");
if (method_getObjectFilePath == NULL) {
- LOGE("Can't find getObjectFilePath");
+ ALOGE("Can't find getObjectFilePath");
return -1;
}
method_deleteFile = env->GetMethodID(clazz, "deleteFile", "(I)I");
if (method_deleteFile == NULL) {
- LOGE("Can't find deleteFile");
+ ALOGE("Can't find deleteFile");
return -1;
}
method_getObjectReferences = env->GetMethodID(clazz, "getObjectReferences", "(I)[I");
if (method_getObjectReferences == NULL) {
- LOGE("Can't find getObjectReferences");
+ ALOGE("Can't find getObjectReferences");
return -1;
}
method_setObjectReferences = env->GetMethodID(clazz, "setObjectReferences", "(I[I)I");
if (method_setObjectReferences == NULL) {
- LOGE("Can't find setObjectReferences");
+ ALOGE("Can't find setObjectReferences");
return -1;
}
method_sessionStarted = env->GetMethodID(clazz, "sessionStarted", "()V");
if (method_sessionStarted == NULL) {
- LOGE("Can't find sessionStarted");
+ ALOGE("Can't find sessionStarted");
return -1;
}
method_sessionEnded = env->GetMethodID(clazz, "sessionEnded", "()V");
if (method_sessionEnded == NULL) {
- LOGE("Can't find sessionEnded");
+ ALOGE("Can't find sessionEnded");
return -1;
}
field_context = env->GetFieldID(clazz, "mNativeContext", "I");
if (field_context == NULL) {
- LOGE("Can't find MtpDatabase.mNativeContext");
+ ALOGE("Can't find MtpDatabase.mNativeContext");
return -1;
}
// now set up fields for MtpPropertyList class
clazz = env->FindClass("android/mtp/MtpPropertyList");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpPropertyList");
+ ALOGE("Can't find android/mtp/MtpPropertyList");
return -1;
}
field_mCount = env->GetFieldID(clazz, "mCount", "I");
if (field_mCount == NULL) {
- LOGE("Can't find MtpPropertyList.mCount");
+ ALOGE("Can't find MtpPropertyList.mCount");
return -1;
}
field_mResult = env->GetFieldID(clazz, "mResult", "I");
if (field_mResult == NULL) {
- LOGE("Can't find MtpPropertyList.mResult");
+ ALOGE("Can't find MtpPropertyList.mResult");
return -1;
}
field_mObjectHandles = env->GetFieldID(clazz, "mObjectHandles", "[I");
if (field_mObjectHandles == NULL) {
- LOGE("Can't find MtpPropertyList.mObjectHandles");
+ ALOGE("Can't find MtpPropertyList.mObjectHandles");
return -1;
}
field_mPropertyCodes = env->GetFieldID(clazz, "mPropertyCodes", "[I");
if (field_mPropertyCodes == NULL) {
- LOGE("Can't find MtpPropertyList.mPropertyCodes");
+ ALOGE("Can't find MtpPropertyList.mPropertyCodes");
return -1;
}
field_mDataTypes = env->GetFieldID(clazz, "mDataTypes", "[I");
if (field_mDataTypes == NULL) {
- LOGE("Can't find MtpPropertyList.mDataTypes");
+ ALOGE("Can't find MtpPropertyList.mDataTypes");
return -1;
}
field_mLongValues = env->GetFieldID(clazz, "mLongValues", "[J");
if (field_mLongValues == NULL) {
- LOGE("Can't find MtpPropertyList.mLongValues");
+ ALOGE("Can't find MtpPropertyList.mLongValues");
return -1;
}
field_mStringValues = env->GetFieldID(clazz, "mStringValues", "[Ljava/lang/String;");
if (field_mStringValues == NULL) {
- LOGE("Can't find MtpPropertyList.mStringValues");
+ ALOGE("Can't find MtpPropertyList.mStringValues");
return -1;
}
diff --git a/media/jni/android_mtp_MtpDevice.cpp b/media/jni/android_mtp_MtpDevice.cpp
index c71410bab89d..113784eca9ce 100644
--- a/media/jni/android_mtp_MtpDevice.cpp
+++ b/media/jni/android_mtp_MtpDevice.cpp
@@ -92,7 +92,7 @@ MtpDevice* get_device_from_object(JNIEnv* env, jobject javaDevice)
static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
}
@@ -142,7 +142,7 @@ android_mtp_MtpDevice_get_device_info(JNIEnv *env, jobject thiz)
}
jobject info = env->NewObject(clazz_deviceInfo, constructor_deviceInfo);
if (info == NULL) {
- LOGE("Could not create a MtpDeviceInfo object");
+ ALOGE("Could not create a MtpDeviceInfo object");
delete deviceInfo;
return NULL;
}
@@ -195,7 +195,7 @@ android_mtp_MtpDevice_get_storage_info(JNIEnv *env, jobject thiz, jint storageID
jobject info = env->NewObject(clazz_storageInfo, constructor_storageInfo);
if (info == NULL) {
- LOGE("Could not create a MtpStorageInfo object");
+ ALOGE("Could not create a MtpStorageInfo object");
delete storageInfo;
return NULL;
}
@@ -248,7 +248,7 @@ android_mtp_MtpDevice_get_object_info(JNIEnv *env, jobject thiz, jint objectID)
return NULL;
jobject info = env->NewObject(clazz_objectInfo, constructor_objectInfo);
if (info == NULL) {
- LOGE("Could not create a MtpObjectInfo object");
+ ALOGE("Could not create a MtpObjectInfo object");
delete objectInfo;
return NULL;
}
@@ -433,193 +433,193 @@ int register_android_mtp_MtpDevice(JNIEnv *env)
clazz = env->FindClass("android/mtp/MtpDeviceInfo");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpDeviceInfo");
+ ALOGE("Can't find android/mtp/MtpDeviceInfo");
return -1;
}
constructor_deviceInfo = env->GetMethodID(clazz, "<init>", "()V");
if (constructor_deviceInfo == NULL) {
- LOGE("Can't find android/mtp/MtpDeviceInfo constructor");
+ ALOGE("Can't find android/mtp/MtpDeviceInfo constructor");
return -1;
}
field_deviceInfo_manufacturer = env->GetFieldID(clazz, "mManufacturer", "Ljava/lang/String;");
if (field_deviceInfo_manufacturer == NULL) {
- LOGE("Can't find MtpDeviceInfo.mManufacturer");
+ ALOGE("Can't find MtpDeviceInfo.mManufacturer");
return -1;
}
field_deviceInfo_model = env->GetFieldID(clazz, "mModel", "Ljava/lang/String;");
if (field_deviceInfo_model == NULL) {
- LOGE("Can't find MtpDeviceInfo.mModel");
+ ALOGE("Can't find MtpDeviceInfo.mModel");
return -1;
}
field_deviceInfo_version = env->GetFieldID(clazz, "mVersion", "Ljava/lang/String;");
if (field_deviceInfo_version == NULL) {
- LOGE("Can't find MtpDeviceInfo.mVersion");
+ ALOGE("Can't find MtpDeviceInfo.mVersion");
return -1;
}
field_deviceInfo_serialNumber = env->GetFieldID(clazz, "mSerialNumber", "Ljava/lang/String;");
if (field_deviceInfo_serialNumber == NULL) {
- LOGE("Can't find MtpDeviceInfo.mSerialNumber");
+ ALOGE("Can't find MtpDeviceInfo.mSerialNumber");
return -1;
}
clazz_deviceInfo = (jclass)env->NewGlobalRef(clazz);
clazz = env->FindClass("android/mtp/MtpStorageInfo");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpStorageInfo");
+ ALOGE("Can't find android/mtp/MtpStorageInfo");
return -1;
}
constructor_storageInfo = env->GetMethodID(clazz, "<init>", "()V");
if (constructor_storageInfo == NULL) {
- LOGE("Can't find android/mtp/MtpStorageInfo constructor");
+ ALOGE("Can't find android/mtp/MtpStorageInfo constructor");
return -1;
}
field_storageInfo_storageId = env->GetFieldID(clazz, "mStorageId", "I");
if (field_storageInfo_storageId == NULL) {
- LOGE("Can't find MtpStorageInfo.mStorageId");
+ ALOGE("Can't find MtpStorageInfo.mStorageId");
return -1;
}
field_storageInfo_maxCapacity = env->GetFieldID(clazz, "mMaxCapacity", "J");
if (field_storageInfo_maxCapacity == NULL) {
- LOGE("Can't find MtpStorageInfo.mMaxCapacity");
+ ALOGE("Can't find MtpStorageInfo.mMaxCapacity");
return -1;
}
field_storageInfo_freeSpace = env->GetFieldID(clazz, "mFreeSpace", "J");
if (field_storageInfo_freeSpace == NULL) {
- LOGE("Can't find MtpStorageInfo.mFreeSpace");
+ ALOGE("Can't find MtpStorageInfo.mFreeSpace");
return -1;
}
field_storageInfo_description = env->GetFieldID(clazz, "mDescription", "Ljava/lang/String;");
if (field_storageInfo_description == NULL) {
- LOGE("Can't find MtpStorageInfo.mDescription");
+ ALOGE("Can't find MtpStorageInfo.mDescription");
return -1;
}
field_storageInfo_volumeIdentifier = env->GetFieldID(clazz, "mVolumeIdentifier", "Ljava/lang/String;");
if (field_storageInfo_volumeIdentifier == NULL) {
- LOGE("Can't find MtpStorageInfo.mVolumeIdentifier");
+ ALOGE("Can't find MtpStorageInfo.mVolumeIdentifier");
return -1;
}
clazz_storageInfo = (jclass)env->NewGlobalRef(clazz);
clazz = env->FindClass("android/mtp/MtpObjectInfo");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpObjectInfo");
+ ALOGE("Can't find android/mtp/MtpObjectInfo");
return -1;
}
constructor_objectInfo = env->GetMethodID(clazz, "<init>", "()V");
if (constructor_objectInfo == NULL) {
- LOGE("Can't find android/mtp/MtpObjectInfo constructor");
+ ALOGE("Can't find android/mtp/MtpObjectInfo constructor");
return -1;
}
field_objectInfo_handle = env->GetFieldID(clazz, "mHandle", "I");
if (field_objectInfo_handle == NULL) {
- LOGE("Can't find MtpObjectInfo.mHandle");
+ ALOGE("Can't find MtpObjectInfo.mHandle");
return -1;
}
field_objectInfo_storageId = env->GetFieldID(clazz, "mStorageId", "I");
if (field_objectInfo_storageId == NULL) {
- LOGE("Can't find MtpObjectInfo.mStorageId");
+ ALOGE("Can't find MtpObjectInfo.mStorageId");
return -1;
}
field_objectInfo_format = env->GetFieldID(clazz, "mFormat", "I");
if (field_objectInfo_format == NULL) {
- LOGE("Can't find MtpObjectInfo.mFormat");
+ ALOGE("Can't find MtpObjectInfo.mFormat");
return -1;
}
field_objectInfo_protectionStatus = env->GetFieldID(clazz, "mProtectionStatus", "I");
if (field_objectInfo_protectionStatus == NULL) {
- LOGE("Can't find MtpObjectInfo.mProtectionStatus");
+ ALOGE("Can't find MtpObjectInfo.mProtectionStatus");
return -1;
}
field_objectInfo_compressedSize = env->GetFieldID(clazz, "mCompressedSize", "I");
if (field_objectInfo_compressedSize == NULL) {
- LOGE("Can't find MtpObjectInfo.mCompressedSize");
+ ALOGE("Can't find MtpObjectInfo.mCompressedSize");
return -1;
}
field_objectInfo_thumbFormat = env->GetFieldID(clazz, "mThumbFormat", "I");
if (field_objectInfo_thumbFormat == NULL) {
- LOGE("Can't find MtpObjectInfo.mThumbFormat");
+ ALOGE("Can't find MtpObjectInfo.mThumbFormat");
return -1;
}
field_objectInfo_thumbCompressedSize = env->GetFieldID(clazz, "mThumbCompressedSize", "I");
if (field_objectInfo_thumbCompressedSize == NULL) {
- LOGE("Can't find MtpObjectInfo.mThumbCompressedSize");
+ ALOGE("Can't find MtpObjectInfo.mThumbCompressedSize");
return -1;
}
field_objectInfo_thumbPixWidth = env->GetFieldID(clazz, "mThumbPixWidth", "I");
if (field_objectInfo_thumbPixWidth == NULL) {
- LOGE("Can't find MtpObjectInfo.mThumbPixWidth");
+ ALOGE("Can't find MtpObjectInfo.mThumbPixWidth");
return -1;
}
field_objectInfo_thumbPixHeight = env->GetFieldID(clazz, "mThumbPixHeight", "I");
if (field_objectInfo_thumbPixHeight == NULL) {
- LOGE("Can't find MtpObjectInfo.mThumbPixHeight");
+ ALOGE("Can't find MtpObjectInfo.mThumbPixHeight");
return -1;
}
field_objectInfo_imagePixWidth = env->GetFieldID(clazz, "mImagePixWidth", "I");
if (field_objectInfo_imagePixWidth == NULL) {
- LOGE("Can't find MtpObjectInfo.mImagePixWidth");
+ ALOGE("Can't find MtpObjectInfo.mImagePixWidth");
return -1;
}
field_objectInfo_imagePixHeight = env->GetFieldID(clazz, "mImagePixHeight", "I");
if (field_objectInfo_imagePixHeight == NULL) {
- LOGE("Can't find MtpObjectInfo.mImagePixHeight");
+ ALOGE("Can't find MtpObjectInfo.mImagePixHeight");
return -1;
}
field_objectInfo_imagePixDepth = env->GetFieldID(clazz, "mImagePixDepth", "I");
if (field_objectInfo_imagePixDepth == NULL) {
- LOGE("Can't find MtpObjectInfo.mImagePixDepth");
+ ALOGE("Can't find MtpObjectInfo.mImagePixDepth");
return -1;
}
field_objectInfo_parent = env->GetFieldID(clazz, "mParent", "I");
if (field_objectInfo_parent == NULL) {
- LOGE("Can't find MtpObjectInfo.mParent");
+ ALOGE("Can't find MtpObjectInfo.mParent");
return -1;
}
field_objectInfo_associationType = env->GetFieldID(clazz, "mAssociationType", "I");
if (field_objectInfo_associationType == NULL) {
- LOGE("Can't find MtpObjectInfo.mAssociationType");
+ ALOGE("Can't find MtpObjectInfo.mAssociationType");
return -1;
}
field_objectInfo_associationDesc = env->GetFieldID(clazz, "mAssociationDesc", "I");
if (field_objectInfo_associationDesc == NULL) {
- LOGE("Can't find MtpObjectInfo.mAssociationDesc");
+ ALOGE("Can't find MtpObjectInfo.mAssociationDesc");
return -1;
}
field_objectInfo_sequenceNumber = env->GetFieldID(clazz, "mSequenceNumber", "I");
if (field_objectInfo_sequenceNumber == NULL) {
- LOGE("Can't find MtpObjectInfo.mSequenceNumber");
+ ALOGE("Can't find MtpObjectInfo.mSequenceNumber");
return -1;
}
field_objectInfo_name = env->GetFieldID(clazz, "mName", "Ljava/lang/String;");
if (field_objectInfo_name == NULL) {
- LOGE("Can't find MtpObjectInfo.mName");
+ ALOGE("Can't find MtpObjectInfo.mName");
return -1;
}
field_objectInfo_dateCreated = env->GetFieldID(clazz, "mDateCreated", "J");
if (field_objectInfo_dateCreated == NULL) {
- LOGE("Can't find MtpObjectInfo.mDateCreated");
+ ALOGE("Can't find MtpObjectInfo.mDateCreated");
return -1;
}
field_objectInfo_dateModified = env->GetFieldID(clazz, "mDateModified", "J");
if (field_objectInfo_dateModified == NULL) {
- LOGE("Can't find MtpObjectInfo.mDateModified");
+ ALOGE("Can't find MtpObjectInfo.mDateModified");
return -1;
}
field_objectInfo_keywords = env->GetFieldID(clazz, "mKeywords", "Ljava/lang/String;");
if (field_objectInfo_keywords == NULL) {
- LOGE("Can't find MtpObjectInfo.mKeywords");
+ ALOGE("Can't find MtpObjectInfo.mKeywords");
return -1;
}
clazz_objectInfo = (jclass)env->NewGlobalRef(clazz);
clazz = env->FindClass("android/mtp/MtpDevice");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpDevice");
+ ALOGE("Can't find android/mtp/MtpDevice");
return -1;
}
field_context = env->GetFieldID(clazz, "mNativeContext", "I");
if (field_context == NULL) {
- LOGE("Can't find MtpDevice.mNativeContext");
+ ALOGE("Can't find MtpDevice.mNativeContext");
return -1;
}
diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp
index 107db08d516f..5252a3afc20f 100644
--- a/media/jni/android_mtp_MtpServer.cpp
+++ b/media/jni/android_mtp_MtpServer.cpp
@@ -65,7 +65,7 @@ android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jbo
usePtp, AID_MEDIA_RW, 0664, 0775);
env->SetIntField(thiz, field_MtpServer_nativeContext, (int)server);
} else {
- LOGE("could not open MTP driver, errno: %d", errno);
+ ALOGE("could not open MTP driver, errno: %d", errno);
}
}
@@ -76,7 +76,7 @@ android_mtp_MtpServer_run(JNIEnv *env, jobject thiz)
if (server)
server->run();
else
- LOGE("server is null in run");
+ ALOGE("server is null in run");
}
static void
@@ -89,7 +89,7 @@ android_mtp_MtpServer_cleanup(JNIEnv *env, jobject thiz)
delete server;
env->SetIntField(thiz, field_MtpServer_nativeContext, 0);
} else {
- LOGE("server is null in cleanup");
+ ALOGE("server is null in cleanup");
}
}
@@ -102,7 +102,7 @@ android_mtp_MtpServer_send_object_added(JNIEnv *env, jobject thiz, jint handle)
if (server)
server->sendObjectAdded(handle);
else
- LOGE("server is null in send_object_added");
+ ALOGE("server is null in send_object_added");
}
static void
@@ -114,7 +114,7 @@ android_mtp_MtpServer_send_object_removed(JNIEnv *env, jobject thiz, jint handle
if (server)
server->sendObjectRemoved(handle);
else
- LOGE("server is null in send_object_removed");
+ ALOGE("server is null in send_object_removed");
}
static void
@@ -145,7 +145,7 @@ android_mtp_MtpServer_add_storage(JNIEnv *env, jobject thiz, jobject jstorage)
}
}
} else {
- LOGE("server is null in add_storage");
+ ALOGE("server is null in add_storage");
}
}
@@ -162,7 +162,7 @@ android_mtp_MtpServer_remove_storage(JNIEnv *env, jobject thiz, jint storageId)
delete storage;
}
} else
- LOGE("server is null in remove_storage");
+ ALOGE("server is null in remove_storage");
}
// ----------------------------------------------------------------------------
@@ -187,48 +187,48 @@ int register_android_mtp_MtpServer(JNIEnv *env)
clazz = env->FindClass("android/mtp/MtpStorage");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpStorage");
+ ALOGE("Can't find android/mtp/MtpStorage");
return -1;
}
field_MtpStorage_storageId = env->GetFieldID(clazz, "mStorageId", "I");
if (field_MtpStorage_storageId == NULL) {
- LOGE("Can't find MtpStorage.mStorageId");
+ ALOGE("Can't find MtpStorage.mStorageId");
return -1;
}
field_MtpStorage_path = env->GetFieldID(clazz, "mPath", "Ljava/lang/String;");
if (field_MtpStorage_path == NULL) {
- LOGE("Can't find MtpStorage.mPath");
+ ALOGE("Can't find MtpStorage.mPath");
return -1;
}
field_MtpStorage_description = env->GetFieldID(clazz, "mDescription", "Ljava/lang/String;");
if (field_MtpStorage_description == NULL) {
- LOGE("Can't find MtpStorage.mDescription");
+ ALOGE("Can't find MtpStorage.mDescription");
return -1;
}
field_MtpStorage_reserveSpace = env->GetFieldID(clazz, "mReserveSpace", "J");
if (field_MtpStorage_reserveSpace == NULL) {
- LOGE("Can't find MtpStorage.mReserveSpace");
+ ALOGE("Can't find MtpStorage.mReserveSpace");
return -1;
}
field_MtpStorage_removable = env->GetFieldID(clazz, "mRemovable", "Z");
if (field_MtpStorage_removable == NULL) {
- LOGE("Can't find MtpStorage.mRemovable");
+ ALOGE("Can't find MtpStorage.mRemovable");
return -1;
}
field_MtpStorage_maxFileSize = env->GetFieldID(clazz, "mMaxFileSize", "J");
if (field_MtpStorage_maxFileSize == NULL) {
- LOGE("Can't find MtpStorage.mMaxFileSize");
+ ALOGE("Can't find MtpStorage.mMaxFileSize");
return -1;
}
clazz = env->FindClass("android/mtp/MtpServer");
if (clazz == NULL) {
- LOGE("Can't find android/mtp/MtpServer");
+ ALOGE("Can't find android/mtp/MtpServer");
return -1;
}
field_MtpServer_nativeContext = env->GetFieldID(clazz, "mNativeContext", "I");
if (field_MtpServer_nativeContext == NULL) {
- LOGE("Can't find MtpServer.mNativeContext");
+ ALOGE("Can't find MtpServer.mNativeContext");
return -1;
}
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp
index d517a584d175..3b325b7d4e74 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -112,14 +112,14 @@ static void effectCallback(int event, void* user, void *info) {
callbackInfo->audioEffect_class);
if (!user || !env) {
- LOGW("effectCallback error user %p, env %p", user, env);
+ ALOGW("effectCallback error user %p, env %p", user, env);
return;
}
switch (event) {
case AudioEffect::EVENT_CONTROL_STATUS_CHANGED:
if (info == 0) {
- LOGW("EVENT_CONTROL_STATUS_CHANGED info == NULL");
+ ALOGW("EVENT_CONTROL_STATUS_CHANGED info == NULL");
goto effectCallback_Exit;
}
param = *(bool *)info;
@@ -128,7 +128,7 @@ static void effectCallback(int event, void* user, void *info) {
break;
case AudioEffect::EVENT_ENABLE_STATUS_CHANGED:
if (info == 0) {
- LOGW("EVENT_ENABLE_STATUS_CHANGED info == NULL");
+ ALOGW("EVENT_ENABLE_STATUS_CHANGED info == NULL");
goto effectCallback_Exit;
}
param = *(bool *)info;
@@ -137,7 +137,7 @@ static void effectCallback(int event, void* user, void *info) {
break;
case AudioEffect::EVENT_PARAMETER_CHANGED:
if (info == 0) {
- LOGW("EVENT_PARAMETER_CHANGED info == NULL");
+ ALOGW("EVENT_PARAMETER_CHANGED info == NULL");
goto effectCallback_Exit;
}
p = (effect_param_t *)info;
@@ -149,7 +149,7 @@ static void effectCallback(int event, void* user, void *info) {
size = arg1 + p->vsize;
array = env->NewByteArray(size);
if (array == NULL) {
- LOGE("effectCallback: Couldn't allocate byte array for parameter data");
+ ALOGE("effectCallback: Couldn't allocate byte array for parameter data");
goto effectCallback_Exit;
}
bytes = env->GetByteArrayElements(array, NULL);
@@ -159,7 +159,7 @@ static void effectCallback(int event, void* user, void *info) {
ALOGV("EVENT_PARAMETER_CHANGED");
break;
case AudioEffect::EVENT_ERROR:
- LOGW("EVENT_ERROR");
+ ALOGW("EVENT_ERROR");
break;
}
@@ -195,7 +195,7 @@ android_media_AudioEffect_native_init(JNIEnv *env)
// Get the AudioEffect class
jclass clazz = env->FindClass(kClassPathName);
if (clazz == NULL) {
- LOGE("Can't find %s", kClassPathName);
+ ALOGE("Can't find %s", kClassPathName);
return;
}
@@ -206,7 +206,7 @@ android_media_AudioEffect_native_init(JNIEnv *env)
fields.clazzEffect,
"postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V");
if (fields.midPostNativeEvent == NULL) {
- LOGE("Can't find AudioEffect.%s", "postEventFromNative");
+ ALOGE("Can't find AudioEffect.%s", "postEventFromNative");
return;
}
@@ -216,7 +216,7 @@ android_media_AudioEffect_native_init(JNIEnv *env)
fields.clazzEffect,
"mNativeAudioEffect", "I");
if (fields.fidNativeAudioEffect == NULL) {
- LOGE("Can't find AudioEffect.%s", "mNativeAudioEffect");
+ ALOGE("Can't find AudioEffect.%s", "mNativeAudioEffect");
return;
}
// fidJniData;
@@ -224,13 +224,13 @@ android_media_AudioEffect_native_init(JNIEnv *env)
fields.clazzEffect,
"mJniData", "I");
if (fields.fidJniData == NULL) {
- LOGE("Can't find AudioEffect.%s", "mJniData");
+ ALOGE("Can't find AudioEffect.%s", "mJniData");
return;
}
clazz = env->FindClass("android/media/audiofx/AudioEffect$Descriptor");
if (clazz == NULL) {
- LOGE("Can't find android/media/audiofx/AudioEffect$Descriptor class");
+ ALOGE("Can't find android/media/audiofx/AudioEffect$Descriptor class");
return;
}
fields.clazzDesc = (jclass)env->NewGlobalRef(clazz);
@@ -241,7 +241,7 @@ android_media_AudioEffect_native_init(JNIEnv *env)
"<init>",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
if (fields.midDescCstor == NULL) {
- LOGE("Can't find android/media/audiofx/AudioEffect$Descriptor class constructor");
+ ALOGE("Can't find android/media/audiofx/AudioEffect$Descriptor class constructor");
return;
}
}
@@ -290,7 +290,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t
lpJniStorage = new AudioEffectJniStorage();
if (lpJniStorage == NULL) {
- LOGE("setup: Error creating JNI Storage");
+ ALOGE("setup: Error creating JNI Storage");
goto setup_failure;
}
@@ -305,7 +305,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t
&lpJniStorage->mCallbackData);
if (jId == NULL) {
- LOGE("setup: NULL java array for id pointer");
+ ALOGE("setup: NULL java array for id pointer");
lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
goto setup_failure;
}
@@ -319,19 +319,19 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t
sessionId,
0);
if (lpAudioEffect == NULL) {
- LOGE("Error creating AudioEffect");
+ ALOGE("Error creating AudioEffect");
goto setup_failure;
}
lStatus = translateError(lpAudioEffect->initCheck());
if (lStatus != AUDIOEFFECT_SUCCESS && lStatus != AUDIOEFFECT_ERROR_ALREADY_EXISTS) {
- LOGE("AudioEffect initCheck failed %d", lStatus);
+ ALOGE("AudioEffect initCheck failed %d", lStatus);
goto setup_failure;
}
nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL);
if (nId == NULL) {
- LOGE("setup: Error retrieving id pointer");
+ ALOGE("setup: Error retrieving id pointer");
lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
goto setup_failure;
}
@@ -382,7 +382,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t
env->DeleteLocalRef(jdescName);
env->DeleteLocalRef(jdescImplementor);
if (jdesc == NULL) {
- LOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
+ ALOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
goto setup_failure;
}
@@ -534,14 +534,14 @@ static jint android_media_AudioEffect_native_setParameter(JNIEnv *env,
// get the pointer for the param from the java array
lpParam = (jbyte *) env->GetPrimitiveArrayCritical(pJavaParam, NULL);
if (lpParam == NULL) {
- LOGE("setParameter: Error retrieving param pointer");
+ ALOGE("setParameter: Error retrieving param pointer");
goto setParameter_Exit;
}
// get the pointer for the value from the java array
lpValue = (jbyte *) env->GetPrimitiveArrayCritical(pJavaValue, NULL);
if (lpValue == NULL) {
- LOGE("setParameter: Error retrieving value pointer");
+ ALOGE("setParameter: Error retrieving value pointer");
goto setParameter_Exit;
}
@@ -597,14 +597,14 @@ android_media_AudioEffect_native_getParameter(JNIEnv *env,
// get the pointer for the param from the java array
lpParam = (jbyte *) env->GetPrimitiveArrayCritical(pJavaParam, NULL);
if (lpParam == NULL) {
- LOGE("getParameter: Error retrieving param pointer");
+ ALOGE("getParameter: Error retrieving param pointer");
goto getParameter_Exit;
}
// get the pointer for the value from the java array
lpValue = (jbyte *) env->GetPrimitiveArrayCritical(pJavaValue, NULL);
if (lpValue == NULL) {
- LOGE("getParameter: Error retrieving value pointer");
+ ALOGE("getParameter: Error retrieving value pointer");
goto getParameter_Exit;
}
@@ -665,7 +665,7 @@ static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz,
if (cmdSize != 0) {
pCmdData = (jbyte *) env->GetPrimitiveArrayCritical(jCmdData, NULL);
if (pCmdData == NULL) {
- LOGE("setParameter: Error retrieving command pointer");
+ ALOGE("setParameter: Error retrieving command pointer");
goto command_Exit;
}
}
@@ -674,7 +674,7 @@ static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz,
if (replySize != 0 && jReplyData != NULL) {
pReplyData = (jbyte *) env->GetPrimitiveArrayCritical(jReplyData, NULL);
if (pReplyData == NULL) {
- LOGE("setParameter: Error retrieving reply pointer");
+ ALOGE("setParameter: Error retrieving reply pointer");
goto command_Exit;
}
}
@@ -759,7 +759,7 @@ android_media_AudioEffect_native_queryEffects(JNIEnv *env, jclass clazz)
env->DeleteLocalRef(jdescName);
env->DeleteLocalRef(jdescImplementor);
if (jdesc == NULL) {
- LOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
+ ALOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
goto queryEffects_failure;
}
@@ -847,7 +847,7 @@ android_media_AudioEffect_native_queryPreProcessings(JNIEnv *env, jclass clazz,
env->DeleteLocalRef(jdescName);
env->DeleteLocalRef(jdescImplementor);
if (jdesc == NULL) {
- LOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
+ ALOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
env->DeleteLocalRef(ret);
return NULL;;
}
@@ -895,18 +895,18 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- LOGE("ERROR: GetEnv failed\n");
+ ALOGE("ERROR: GetEnv failed\n");
goto bail;
}
assert(env != NULL);
if (register_android_media_AudioEffect(env) < 0) {
- LOGE("ERROR: AudioEffect native registration failed\n");
+ ALOGE("ERROR: AudioEffect native registration failed\n");
goto bail;
}
if (register_android_media_visualizer(env) < 0) {
- LOGE("ERROR: Visualizer native registration failed\n");
+ ALOGE("ERROR: Visualizer native registration failed\n");
goto bail;
}
diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp
index b64505cd265e..ecd4d076aaed 100644
--- a/media/jni/audioeffect/android_media_Visualizer.cpp
+++ b/media/jni/audioeffect/android_media_Visualizer.cpp
@@ -113,7 +113,7 @@ static void captureCallback(void* user,
callbackInfo->visualizer_class);
if (!user || !env) {
- LOGW("captureCallback error user %p, env %p", user, env);
+ ALOGW("captureCallback error user %p, env %p", user, env);
return;
}
@@ -185,7 +185,7 @@ android_media_visualizer_native_init(JNIEnv *env)
// Get the Visualizer class
jclass clazz = env->FindClass(kClassPathName);
if (clazz == NULL) {
- LOGE("Can't find %s", kClassPathName);
+ ALOGE("Can't find %s", kClassPathName);
return;
}
@@ -196,7 +196,7 @@ android_media_visualizer_native_init(JNIEnv *env)
fields.clazzEffect,
"postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V");
if (fields.midPostNativeEvent == NULL) {
- LOGE("Can't find Visualizer.%s", "postEventFromNative");
+ ALOGE("Can't find Visualizer.%s", "postEventFromNative");
return;
}
@@ -206,7 +206,7 @@ android_media_visualizer_native_init(JNIEnv *env)
fields.clazzEffect,
"mNativeVisualizer", "I");
if (fields.fidNativeVisualizer == NULL) {
- LOGE("Can't find Visualizer.%s", "mNativeVisualizer");
+ ALOGE("Can't find Visualizer.%s", "mNativeVisualizer");
return;
}
// fidJniData;
@@ -214,7 +214,7 @@ android_media_visualizer_native_init(JNIEnv *env)
fields.clazzEffect,
"mJniData", "I");
if (fields.fidJniData == NULL) {
- LOGE("Can't find Visualizer.%s", "mJniData");
+ ALOGE("Can't find Visualizer.%s", "mJniData");
return;
}
@@ -233,7 +233,7 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
lpJniStorage = new visualizerJniStorage();
if (lpJniStorage == NULL) {
- LOGE("setup: Error creating JNI Storage");
+ ALOGE("setup: Error creating JNI Storage");
goto setup_failure;
}
@@ -248,7 +248,7 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
&lpJniStorage->mCallbackData);
if (jId == NULL) {
- LOGE("setup: NULL java array for id pointer");
+ ALOGE("setup: NULL java array for id pointer");
lStatus = VISUALIZER_ERROR_BAD_VALUE;
goto setup_failure;
}
@@ -259,19 +259,19 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th
NULL,
sessionId);
if (lpVisualizer == NULL) {
- LOGE("Error creating Visualizer");
+ ALOGE("Error creating Visualizer");
goto setup_failure;
}
lStatus = translateError(lpVisualizer->initCheck());
if (lStatus != VISUALIZER_SUCCESS && lStatus != VISUALIZER_ERROR_ALREADY_EXISTS) {
- LOGE("Visualizer initCheck failed %d", lStatus);
+ ALOGE("Visualizer initCheck failed %d", lStatus);
goto setup_failure;
}
nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL);
if (nId == NULL) {
- LOGE("setup: Error retrieving id pointer");
+ ALOGE("setup: Error retrieving id pointer");
lStatus = VISUALIZER_ERROR_BAD_VALUE;
goto setup_failure;
}
diff --git a/media/jni/mediaeditor/VideoEditorLogging.h b/media/jni/mediaeditor/VideoEditorLogging.h
index c13f6ff8dcc7..479d8b6f9847 100755
--- a/media/jni/mediaeditor/VideoEditorLogging.h
+++ b/media/jni/mediaeditor/VideoEditorLogging.h
@@ -29,7 +29,7 @@
#define VIDEOEDIT_LOG_ALLOCATION __android_log_print
#define VIDEOEDIT_LOG_API __android_log_print
#define VIDEOEDIT_LOG_FUNCTION __android_log_print
-#define VIDEOEDIT_LOG_RESULT(x,y, ...) LOGI(y, __VA_ARGS__ )
+#define VIDEOEDIT_LOG_RESULT(x,y, ...) ALOGI(y, __VA_ARGS__ )
#define VIDEOEDIT_LOG_SETTING __android_log_print
#define VIDEOEDIT_LOG_EDIT_SETTINGS(m_settings) videoEditClasses_logEditSettings\
(m_settings, VIDEOEDIT_LOG_INDENTATION)
diff --git a/media/jni/mediaeditor/VideoEditorMain.cpp b/media/jni/mediaeditor/VideoEditorMain.cpp
index 7083a91cc3cb..c84a88394d56 100755
--- a/media/jni/mediaeditor/VideoEditorMain.cpp
+++ b/media/jni/mediaeditor/VideoEditorMain.cpp
@@ -441,7 +441,7 @@ static void jniPreviewProgressCallback (void* cookie, M4OSA_UInt32 msgType,
if (extPos != NULL) {
*extPos = '\0';
} else {
- LOGE("ERROR the overlay file is incorrect");
+ ALOGE("ERROR the overlay file is incorrect");
}
strcat(pContext->mOverlayFileName, ".png");
@@ -518,7 +518,7 @@ static M4OSA_ERR checkClipVideoProfileAndLevel(M4DECODER_VideoDecoders *pDecoder
// For these case we do not check the profile and level
return M4NO_ERROR;
default :
- LOGE("checkClipVideoProfileAndLevel unsupport Video format %ld", format);
+ ALOGE("checkClipVideoProfileAndLevel unsupport Video format %ld", format);
break;
}
@@ -971,7 +971,7 @@ static int videoEditor_renderPreviewFrame(JNIEnv* pEnv,
if (extPos != NULL) {
*extPos = '\0';
} else {
- LOGE("ERROR the overlay file is incorrect");
+ ALOGE("ERROR the overlay file is incorrect");
}
strcat(tmpOverlayFilename, ".png");
@@ -1510,7 +1510,7 @@ static int removeAlphafromRGB8888 (
M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, M4VS, (M4OSA_Char*)"Image argb data");
if (pTmpData == M4OSA_NULL) {
- LOGE("Failed to allocate memory for Image clip");
+ ALOGE("Failed to allocate memory for Image clip");
return M4ERR_ALLOC;
}
@@ -1520,7 +1520,7 @@ static int removeAlphafromRGB8888 (
if ((lerr != M4NO_ERROR) || (lImageFileFp == M4OSA_NULL))
{
- LOGE("removeAlphafromRGB8888: Can not open the file ");
+ ALOGE("removeAlphafromRGB8888: Can not open the file ");
free(pTmpData);
return M4ERR_FILE_NOT_FOUND;
}
@@ -1529,7 +1529,7 @@ static int removeAlphafromRGB8888 (
lerr = M4OSA_fileReadData(lImageFileFp, (M4OSA_MemAddr8)pTmpData, &frameSize_argb);
if (lerr != M4NO_ERROR)
{
- LOGE("removeAlphafromRGB8888: can not read the data ");
+ ALOGE("removeAlphafromRGB8888: can not read the data ");
M4OSA_fileReadClose(lImageFileFp);
free(pTmpData);
return lerr;
@@ -1545,7 +1545,7 @@ static int removeAlphafromRGB8888 (
if (pFramingCtx->FramingRgb == M4OSA_NULL)
{
- LOGE("Failed to allocate memory for Image clip");
+ ALOGE("Failed to allocate memory for Image clip");
free(pTmpData);
return M4ERR_ALLOC;
}
@@ -2904,7 +2904,7 @@ M4OSA_ERR videoEditor_processClip(
// Other states are unexpected
else {
result = M4ERR_STATE;
- LOGE("videoEditor_processClip ITEM %d State ERROR 0x%x",
+ ALOGE("videoEditor_processClip ITEM %d State ERROR 0x%x",
unuseditemID, (unsigned int) result);
}
}
@@ -2916,13 +2916,13 @@ M4OSA_ERR videoEditor_processClip(
pContext->state = errorState;
// Log the result.
- LOGE("videoEditor_processClip ITEM %d Processing ERROR 0x%x",
+ ALOGE("videoEditor_processClip ITEM %d Processing ERROR 0x%x",
unuseditemID, (unsigned int) result);
}
}
// Return the error result
- LOGE("videoEditor_processClip ITEM %d END 0x%x", unuseditemID, (unsigned int) result);
+ ALOGE("videoEditor_processClip ITEM %d END 0x%x", unuseditemID, (unsigned int) result);
return result;
}
/*+ PROGRESS CB */
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index 40db37facdfb..14a53099fe6b 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -52,7 +52,7 @@ SoundPool::SoundPool(int maxChannels, int streamType, int srcQuality)
else if (mMaxChannels > 32) {
mMaxChannels = 32;
}
- LOGW_IF(maxChannels != mMaxChannels, "App requested %d channels", maxChannels);
+ ALOGW_IF(maxChannels != mMaxChannels, "App requested %d channels", maxChannels);
mQuit = false;
mDecodeThread = 0;
@@ -255,7 +255,7 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
// is sample ready?
sample = findSample(sampleID);
if ((sample == 0) || (sample->state() != Sample::READY)) {
- LOGW(" sample %d not READY", sampleID);
+ ALOGW(" sample %d not READY", sampleID);
return 0;
}
@@ -508,19 +508,19 @@ status_t Sample::doLoad()
mFd = -1;
}
if (p == 0) {
- LOGE("Unable to load sample: %s", mUrl);
+ ALOGE("Unable to load sample: %s", mUrl);
return -1;
}
ALOGV("pointer = %p, size = %u, sampleRate = %u, numChannels = %d",
p->pointer(), p->size(), sampleRate, numChannels);
if (sampleRate > kMaxSampleRate) {
- LOGE("Sample rate (%u) out of range", sampleRate);
+ ALOGE("Sample rate (%u) out of range", sampleRate);
return - 1;
}
if ((numChannels < 1) || (numChannels > 2)) {
- LOGE("Sample channel count (%d) out of range", numChannels);
+ ALOGE("Sample channel count (%d) out of range", numChannels);
return - 1;
}
@@ -616,7 +616,7 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
oldTrack = mAudioTrack;
status = newTrack->initCheck();
if (status != NO_ERROR) {
- LOGE("Error creating AudioTrack");
+ ALOGE("Error creating AudioTrack");
goto exit;
}
ALOGV("setVolume %p", newTrack);
diff --git a/media/jni/soundpool/SoundPoolThread.cpp b/media/jni/soundpool/SoundPoolThread.cpp
index bbb56ff6c6c2..ba3b482935dd 100644
--- a/media/jni/soundpool/SoundPoolThread.cpp
+++ b/media/jni/soundpool/SoundPoolThread.cpp
@@ -91,7 +91,7 @@ int SoundPoolThread::run() {
doLoadSample(msg.mData);
break;
default:
- LOGW("run: Unrecognized message %d\n",
+ ALOGW("run: Unrecognized message %d\n",
msg.mMessageType);
break;
}
diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp
index f86892f328fc..fe1c20a93f9c 100644
--- a/media/jni/soundpool/android_media_SoundPool.cpp
+++ b/media/jni/soundpool/android_media_SoundPool.cpp
@@ -288,27 +288,27 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
jclass clazz;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- LOGE("ERROR: GetEnv failed\n");
+ ALOGE("ERROR: GetEnv failed\n");
goto bail;
}
assert(env != NULL);
clazz = env->FindClass(kClassPathName);
if (clazz == NULL) {
- LOGE("Can't find %s", kClassPathName);
+ ALOGE("Can't find %s", kClassPathName);
goto bail;
}
fields.mNativeContext = env->GetFieldID(clazz, "mNativeContext", "I");
if (fields.mNativeContext == NULL) {
- LOGE("Can't find SoundPool.mNativeContext");
+ ALOGE("Can't find SoundPool.mNativeContext");
goto bail;
}
fields.mPostEvent = env->GetStaticMethodID(clazz, "postEventFromNative",
"(Ljava/lang/Object;IIILjava/lang/Object;)V");
if (fields.mPostEvent == NULL) {
- LOGE("Can't find android/media/SoundPool.postEventFromNative");
+ ALOGE("Can't find android/media/SoundPool.postEventFromNative");
goto bail;
}
diff --git a/media/libeffects/factory/EffectsFactory.c b/media/libeffects/factory/EffectsFactory.c
index ee2279a1acb6..9f6599fa1246 100644
--- a/media/libeffects/factory/EffectsFactory.c
+++ b/media/libeffects/factory/EffectsFactory.c
@@ -279,7 +279,7 @@ int EffectCreate(effect_uuid_t *uuid, int32_t sessionId, int32_t ioId, effect_ha
ret = init();
if (ret < 0) {
- LOGW("EffectCreate() init error: %d", ret);
+ ALOGW("EffectCreate() init error: %d", ret);
return ret;
}
@@ -293,7 +293,7 @@ int EffectCreate(effect_uuid_t *uuid, int32_t sessionId, int32_t ioId, effect_ha
// create effect in library
ret = l->desc->create_effect(uuid, sessionId, ioId, &itfe);
if (ret != 0) {
- LOGW("EffectCreate() library %s: could not create fx %s, error %d", l->name, d->name, ret);
+ ALOGW("EffectCreate() library %s: could not create fx %s, error %d", l->name, d->name, ret);
goto exit;
}
@@ -359,7 +359,7 @@ int EffectRelease(effect_handle_t handle)
// release effect in library
if (fx->lib == NULL) {
- LOGW("EffectRelease() fx %p library already unloaded", handle);
+ ALOGW("EffectRelease() fx %p library already unloaded", handle);
} else {
pthread_mutex_lock(&fx->lib->lock);
fx->lib->desc->release_effect(fx->subItfe);
@@ -456,24 +456,24 @@ int loadLibrary(cnode *root, const char *name)
hdl = dlopen(node->value, RTLD_NOW);
if (hdl == NULL) {
- LOGW("loadLibrary() failed to open %s", node->value);
+ ALOGW("loadLibrary() failed to open %s", node->value);
goto error;
}
desc = (audio_effect_library_t *)dlsym(hdl, AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR);
if (desc == NULL) {
- LOGW("loadLibrary() could not find symbol %s", AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR);
+ ALOGW("loadLibrary() could not find symbol %s", AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR);
goto error;
}
if (AUDIO_EFFECT_LIBRARY_TAG != desc->tag) {
- LOGW("getLibrary() bad tag %08x in lib info struct", desc->tag);
+ ALOGW("getLibrary() bad tag %08x in lib info struct", desc->tag);
goto error;
}
if (EFFECT_API_VERSION_MAJOR(desc->version) !=
EFFECT_API_VERSION_MAJOR(EFFECT_LIBRARY_API_VERSION)) {
- LOGW("loadLibrary() bad lib version %08x", desc->version);
+ ALOGW("loadLibrary() bad lib version %08x", desc->version);
goto error;
}
@@ -534,7 +534,7 @@ int loadEffect(cnode *root)
l = getLibrary(node->value);
if (l == NULL) {
- LOGW("loadEffect() could not get library %s", node->value);
+ ALOGW("loadEffect() could not get library %s", node->value);
return -EINVAL;
}
@@ -543,7 +543,7 @@ int loadEffect(cnode *root)
return -EINVAL;
}
if (stringToUuid(node->value, &uuid) != 0) {
- LOGW("loadEffect() invalid uuid %s", node->value);
+ ALOGW("loadEffect() invalid uuid %s", node->value);
return -EINVAL;
}
@@ -551,7 +551,7 @@ int loadEffect(cnode *root)
if (l->desc->get_descriptor(&uuid, d) != 0) {
char s[40];
uuidToString(&uuid, s, 40);
- LOGW("Error querying effect %s on lib %s", s, l->name);
+ ALOGW("Error querying effect %s on lib %s", s, l->name);
free(d);
return -EINVAL;
}
@@ -562,7 +562,7 @@ int loadEffect(cnode *root)
#endif
if (EFFECT_API_VERSION_MAJOR(d->apiVersion) !=
EFFECT_API_VERSION_MAJOR(EFFECT_CONTROL_API_VERSION)) {
- LOGW("Bad API version %08x on lib %s", d->apiVersion, l->name);
+ ALOGW("Bad API version %08x on lib %s", d->apiVersion, l->name);
free(d);
return -EINVAL;
}
diff --git a/media/libeffects/preprocessing/PreProcessing.cpp b/media/libeffects/preprocessing/PreProcessing.cpp
index c99552bb399c..e988e06b22d5 100755
--- a/media/libeffects/preprocessing/PreProcessing.cpp
+++ b/media/libeffects/preprocessing/PreProcessing.cpp
@@ -240,7 +240,7 @@ int AgcCreate(preproc_effect_t *effect)
webrtc::GainControl *agc = effect->session->apm->gain_control();
ALOGV("AgcCreate got agc %p", agc);
if (agc == NULL) {
- LOGW("AgcCreate Error");
+ ALOGW("AgcCreate Error");
return -ENOMEM;
}
effect->engine = static_cast<preproc_fx_handle_t>(agc);
@@ -280,7 +280,7 @@ int AgcGetParameter(preproc_effect_t *effect,
break;
default:
- LOGW("AgcGetParameter() unknown param %08x", param);
+ ALOGW("AgcGetParameter() unknown param %08x", param);
status = -EINVAL;
break;
}
@@ -305,7 +305,7 @@ int AgcGetParameter(preproc_effect_t *effect,
pProperties->limiterEnabled = (bool)agc->is_limiter_enabled();
break;
default:
- LOGW("AgcGetParameter() unknown param %d", param);
+ ALOGW("AgcGetParameter() unknown param %d", param);
status = -EINVAL;
break;
}
@@ -344,7 +344,7 @@ int AgcSetParameter (preproc_effect_t *effect, void *pParam, void *pValue)
status = agc->enable_limiter(pProperties->limiterEnabled);
break;
default:
- LOGW("AgcSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue);
+ ALOGW("AgcSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue);
status = -EINVAL;
break;
}
@@ -403,7 +403,7 @@ int AecCreate(preproc_effect_t *effect)
webrtc::EchoControlMobile *aec = effect->session->apm->echo_control_mobile();
ALOGV("AecCreate got aec %p", aec);
if (aec == NULL) {
- LOGW("AgcCreate Error");
+ ALOGW("AgcCreate Error");
return -ENOMEM;
}
effect->engine = static_cast<preproc_fx_handle_t>(aec);
@@ -429,7 +429,7 @@ int AecGetParameter(preproc_effect_t *effect,
ALOGV("AecGetParameter() echo delay %d us", *(uint32_t *)pValue);
break;
default:
- LOGW("AecGetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue);
+ ALOGW("AecGetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue);
status = -EINVAL;
break;
}
@@ -449,7 +449,7 @@ int AecSetParameter (preproc_effect_t *effect, void *pParam, void *pValue)
ALOGV("AecSetParameter() echo delay %d us, status %d", value, status);
break;
default:
- LOGW("AecSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue);
+ ALOGW("AecSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue);
status = -EINVAL;
break;
}
@@ -522,7 +522,7 @@ int NsCreate(preproc_effect_t *effect)
webrtc::NoiseSuppression *ns = effect->session->apm->noise_suppression();
ALOGV("NsCreate got ns %p", ns);
if (ns == NULL) {
- LOGW("AgcCreate Error");
+ ALOGW("AgcCreate Error");
return -ENOMEM;
}
effect->engine = static_cast<preproc_fx_handle_t>(ns);
@@ -616,7 +616,7 @@ int Effect_SetState(preproc_effect_t *effect, uint32_t state)
case PREPROC_EFFECT_STATE_CREATED:
case PREPROC_EFFECT_STATE_ACTIVE:
case PREPROC_EFFECT_STATE_CONFIG:
- LOGE("Effect_SetState invalid transition");
+ ALOGE("Effect_SetState invalid transition");
status = -ENOSYS;
break;
default:
@@ -626,7 +626,7 @@ int Effect_SetState(preproc_effect_t *effect, uint32_t state)
case PREPROC_EFFECT_STATE_CONFIG:
switch(effect->state) {
case PREPROC_EFFECT_STATE_INIT:
- LOGE("Effect_SetState invalid transition");
+ ALOGE("Effect_SetState invalid transition");
status = -ENOSYS;
break;
case PREPROC_EFFECT_STATE_ACTIVE:
@@ -645,7 +645,7 @@ int Effect_SetState(preproc_effect_t *effect, uint32_t state)
case PREPROC_EFFECT_STATE_INIT:
case PREPROC_EFFECT_STATE_CREATED:
case PREPROC_EFFECT_STATE_ACTIVE:
- LOGE("Effect_SetState invalid transition");
+ ALOGE("Effect_SetState invalid transition");
status = -ENOSYS;
break;
case PREPROC_EFFECT_STATE_CONFIG:
@@ -730,7 +730,7 @@ extern "C" int Session_CreateEffect(preproc_session_t *session,
if (session->createdMsk == 0) {
session->apm = webrtc::AudioProcessing::Create(session->io);
if (session->apm == NULL) {
- LOGW("Session_CreateEffect could not get apm engine");
+ ALOGW("Session_CreateEffect could not get apm engine");
goto error;
}
session->apm->set_sample_rate_hz(kPreprocDefaultSr);
@@ -738,12 +738,12 @@ extern "C" int Session_CreateEffect(preproc_session_t *session,
session->apm->set_num_reverse_channels(kPreProcDefaultCnl);
session->procFrame = new webrtc::AudioFrame();
if (session->procFrame == NULL) {
- LOGW("Session_CreateEffect could not allocate audio frame");
+ ALOGW("Session_CreateEffect could not allocate audio frame");
goto error;
}
session->revFrame = new webrtc::AudioFrame();
if (session->revFrame == NULL) {
- LOGW("Session_CreateEffect could not allocate reverse audio frame");
+ ALOGW("Session_CreateEffect could not allocate reverse audio frame");
goto error;
}
session->apmSamplingRate = kPreprocDefaultSr;
@@ -794,7 +794,7 @@ error:
int Session_ReleaseEffect(preproc_session_t *session,
preproc_effect_t *fx)
{
- LOGW_IF(Effect_Release(fx) != 0, " Effect_Release() failed for proc ID %d", fx->procId);
+ ALOGW_IF(Effect_Release(fx) != 0, " Effect_Release() failed for proc ID %d", fx->procId);
session->createdMsk &= ~(1<<fx->procId);
if (session->createdMsk == 0) {
webrtc::AudioProcessing::Destroy(session->apm);
@@ -904,7 +904,7 @@ int Session_SetConfig(preproc_session_t *session, effect_config_t *config)
RESAMPLER_QUALITY,
&error);
if (session->inResampler == NULL) {
- LOGW("Session_SetConfig Cannot create speex resampler: %s",
+ ALOGW("Session_SetConfig Cannot create speex resampler: %s",
speex_resampler_strerror(error));
return -EINVAL;
}
@@ -914,7 +914,7 @@ int Session_SetConfig(preproc_session_t *session, effect_config_t *config)
RESAMPLER_QUALITY,
&error);
if (session->outResampler == NULL) {
- LOGW("Session_SetConfig Cannot create speex resampler: %s",
+ ALOGW("Session_SetConfig Cannot create speex resampler: %s",
speex_resampler_strerror(error));
speex_resampler_destroy(session->inResampler);
session->inResampler = NULL;
@@ -926,7 +926,7 @@ int Session_SetConfig(preproc_session_t *session, effect_config_t *config)
RESAMPLER_QUALITY,
&error);
if (session->revResampler == NULL) {
- LOGW("Session_SetConfig Cannot create speex resampler: %s",
+ ALOGW("Session_SetConfig Cannot create speex resampler: %s",
speex_resampler_strerror(error));
speex_resampler_destroy(session->inResampler);
session->inResampler = NULL;
@@ -1105,7 +1105,7 @@ int PreProcessingFx_Process(effect_handle_t self,
if (inBuffer == NULL || inBuffer->raw == NULL ||
outBuffer == NULL || outBuffer->raw == NULL){
- LOGW("PreProcessingFx_Process() ERROR bad pointer");
+ ALOGW("PreProcessingFx_Process() ERROR bad pointer");
return -EINVAL;
}
@@ -1443,13 +1443,13 @@ int PreProcessingFx_ProcessReverse(effect_handle_t self,
int status = 0;
if (effect == NULL){
- LOGW("PreProcessingFx_ProcessReverse() ERROR effect == NULL");
+ ALOGW("PreProcessingFx_ProcessReverse() ERROR effect == NULL");
return -EINVAL;
}
preproc_session_t * session = (preproc_session_t *)effect->session;
if (inBuffer == NULL || inBuffer->raw == NULL){
- LOGW("PreProcessingFx_ProcessReverse() ERROR bad pointer");
+ ALOGW("PreProcessingFx_ProcessReverse() ERROR bad pointer");
return -EINVAL;
}
@@ -1585,14 +1585,14 @@ int PreProcessingLib_Create(effect_uuid_t *uuid,
}
desc = PreProc_GetDescriptor(uuid);
if (desc == NULL) {
- LOGW("EffectCreate: fx not found uuid: %08x", uuid->timeLow);
+ ALOGW("EffectCreate: fx not found uuid: %08x", uuid->timeLow);
return -EINVAL;
}
procId = UuidToProcId(&desc->type);
session = PreProc_GetSession(procId, sessionId, ioId);
if (session == NULL) {
- LOGW("EffectCreate: no more session available");
+ ALOGW("EffectCreate: no more session available");
return -EINVAL;
}
diff --git a/media/libeffects/testlibs/EffectEqualizer.cpp b/media/libeffects/testlibs/EffectEqualizer.cpp
index 52fbf79e0d3c..5241660612ff 100644
--- a/media/libeffects/testlibs/EffectEqualizer.cpp
+++ b/media/libeffects/testlibs/EffectEqualizer.cpp
@@ -165,7 +165,7 @@ extern "C" int EffectCreate(effect_uuid_t *uuid,
ret = Equalizer_init(pContext);
if (ret < 0) {
- LOGW("EffectLibCreateEffect() init failed");
+ ALOGW("EffectLibCreateEffect() init failed");
delete pContext;
return ret;
}
@@ -735,7 +735,7 @@ extern "C" int Equalizer_command(effect_handle_t self, uint32_t cmdCode, uint32_
case EFFECT_CMD_SET_AUDIO_MODE:
break;
default:
- LOGW("Equalizer_command invalid command %d",cmdCode);
+ ALOGW("Equalizer_command invalid command %d",cmdCode);
return -EINVAL;
}
diff --git a/media/libeffects/testlibs/EffectReverb.c b/media/libeffects/testlibs/EffectReverb.c
index 419a41c94e7e..ebb72c1ff1f4 100644
--- a/media/libeffects/testlibs/EffectReverb.c
+++ b/media/libeffects/testlibs/EffectReverb.c
@@ -154,7 +154,7 @@ int EffectCreate(effect_uuid_t *uuid,
}
ret = Reverb_Init(module, aux, preset);
if (ret < 0) {
- LOGW("EffectLibCreateEffect() init failed");
+ ALOGW("EffectLibCreateEffect() init failed");
free(module);
return ret;
}
@@ -405,7 +405,7 @@ static int Reverb_Command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSi
ALOGV("Reverb_Command EFFECT_CMD_SET_AUDIO_MODE: %d", *(uint32_t *)pCmdData);
break;
default:
- LOGW("Reverb_Command invalid command %d",cmdCode);
+ ALOGW("Reverb_Command invalid command %d",cmdCode);
return -EINVAL;
}
diff --git a/media/libeffects/visualizer/EffectVisualizer.cpp b/media/libeffects/visualizer/EffectVisualizer.cpp
index b2a7a35cf568..5d70a9b7d05a 100644
--- a/media/libeffects/visualizer/EffectVisualizer.cpp
+++ b/media/libeffects/visualizer/EffectVisualizer.cpp
@@ -212,7 +212,7 @@ int VisualizerLib_Create(effect_uuid_t *uuid,
ret = Visualizer_init(pContext);
if (ret < 0) {
- LOGW("VisualizerLib_Create() init failed");
+ ALOGW("VisualizerLib_Create() init failed");
delete pContext;
return ret;
}
@@ -472,7 +472,7 @@ int Visualizer_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize,
break;
default:
- LOGW("Visualizer_command invalid command %d",cmdCode);
+ ALOGW("Visualizer_command invalid command %d",cmdCode);
return -EINVAL;
}
diff --git a/media/libmedia/AudioEffect.cpp b/media/libmedia/AudioEffect.cpp
index 6e53a15af7be..6639d06369f2 100644
--- a/media/libmedia/AudioEffect.cpp
+++ b/media/libmedia/AudioEffect.cpp
@@ -101,18 +101,18 @@ status_t AudioEffect::set(const effect_uuid_t *type,
ALOGV("set %p mUserData: %p uuid: %p timeLow %08x", this, user, type, type ? type->timeLow : 0);
if (mIEffect != 0) {
- LOGW("Effect already in use");
+ ALOGW("Effect already in use");
return INVALID_OPERATION;
}
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
if (audioFlinger == 0) {
- LOGE("set(): Could not get audioflinger");
+ ALOGE("set(): Could not get audioflinger");
return NO_INIT;
}
if (type == NULL && uuid == NULL) {
- LOGW("Must specify at least type or uuid");
+ ALOGW("Must specify at least type or uuid");
return BAD_VALUE;
}
@@ -138,7 +138,7 @@ status_t AudioEffect::set(const effect_uuid_t *type,
mIEffectClient, priority, io, mSessionId, &mStatus, &mId, &enabled);
if (iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) {
- LOGE("set(): AudioFlinger could not create effect, status: %d", mStatus);
+ ALOGE("set(): AudioFlinger could not create effect, status: %d", mStatus);
return mStatus;
}
@@ -148,7 +148,7 @@ status_t AudioEffect::set(const effect_uuid_t *type,
cblk = iEffect->getCblk();
if (cblk == 0) {
mStatus = NO_INIT;
- LOGE("Could not get control block");
+ ALOGE("Could not get control block");
return mStatus;
}
@@ -340,7 +340,7 @@ status_t AudioEffect::getParameter(effect_param_t *param)
void AudioEffect::binderDied()
{
- LOGW("IEffect died");
+ ALOGW("IEffect died");
mStatus = NO_INIT;
if (mCbf) {
status_t status = DEAD_OBJECT;
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index dd1c6a502139..26740707adb2 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -54,12 +54,12 @@ status_t AudioRecord::getMinFrameCount(
size_t size = 0;
if (AudioSystem::getInputBufferSize(sampleRate, format, channelCount, &size)
!= NO_ERROR) {
- LOGE("AudioSystem could not query the input buffer size.");
+ ALOGE("AudioSystem could not query the input buffer size.");
return NO_INIT;
}
if (size == 0) {
- LOGE("Unsupported configuration: sampleRate %d, format %d, channelCount %d",
+ ALOGE("Unsupported configuration: sampleRate %d, format %d, channelCount %d",
sampleRate, format, channelCount);
return BAD_VALUE;
}
@@ -153,7 +153,7 @@ status_t AudioRecord::set(
}
// validate parameters
if (!audio_is_valid_format(format)) {
- LOGE("Invalid format");
+ ALOGE("Invalid format");
return BAD_VALUE;
}
@@ -177,7 +177,7 @@ status_t AudioRecord::set(
(audio_in_acoustics_t)flags,
mSessionId);
if (input == 0) {
- LOGE("Could not get audio input for record source %d", inputSource);
+ ALOGE("Could not get audio input for record source %d", inputSource);
return BAD_VALUE;
}
@@ -292,7 +292,7 @@ status_t AudioRecord::start()
if (t != 0) {
if (t->exitPending()) {
if (t->requestExitAndWait() == WOULD_BLOCK) {
- LOGE("AudioRecord::start called from thread");
+ ALOGE("AudioRecord::start called from thread");
return WOULD_BLOCK;
}
}
@@ -472,12 +472,12 @@ status_t AudioRecord::openRecord_l(
&status);
if (record == 0) {
- LOGE("AudioFlinger could not create record track, status: %d", status);
+ ALOGE("AudioFlinger could not create record track, status: %d", status);
return status;
}
sp<IMemory> cblk = record->getCblk();
if (cblk == 0) {
- LOGE("Could not get control block");
+ ALOGE("Could not get control block");
return NO_INIT;
}
mAudioRecord.clear();
@@ -535,7 +535,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
if (CC_UNLIKELY(result != NO_ERROR)) {
cblk->waitTimeMs += waitTimeMs;
if (cblk->waitTimeMs >= cblk->bufferTimeoutMs) {
- LOGW( "obtainBuffer timed out (is the CPU pegged?) "
+ ALOGW( "obtainBuffer timed out (is the CPU pegged?) "
"user=%08x, server=%08x", cblk->user, cblk->server);
cblk->lock.unlock();
result = mAudioRecord->start();
@@ -546,7 +546,7 @@ create_new_record:
result = AudioRecord::restoreRecord_l(cblk);
}
if (result != NO_ERROR) {
- LOGW("obtainBuffer create Track error %d", result);
+ ALOGW("obtainBuffer create Track error %d", result);
cblk->lock.unlock();
return result;
}
@@ -626,7 +626,7 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize)
if (ssize_t(userSize) < 0) {
// sanity-check. user is most-likely passing an error code.
- LOGE("AudioRecord::read(buffer=%p, size=%u (%d)",
+ ALOGE("AudioRecord::read(buffer=%p, size=%u (%d)",
buffer, userSize, userSize);
return BAD_VALUE;
}
@@ -709,7 +709,7 @@ bool AudioRecord::processAudioBuffer(const sp<ClientRecordThread>& thread)
status_t err = obtainBuffer(&audioBuffer, 1);
if (err < NO_ERROR) {
if (err != TIMED_OUT) {
- LOGE_IF(err != status_t(NO_MORE_BUFFERS), "Error obtaining an audio buffer, giving up.");
+ ALOGE_IF(err != status_t(NO_MORE_BUFFERS), "Error obtaining an audio buffer, giving up.");
return false;
}
break;
@@ -764,7 +764,7 @@ status_t AudioRecord::restoreRecord_l(audio_track_cblk_t*& cblk)
status_t result;
if (!(android_atomic_or(CBLK_RESTORING_ON, &cblk->flags) & CBLK_RESTORING_MSK)) {
- LOGW("dead IAudioRecord, creating a new one");
+ ALOGW("dead IAudioRecord, creating a new one");
// signal old cblk condition so that other threads waiting for available buffers stop
// waiting now
cblk->cv.broadcast();
@@ -787,13 +787,13 @@ status_t AudioRecord::restoreRecord_l(audio_track_cblk_t*& cblk)
cblk->cv.broadcast();
} else {
if (!(cblk->flags & CBLK_RESTORED_MSK)) {
- LOGW("dead IAudioRecord, waiting for a new one to be created");
+ ALOGW("dead IAudioRecord, waiting for a new one to be created");
mLock.unlock();
result = cblk->cv.waitRelative(cblk->lock, milliseconds(RESTORE_TIMEOUT_MS));
cblk->lock.unlock();
mLock.lock();
} else {
- LOGW("dead IAudioRecord, already restored");
+ ALOGW("dead IAudioRecord, already restored");
result = NO_ERROR;
cblk->lock.unlock();
}
@@ -810,7 +810,7 @@ status_t AudioRecord::restoreRecord_l(audio_track_cblk_t*& cblk)
}
cblk->lock.lock();
- LOGW_IF(result != NO_ERROR, "restoreRecord_l() error %d", result);
+ ALOGW_IF(result != NO_ERROR, "restoreRecord_l() error %d", result);
return result;
}
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp
index 61d0dad56aff..f7f129c30bb8 100644
--- a/media/libmedia/AudioSystem.cpp
+++ b/media/libmedia/AudioSystem.cpp
@@ -56,7 +56,7 @@ const sp<IAudioFlinger>& AudioSystem::get_audio_flinger()
binder = sm->getService(String16("media.audio_flinger"));
if (binder != 0)
break;
- LOGW("AudioFlinger not published, waiting...");
+ ALOGW("AudioFlinger not published, waiting...");
usleep(500000); // 0.5 s
} while(true);
if (gAudioFlingerClient == NULL) {
@@ -70,7 +70,7 @@ const sp<IAudioFlinger>& AudioSystem::get_audio_flinger()
gAudioFlinger = interface_cast<IAudioFlinger>(binder);
gAudioFlinger->registerClient(gAudioFlingerClient);
}
- LOGE_IF(gAudioFlinger==0, "no AudioFlinger!?");
+ ALOGE_IF(gAudioFlinger==0, "no AudioFlinger!?");
return gAudioFlinger;
}
@@ -383,7 +383,7 @@ void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) {
if (gAudioErrorCallback) {
gAudioErrorCallback(DEAD_OBJECT);
}
- LOGW("AudioFlinger server died!");
+ ALOGW("AudioFlinger server died!");
}
void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, void *param2) {
@@ -419,7 +419,7 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, v
} break;
case OUTPUT_CLOSED: {
if (gOutputs.indexOfKey(ioHandle) < 0) {
- LOGW("ioConfigChanged() closing unknow output! %d", ioHandle);
+ ALOGW("ioConfigChanged() closing unknow output! %d", ioHandle);
break;
}
ALOGV("ioConfigChanged() output %d closed", ioHandle);
@@ -435,7 +435,7 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, v
case OUTPUT_CONFIG_CHANGED: {
int index = gOutputs.indexOfKey(ioHandle);
if (index < 0) {
- LOGW("ioConfigChanged() modifying unknow output! %d", ioHandle);
+ ALOGW("ioConfigChanged() modifying unknow output! %d", ioHandle);
break;
}
if (param2 == 0) break;
@@ -491,7 +491,7 @@ const sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service()
binder = sm->getService(String16("media.audio_policy"));
if (binder != 0)
break;
- LOGW("AudioPolicyService not published, waiting...");
+ ALOGW("AudioPolicyService not published, waiting...");
usleep(500000); // 0.5 s
} while(true);
if (gAudioPolicyServiceClient == NULL) {
@@ -747,7 +747,7 @@ void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who) {
Mutex::Autolock _l(AudioSystem::gLock);
AudioSystem::gAudioPolicyService.clear();
- LOGW("AudioPolicyService server died!");
+ ALOGW("AudioPolicyService server died!");
}
}; // namespace android
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index e0c6ca5b9d54..191fbaf327ce 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -158,7 +158,7 @@ status_t AudioTrack::set(
AutoMutex lock(mLock);
if (mAudioTrack != 0) {
- LOGE("Track already in use");
+ ALOGE("Track already in use");
return INVALID_OPERATION;
}
@@ -188,7 +188,7 @@ status_t AudioTrack::set(
// validate parameters
if (!audio_is_valid_format(format)) {
- LOGE("Invalid format");
+ ALOGE("Invalid format");
return BAD_VALUE;
}
@@ -198,7 +198,7 @@ status_t AudioTrack::set(
}
if (!audio_is_output_channel(channelMask)) {
- LOGE("Invalid channel mask");
+ ALOGE("Invalid channel mask");
return BAD_VALUE;
}
uint32_t channelCount = popcount(channelMask);
@@ -209,7 +209,7 @@ status_t AudioTrack::set(
(audio_policy_output_flags_t)flags);
if (output == 0) {
- LOGE("Could not get audio output for stream type %d", streamType);
+ ALOGE("Could not get audio output for stream type %d", streamType);
return BAD_VALUE;
}
@@ -239,7 +239,7 @@ status_t AudioTrack::set(
if (cbf != 0) {
mAudioTrackThread = new AudioTrackThread(*this, threadCanCallJava);
if (mAudioTrackThread == 0) {
- LOGE("Could not create callback thread");
+ ALOGE("Could not create callback thread");
return NO_INIT;
}
}
@@ -252,7 +252,7 @@ status_t AudioTrack::set(
mChannelCount = channelCount;
mSharedBuffer = sharedBuffer;
mMuted = false;
- mActive = 0;
+ mActive = false;
mCbf = cbf;
mUserData = user;
mLoopCount = 0;
@@ -324,7 +324,7 @@ void AudioTrack::start()
if (t != 0) {
if (t->exitPending()) {
if (t->requestExitAndWait() == WOULD_BLOCK) {
- LOGE("AudioTrack::start called from thread");
+ ALOGE("AudioTrack::start called from thread");
return;
}
}
@@ -338,9 +338,9 @@ void AudioTrack::start()
sp <IMemory> iMem = mCblkMemory;
audio_track_cblk_t* cblk = mCblk;
- if (mActive == 0) {
+ if (!mActive) {
mFlushed = false;
- mActive = 1;
+ mActive = true;
mNewPosition = cblk->server + mUpdatePeriod;
cblk->lock.lock();
cblk->bufferTimeoutMs = MAX_STARTUP_TIMEOUT_MS;
@@ -369,7 +369,7 @@ void AudioTrack::start()
cblk->lock.unlock();
if (status != NO_ERROR) {
ALOGV("start() failed");
- mActive = 0;
+ mActive = false;
if (t != 0) {
t->requestExit();
} else {
@@ -394,8 +394,8 @@ void AudioTrack::stop()
}
AutoMutex lock(mLock);
- if (mActive == 1) {
- mActive = 0;
+ if (mActive) {
+ mActive = false;
mCblk->cv.signal();
mAudioTrack->stop();
// Cancel loops (If we are in the middle of a loop, playback
@@ -424,7 +424,8 @@ void AudioTrack::stop()
bool AudioTrack::stopped() const
{
- return !mActive;
+ AutoMutex lock(mLock);
+ return stopped_l();
}
void AudioTrack::flush()
@@ -456,8 +457,8 @@ void AudioTrack::pause()
{
ALOGV("pause");
AutoMutex lock(mLock);
- if (mActive == 1) {
- mActive = 0;
+ if (mActive) {
+ mActive = false;
mAudioTrack->pause();
}
}
@@ -566,12 +567,12 @@ status_t AudioTrack::setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCou
if (loopStart >= loopEnd ||
loopEnd - loopStart > cblk->frameCount ||
cblk->server > loopStart) {
- LOGE("setLoop invalid value: loopStart %d, loopEnd %d, loopCount %d, framecount %d, user %d", loopStart, loopEnd, loopCount, cblk->frameCount, cblk->user);
+ ALOGE("setLoop invalid value: loopStart %d, loopEnd %d, loopCount %d, framecount %d, user %d", loopStart, loopEnd, loopCount, cblk->frameCount, cblk->user);
return BAD_VALUE;
}
if ((mSharedBuffer != 0) && (loopEnd > cblk->frameCount)) {
- LOGE("setLoop invalid value: loop markers beyond data: loopStart %d, loopEnd %d, framecount %d",
+ ALOGE("setLoop invalid value: loop markers beyond data: loopStart %d, loopEnd %d, framecount %d",
loopStart, loopEnd, cblk->frameCount);
return BAD_VALUE;
}
@@ -647,9 +648,10 @@ status_t AudioTrack::getPositionUpdatePeriod(uint32_t *updatePeriod)
status_t AudioTrack::setPosition(uint32_t position)
{
AutoMutex lock(mLock);
- Mutex::Autolock _l(mCblk->lock);
- if (!stopped()) return INVALID_OPERATION;
+ if (!stopped_l()) return INVALID_OPERATION;
+
+ Mutex::Autolock _l(mCblk->lock);
if (position > mCblk->user) return BAD_VALUE;
@@ -672,7 +674,7 @@ status_t AudioTrack::reload()
{
AutoMutex lock(mLock);
- if (!stopped()) return INVALID_OPERATION;
+ if (!stopped_l()) return INVALID_OPERATION;
flush_l();
@@ -726,7 +728,7 @@ status_t AudioTrack::createTrack_l(
status_t status;
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
if (audioFlinger == 0) {
- LOGE("Could not get audioflinger");
+ ALOGE("Could not get audioflinger");
return NO_INIT;
}
@@ -769,7 +771,7 @@ status_t AudioTrack::createTrack_l(
}
if (frameCount < minFrameCount) {
if (enforceFrameCount) {
- LOGE("Invalid buffer size: minFrameCount %d, frameCount %d", minFrameCount, frameCount);
+ ALOGE("Invalid buffer size: minFrameCount %d, frameCount %d", minFrameCount, frameCount);
return BAD_VALUE;
} else {
frameCount = minFrameCount;
@@ -779,7 +781,7 @@ status_t AudioTrack::createTrack_l(
// Ensure that buffer alignment matches channelcount
int channelCount = popcount(channelMask);
if (((uint32_t)sharedBuffer->pointer() & (channelCount | 1)) != 0) {
- LOGE("Invalid buffer alignement: address %p, channelCount %d", sharedBuffer->pointer(), channelCount);
+ ALOGE("Invalid buffer alignement: address %p, channelCount %d", sharedBuffer->pointer(), channelCount);
return BAD_VALUE;
}
frameCount = sharedBuffer->size()/channelCount/sizeof(int16_t);
@@ -799,12 +801,12 @@ status_t AudioTrack::createTrack_l(
&status);
if (track == 0) {
- LOGE("AudioFlinger could not create track, status: %d", status);
+ ALOGE("AudioFlinger could not create track, status: %d", status);
return status;
}
sp<IMemory> cblk = track->getCblk();
if (cblk == 0) {
- LOGE("Could not get control block");
+ ALOGE("Could not get control block");
return NO_INIT;
}
mAudioTrack = track;
@@ -832,7 +834,7 @@ status_t AudioTrack::createTrack_l(
status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
{
AutoMutex lock(mLock);
- int active;
+ bool active;
status_t result = NO_ERROR;
audio_track_cblk_t* cblk = mCblk;
uint32_t framesReq = audioBuffer->frameCount;
@@ -868,7 +870,7 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
result = cblk->cv.waitRelative(cblk->lock, milliseconds(waitTimeMs));
cblk->lock.unlock();
mLock.lock();
- if (mActive == 0) {
+ if (!mActive) {
return status_t(STOPPED);
}
cblk->lock.lock();
@@ -883,7 +885,7 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
// timing out when a loop has been set and we have already written upto loop end
// is a normal condition: no need to wake AudioFlinger up.
if (cblk->user < cblk->loopEnd) {
- LOGW( "obtainBuffer timed out (is the CPU pegged?) %p "
+ ALOGW( "obtainBuffer timed out (is the CPU pegged?) %p "
"user=%08x, server=%08x", this, cblk->user, cblk->server);
//unlock cblk mutex before calling mAudioTrack->start() (see issue #1617140)
cblk->lock.unlock();
@@ -895,7 +897,7 @@ create_new_track:
result = restoreTrack_l(cblk, false);
}
if (result != NO_ERROR) {
- LOGW("obtainBuffer create Track error %d", result);
+ ALOGW("obtainBuffer create Track error %d", result);
cblk->lock.unlock();
return result;
}
@@ -918,7 +920,7 @@ create_new_track:
// restart track if it was disabled by audioflinger due to previous underrun
if (mActive && (cblk->flags & CBLK_DISABLED_MSK)) {
android_atomic_and(~CBLK_DISABLED_ON, &cblk->flags);
- LOGW("obtainBuffer() track %p disabled, restarting", this);
+ ALOGW("obtainBuffer() track %p disabled, restarting", this);
mAudioTrack->start();
}
@@ -964,7 +966,7 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize)
if (ssize_t(userSize) < 0) {
// sanity-check. user is most-likely passing an error code.
- LOGE("AudioTrack::write(buffer=%p, size=%u (%d)",
+ ALOGE("AudioTrack::write(buffer=%p, size=%u (%d)",
buffer, userSize, userSize);
return BAD_VALUE;
}
@@ -1035,10 +1037,11 @@ bool AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
sp <IAudioTrack> audioTrack = mAudioTrack;
sp <IMemory> iMem = mCblkMemory;
audio_track_cblk_t* cblk = mCblk;
+ bool active = mActive;
mLock.unlock();
// Manage underrun callback
- if (mActive && (cblk->framesAvailable() == cblk->frameCount)) {
+ if (active && (cblk->framesAvailable() == cblk->frameCount)) {
ALOGV("Underrun user: %x, server: %x, flags %04x", cblk->user, cblk->server, cblk->flags);
if (!(android_atomic_or(CBLK_UNDERRUN_ON, &cblk->flags) & CBLK_UNDERRUN_MSK)) {
mCbf(EVENT_UNDERRUN, mUserData, 0);
@@ -1096,7 +1099,7 @@ bool AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
status_t err = obtainBuffer(&audioBuffer, waitCount);
if (err < NO_ERROR) {
if (err != TIMED_OUT) {
- LOGE_IF(err != status_t(NO_MORE_BUFFERS), "Error obtaining an audio buffer, giving up.");
+ ALOGE_IF(err != status_t(NO_MORE_BUFFERS), "Error obtaining an audio buffer, giving up.");
return false;
}
break;
@@ -1164,7 +1167,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart)
status_t result;
if (!(android_atomic_or(CBLK_RESTORING_ON, &cblk->flags) & CBLK_RESTORING_MSK)) {
- LOGW("dead IAudioTrack, creating a new one from %s TID %d",
+ ALOGW("dead IAudioTrack, creating a new one from %s TID %d",
fromStart ? "start()" : "obtainBuffer()", gettid());
// signal old cblk condition so that other threads waiting for available buffers stop
@@ -1220,7 +1223,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart)
}
if (mActive) {
result = mAudioTrack->start();
- LOGW_IF(result != NO_ERROR, "restoreTrack_l() start() failed status %d", result);
+ ALOGW_IF(result != NO_ERROR, "restoreTrack_l() start() failed status %d", result);
}
if (fromStart && result == NO_ERROR) {
mNewPosition = mCblk->server + mUpdatePeriod;
@@ -1228,7 +1231,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart)
}
if (result != NO_ERROR) {
android_atomic_and(~CBLK_RESTORING_ON, &cblk->flags);
- LOGW_IF(result != NO_ERROR, "restoreTrack_l() failed status %d", result);
+ ALOGW_IF(result != NO_ERROR, "restoreTrack_l() failed status %d", result);
}
mRestoreStatus = result;
// signal old cblk condition for other threads waiting for restore completion
@@ -1236,7 +1239,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart)
cblk->cv.broadcast();
} else {
if (!(cblk->flags & CBLK_RESTORED_MSK)) {
- LOGW("dead IAudioTrack, waiting for a new one TID %d", gettid());
+ ALOGW("dead IAudioTrack, waiting for a new one TID %d", gettid());
mLock.unlock();
result = cblk->cv.waitRelative(cblk->lock, milliseconds(RESTORE_TIMEOUT_MS));
if (result == NO_ERROR) {
@@ -1245,7 +1248,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart)
cblk->lock.unlock();
mLock.lock();
} else {
- LOGW("dead IAudioTrack, already restored TID %d", gettid());
+ ALOGW("dead IAudioTrack, already restored TID %d", gettid());
result = mRestoreStatus;
cblk->lock.unlock();
}
@@ -1259,7 +1262,7 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart)
}
cblk->lock.lock();
- LOGW_IF(result != NO_ERROR, "restoreTrack_l() error %d TID %d", result, gettid());
+ ALOGW_IF(result != NO_ERROR, "restoreTrack_l() error %d TID %d", result, gettid());
return result;
}
@@ -1328,7 +1331,7 @@ uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount)
bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
}
} else if (u > server) {
- LOGW("stepServer occurred after track reset");
+ ALOGW("stepServer occurred after track reset");
u = server;
}
@@ -1349,7 +1352,7 @@ uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount)
bool audio_track_cblk_t::stepServer(uint32_t frameCount)
{
if (!tryLock()) {
- LOGW("stepServer() could not lock cblk");
+ ALOGW("stepServer() could not lock cblk");
return false;
}
@@ -1367,13 +1370,13 @@ bool audio_track_cblk_t::stepServer(uint32_t frameCount)
// stepServer() is called After the flush() has reset u & s and
// we have s > u
if (s > user) {
- LOGW("stepServer occurred after track reset");
+ ALOGW("stepServer occurred after track reset");
s = user;
}
}
if (s >= loopEnd) {
- LOGW_IF(s > loopEnd, "stepServer: s %u > loopEnd %u", s, loopEnd);
+ ALOGW_IF(s > loopEnd, "stepServer: s %u > loopEnd %u", s, loopEnd);
s = loopStart;
if (--loopCount == 0) {
loopEnd = UINT_MAX;
@@ -1428,7 +1431,7 @@ uint32_t audio_track_cblk_t::framesReady()
} else {
// do not block on mutex shared with client on AudioFlinger side
if (!tryLock()) {
- LOGW("framesReady() could not lock cblk");
+ ALOGW("framesReady() could not lock cblk");
return 0;
}
uint32_t frames = UINT_MAX;
diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp
index bedf8d3c7946..abd491f62534 100644
--- a/media/libmedia/IAudioFlinger.cpp
+++ b/media/libmedia/IAudioFlinger.cpp
@@ -112,7 +112,7 @@ public:
data.writeInt32(lSessionId);
status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
if (lStatus != NO_ERROR) {
- LOGE("createTrack error: %s", strerror(-lStatus));
+ ALOGE("createTrack error: %s", strerror(-lStatus));
} else {
lSessionId = reply.readInt32();
if (sessionId != NULL) {
@@ -155,7 +155,7 @@ public:
data.writeInt32(lSessionId);
status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
if (lStatus != NO_ERROR) {
- LOGE("openRecord error: %s", strerror(-lStatus));
+ ALOGE("openRecord error: %s", strerror(-lStatus));
} else {
lSessionId = reply.readInt32();
if (sessionId != NULL) {
@@ -632,7 +632,7 @@ public:
status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
if (lStatus != NO_ERROR) {
- LOGE("createEffect error: %s", strerror(-lStatus));
+ ALOGE("createEffect error: %s", strerror(-lStatus));
} else {
lStatus = reply.readInt32();
int tmp = reply.readInt32();
diff --git a/media/libmedia/IAudioRecord.cpp b/media/libmedia/IAudioRecord.cpp
index ba0d55b843d4..8c7a96023498 100644
--- a/media/libmedia/IAudioRecord.cpp
+++ b/media/libmedia/IAudioRecord.cpp
@@ -50,7 +50,7 @@ public:
if (status == NO_ERROR) {
status = reply.readInt32();
} else {
- LOGW("start() error: %s", strerror(-status));
+ ALOGW("start() error: %s", strerror(-status));
}
return status;
}
diff --git a/media/libmedia/IAudioTrack.cpp b/media/libmedia/IAudioTrack.cpp
index bc8ff34182a4..0b372f324bed 100644
--- a/media/libmedia/IAudioTrack.cpp
+++ b/media/libmedia/IAudioTrack.cpp
@@ -54,7 +54,7 @@ public:
if (status == NO_ERROR) {
status = reply.readInt32();
} else {
- LOGW("start() error: %s", strerror(-status));
+ ALOGW("start() error: %s", strerror(-status));
}
return status;
}
@@ -109,7 +109,7 @@ public:
if (status == NO_ERROR) {
status = reply.readInt32();
} else {
- LOGW("attachAuxEffect() error: %s", strerror(-status));
+ ALOGW("attachAuxEffect() error: %s", strerror(-status));
}
return status;
}
diff --git a/media/libmedia/IMediaDeathNotifier.cpp b/media/libmedia/IMediaDeathNotifier.cpp
index da33edba1bc9..85254822657b 100644
--- a/media/libmedia/IMediaDeathNotifier.cpp
+++ b/media/libmedia/IMediaDeathNotifier.cpp
@@ -44,7 +44,7 @@ IMediaDeathNotifier::getMediaPlayerService()
if (binder != 0) {
break;
}
- LOGW("Media player service not published, waiting...");
+ ALOGW("Media player service not published, waiting...");
usleep(500000); // 0.5 s
} while(true);
@@ -54,7 +54,7 @@ IMediaDeathNotifier::getMediaPlayerService()
binder->linkToDeath(sDeathNotifier);
sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
}
- LOGE_IF(sMediaPlayerService == 0, "no media player service!?");
+ ALOGE_IF(sMediaPlayerService == 0, "no media player service!?");
return sMediaPlayerService;
}
@@ -76,7 +76,7 @@ IMediaDeathNotifier::removeObitRecipient(const wp<IMediaDeathNotifier>& recipien
void
IMediaDeathNotifier::DeathNotifier::binderDied(const wp<IBinder>& who) {
- LOGW("media server died");
+ ALOGW("media server died");
// Need to do this with the lock held
SortedVector< wp<IMediaDeathNotifier> > list;
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index 7d2fbced3e5e..d2f5f71b572d 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -407,7 +407,7 @@ IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
#define CHECK_INTERFACE(interface, data, reply) \
do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
- LOGW("Call incorrectly routed to " #interface); \
+ ALOGW("Call incorrectly routed to " #interface); \
return PERMISSION_DENIED; \
} } while (0)
diff --git a/media/libmedia/JetPlayer.cpp b/media/libmedia/JetPlayer.cpp
index afa84b790851..188e5829c7c4 100644
--- a/media/libmedia/JetPlayer.cpp
+++ b/media/libmedia/JetPlayer.cpp
@@ -68,21 +68,21 @@ int JetPlayer::init()
if (pLibConfig == NULL)
pLibConfig = EAS_Config();
if (pLibConfig == NULL) {
- LOGE("JetPlayer::init(): EAS library configuration could not be retrieved, aborting.");
+ ALOGE("JetPlayer::init(): EAS library configuration could not be retrieved, aborting.");
return EAS_FAILURE;
}
// init the EAS library
result = EAS_Init(&mEasData);
if( result != EAS_SUCCESS) {
- LOGE("JetPlayer::init(): Error initializing Sonivox EAS library, aborting.");
+ ALOGE("JetPlayer::init(): Error initializing Sonivox EAS library, aborting.");
mState = EAS_STATE_ERROR;
return result;
}
// init the JET library with the default app event controller range
result = JET_Init(mEasData, NULL, sizeof(S_JET_CONFIG));
if( result != EAS_SUCCESS) {
- LOGE("JetPlayer::init(): Error initializing JET library, aborting.");
+ ALOGE("JetPlayer::init(): Error initializing JET library, aborting.");
mState = EAS_STATE_ERROR;
return result;
}
@@ -109,7 +109,7 @@ int JetPlayer::init()
ALOGV("JetPlayer::init(): render thread(%d) successfully started.", mTid);
mState = EAS_STATE_READY;
} else {
- LOGE("JetPlayer::init(): failed to start render thread.");
+ ALOGE("JetPlayer::init(): failed to start render thread.");
mState = EAS_STATE_ERROR;
return EAS_FAILURE;
}
@@ -169,7 +169,7 @@ int JetPlayer::render() {
mAudioBuffer =
new EAS_PCM[pLibConfig->mixBufferSize * pLibConfig->numChannels * MIX_NUM_BUFFERS];
if (!mAudioBuffer) {
- LOGE("JetPlayer::render(): mAudioBuffer allocate failed");
+ ALOGE("JetPlayer::render(): mAudioBuffer allocate failed");
goto threadExit;
}
@@ -210,7 +210,7 @@ int JetPlayer::render() {
for (int i = 0; i < MIX_NUM_BUFFERS; i++) {
result = EAS_Render(mEasData, p, pLibConfig->mixBufferSize, &count);
if (result != EAS_SUCCESS) {
- LOGE("JetPlayer::render(): EAS_Render returned error %ld", result);
+ ALOGE("JetPlayer::render(): EAS_Render returned error %ld", result);
}
p += count * pLibConfig->numChannels;
num_output += count * pLibConfig->numChannels * sizeof(EAS_PCM);
@@ -229,14 +229,14 @@ int JetPlayer::render() {
// check audio output track
if (mAudioTrack == NULL) {
- LOGE("JetPlayer::render(): output AudioTrack was not created");
+ ALOGE("JetPlayer::render(): output AudioTrack was not created");
goto threadExit;
}
// Write data to the audio hardware
//ALOGV("JetPlayer::render(): writing to audio output");
if ((temp = mAudioTrack->write(mAudioBuffer, num_output)) < 0) {
- LOGE("JetPlayer::render(): Error in writing:%d",temp);
+ ALOGE("JetPlayer::render(): Error in writing:%d",temp);
return temp;
}
@@ -469,7 +469,7 @@ int JetPlayer::clearQueue()
//-------------------------------------------------------------------------------------------------
void JetPlayer::dump()
{
- LOGE("JetPlayer dump: JET file=%s", mEasJetFileLoc->path);
+ ALOGE("JetPlayer dump: JET file=%s", mEasJetFileLoc->path);
}
void JetPlayer::dumpJetStatus(S_JET_STATUS* pJetStatus)
@@ -479,7 +479,7 @@ void JetPlayer::dumpJetStatus(S_JET_STATUS* pJetStatus)
pJetStatus->currentUserID, pJetStatus->segmentRepeatCount,
pJetStatus->numQueuedSegments, pJetStatus->paused);
else
- LOGE(">> JET player status is NULL");
+ ALOGE(">> JET player status is NULL");
}
diff --git a/media/libmedia/MediaProfiles.cpp b/media/libmedia/MediaProfiles.cpp
index 109f29483b66..c905762799e6 100644
--- a/media/libmedia/MediaProfiles.cpp
+++ b/media/libmedia/MediaProfiles.cpp
@@ -620,7 +620,7 @@ MediaProfiles::getInstance()
const char *defaultXmlFile = "/etc/media_profiles.xml";
FILE *fp = fopen(defaultXmlFile, "r");
if (fp == NULL) {
- LOGW("could not find media config xml file");
+ ALOGW("could not find media config xml file");
sInstance = createDefaultInstance();
} else {
fclose(fp); // close the file first.
@@ -903,7 +903,7 @@ MediaProfiles::createInstanceFromXmlFile(const char *xml)
expat is not compiled with -DXML_DTD. We don't have DTD parsing support.
if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) {
- LOGE("failed to enable DTD support in the xml file");
+ ALOGE("failed to enable DTD support in the xml file");
return UNKNOWN_ERROR;
}
@@ -913,7 +913,7 @@ MediaProfiles::createInstanceFromXmlFile(const char *xml)
for (;;) {
void *buff = ::XML_GetBuffer(parser, BUFF_SIZE);
if (buff == NULL) {
- LOGE("failed to in call to XML_GetBuffer()");
+ ALOGE("failed to in call to XML_GetBuffer()");
delete profiles;
profiles = NULL;
goto exit;
@@ -921,7 +921,7 @@ MediaProfiles::createInstanceFromXmlFile(const char *xml)
int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp);
if (bytes_read < 0) {
- LOGE("failed in call to read");
+ ALOGE("failed in call to read");
delete profiles;
profiles = NULL;
goto exit;
@@ -963,7 +963,7 @@ int MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder co
}
}
if (index == -1) {
- LOGE("The given video encoder %d is not found", codec);
+ ALOGE("The given video encoder %d is not found", codec);
return -1;
}
@@ -976,7 +976,7 @@ int MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder co
if (!strcmp("enc.vid.fps.min", name)) return mVideoEncoders[index]->mMinFrameRate;
if (!strcmp("enc.vid.fps.max", name)) return mVideoEncoders[index]->mMaxFrameRate;
- LOGE("The given video encoder param name %s is not found", name);
+ ALOGE("The given video encoder param name %s is not found", name);
return -1;
}
int MediaProfiles::getVideoEditorExportParamByName(
@@ -993,7 +993,7 @@ int MediaProfiles::getVideoEditorExportParamByName(
}
}
if (index == -1) {
- LOGE("The given video decoder %d is not found", codec);
+ ALOGE("The given video decoder %d is not found", codec);
return -1;
}
if (!strcmp("videoeditor.export.profile", name))
@@ -1001,7 +1001,7 @@ int MediaProfiles::getVideoEditorExportParamByName(
if (!strcmp("videoeditor.export.level", name))
return exportProfile->mLevel;
- LOGE("The given video editor export param name %s is not found", name);
+ ALOGE("The given video editor export param name %s is not found", name);
return -1;
}
int MediaProfiles::getVideoEditorCapParamByName(const char *name) const
@@ -1009,7 +1009,7 @@ int MediaProfiles::getVideoEditorCapParamByName(const char *name) const
ALOGV("getVideoEditorCapParamByName: %s", name);
if (mVideoEditorCap == NULL) {
- LOGE("The mVideoEditorCap is not created, then create default cap.");
+ ALOGE("The mVideoEditorCap is not created, then create default cap.");
createDefaultVideoEditorCap(sInstance);
}
@@ -1024,7 +1024,7 @@ int MediaProfiles::getVideoEditorCapParamByName(const char *name) const
if (!strcmp("maxPrefetchYUVFrames", name))
return mVideoEditorCap->mMaxPrefetchYUVFrames;
- LOGE("The given video editor param name %s is not found", name);
+ ALOGE("The given video editor param name %s is not found", name);
return -1;
}
@@ -1048,7 +1048,7 @@ int MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder co
}
}
if (index == -1) {
- LOGE("The given audio encoder %d is not found", codec);
+ ALOGE("The given audio encoder %d is not found", codec);
return -1;
}
@@ -1059,7 +1059,7 @@ int MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder co
if (!strcmp("enc.aud.hz.min", name)) return mAudioEncoders[index]->mMinSampleRate;
if (!strcmp("enc.aud.hz.max", name)) return mAudioEncoders[index]->mMaxSampleRate;
- LOGE("The given audio encoder param name %s is not found", name);
+ ALOGE("The given audio encoder param name %s is not found", name);
return -1;
}
@@ -1103,7 +1103,7 @@ int MediaProfiles::getCamcorderProfileParamByName(const char *name,
int index = getCamcorderProfileIndex(cameraId, quality);
if (index == -1) {
- LOGE("The given camcorder profile camera %d quality %d is not found",
+ ALOGE("The given camcorder profile camera %d quality %d is not found",
cameraId, quality);
return -1;
}
@@ -1120,7 +1120,7 @@ int MediaProfiles::getCamcorderProfileParamByName(const char *name,
if (!strcmp("aud.ch", name)) return mCamcorderProfiles[index]->mAudioCodec->mChannels;
if (!strcmp("aud.hz", name)) return mCamcorderProfiles[index]->mAudioCodec->mSampleRate;
- LOGE("The given camcorder profile param id %d name %s is not found", cameraId, name);
+ ALOGE("The given camcorder profile param id %d name %s is not found", cameraId, name);
return -1;
}
diff --git a/media/libmedia/MediaScanner.cpp b/media/libmedia/MediaScanner.cpp
index cda185f932b0..79cab74ac4b4 100644
--- a/media/libmedia/MediaScanner.cpp
+++ b/media/libmedia/MediaScanner.cpp
@@ -153,7 +153,7 @@ MediaScanResult MediaScanner::doProcessDirectory(
DIR* dir = opendir(path);
if (!dir) {
- LOGW("Error opening directory '%s', skipping: %s.", path, strerror(errno));
+ ALOGW("Error opening directory '%s', skipping: %s.", path, strerror(errno));
return MEDIA_SCAN_RESULT_SKIPPED;
}
diff --git a/media/libmedia/MediaScannerClient.cpp b/media/libmedia/MediaScannerClient.cpp
index 629b165dd491..40b81880d45d 100644
--- a/media/libmedia/MediaScannerClient.cpp
+++ b/media/libmedia/MediaScannerClient.cpp
@@ -142,12 +142,12 @@ void MediaScannerClient::convertValues(uint32_t encoding)
UConverter *conv = ucnv_open(enc, &status);
if (U_FAILURE(status)) {
- LOGE("could not create UConverter for %s\n", enc);
+ ALOGE("could not create UConverter for %s\n", enc);
return;
}
UConverter *utf8Conv = ucnv_open("UTF-8", &status);
if (U_FAILURE(status)) {
- LOGE("could not create UConverter for UTF-8\n");
+ ALOGE("could not create UConverter for UTF-8\n");
ucnv_close(conv);
return;
}
@@ -180,7 +180,7 @@ void MediaScannerClient::convertValues(uint32_t encoding)
ucnv_convertEx(utf8Conv, conv, &target, target + targetLength,
&source, (const char *)dest, NULL, NULL, NULL, NULL, TRUE, TRUE, &status);
if (U_FAILURE(status)) {
- LOGE("ucnv_convertEx failed: %d\n", status);
+ ALOGE("ucnv_convertEx failed: %d\n", status);
mValues->setEntry(i, "???");
} else {
// zero terminate
diff --git a/media/libmedia/Metadata.cpp b/media/libmedia/Metadata.cpp
index 8eeebbb57dce..546a9b0501b3 100644
--- a/media/libmedia/Metadata.cpp
+++ b/media/libmedia/Metadata.cpp
@@ -135,7 +135,7 @@ bool Metadata::checkKey(int key)
{
if (key < FIRST_SYSTEM_ID ||
(LAST_SYSTEM_ID < key && key < FIRST_CUSTOM_ID)) {
- LOGE("Bad key %d", key);
+ ALOGE("Bad key %d", key);
return false;
}
size_t curr = mData->dataPosition();
@@ -152,7 +152,7 @@ bool Metadata::checkKey(int key)
break;
}
if (mData->readInt32() == key) {
- LOGE("Key exists already %d", key);
+ ALOGE("Key exists already %d", key);
error = true;
break;
}
diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp
index 28b54b50c234..35dfbb8edcd7 100644
--- a/media/libmedia/ToneGenerator.cpp
+++ b/media/libmedia/ToneGenerator.cpp
@@ -805,7 +805,7 @@ ToneGenerator::ToneGenerator(int streamType, float volume, bool threadCanCallJav
mState = TONE_IDLE;
if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) {
- LOGE("Unable to marshal AudioFlinger");
+ ALOGE("Unable to marshal AudioFlinger");
return;
}
mThreadCanCallJava = threadCanCallJava;
@@ -906,7 +906,7 @@ bool ToneGenerator::startTone(int toneType, int durationMs) {
ALOGV("Start waiting for previous tone to stop");
lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
if (lStatus != NO_ERROR) {
- LOGE("--- start wait for stop timed out, status %d", lStatus);
+ ALOGE("--- start wait for stop timed out, status %d", lStatus);
mState = TONE_IDLE;
mLock.unlock();
return lResult;
@@ -925,7 +925,7 @@ bool ToneGenerator::startTone(int toneType, int durationMs) {
ALOGV("Wait for start callback");
lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
if (lStatus != NO_ERROR) {
- LOGE("--- Immediate start timed out, status %d", lStatus);
+ ALOGE("--- Immediate start timed out, status %d", lStatus);
mState = TONE_IDLE;
lResult = false;
}
@@ -943,14 +943,14 @@ bool ToneGenerator::startTone(int toneType, int durationMs) {
}
ALOGV("cond received");
} else {
- LOGE("--- Delayed start timed out, status %d", lStatus);
+ ALOGE("--- Delayed start timed out, status %d", lStatus);
mState = TONE_IDLE;
}
}
mLock.unlock();
ALOGV_IF(lResult, "Tone started, time %d\n", (unsigned int)(systemTime()/1000000));
- LOGW_IF(!lResult, "Tone start failed!!!, time %d\n", (unsigned int)(systemTime()/1000000));
+ ALOGW_IF(!lResult, "Tone start failed!!!, time %d\n", (unsigned int)(systemTime()/1000000));
return lResult;
}
@@ -979,7 +979,7 @@ void ToneGenerator::stopTone() {
if (lStatus == NO_ERROR) {
ALOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000));
} else {
- LOGE("--- Stop timed out");
+ ALOGE("--- Stop timed out");
mState = TONE_IDLE;
mpAudioTrack->stop();
}
@@ -1018,7 +1018,7 @@ bool ToneGenerator::initAudioTrack() {
// Open audio track in mono, PCM 16bit, default sampling rate, default buffer size
mpAudioTrack = new AudioTrack();
if (mpAudioTrack == 0) {
- LOGE("AudioTrack allocation failed");
+ ALOGE("AudioTrack allocation failed");
goto initAudioTrack_exit;
}
ALOGV("Create Track: %p\n", mpAudioTrack);
@@ -1036,7 +1036,7 @@ bool ToneGenerator::initAudioTrack() {
mThreadCanCallJava);
if (mpAudioTrack->initCheck() != NO_ERROR) {
- LOGE("AudioTrack->initCheck failed");
+ ALOGE("AudioTrack->initCheck failed");
goto initAudioTrack_exit;
}
@@ -1261,7 +1261,7 @@ audioCallback_EndLoop:
// must reload lpToneDesc as prepareWave() may change mpToneDesc
lpToneDesc = lpToneGen->mpToneDesc;
} else {
- LOGW("Cbk restarting prepareWave() failed\n");
+ ALOGW("Cbk restarting prepareWave() failed\n");
lpToneGen->mState = TONE_IDLE;
lpToneGen->mpAudioTrack->stop();
// Force loop exit
diff --git a/media/libmedia/Visualizer.cpp b/media/libmedia/Visualizer.cpp
index de40f983ff2d..d08ffa5e49d1 100644
--- a/media/libmedia/Visualizer.cpp
+++ b/media/libmedia/Visualizer.cpp
@@ -61,7 +61,7 @@ status_t Visualizer::setEnabled(bool enabled)
if (enabled) {
if (t->exitPending()) {
if (t->requestExitAndWait() == WOULD_BLOCK) {
- LOGE("Visualizer::enable() called from thread");
+ ALOGE("Visualizer::enable() called from thread");
return INVALID_OPERATION;
}
}
@@ -116,7 +116,7 @@ status_t Visualizer::setCaptureCallBack(capture_cbk_t cbk, void* user, uint32_t
if (cbk != NULL) {
mCaptureThread = new CaptureThread(*this, rate, ((flags & CAPTURE_CALL_JAVA) != 0));
if (mCaptureThread == 0) {
- LOGE("Could not create callback thread");
+ ALOGE("Could not create callback thread");
return NO_INIT;
}
}
diff --git a/media/libmedia/mediametadataretriever.cpp b/media/libmedia/mediametadataretriever.cpp
index fd8c0658392c..88e269fd89d8 100644
--- a/media/libmedia/mediametadataretriever.cpp
+++ b/media/libmedia/mediametadataretriever.cpp
@@ -43,7 +43,7 @@ const sp<IMediaPlayerService>& MediaMetadataRetriever::getService()
if (binder != 0) {
break;
}
- LOGW("MediaPlayerService not published, waiting...");
+ ALOGW("MediaPlayerService not published, waiting...");
usleep(500000); // 0.5 s
} while(true);
if (sDeathNotifier == NULL) {
@@ -52,7 +52,7 @@ const sp<IMediaPlayerService>& MediaMetadataRetriever::getService()
binder->linkToDeath(sDeathNotifier);
sService = interface_cast<IMediaPlayerService>(binder);
}
- LOGE_IF(sService == 0, "no MediaPlayerService!?");
+ ALOGE_IF(sService == 0, "no MediaPlayerService!?");
return sService;
}
@@ -61,12 +61,12 @@ MediaMetadataRetriever::MediaMetadataRetriever()
ALOGV("constructor");
const sp<IMediaPlayerService>& service(getService());
if (service == 0) {
- LOGE("failed to obtain MediaMetadataRetrieverService");
+ ALOGE("failed to obtain MediaMetadataRetrieverService");
return;
}
sp<IMediaMetadataRetriever> retriever(service->createMetadataRetriever(getpid()));
if (retriever == 0) {
- LOGE("failed to create IMediaMetadataRetriever object from server");
+ ALOGE("failed to create IMediaMetadataRetriever object from server");
}
mRetriever = retriever;
}
@@ -98,11 +98,11 @@ status_t MediaMetadataRetriever::setDataSource(
ALOGV("setDataSource");
Mutex::Autolock _l(mLock);
if (mRetriever == 0) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return INVALID_OPERATION;
}
if (srcUrl == NULL) {
- LOGE("data source is a null pointer");
+ ALOGE("data source is a null pointer");
return UNKNOWN_ERROR;
}
ALOGV("data source (%s)", srcUrl);
@@ -114,11 +114,11 @@ status_t MediaMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t l
ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
Mutex::Autolock _l(mLock);
if (mRetriever == 0) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return INVALID_OPERATION;
}
if (fd < 0 || offset < 0 || length < 0) {
- LOGE("Invalid negative argument");
+ ALOGE("Invalid negative argument");
return UNKNOWN_ERROR;
}
return mRetriever->setDataSource(fd, offset, length);
@@ -129,7 +129,7 @@ sp<IMemory> MediaMetadataRetriever::getFrameAtTime(int64_t timeUs, int option)
ALOGV("getFrameAtTime: time(%lld us) option(%d)", timeUs, option);
Mutex::Autolock _l(mLock);
if (mRetriever == 0) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return NULL;
}
return mRetriever->getFrameAtTime(timeUs, option);
@@ -140,7 +140,7 @@ const char* MediaMetadataRetriever::extractMetadata(int keyCode)
ALOGV("extractMetadata(%d)", keyCode);
Mutex::Autolock _l(mLock);
if (mRetriever == 0) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return NULL;
}
return mRetriever->extractMetadata(keyCode);
@@ -151,7 +151,7 @@ sp<IMemory> MediaMetadataRetriever::extractAlbumArt()
ALOGV("extractAlbumArt");
Mutex::Autolock _l(mLock);
if (mRetriever == 0) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return NULL;
}
return mRetriever->extractAlbumArt();
@@ -160,7 +160,7 @@ sp<IMemory> MediaMetadataRetriever::extractAlbumArt()
void MediaMetadataRetriever::DeathNotifier::binderDied(const wp<IBinder>& who) {
Mutex::Autolock lock(MediaMetadataRetriever::sServiceLock);
MediaMetadataRetriever::sService.clear();
- LOGW("MediaMetadataRetriever server died!");
+ ALOGW("MediaMetadataRetriever server died!");
}
MediaMetadataRetriever::DeathNotifier::~DeathNotifier()
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 695c4a825606..228492727840 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -115,7 +115,7 @@ status_t MediaPlayer::attachNewPlayer(const sp<IMediaPlayer>& player)
if ( !( (mCurrentState & MEDIA_PLAYER_IDLE) ||
(mCurrentState == MEDIA_PLAYER_STATE_ERROR ) ) ) {
- LOGE("attachNewPlayer called in state %d", mCurrentState);
+ ALOGE("attachNewPlayer called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -126,7 +126,7 @@ status_t MediaPlayer::attachNewPlayer(const sp<IMediaPlayer>& player)
mCurrentState = MEDIA_PLAYER_INITIALIZED;
err = NO_ERROR;
} else {
- LOGE("Unable to to create media player");
+ ALOGE("Unable to to create media player");
}
}
@@ -195,7 +195,7 @@ status_t MediaPlayer::invoke(const Parcel& request, Parcel *reply)
ALOGV("invoke %d", request.dataSize());
return mPlayer->invoke(request, reply);
}
- LOGE("invoke failed: wrong state %X", mCurrentState);
+ ALOGE("invoke failed: wrong state %X", mCurrentState);
return INVALID_OPERATION;
}
@@ -236,7 +236,7 @@ status_t MediaPlayer::prepareAsync_l()
mCurrentState = MEDIA_PLAYER_PREPARING;
return mPlayer->prepareAsync();
}
- LOGE("prepareAsync called in state %d", mCurrentState);
+ ALOGE("prepareAsync called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -298,7 +298,7 @@ status_t MediaPlayer::start()
}
return ret;
}
- LOGE("start called in state %d", mCurrentState);
+ ALOGE("start called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -317,7 +317,7 @@ status_t MediaPlayer::stop()
}
return ret;
}
- LOGE("stop called in state %d", mCurrentState);
+ ALOGE("stop called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -336,7 +336,7 @@ status_t MediaPlayer::pause()
}
return ret;
}
- LOGE("pause called in state %d", mCurrentState);
+ ALOGE("pause called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -348,7 +348,7 @@ bool MediaPlayer::isPlaying()
mPlayer->isPlaying(&temp);
ALOGV("isPlaying: %d", temp);
if ((mCurrentState & MEDIA_PLAYER_STARTED) && ! temp) {
- LOGE("internal/external state mismatch corrected");
+ ALOGE("internal/external state mismatch corrected");
mCurrentState = MEDIA_PLAYER_PAUSED;
}
return temp;
@@ -402,7 +402,7 @@ status_t MediaPlayer::getDuration_l(int *msec)
*msec = mDuration;
return ret;
}
- LOGE("Attempt to call getDuration without a valid mediaplayer");
+ ALOGE("Attempt to call getDuration without a valid mediaplayer");
return INVALID_OPERATION;
}
@@ -417,10 +417,10 @@ status_t MediaPlayer::seekTo_l(int msec)
ALOGV("seekTo %d", msec);
if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
if ( msec < 0 ) {
- LOGW("Attempt to seek to invalid position: %d", msec);
+ ALOGW("Attempt to seek to invalid position: %d", msec);
msec = 0;
} else if ((mDuration > 0) && (msec > mDuration)) {
- LOGW("Attempt to seek to past end of file: request = %d, EOF = %d", msec, mDuration);
+ ALOGW("Attempt to seek to past end of file: request = %d, EOF = %d", msec, mDuration);
msec = mDuration;
}
// cache duration
@@ -435,7 +435,7 @@ status_t MediaPlayer::seekTo_l(int msec)
return NO_ERROR;
}
}
- LOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(), mCurrentState);
+ ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(), mCurrentState);
return INVALID_OPERATION;
}
@@ -457,7 +457,7 @@ status_t MediaPlayer::reset_l()
if (mPlayer != 0) {
status_t ret = mPlayer->reset();
if (ret != NO_ERROR) {
- LOGE("reset() failed with return code (%d)", ret);
+ ALOGE("reset() failed with return code (%d)", ret);
mCurrentState = MEDIA_PLAYER_STATE_ERROR;
} else {
mCurrentState = MEDIA_PLAYER_IDLE;
@@ -486,7 +486,7 @@ status_t MediaPlayer::setAudioStreamType(int type)
if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) {
// Can't change the stream type after prepare
- LOGE("setAudioStream called in state %d", mCurrentState);
+ ALOGE("setAudioStream called in state %d", mCurrentState);
return INVALID_OPERATION;
}
// cache
@@ -532,7 +532,7 @@ status_t MediaPlayer::setAudioSessionId(int sessionId)
ALOGV("MediaPlayer::setAudioSessionId(%d)", sessionId);
Mutex::Autolock _l(mLock);
if (!(mCurrentState & MEDIA_PLAYER_IDLE)) {
- LOGE("setAudioSessionId called in state %d", mCurrentState);
+ ALOGE("setAudioSessionId called in state %d", mCurrentState);
return INVALID_OPERATION;
}
if (sessionId < 0) {
@@ -570,7 +570,7 @@ status_t MediaPlayer::attachAuxEffect(int effectId)
if (mPlayer == 0 ||
(mCurrentState & MEDIA_PLAYER_IDLE) ||
(mCurrentState == MEDIA_PLAYER_STATE_ERROR )) {
- LOGE("attachAuxEffect called in state %d", mCurrentState);
+ ALOGE("attachAuxEffect called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -641,7 +641,7 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
case MEDIA_PLAYBACK_COMPLETE:
ALOGV("playback complete");
if (mCurrentState == MEDIA_PLAYER_IDLE) {
- LOGE("playback complete in idle state");
+ ALOGE("playback complete in idle state");
}
if (!mLoop) {
mCurrentState = MEDIA_PLAYER_PLAYBACK_COMPLETE;
@@ -651,7 +651,7 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
// Always log errors.
// ext1: Media framework error code.
// ext2: Implementation dependant error code.
- LOGE("error (%d, %d)", ext1, ext2);
+ ALOGE("error (%d, %d)", ext1, ext2);
mCurrentState = MEDIA_PLAYER_STATE_ERROR;
if (mPrepareSync)
{
@@ -666,7 +666,7 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
// ext1: Media framework error code.
// ext2: Implementation dependant error code.
if (ext1 != MEDIA_INFO_VIDEO_TRACK_LAGGING) {
- LOGW("info/warning (%d, %d)", ext1, ext2);
+ ALOGW("info/warning (%d, %d)", ext1, ext2);
}
break;
case MEDIA_SEEK_COMPLETE:
@@ -717,7 +717,7 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
if (service != 0) {
p = service->decode(url, pSampleRate, pNumChannels, pFormat);
} else {
- LOGE("Unable to locate media service");
+ ALOGE("Unable to locate media service");
}
return p;
@@ -737,7 +737,7 @@ void MediaPlayer::died()
if (service != 0) {
p = service->decode(fd, offset, length, pSampleRate, pNumChannels, pFormat);
} else {
- LOGE("Unable to locate media service");
+ ALOGE("Unable to locate media service");
}
return p;
diff --git a/media/libmedia/mediarecorder.cpp b/media/libmedia/mediarecorder.cpp
index ec629780de13..8d947d862549 100644
--- a/media/libmedia/mediarecorder.cpp
+++ b/media/libmedia/mediarecorder.cpp
@@ -33,11 +33,11 @@ status_t MediaRecorder::setCamera(const sp<ICamera>& camera, const sp<ICameraRec
{
ALOGV("setCamera(%p,%p)", camera.get(), proxy.get());
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
- LOGE("setCamera called in an invalid state(%d)", mCurrentState);
+ ALOGE("setCamera called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -54,15 +54,15 @@ status_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface)
{
ALOGV("setPreviewSurface(%p)", surface.get());
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
+ ALOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
if (!mIsVideoSourceSet) {
- LOGE("try to set preview surface without setting the video source first");
+ ALOGE("try to set preview surface without setting the video source first");
return INVALID_OPERATION;
}
@@ -79,11 +79,11 @@ status_t MediaRecorder::init()
{
ALOGV("init");
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
- LOGE("init called in an invalid state(%d)", mCurrentState);
+ ALOGE("init called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -109,11 +109,11 @@ status_t MediaRecorder::setVideoSource(int vs)
{
ALOGV("setVideoSource(%d)", vs);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (mIsVideoSourceSet) {
- LOGE("video source has already been set");
+ ALOGE("video source has already been set");
return INVALID_OPERATION;
}
if (mCurrentState & MEDIA_RECORDER_IDLE) {
@@ -124,7 +124,7 @@ status_t MediaRecorder::setVideoSource(int vs)
}
}
if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
- LOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
+ ALOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -144,7 +144,7 @@ status_t MediaRecorder::setAudioSource(int as)
{
ALOGV("setAudioSource(%d)", as);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (mCurrentState & MEDIA_RECORDER_IDLE) {
@@ -155,11 +155,11 @@ status_t MediaRecorder::setAudioSource(int as)
}
}
if (mIsAudioSourceSet) {
- LOGE("audio source has already been set");
+ ALOGE("audio source has already been set");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
- LOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
+ ALOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -177,21 +177,21 @@ status_t MediaRecorder::setOutputFormat(int of)
{
ALOGV("setOutputFormat(%d)", of);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
- LOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
+ ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format
- LOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
+ ALOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->setOutputFormat(of);
if (OK != ret) {
- LOGE("setOutputFormat failed: %d", ret);
+ ALOGE("setOutputFormat failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -203,19 +203,19 @@ status_t MediaRecorder::setVideoEncoder(int ve)
{
ALOGV("setVideoEncoder(%d)", ve);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!mIsVideoSourceSet) {
- LOGE("try to set the video encoder without setting the video source first");
+ ALOGE("try to set the video encoder without setting the video source first");
return INVALID_OPERATION;
}
if (mIsVideoEncoderSet) {
- LOGE("video encoder has already been set");
+ ALOGE("video encoder has already been set");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
+ ALOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -233,19 +233,19 @@ status_t MediaRecorder::setAudioEncoder(int ae)
{
ALOGV("setAudioEncoder(%d)", ae);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!mIsAudioSourceSet) {
- LOGE("try to set the audio encoder without setting the audio source first");
+ ALOGE("try to set the audio encoder without setting the audio source first");
return INVALID_OPERATION;
}
if (mIsAudioEncoderSet) {
- LOGE("audio encoder has already been set");
+ ALOGE("audio encoder has already been set");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
+ ALOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -263,15 +263,15 @@ status_t MediaRecorder::setOutputFile(const char* path)
{
ALOGV("setOutputFile(%s)", path);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (mIsOutputFileSet) {
- LOGE("output file has already been set");
+ ALOGE("output file has already been set");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
+ ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -289,15 +289,15 @@ status_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
{
ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (mIsOutputFileSet) {
- LOGE("output file has already been set");
+ ALOGE("output file has already been set");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
+ ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
return INVALID_OPERATION;
}
@@ -308,7 +308,7 @@ status_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
// this issue by checking the file descriptor first before passing
// it through binder call.
if (fd < 0) {
- LOGE("Invalid file descriptor: %d", fd);
+ ALOGE("Invalid file descriptor: %d", fd);
return BAD_VALUE;
}
@@ -326,21 +326,21 @@ status_t MediaRecorder::setVideoSize(int width, int height)
{
ALOGV("setVideoSize(%d, %d)", width, height);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setVideoSize called in an invalid state: %d", mCurrentState);
+ ALOGE("setVideoSize called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
if (!mIsVideoSourceSet) {
- LOGE("Cannot set video size without setting video source first");
+ ALOGE("Cannot set video size without setting video source first");
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->setVideoSize(width, height);
if (OK != ret) {
- LOGE("setVideoSize failed: %d", ret);
+ ALOGE("setVideoSize failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -358,7 +358,7 @@ sp<ISurfaceTexture> MediaRecorder::
mSurfaceMediaSource =
mMediaRecorder->querySurfaceMediaSource();
if (mSurfaceMediaSource == NULL) {
- LOGE("SurfaceMediaSource could not be initialized!");
+ ALOGE("SurfaceMediaSource could not be initialized!");
}
return mSurfaceMediaSource;
}
@@ -369,21 +369,21 @@ status_t MediaRecorder::setVideoFrameRate(int frames_per_second)
{
ALOGV("setVideoFrameRate(%d)", frames_per_second);
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
+ ALOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
if (!mIsVideoSourceSet) {
- LOGE("Cannot set video frame rate without setting video source first");
+ ALOGE("Cannot set video frame rate without setting video source first");
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second);
if (OK != ret) {
- LOGE("setVideoFrameRate failed: %d", ret);
+ ALOGE("setVideoFrameRate failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -393,7 +393,7 @@ status_t MediaRecorder::setVideoFrameRate(int frames_per_second)
status_t MediaRecorder::setParameters(const String8& params) {
ALOGV("setParameters(%s)", params.string());
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
@@ -402,13 +402,13 @@ status_t MediaRecorder::setParameters(const String8& params) {
MEDIA_RECORDER_RECORDING |
MEDIA_RECORDER_ERROR));
if (isInvalidState) {
- LOGE("setParameters is called in an invalid state: %d", mCurrentState);
+ ALOGE("setParameters is called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->setParameters(params);
if (OK != ret) {
- LOGE("setParameters(%s) failed: %d", params.string(), ret);
+ ALOGE("setParameters(%s) failed: %d", params.string(), ret);
// Do not change our current state to MEDIA_RECORDER_ERROR, failures
// of the only currently supported parameters, "max-duration" and
// "max-filesize" are _not_ fatal.
@@ -421,34 +421,34 @@ status_t MediaRecorder::prepare()
{
ALOGV("prepare");
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
- LOGE("prepare called in an invalid state: %d", mCurrentState);
+ ALOGE("prepare called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
if (mIsAudioSourceSet != mIsAudioEncoderSet) {
if (mIsAudioSourceSet) {
- LOGE("audio source is set, but audio encoder is not set");
+ ALOGE("audio source is set, but audio encoder is not set");
} else { // must not happen, since setAudioEncoder checks this already
- LOGE("audio encoder is set, but audio source is not set");
+ ALOGE("audio encoder is set, but audio source is not set");
}
return INVALID_OPERATION;
}
if (mIsVideoSourceSet != mIsVideoEncoderSet) {
if (mIsVideoSourceSet) {
- LOGE("video source is set, but video encoder is not set");
+ ALOGE("video source is set, but video encoder is not set");
} else { // must not happen, since setVideoEncoder checks this already
- LOGE("video encoder is set, but video source is not set");
+ ALOGE("video encoder is set, but video source is not set");
}
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->prepare();
if (OK != ret) {
- LOGE("prepare failed: %d", ret);
+ ALOGE("prepare failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -460,17 +460,17 @@ status_t MediaRecorder::getMaxAmplitude(int* max)
{
ALOGV("getMaxAmplitude");
if(mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (mCurrentState & MEDIA_RECORDER_ERROR) {
- LOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState);
+ ALOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->getMaxAmplitude(max);
if (OK != ret) {
- LOGE("getMaxAmplitude failed: %d", ret);
+ ALOGE("getMaxAmplitude failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -481,17 +481,17 @@ status_t MediaRecorder::start()
{
ALOGV("start");
if (mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) {
- LOGE("start called in an invalid state: %d", mCurrentState);
+ ALOGE("start called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->start();
if (OK != ret) {
- LOGE("start failed: %d", ret);
+ ALOGE("start failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -503,17 +503,17 @@ status_t MediaRecorder::stop()
{
ALOGV("stop");
if (mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) {
- LOGE("stop called in an invalid state: %d", mCurrentState);
+ ALOGE("stop called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->stop();
if (OK != ret) {
- LOGE("stop failed: %d", ret);
+ ALOGE("stop failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
}
@@ -531,7 +531,7 @@ status_t MediaRecorder::reset()
{
ALOGV("reset");
if (mMediaRecorder == NULL) {
- LOGE("media recorder is not initialized yet");
+ ALOGE("media recorder is not initialized yet");
return INVALID_OPERATION;
}
@@ -556,7 +556,7 @@ status_t MediaRecorder::reset()
break;
default: {
- LOGE("Unexpected non-existing state: %d", mCurrentState);
+ ALOGE("Unexpected non-existing state: %d", mCurrentState);
break;
}
}
@@ -567,12 +567,12 @@ status_t MediaRecorder::close()
{
ALOGV("close");
if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
- LOGE("close called in an invalid state: %d", mCurrentState);
+ ALOGE("close called in an invalid state: %d", mCurrentState);
return INVALID_OPERATION;
}
status_t ret = mMediaRecorder->close();
if (OK != ret) {
- LOGE("close failed: %d", ret);
+ ALOGE("close failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return UNKNOWN_ERROR;
} else {
@@ -586,7 +586,7 @@ status_t MediaRecorder::doReset()
ALOGV("doReset");
status_t ret = mMediaRecorder->reset();
if (OK != ret) {
- LOGE("doReset failed: %d", ret);
+ ALOGE("doReset failed: %d", ret);
mCurrentState = MEDIA_RECORDER_ERROR;
return ret;
} else {
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 487c43301274..f5cb019e315e 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -112,14 +112,14 @@ bool unmarshallFilter(const Parcel& p,
int32_t val;
if (p.readInt32(&val) != OK)
{
- LOGE("Failed to read filter's length");
+ ALOGE("Failed to read filter's length");
*status = NOT_ENOUGH_DATA;
return false;
}
if( val > kMaxFilterSize || val < 0)
{
- LOGE("Invalid filter len %d", val);
+ ALOGE("Invalid filter len %d", val);
*status = BAD_VALUE;
return false;
}
@@ -134,7 +134,7 @@ bool unmarshallFilter(const Parcel& p,
if (p.dataAvail() < size)
{
- LOGE("Filter too short expected %d but got %d", size, p.dataAvail());
+ ALOGE("Filter too short expected %d but got %d", size, p.dataAvail());
*status = NOT_ENOUGH_DATA;
return false;
}
@@ -144,7 +144,7 @@ bool unmarshallFilter(const Parcel& p,
if (NULL == data)
{
- LOGE("Filter had no data");
+ ALOGE("Filter had no data");
*status = BAD_VALUE;
return false;
}
@@ -184,7 +184,7 @@ static bool checkPermission(const char* permissionString) {
#endif
if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
bool ok = checkCallingPermission(String16(permissionString));
- if (!ok) LOGE("Request requires %s", permissionString);
+ if (!ok) ALOGE("Request requires %s", permissionString);
return ok;
}
@@ -630,7 +630,7 @@ static sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie,
p = new TestPlayerStub();
break;
default:
- LOGE("Unknown player type: %d", playerType);
+ ALOGE("Unknown player type: %d", playerType);
return NULL;
}
if (p != NULL) {
@@ -641,7 +641,7 @@ static sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie,
}
}
if (p == NULL) {
- LOGE("Failed to create player object");
+ ALOGE("Failed to create player object");
}
return p;
}
@@ -688,7 +688,7 @@ status_t MediaPlayerService::Client::setDataSource(
int fd = android::openContentProviderFile(url16);
if (fd < 0)
{
- LOGE("Couldn't open fd for %s", url);
+ ALOGE("Couldn't open fd for %s", url);
return UNKNOWN_ERROR;
}
setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus
@@ -713,7 +713,7 @@ status_t MediaPlayerService::Client::setDataSource(
if (mStatus == NO_ERROR) {
mPlayer = p;
} else {
- LOGE(" error: %d", mStatus);
+ ALOGE(" error: %d", mStatus);
}
return mStatus;
}
@@ -725,7 +725,7 @@ status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64
struct stat sb;
int ret = fstat(fd, &sb);
if (ret != 0) {
- LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
+ ALOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
return UNKNOWN_ERROR;
}
@@ -736,7 +736,7 @@ status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64
ALOGV("st_size = %llu", sb.st_size);
if (offset >= sb.st_size) {
- LOGE("offset error");
+ ALOGE("offset error");
::close(fd);
return UNKNOWN_ERROR;
}
@@ -794,7 +794,7 @@ void MediaPlayerService::Client::disconnectNativeWindow() {
NATIVE_WINDOW_API_MEDIA);
if (err != OK) {
- LOGW("native_window_api_disconnect returned an error: %s (%d)",
+ ALOGW("native_window_api_disconnect returned an error: %s (%d)",
strerror(-err), err);
}
}
@@ -821,7 +821,7 @@ status_t MediaPlayerService::Client::setVideoSurfaceTexture(
NATIVE_WINDOW_API_MEDIA);
if (err != OK) {
- LOGE("setVideoSurfaceTexture failed: %d", err);
+ ALOGE("setVideoSurfaceTexture failed: %d", err);
// Note that we must do the reset before disconnecting from the ANW.
// Otherwise queue/dequeue calls could be made on the disconnected
// ANW, which may result in errors.
@@ -905,7 +905,7 @@ status_t MediaPlayerService::Client::getMetadata(
if (status != OK) {
metadata.resetParcel();
- LOGE("getMetadata failed %d", status);
+ ALOGE("getMetadata failed %d", status);
return status;
}
@@ -975,7 +975,7 @@ status_t MediaPlayerService::Client::getCurrentPosition(int *msec)
if (ret == NO_ERROR) {
ALOGV("[%d] getCurrentPosition = %d", mConnId, *msec);
} else {
- LOGE("getCurrentPosition returned %d", ret);
+ ALOGE("getCurrentPosition returned %d", ret);
}
return ret;
}
@@ -989,7 +989,7 @@ status_t MediaPlayerService::Client::getDuration(int *msec)
if (ret == NO_ERROR) {
ALOGV("[%d] getDuration = %d", mConnId, *msec);
} else {
- LOGE("getDuration returned %d", ret);
+ ALOGE("getDuration returned %d", ret);
}
return ret;
}
@@ -1394,7 +1394,7 @@ status_t MediaPlayerService::AudioOutput::open(
}
if ((t == 0) || (t->initCheck() != NO_ERROR)) {
- LOGE("Unable to create audio track");
+ ALOGE("Unable to create audio track");
delete t;
return NO_INIT;
}
@@ -1652,7 +1652,7 @@ ssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size)
p += mSize;
ALOGV("memcpy(%p, %p, %u)", p, buffer, size);
if (mSize + size > mHeap->getSize()) {
- LOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize());
+ ALOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize());
size = mHeap->getSize() - mSize;
}
memcpy(p, buffer, size);
@@ -1687,7 +1687,7 @@ void MediaPlayerService::AudioCache::notify(
switch (msg)
{
case MEDIA_ERROR:
- LOGE("Error %d, %d occurred", ext1, ext2);
+ ALOGE("Error %d, %d occurred", ext1, ext2);
p->mError = ext1;
break;
case MEDIA_PREPARED:
@@ -1772,7 +1772,7 @@ void MediaPlayerService::addBatteryData(uint32_t params)
} else if (params & kBatteryDataAudioFlingerStop) {
if (mBatteryAudio.refCount <= 0) {
- LOGW("Battery track warning: refCount is <= 0");
+ ALOGW("Battery track warning: refCount is <= 0");
return;
}
@@ -1807,7 +1807,7 @@ void MediaPlayerService::addBatteryData(uint32_t params)
info.refCount = 0;
if (mBatteryData.add(uid, info) == NO_MEMORY) {
- LOGE("Battery track error: no memory for new app");
+ ALOGE("Battery track error: no memory for new app");
return;
}
}
@@ -1825,10 +1825,10 @@ void MediaPlayerService::addBatteryData(uint32_t params)
}
} else {
if (info.refCount == 0) {
- LOGW("Battery track warning: refCount is already 0");
+ ALOGW("Battery track warning: refCount is already 0");
return;
} else if (info.refCount < 0) {
- LOGE("Battery track error: refCount < 0");
+ ALOGE("Battery track error: refCount < 0");
mBatteryData.removeItem(uid);
return;
}
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index ca92c778299c..d219fc22cef0 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -54,7 +54,7 @@ static bool checkPermission(const char* permissionString) {
#endif
if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
bool ok = checkCallingPermission(String16(permissionString));
- if (!ok) LOGE("Request requires %s", permissionString);
+ if (!ok) ALOGE("Request requires %s", permissionString);
return ok;
}
@@ -64,7 +64,7 @@ sp<ISurfaceTexture> MediaRecorderClient::querySurfaceMediaSource()
ALOGV("Query SurfaceMediaSource");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NULL;
}
return mRecorder->querySurfaceMediaSource();
@@ -78,7 +78,7 @@ status_t MediaRecorderClient::setCamera(const sp<ICamera>& camera,
ALOGV("setCamera");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setCamera(camera, proxy);
@@ -89,7 +89,7 @@ status_t MediaRecorderClient::setPreviewSurface(const sp<Surface>& surface)
ALOGV("setPreviewSurface");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setPreviewSurface(surface);
@@ -103,7 +103,7 @@ status_t MediaRecorderClient::setVideoSource(int vs)
}
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setVideoSource((video_source)vs);
@@ -117,7 +117,7 @@ status_t MediaRecorderClient::setAudioSource(int as)
}
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setAudioSource((audio_source_t)as);
@@ -128,7 +128,7 @@ status_t MediaRecorderClient::setOutputFormat(int of)
ALOGV("setOutputFormat(%d)", of);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setOutputFormat((output_format)of);
@@ -139,7 +139,7 @@ status_t MediaRecorderClient::setVideoEncoder(int ve)
ALOGV("setVideoEncoder(%d)", ve);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setVideoEncoder((video_encoder)ve);
@@ -150,7 +150,7 @@ status_t MediaRecorderClient::setAudioEncoder(int ae)
ALOGV("setAudioEncoder(%d)", ae);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setAudioEncoder((audio_encoder)ae);
@@ -161,7 +161,7 @@ status_t MediaRecorderClient::setOutputFile(const char* path)
ALOGV("setOutputFile(%s)", path);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setOutputFile(path);
@@ -172,7 +172,7 @@ status_t MediaRecorderClient::setOutputFile(int fd, int64_t offset, int64_t leng
ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setOutputFile(fd, offset, length);
@@ -183,7 +183,7 @@ status_t MediaRecorderClient::setVideoSize(int width, int height)
ALOGV("setVideoSize(%dx%d)", width, height);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setVideoSize(width, height);
@@ -194,7 +194,7 @@ status_t MediaRecorderClient::setVideoFrameRate(int frames_per_second)
ALOGV("setVideoFrameRate(%d)", frames_per_second);
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setVideoFrameRate(frames_per_second);
@@ -204,7 +204,7 @@ status_t MediaRecorderClient::setParameters(const String8& params) {
ALOGV("setParameters(%s)", params.string());
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setParameters(params);
@@ -215,7 +215,7 @@ status_t MediaRecorderClient::prepare()
ALOGV("prepare");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->prepare();
@@ -227,7 +227,7 @@ status_t MediaRecorderClient::getMaxAmplitude(int* max)
ALOGV("getMaxAmplitude");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->getMaxAmplitude(max);
@@ -238,7 +238,7 @@ status_t MediaRecorderClient::start()
ALOGV("start");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->start();
@@ -250,7 +250,7 @@ status_t MediaRecorderClient::stop()
ALOGV("stop");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->stop();
@@ -261,7 +261,7 @@ status_t MediaRecorderClient::init()
ALOGV("init");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->init();
@@ -272,7 +272,7 @@ status_t MediaRecorderClient::close()
ALOGV("close");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->close();
@@ -284,7 +284,7 @@ status_t MediaRecorderClient::reset()
ALOGV("reset");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->reset();
@@ -322,7 +322,7 @@ status_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listen
ALOGV("setListener");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
- LOGE("recorder is not initialized");
+ ALOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->setListener(listener);
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
index f945c6a3518c..7dbb57f47c06 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
@@ -98,11 +98,11 @@ static sp<MediaMetadataRetrieverBase> createRetriever(player_type playerType)
default:
// TODO:
// support for TEST_PLAYER
- LOGE("player type %d is not supported", playerType);
+ ALOGE("player type %d is not supported", playerType);
break;
}
if (p == NULL) {
- LOGE("failed to create a retriever object");
+ ALOGE("failed to create a retriever object");
}
return p;
}
@@ -131,7 +131,7 @@ status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t
struct stat sb;
int ret = fstat(fd, &sb);
if (ret != 0) {
- LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
+ ALOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
return BAD_VALUE;
}
ALOGV("st_dev = %llu", sb.st_dev);
@@ -141,7 +141,7 @@ status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t
ALOGV("st_size = %llu", sb.st_size);
if (offset >= sb.st_size) {
- LOGE("offset (%lld) bigger than file size (%llu)", offset, sb.st_size);
+ ALOGE("offset (%lld) bigger than file size (%llu)", offset, sb.st_size);
::close(fd);
return BAD_VALUE;
}
@@ -169,24 +169,24 @@ sp<IMemory> MetadataRetrieverClient::getFrameAtTime(int64_t timeUs, int option)
Mutex::Autolock lock(mLock);
mThumbnail.clear();
if (mRetriever == NULL) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return NULL;
}
VideoFrame *frame = mRetriever->getFrameAtTime(timeUs, option);
if (frame == NULL) {
- LOGE("failed to capture a video frame");
+ ALOGE("failed to capture a video frame");
return NULL;
}
size_t size = sizeof(VideoFrame) + frame->mSize;
sp<MemoryHeapBase> heap = new MemoryHeapBase(size, 0, "MetadataRetrieverClient");
if (heap == NULL) {
- LOGE("failed to create MemoryDealer");
+ ALOGE("failed to create MemoryDealer");
delete frame;
return NULL;
}
mThumbnail = new MemoryBase(heap, 0, size);
if (mThumbnail == NULL) {
- LOGE("not enough memory for VideoFrame size=%u", size);
+ ALOGE("not enough memory for VideoFrame size=%u", size);
delete frame;
return NULL;
}
@@ -210,24 +210,24 @@ sp<IMemory> MetadataRetrieverClient::extractAlbumArt()
Mutex::Autolock lock(mLock);
mAlbumArt.clear();
if (mRetriever == NULL) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return NULL;
}
MediaAlbumArt *albumArt = mRetriever->extractAlbumArt();
if (albumArt == NULL) {
- LOGE("failed to extract an album art");
+ ALOGE("failed to extract an album art");
return NULL;
}
size_t size = sizeof(MediaAlbumArt) + albumArt->mSize;
sp<MemoryHeapBase> heap = new MemoryHeapBase(size, 0, "MetadataRetrieverClient");
if (heap == NULL) {
- LOGE("failed to create MemoryDealer object");
+ ALOGE("failed to create MemoryDealer object");
delete albumArt;
return NULL;
}
mAlbumArt = new MemoryBase(heap, 0, size);
if (mAlbumArt == NULL) {
- LOGE("not enough memory for MediaAlbumArt size=%u", size);
+ ALOGE("not enough memory for MediaAlbumArt size=%u", size);
delete albumArt;
return NULL;
}
@@ -244,7 +244,7 @@ const char* MetadataRetrieverClient::extractMetadata(int keyCode)
ALOGV("extractMetadata");
Mutex::Autolock lock(mLock);
if (mRetriever == NULL) {
- LOGE("retriever is not initialized");
+ ALOGE("retriever is not initialized");
return NULL;
}
return mRetriever->extractMetadata(keyCode);
diff --git a/media/libmediaplayerservice/MidiFile.cpp b/media/libmediaplayerservice/MidiFile.cpp
index 49469562da4a..7cb8c29150df 100644
--- a/media/libmediaplayerservice/MidiFile.cpp
+++ b/media/libmediaplayerservice/MidiFile.cpp
@@ -69,13 +69,13 @@ MidiFile::MidiFile() :
if (pLibConfig == NULL)
pLibConfig = EAS_Config();
if ((pLibConfig == NULL) || (LIB_VERSION != pLibConfig->libVersion)) {
- LOGE("EAS library/header mismatch");
+ ALOGE("EAS library/header mismatch");
goto Failed;
}
// initialize EAS library
if (EAS_Init(&mEasData) != EAS_SUCCESS) {
- LOGE("EAS_Init failed");
+ ALOGE("EAS_Init failed");
goto Failed;
}
@@ -134,7 +134,7 @@ status_t MidiFile::setDataSource(
}
if (result != EAS_SUCCESS) {
- LOGE("EAS_OpenFile failed: [%d]", (int)result);
+ ALOGE("EAS_OpenFile failed: [%d]", (int)result);
mState = EAS_STATE_ERROR;
return ERROR_OPEN_FAILED;
}
@@ -162,7 +162,7 @@ status_t MidiFile::setDataSource(int fd, int64_t offset, int64_t length)
updateState();
if (result != EAS_SUCCESS) {
- LOGE("EAS_OpenFile failed: [%d]", (int)result);
+ ALOGE("EAS_OpenFile failed: [%d]", (int)result);
mState = EAS_STATE_ERROR;
return ERROR_OPEN_FAILED;
}
@@ -181,7 +181,7 @@ status_t MidiFile::prepare()
}
EAS_RESULT result;
if ((result = EAS_Prepare(mEasData, mEasHandle)) != EAS_SUCCESS) {
- LOGE("EAS_Prepare failed: [%ld]", result);
+ ALOGE("EAS_Prepare failed: [%ld]", result);
return ERROR_EAS_FAILURE;
}
updateState();
@@ -237,7 +237,7 @@ status_t MidiFile::stop()
if (!mPaused && (mState != EAS_STATE_STOPPED)) {
EAS_RESULT result = EAS_Pause(mEasData, mEasHandle);
if (result != EAS_SUCCESS) {
- LOGE("EAS_Pause returned error %ld", result);
+ ALOGE("EAS_Pause returned error %ld", result);
return ERROR_EAS_FAILURE;
}
}
@@ -258,7 +258,7 @@ status_t MidiFile::seekTo(int position)
if ((result = EAS_Locate(mEasData, mEasHandle, position, false))
!= EAS_SUCCESS)
{
- LOGE("EAS_Locate returned %ld", result);
+ ALOGE("EAS_Locate returned %ld", result);
return ERROR_EAS_FAILURE;
}
EAS_GetLocation(mEasData, mEasHandle, &mPlayTime);
@@ -293,11 +293,11 @@ status_t MidiFile::getCurrentPosition(int* position)
{
ALOGV("MidiFile::getCurrentPosition");
if (!mEasHandle) {
- LOGE("getCurrentPosition(): file not open");
+ ALOGE("getCurrentPosition(): file not open");
return ERROR_NOT_OPEN;
}
if (mPlayTime < 0) {
- LOGE("getCurrentPosition(): mPlayTime = %ld", mPlayTime);
+ ALOGE("getCurrentPosition(): mPlayTime = %ld", mPlayTime);
return ERROR_EAS_FAILURE;
}
*position = mPlayTime;
@@ -422,7 +422,7 @@ status_t MidiFile::setLooping(int loop)
status_t MidiFile::createOutputTrack() {
if (mAudioSink->open(pLibConfig->sampleRate, pLibConfig->numChannels, AUDIO_FORMAT_PCM_16_BIT, 2) != NO_ERROR) {
- LOGE("mAudioSink open failed");
+ ALOGE("mAudioSink open failed");
return ERROR_OPEN_FAILED;
}
return NO_ERROR;
@@ -439,7 +439,7 @@ int MidiFile::render() {
// allocate render buffer
mAudioBuffer = new EAS_PCM[pLibConfig->mixBufferSize * pLibConfig->numChannels * NUM_BUFFERS];
if (!mAudioBuffer) {
- LOGE("mAudioBuffer allocate failed");
+ ALOGE("mAudioBuffer allocate failed");
goto threadExit;
}
@@ -473,7 +473,7 @@ int MidiFile::render() {
for (int i = 0; i < NUM_BUFFERS; i++) {
result = EAS_Render(mEasData, p, pLibConfig->mixBufferSize, &count);
if (result != EAS_SUCCESS) {
- LOGE("EAS_Render returned %ld", result);
+ ALOGE("EAS_Render returned %ld", result);
}
p += count * pLibConfig->numChannels;
num_output += count * pLibConfig->numChannels * sizeof(EAS_PCM);
@@ -495,7 +495,7 @@ int MidiFile::render() {
// Write data to the audio hardware
// ALOGV("MidiFile::render - writing to audio output");
if ((temp = mAudioSink->write(mAudioBuffer, num_output)) < 0) {
- LOGE("Error in writing:%d",temp);
+ ALOGE("Error in writing:%d",temp);
return temp;
}
@@ -519,7 +519,7 @@ int MidiFile::render() {
}
case EAS_STATE_ERROR:
{
- LOGE("MidiFile::render - error");
+ ALOGE("MidiFile::render - error");
sendEvent(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN);
break;
}
diff --git a/media/libmediaplayerservice/MidiMetadataRetriever.cpp b/media/libmediaplayerservice/MidiMetadataRetriever.cpp
index bb65ed432ea8..465209f00849 100644
--- a/media/libmediaplayerservice/MidiMetadataRetriever.cpp
+++ b/media/libmediaplayerservice/MidiMetadataRetriever.cpp
@@ -63,7 +63,7 @@ const char* MidiMetadataRetriever::extractMetadata(int keyCode)
ALOGV("extractMetdata: key(%d)", keyCode);
Mutex::Autolock lock(mLock);
if (mMidiPlayer == 0 || mMidiPlayer->initCheck() != NO_ERROR) {
- LOGE("Midi player is not initialized yet");
+ ALOGE("Midi player is not initialized yet");
return NULL;
}
switch (keyCode) {
@@ -72,7 +72,7 @@ const char* MidiMetadataRetriever::extractMetadata(int keyCode)
if (mMetadataValues[0][0] == '\0') {
int duration = -1;
if (mMidiPlayer->getDuration(&duration) != NO_ERROR) {
- LOGE("failed to get duration");
+ ALOGE("failed to get duration");
return NULL;
}
snprintf(mMetadataValues[0], MAX_METADATA_STRING_LENGTH, "%d", duration);
@@ -82,7 +82,7 @@ const char* MidiMetadataRetriever::extractMetadata(int keyCode)
return mMetadataValues[0];
}
default:
- LOGE("Unsupported key code (%d)", keyCode);
+ ALOGE("Unsupported key code (%d)", keyCode);
return NULL;
}
return NULL;
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index c0ba0918c5fe..4632016cf9b9 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -97,7 +97,7 @@ status_t StagefrightRecorder::setAudioSource(audio_source_t as) {
ALOGV("setAudioSource: %d", as);
if (as < AUDIO_SOURCE_DEFAULT ||
as >= AUDIO_SOURCE_CNT) {
- LOGE("Invalid audio source: %d", as);
+ ALOGE("Invalid audio source: %d", as);
return BAD_VALUE;
}
@@ -114,7 +114,7 @@ status_t StagefrightRecorder::setVideoSource(video_source vs) {
ALOGV("setVideoSource: %d", vs);
if (vs < VIDEO_SOURCE_DEFAULT ||
vs >= VIDEO_SOURCE_LIST_END) {
- LOGE("Invalid video source: %d", vs);
+ ALOGE("Invalid video source: %d", vs);
return BAD_VALUE;
}
@@ -131,7 +131,7 @@ status_t StagefrightRecorder::setOutputFormat(output_format of) {
ALOGV("setOutputFormat: %d", of);
if (of < OUTPUT_FORMAT_DEFAULT ||
of >= OUTPUT_FORMAT_LIST_END) {
- LOGE("Invalid output format: %d", of);
+ ALOGE("Invalid output format: %d", of);
return BAD_VALUE;
}
@@ -148,7 +148,7 @@ status_t StagefrightRecorder::setAudioEncoder(audio_encoder ae) {
ALOGV("setAudioEncoder: %d", ae);
if (ae < AUDIO_ENCODER_DEFAULT ||
ae >= AUDIO_ENCODER_LIST_END) {
- LOGE("Invalid audio encoder: %d", ae);
+ ALOGE("Invalid audio encoder: %d", ae);
return BAD_VALUE;
}
@@ -165,7 +165,7 @@ status_t StagefrightRecorder::setVideoEncoder(video_encoder ve) {
ALOGV("setVideoEncoder: %d", ve);
if (ve < VIDEO_ENCODER_DEFAULT ||
ve >= VIDEO_ENCODER_LIST_END) {
- LOGE("Invalid video encoder: %d", ve);
+ ALOGE("Invalid video encoder: %d", ve);
return BAD_VALUE;
}
@@ -181,7 +181,7 @@ status_t StagefrightRecorder::setVideoEncoder(video_encoder ve) {
status_t StagefrightRecorder::setVideoSize(int width, int height) {
ALOGV("setVideoSize: %dx%d", width, height);
if (width <= 0 || height <= 0) {
- LOGE("Invalid video size: %dx%d", width, height);
+ ALOGE("Invalid video size: %dx%d", width, height);
return BAD_VALUE;
}
@@ -196,7 +196,7 @@ status_t StagefrightRecorder::setVideoFrameRate(int frames_per_second) {
ALOGV("setVideoFrameRate: %d", frames_per_second);
if ((frames_per_second <= 0 && frames_per_second != -1) ||
frames_per_second > 120) {
- LOGE("Invalid video frame rate: %d", frames_per_second);
+ ALOGE("Invalid video frame rate: %d", frames_per_second);
return BAD_VALUE;
}
@@ -210,11 +210,11 @@ status_t StagefrightRecorder::setCamera(const sp<ICamera> &camera,
const sp<ICameraRecordingProxy> &proxy) {
ALOGV("setCamera");
if (camera == 0) {
- LOGE("camera is NULL");
+ ALOGE("camera is NULL");
return BAD_VALUE;
}
if (proxy == 0) {
- LOGE("camera proxy is NULL");
+ ALOGE("camera proxy is NULL");
return BAD_VALUE;
}
@@ -231,7 +231,7 @@ status_t StagefrightRecorder::setPreviewSurface(const sp<Surface> &surface) {
}
status_t StagefrightRecorder::setOutputFile(const char *path) {
- LOGE("setOutputFile(const char*) must not be called");
+ ALOGE("setOutputFile(const char*) must not be called");
// We don't actually support this at all, as the media_server process
// no longer has permissions to create files.
@@ -245,7 +245,7 @@ status_t StagefrightRecorder::setOutputFile(int fd, int64_t offset, int64_t leng
CHECK_EQ(length, 0);
if (fd < 0) {
- LOGE("Invalid file descriptor: %d", fd);
+ ALOGE("Invalid file descriptor: %d", fd);
return -EBADF;
}
@@ -315,7 +315,7 @@ static void TrimString(String8 *s) {
status_t StagefrightRecorder::setParamAudioSamplingRate(int32_t sampleRate) {
ALOGV("setParamAudioSamplingRate: %d", sampleRate);
if (sampleRate <= 0) {
- LOGE("Invalid audio sampling rate: %d", sampleRate);
+ ALOGE("Invalid audio sampling rate: %d", sampleRate);
return BAD_VALUE;
}
@@ -327,7 +327,7 @@ status_t StagefrightRecorder::setParamAudioSamplingRate(int32_t sampleRate) {
status_t StagefrightRecorder::setParamAudioNumberOfChannels(int32_t channels) {
ALOGV("setParamAudioNumberOfChannels: %d", channels);
if (channels <= 0 || channels >= 3) {
- LOGE("Invalid number of audio channels: %d", channels);
+ ALOGE("Invalid number of audio channels: %d", channels);
return BAD_VALUE;
}
@@ -339,7 +339,7 @@ status_t StagefrightRecorder::setParamAudioNumberOfChannels(int32_t channels) {
status_t StagefrightRecorder::setParamAudioEncodingBitRate(int32_t bitRate) {
ALOGV("setParamAudioEncodingBitRate: %d", bitRate);
if (bitRate <= 0) {
- LOGE("Invalid audio encoding bit rate: %d", bitRate);
+ ALOGE("Invalid audio encoding bit rate: %d", bitRate);
return BAD_VALUE;
}
@@ -354,7 +354,7 @@ status_t StagefrightRecorder::setParamAudioEncodingBitRate(int32_t bitRate) {
status_t StagefrightRecorder::setParamVideoEncodingBitRate(int32_t bitRate) {
ALOGV("setParamVideoEncodingBitRate: %d", bitRate);
if (bitRate <= 0) {
- LOGE("Invalid video encoding bit rate: %d", bitRate);
+ ALOGE("Invalid video encoding bit rate: %d", bitRate);
return BAD_VALUE;
}
@@ -370,7 +370,7 @@ status_t StagefrightRecorder::setParamVideoEncodingBitRate(int32_t bitRate) {
status_t StagefrightRecorder::setParamVideoRotation(int32_t degrees) {
ALOGV("setParamVideoRotation: %d", degrees);
if (degrees < 0 || degrees % 90 != 0) {
- LOGE("Unsupported video rotation angle: %d", degrees);
+ ALOGE("Unsupported video rotation angle: %d", degrees);
return BAD_VALUE;
}
mRotationDegrees = degrees % 360;
@@ -382,15 +382,15 @@ status_t StagefrightRecorder::setParamMaxFileDurationUs(int64_t timeUs) {
// This is meant for backward compatibility for MediaRecorder.java
if (timeUs <= 0) {
- LOGW("Max file duration is not positive: %lld us. Disabling duration limit.", timeUs);
+ ALOGW("Max file duration is not positive: %lld us. Disabling duration limit.", timeUs);
timeUs = 0; // Disable the duration limit for zero or negative values.
} else if (timeUs <= 100000LL) { // XXX: 100 milli-seconds
- LOGE("Max file duration is too short: %lld us", timeUs);
+ ALOGE("Max file duration is too short: %lld us", timeUs);
return BAD_VALUE;
}
if (timeUs <= 15 * 1000000LL) {
- LOGW("Target duration (%lld us) too short to be respected", timeUs);
+ ALOGW("Target duration (%lld us) too short to be respected", timeUs);
}
mMaxFileDurationUs = timeUs;
return OK;
@@ -401,16 +401,16 @@ status_t StagefrightRecorder::setParamMaxFileSizeBytes(int64_t bytes) {
// This is meant for backward compatibility for MediaRecorder.java
if (bytes <= 0) {
- LOGW("Max file size is not positive: %lld bytes. "
+ ALOGW("Max file size is not positive: %lld bytes. "
"Disabling file size limit.", bytes);
bytes = 0; // Disable the file size limit for zero or negative values.
} else if (bytes <= 1024) { // XXX: 1 kB
- LOGE("Max file size is too small: %lld bytes", bytes);
+ ALOGE("Max file size is too small: %lld bytes", bytes);
return BAD_VALUE;
}
if (bytes <= 100 * 1024) {
- LOGW("Target file size (%lld bytes) is too small to be respected", bytes);
+ ALOGW("Target file size (%lld bytes) is too small to be respected", bytes);
}
mMaxFileSizeBytes = bytes;
@@ -423,13 +423,13 @@ status_t StagefrightRecorder::setParamInterleaveDuration(int32_t durationUs) {
// If interleave duration is too small, it is very inefficient to do
// interleaving since the metadata overhead will count for a significant
// portion of the saved contents
- LOGE("Audio/video interleave duration is too small: %d us", durationUs);
+ ALOGE("Audio/video interleave duration is too small: %d us", durationUs);
return BAD_VALUE;
} else if (durationUs >= 10000000) { // 10 seconds
// If interleaving duration is too large, it can cause the recording
// session to use too much memory since we have to save the output
// data before we write them out
- LOGE("Audio/video interleave duration is too large: %d us", durationUs);
+ ALOGE("Audio/video interleave duration is too large: %d us", durationUs);
return BAD_VALUE;
}
mInterleaveDurationUs = durationUs;
@@ -464,7 +464,7 @@ status_t StagefrightRecorder::setParamVideoCameraId(int32_t cameraId) {
status_t StagefrightRecorder::setParamTrackTimeStatus(int64_t timeDurationUs) {
ALOGV("setParamTrackTimeStatus: %lld", timeDurationUs);
if (timeDurationUs < 20000) { // Infeasible if shorter than 20 ms?
- LOGE("Tracking time duration too short: %lld us", timeDurationUs);
+ ALOGE("Tracking time duration too short: %lld us", timeDurationUs);
return BAD_VALUE;
}
mTrackEveryTimeDurationUs = timeDurationUs;
@@ -495,7 +495,7 @@ status_t StagefrightRecorder::setParamMovieTimeScale(int32_t timeScale) {
// The range is set to be the same as the audio's time scale range
// since audio's time scale has a wider range.
if (timeScale < 600 || timeScale > 96000) {
- LOGE("Time scale (%d) for movie is out of range [600, 96000]", timeScale);
+ ALOGE("Time scale (%d) for movie is out of range [600, 96000]", timeScale);
return BAD_VALUE;
}
mMovieTimeScale = timeScale;
@@ -508,7 +508,7 @@ status_t StagefrightRecorder::setParamVideoTimeScale(int32_t timeScale) {
// 60000 is chosen to make sure that each video frame from a 60-fps
// video has 1000 ticks.
if (timeScale < 600 || timeScale > 60000) {
- LOGE("Time scale (%d) for video is out of range [600, 60000]", timeScale);
+ ALOGE("Time scale (%d) for video is out of range [600, 60000]", timeScale);
return BAD_VALUE;
}
mVideoTimeScale = timeScale;
@@ -520,7 +520,7 @@ status_t StagefrightRecorder::setParamAudioTimeScale(int32_t timeScale) {
// 96000 Hz is the highest sampling rate support in AAC.
if (timeScale < 600 || timeScale > 96000) {
- LOGE("Time scale (%d) for audio is out of range [600, 96000]", timeScale);
+ ALOGE("Time scale (%d) for audio is out of range [600, 96000]", timeScale);
return BAD_VALUE;
}
mAudioTimeScale = timeScale;
@@ -545,7 +545,7 @@ status_t StagefrightRecorder::setParamTimeBetweenTimeLapseFrameCapture(int64_t t
// Not allowing time more than a day
if (timeUs <= 0 || timeUs > 86400*1E6) {
- LOGE("Time between time lapse frame capture (%lld) is out of range [0, 1 Day]", timeUs);
+ ALOGE("Time between time lapse frame capture (%lld) is out of range [0, 1 Day]", timeUs);
return BAD_VALUE;
}
@@ -683,7 +683,7 @@ status_t StagefrightRecorder::setParameter(
1000LL * timeBetweenTimeLapseFrameCaptureMs);
}
} else {
- LOGE("setParameter: failed to find key %s", key.string());
+ ALOGE("setParameter: failed to find key %s", key.string());
}
return BAD_VALUE;
}
@@ -695,13 +695,13 @@ status_t StagefrightRecorder::setParameters(const String8 &params) {
for (;;) {
const char *equal_pos = strchr(key_start, '=');
if (equal_pos == NULL) {
- LOGE("Parameters %s miss a value", cparams);
+ ALOGE("Parameters %s miss a value", cparams);
return BAD_VALUE;
}
String8 key(key_start, equal_pos - key_start);
TrimString(&key);
if (key.length() == 0) {
- LOGE("Parameters %s contains an empty key", cparams);
+ ALOGE("Parameters %s contains an empty key", cparams);
return BAD_VALUE;
}
const char *value_start = equal_pos + 1;
@@ -737,7 +737,7 @@ status_t StagefrightRecorder::start() {
CHECK(mOutputFd >= 0);
if (mWriter != NULL) {
- LOGE("File writer is not avaialble");
+ ALOGE("File writer is not avaialble");
return UNKNOWN_ERROR;
}
@@ -769,7 +769,7 @@ status_t StagefrightRecorder::start() {
break;
default:
- LOGE("Unsupported output file format: %d", mOutputFormat);
+ ALOGE("Unsupported output file format: %d", mOutputFormat);
status = UNKNOWN_ERROR;
break;
}
@@ -801,7 +801,7 @@ sp<MediaSource> StagefrightRecorder::createAudioSource() {
status_t err = audioSource->initCheck();
if (err != OK) {
- LOGE("audio source is not initialized");
+ ALOGE("audio source is not initialized");
return NULL;
}
@@ -819,7 +819,7 @@ sp<MediaSource> StagefrightRecorder::createAudioSource() {
mime = MEDIA_MIMETYPE_AUDIO_AAC;
break;
default:
- LOGE("Unknown audio encoder: %d", mAudioEncoder);
+ ALOGE("Unknown audio encoder: %d", mAudioEncoder);
return NULL;
}
encMeta->setCString(kKeyMIMEType, mime);
@@ -872,13 +872,13 @@ status_t StagefrightRecorder::startAMRRecording() {
if (mOutputFormat == OUTPUT_FORMAT_AMR_NB) {
if (mAudioEncoder != AUDIO_ENCODER_DEFAULT &&
mAudioEncoder != AUDIO_ENCODER_AMR_NB) {
- LOGE("Invalid encoder %d used for AMRNB recording",
+ ALOGE("Invalid encoder %d used for AMRNB recording",
mAudioEncoder);
return BAD_VALUE;
}
} else { // mOutputFormat must be OUTPUT_FORMAT_AMR_WB
if (mAudioEncoder != AUDIO_ENCODER_AMR_WB) {
- LOGE("Invlaid encoder %d used for AMRWB recording",
+ ALOGE("Invlaid encoder %d used for AMRWB recording",
mAudioEncoder);
return BAD_VALUE;
}
@@ -895,7 +895,7 @@ status_t StagefrightRecorder::startAMRRecording() {
status_t StagefrightRecorder::startRawAudioRecording() {
if (mAudioSource >= AUDIO_SOURCE_CNT) {
- LOGE("Invalid audio source: %d", mAudioSource);
+ ALOGE("Invalid audio source: %d", mAudioSource);
return BAD_VALUE;
}
@@ -1022,11 +1022,11 @@ void StagefrightRecorder::clipVideoFrameRate() {
int maxFrameRate = mEncoderProfiles->getVideoEncoderParamByName(
"enc.vid.fps.max", mVideoEncoder);
if (mFrameRate < minFrameRate && mFrameRate != -1) {
- LOGW("Intended video encoding frame rate (%d fps) is too small"
+ ALOGW("Intended video encoding frame rate (%d fps) is too small"
" and will be set to (%d fps)", mFrameRate, minFrameRate);
mFrameRate = minFrameRate;
} else if (mFrameRate > maxFrameRate) {
- LOGW("Intended video encoding frame rate (%d fps) is too large"
+ ALOGW("Intended video encoding frame rate (%d fps) is too large"
" and will be set to (%d fps)", mFrameRate, maxFrameRate);
mFrameRate = maxFrameRate;
}
@@ -1039,11 +1039,11 @@ void StagefrightRecorder::clipVideoBitRate() {
int maxBitRate = mEncoderProfiles->getVideoEncoderParamByName(
"enc.vid.bps.max", mVideoEncoder);
if (mVideoBitRate < minBitRate) {
- LOGW("Intended video encoding bit rate (%d bps) is too small"
+ ALOGW("Intended video encoding bit rate (%d bps) is too small"
" and will be set to (%d bps)", mVideoBitRate, minBitRate);
mVideoBitRate = minBitRate;
} else if (mVideoBitRate > maxBitRate) {
- LOGW("Intended video encoding bit rate (%d bps) is too large"
+ ALOGW("Intended video encoding bit rate (%d bps) is too large"
" and will be set to (%d bps)", mVideoBitRate, maxBitRate);
mVideoBitRate = maxBitRate;
}
@@ -1056,11 +1056,11 @@ void StagefrightRecorder::clipVideoFrameWidth() {
int maxFrameWidth = mEncoderProfiles->getVideoEncoderParamByName(
"enc.vid.width.max", mVideoEncoder);
if (mVideoWidth < minFrameWidth) {
- LOGW("Intended video encoding frame width (%d) is too small"
+ ALOGW("Intended video encoding frame width (%d) is too small"
" and will be set to (%d)", mVideoWidth, minFrameWidth);
mVideoWidth = minFrameWidth;
} else if (mVideoWidth > maxFrameWidth) {
- LOGW("Intended video encoding frame width (%d) is too large"
+ ALOGW("Intended video encoding frame width (%d) is too large"
" and will be set to (%d)", mVideoWidth, maxFrameWidth);
mVideoWidth = maxFrameWidth;
}
@@ -1131,7 +1131,7 @@ void StagefrightRecorder::setDefaultProfileIfNecessary() {
audioSampleRate == mSampleRate &&
audioChannels == mAudioChannels) {
if (videoCodec == VIDEO_ENCODER_H264) {
- LOGI("Force to use AVC baseline profile");
+ ALOGI("Force to use AVC baseline profile");
setParamVideoEncoderProfile(OMX_VIDEO_AVCProfileBaseline);
}
}
@@ -1151,7 +1151,7 @@ void StagefrightRecorder::clipAudioBitRate() {
mEncoderProfiles->getAudioEncoderParamByName(
"enc.aud.bps.min", mAudioEncoder);
if (mAudioBitRate < minAudioBitRate) {
- LOGW("Intended audio encoding bit rate (%d) is too small"
+ ALOGW("Intended audio encoding bit rate (%d) is too small"
" and will be set to (%d)", mAudioBitRate, minAudioBitRate);
mAudioBitRate = minAudioBitRate;
}
@@ -1160,7 +1160,7 @@ void StagefrightRecorder::clipAudioBitRate() {
mEncoderProfiles->getAudioEncoderParamByName(
"enc.aud.bps.max", mAudioEncoder);
if (mAudioBitRate > maxAudioBitRate) {
- LOGW("Intended audio encoding bit rate (%d) is too large"
+ ALOGW("Intended audio encoding bit rate (%d) is too large"
" and will be set to (%d)", mAudioBitRate, maxAudioBitRate);
mAudioBitRate = maxAudioBitRate;
}
@@ -1173,7 +1173,7 @@ void StagefrightRecorder::clipAudioSampleRate() {
mEncoderProfiles->getAudioEncoderParamByName(
"enc.aud.hz.min", mAudioEncoder);
if (mSampleRate < minSampleRate) {
- LOGW("Intended audio sample rate (%d) is too small"
+ ALOGW("Intended audio sample rate (%d) is too small"
" and will be set to (%d)", mSampleRate, minSampleRate);
mSampleRate = minSampleRate;
}
@@ -1182,7 +1182,7 @@ void StagefrightRecorder::clipAudioSampleRate() {
mEncoderProfiles->getAudioEncoderParamByName(
"enc.aud.hz.max", mAudioEncoder);
if (mSampleRate > maxSampleRate) {
- LOGW("Intended audio sample rate (%d) is too large"
+ ALOGW("Intended audio sample rate (%d) is too large"
" and will be set to (%d)", mSampleRate, maxSampleRate);
mSampleRate = maxSampleRate;
}
@@ -1195,7 +1195,7 @@ void StagefrightRecorder::clipNumberOfAudioChannels() {
mEncoderProfiles->getAudioEncoderParamByName(
"enc.aud.ch.min", mAudioEncoder);
if (mAudioChannels < minChannels) {
- LOGW("Intended number of audio channels (%d) is too small"
+ ALOGW("Intended number of audio channels (%d) is too small"
" and will be set to (%d)", mAudioChannels, minChannels);
mAudioChannels = minChannels;
}
@@ -1204,7 +1204,7 @@ void StagefrightRecorder::clipNumberOfAudioChannels() {
mEncoderProfiles->getAudioEncoderParamByName(
"enc.aud.ch.max", mAudioEncoder);
if (mAudioChannels > maxChannels) {
- LOGW("Intended number of audio channels (%d) is too large"
+ ALOGW("Intended number of audio channels (%d) is too large"
" and will be set to (%d)", mAudioChannels, maxChannels);
mAudioChannels = maxChannels;
}
@@ -1217,11 +1217,11 @@ void StagefrightRecorder::clipVideoFrameHeight() {
int maxFrameHeight = mEncoderProfiles->getVideoEncoderParamByName(
"enc.vid.height.max", mVideoEncoder);
if (mVideoHeight < minFrameHeight) {
- LOGW("Intended video encoding frame height (%d) is too small"
+ ALOGW("Intended video encoding frame height (%d) is too small"
" and will be set to (%d)", mVideoHeight, minFrameHeight);
mVideoHeight = minFrameHeight;
} else if (mVideoHeight > maxFrameHeight) {
- LOGW("Intended video encoding frame height (%d) is too large"
+ ALOGW("Intended video encoding frame height (%d) is too large"
" and will be set to (%d)", mVideoHeight, maxFrameHeight);
mVideoHeight = maxFrameHeight;
}
@@ -1268,7 +1268,7 @@ status_t StagefrightRecorder::setupSurfaceMediaSource() {
int32_t frameRate = 0;
CHECK (mSurfaceMediaSource->getFormat()->findInt32(
kKeyFrameRate, &frameRate));
- LOGI("Frame rate is not explicitly set. Use the current frame "
+ ALOGI("Frame rate is not explicitly set. Use the current frame "
"rate (%d fps)", frameRate);
mFrameRate = frameRate;
} else {
@@ -1319,7 +1319,7 @@ status_t StagefrightRecorder::setupCameraSource(
int32_t frameRate = 0;
CHECK ((*cameraSource)->getFormat()->findInt32(
kKeyFrameRate, &frameRate));
- LOGI("Frame rate is not explicitly set. Use the current frame "
+ ALOGI("Frame rate is not explicitly set. Use the current frame "
"rate (%d fps)", frameRate);
mFrameRate = frameRate;
}
@@ -1406,7 +1406,7 @@ status_t StagefrightRecorder::setupVideoEncoder(
true /* createEncoder */, cameraSource,
NULL, encoder_flags);
if (encoder == NULL) {
- LOGW("Failed to create the encoder");
+ ALOGW("Failed to create the encoder");
// When the encoder fails to be created, we need
// release the camera source due to the camera's lock
// and unlock mechanism.
@@ -1432,7 +1432,7 @@ status_t StagefrightRecorder::setupAudioEncoder(const sp<MediaWriter>& writer) {
break;
default:
- LOGE("Unsupported audio encoder: %d", mAudioEncoder);
+ ALOGE("Unsupported audio encoder: %d", mAudioEncoder);
return UNKNOWN_ERROR;
}
@@ -1667,7 +1667,7 @@ status_t StagefrightRecorder::getMaxAmplitude(int *max) {
ALOGV("getMaxAmplitude");
if (max == NULL) {
- LOGE("Null pointer argument");
+ ALOGE("Null pointer argument");
return BAD_VALUE;
}
diff --git a/media/libmediaplayerservice/TestPlayerStub.cpp b/media/libmediaplayerservice/TestPlayerStub.cpp
index 169e49ad5caa..0f0ff6500846 100644
--- a/media/libmediaplayerservice/TestPlayerStub.cpp
+++ b/media/libmediaplayerservice/TestPlayerStub.cpp
@@ -134,7 +134,7 @@ status_t TestPlayerStub::setDataSource(
// None of the entry points should be NULL.
mHandle = ::dlopen(mFilename, RTLD_NOW | RTLD_GLOBAL);
if (!mHandle) {
- LOGE("dlopen failed: %s", ::dlerror());
+ ALOGE("dlopen failed: %s", ::dlerror());
resetInternal();
return UNKNOWN_ERROR;
}
@@ -147,7 +147,7 @@ status_t TestPlayerStub::setDataSource(
if (err || mNewPlayer == NULL) {
// if err is NULL the string <null> is inserted in the logs =>
// mNewPlayer was NULL.
- LOGE("dlsym for newPlayer failed %s", err);
+ ALOGE("dlsym for newPlayer failed %s", err);
resetInternal();
return UNKNOWN_ERROR;
}
@@ -156,7 +156,7 @@ status_t TestPlayerStub::setDataSource(
"deletePlayer"));
err = ::dlerror();
if (err || mDeletePlayer == NULL) {
- LOGE("dlsym for deletePlayer failed %s", err);
+ ALOGE("dlsym for deletePlayer failed %s", err);
resetInternal();
return UNKNOWN_ERROR;
}
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
index 079f6fa01952..22b88471c07d 100644
--- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
@@ -111,9 +111,9 @@ status_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
break;
} else if (n < 0) {
if (n != ERROR_END_OF_STREAM) {
- LOGI("input data EOS reached, error %ld", n);
+ ALOGI("input data EOS reached, error %ld", n);
} else {
- LOGI("input data EOS reached.");
+ ALOGI("input data EOS reached.");
}
mTSParser->signalEOS(n);
mFinalResult = n;
@@ -131,7 +131,7 @@ status_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
status_t err = mTSParser->feedTSPacket(buffer, sizeof(buffer));
if (err != OK) {
- LOGE("TS Parser returned error %d", err);
+ ALOGE("TS Parser returned error %d", err);
mTSParser->signalEOS(err);
mFinalResult = err;
break;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 03aa42e99828..b731d0f3cd58 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -383,7 +383,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
finishFlushIfPossible();
} else if (what == ACodec::kWhatError) {
- LOGE("Received error from %s decoder, aborting playback.",
+ ALOGE("Received error from %s decoder, aborting playback.",
audio ? "audio" : "video");
mRenderer->queueEOS(audio, UNKNOWN_ERROR);
@@ -417,7 +417,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
if (finalResult == ERROR_END_OF_STREAM) {
ALOGV("reached %s EOS", audio ? "audio" : "video");
} else {
- LOGE("%s track encountered an error (%d)",
+ ALOGE("%s track encountered an error (%d)",
audio ? "audio" : "video", finalResult);
notifyListener(
@@ -689,7 +689,7 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
- LOGI("%s discontinuity (formatChange=%d, time=%d)",
+ ALOGI("%s discontinuity (formatChange=%d, time=%d)",
audio ? "audio" : "video", formatChange, timeChange);
if (audio) {
@@ -705,7 +705,7 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
int64_t resumeAtMediaTimeUs;
if (extra->findInt64(
"resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
- LOGI("suppressing rendering of %s until %lld us",
+ ALOGI("suppressing rendering of %s until %lld us",
audio ? "audio" : "video", resumeAtMediaTimeUs);
if (audio) {
@@ -838,7 +838,7 @@ void NuPlayer::notifyListener(int msg, int ext1, int ext2) {
void NuPlayer::flushDecoder(bool audio, bool needShutdown) {
if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
- LOGI("flushDecoder %s without decoder present",
+ ALOGI("flushDecoder %s without decoder present",
audio ? "audio" : "video");
}
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 3539e3f10f0e..15259cb5c370 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -228,7 +228,7 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {
#if 0
if (numFramesAvailableToWrite == mAudioSink->frameCount()) {
- LOGI("audio sink underrun");
+ ALOGI("audio sink underrun");
} else {
ALOGV("audio queue has %d frames left to play",
mAudioSink->frameCount() - numFramesAvailableToWrite);
@@ -270,7 +270,7 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {
+ numFramesPendingPlayout
* mAudioSink->msecsPerFrame()) * 1000ll;
- // LOGI("realTimeOffsetUs = %lld us", realTimeOffsetUs);
+ // ALOGI("realTimeOffsetUs = %lld us", realTimeOffsetUs);
mAnchorTimeRealUs =
ALooper::GetNowUs() + realTimeOffsetUs;
diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
index 6d2829814f8e..6eb0d077aac2 100644
--- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
@@ -226,7 +226,7 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
int32_t damaged;
if (accessUnit->meta()->findInt32("damaged", &damaged)
&& damaged) {
- LOGI("dropping damaged access unit.");
+ ALOGI("dropping damaged access unit.");
break;
}
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
index 2e63b3b6afbe..7c9bc5e0a096 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
@@ -58,7 +58,7 @@ status_t NuPlayer::StreamingSource::feedMoreTSData() {
ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra);
if (n == 0) {
- LOGI("input data EOS reached.");
+ ALOGI("input data EOS reached.");
mTSParser->signalEOS(ERROR_END_OF_STREAM);
mFinalResult = ERROR_END_OF_STREAM;
break;
@@ -70,7 +70,7 @@ status_t NuPlayer::StreamingSource::feedMoreTSData() {
&& extra->findInt32(
IStreamListener::kKeyDiscontinuityMask, &mask)) {
if (mask == 0) {
- LOGE("Client specified an illegal discontinuity type.");
+ ALOGE("Client specified an illegal discontinuity type.");
return ERROR_UNSUPPORTED;
}
@@ -94,7 +94,7 @@ status_t NuPlayer::StreamingSource::feedMoreTSData() {
status_t err = mTSParser->feedTSPacket(buffer, sizeof(buffer));
if (err != OK) {
- LOGE("TS Parser returned error %d", err);
+ ALOGE("TS Parser returned error %d", err);
mTSParser->signalEOS(err);
mFinalResult = err;
diff --git a/media/libstagefright/AACWriter.cpp b/media/libstagefright/AACWriter.cpp
index 03fb33b9541e..1673ccdb3983 100644
--- a/media/libstagefright/AACWriter.cpp
+++ b/media/libstagefright/AACWriter.cpp
@@ -84,7 +84,7 @@ status_t AACWriter::addSource(const sp<MediaSource> &source) {
}
if (mSource != NULL) {
- LOGE("AAC files only support a single track of audio.");
+ ALOGE("AAC files only support a single track of audio.");
return UNKNOWN_ERROR;
}
@@ -216,7 +216,7 @@ static bool getSampleRateTableIndex(int sampleRate, uint8_t* tableIndex) {
}
}
- LOGE("Sampling rate %d bps is not supported", sampleRate);
+ ALOGE("Sampling rate %d bps is not supported", sampleRate);
return false;
}
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index ebf5fab4d1ba..ca44ea364024 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -394,7 +394,7 @@ status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
if (portIndex == kPortIndexInput && i == 0) {
// Only log this warning once per allocation round.
- LOGW("OMX.TI.DUCATI1.VIDEO.DECODER requires the use of "
+ ALOGW("OMX.TI.DUCATI1.VIDEO.DECODER requires the use of "
"OMX_AllocateBuffer instead of the preferred "
"OMX_UseBuffer. Vendor must fix this.");
}
@@ -445,7 +445,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
def.format.video.eColorFormat);
if (err != 0) {
- LOGE("native_window_set_buffers_geometry failed: %s (%d)",
+ ALOGE("native_window_set_buffers_geometry failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -454,7 +454,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
OMX_U32 usage = 0;
err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage);
if (err != 0) {
- LOGW("querying usage flags from OMX IL component failed: %d", err);
+ ALOGW("querying usage flags from OMX IL component failed: %d", err);
// XXX: Currently this error is logged, but not fatal.
usage = 0;
}
@@ -464,7 +464,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP);
if (err != 0) {
- LOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err);
+ ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err);
return err;
}
@@ -474,7 +474,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
&minUndequeuedBufs);
if (err != 0) {
- LOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)",
+ ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -489,7 +489,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
if (err != OK) {
- LOGE("[%s] setting nBufferCountActual to %lu failed: %d",
+ ALOGE("[%s] setting nBufferCountActual to %lu failed: %d",
mComponentName.c_str(), newBufferCount, err);
return err;
}
@@ -499,7 +499,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
mNativeWindow.get(), def.nBufferCountActual);
if (err != 0) {
- LOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
+ ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
-err);
return err;
}
@@ -513,7 +513,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
ANativeWindowBuffer *buf;
err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf);
if (err != 0) {
- LOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err);
+ ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err);
break;
}
@@ -528,7 +528,7 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {
err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer,
&bufferId);
if (err != 0) {
- LOGE("registering GraphicBuffer %lu with OMX IL component failed: "
+ ALOGE("registering GraphicBuffer %lu with OMX IL component failed: "
"%d", i, err);
break;
}
@@ -581,7 +581,7 @@ status_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) {
ACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() {
ANativeWindowBuffer *buf;
if (mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf) != 0) {
- LOGE("dequeueBuffer failed.");
+ ALOGE("dequeueBuffer failed.");
return NULL;
}
@@ -734,7 +734,7 @@ void ACodec::setComponentRole(
&roleParams, sizeof(roleParams));
if (err != OK) {
- LOGW("[%s] Failed to set standard component role '%s'.",
+ ALOGW("[%s] Failed to set standard component role '%s'.",
mComponentName.c_str(), role);
}
}
@@ -1367,7 +1367,7 @@ bool ACodec::BaseState::onOMXEvent(
return false;
}
- LOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1);
+ ALOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1);
mCodec->signalError((OMX_ERRORTYPE)data1);
@@ -1826,7 +1826,7 @@ void ACodec::UninitializedState::onSetup(
}
if (node == NULL) {
- LOGE("Unable to instantiate a decoder for type '%s'.", mime.c_str());
+ ALOGE("Unable to instantiate a decoder for type '%s'.", mime.c_str());
mCodec->signalError(OMX_ErrorComponentNotFound);
return;
@@ -1874,7 +1874,7 @@ void ACodec::LoadedToIdleState::stateEntered() {
status_t err;
if ((err = allocateBuffers()) != OK) {
- LOGE("Failed to allocate buffers after transitioning to IDLE state "
+ ALOGE("Failed to allocate buffers after transitioning to IDLE state "
"(error 0x%08x)",
err);
@@ -2198,7 +2198,7 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
status_t err;
if ((err = mCodec->allocateBuffersOnPort(
kPortIndexOutput)) != OK) {
- LOGE("Failed to allocate output port buffers after "
+ ALOGE("Failed to allocate output port buffers after "
"port reconfiguration (error 0x%08x)",
err);
diff --git a/media/libstagefright/AMRExtractor.cpp b/media/libstagefright/AMRExtractor.cpp
index 7eca5e4b9213..5a2834725baf 100644
--- a/media/libstagefright/AMRExtractor.cpp
+++ b/media/libstagefright/AMRExtractor.cpp
@@ -85,7 +85,7 @@ static size_t getFrameSize(bool isWide, unsigned FT) {
};
if (FT > 15 || (isWide && FT > 9 && FT < 14) || (!isWide && FT > 11 && FT < 15)) {
- LOGE("illegal AMR frame type %d", FT);
+ ALOGE("illegal AMR frame type %d", FT);
return 0;
}
@@ -285,7 +285,7 @@ status_t AMRSource::read(
if (header & 0x83) {
// Padding bits must be 0.
- LOGE("padding bits must be 0, header is 0x%02x", header);
+ ALOGE("padding bits must be 0, header is 0x%02x", header);
return ERROR_MALFORMED;
}
diff --git a/media/libstagefright/AVIExtractor.cpp b/media/libstagefright/AVIExtractor.cpp
index 142fa5b58f87..a3187b7e267b 100644
--- a/media/libstagefright/AVIExtractor.cpp
+++ b/media/libstagefright/AVIExtractor.cpp
@@ -625,7 +625,7 @@ status_t AVIExtractor::parseStreamHeader(off64_t offset, size_t size) {
}
if (mime == NULL) {
- LOGW("Unsupported video format '%c%c%c%c'",
+ ALOGW("Unsupported video format '%c%c%c%c'",
(char)(handler >> 24),
(char)((handler >> 16) & 0xff),
(char)((handler >> 8) & 0xff),
@@ -705,7 +705,7 @@ status_t AVIExtractor::parseStreamFormat(off64_t offset, size_t size) {
if (format == 0x55) {
track->mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
} else {
- LOGW("Unsupported audio format = 0x%04x", format);
+ ALOGW("Unsupported audio format = 0x%04x", format);
}
uint32_t numChannels = U16LE_AT(&data[2]);
@@ -1080,7 +1080,7 @@ status_t AVIExtractor::addH264CodecSpecificData(size_t trackIndex) {
sp<MetaData> meta = MakeAVCCodecSpecificData(buffer);
if (meta == NULL) {
- LOGE("Unable to extract AVC codec specific data");
+ ALOGE("Unable to extract AVC codec specific data");
return ERROR_MALFORMED;
}
diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp
index 3fae957408c9..2172cc0d9d41 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -37,7 +37,7 @@ static void AudioRecordCallbackFunction(int event, void *user, void *info) {
break;
}
case AudioRecord::EVENT_OVERRUN: {
- LOGW("AudioRecord reported overrun!");
+ ALOGW("AudioRecord reported overrun!");
break;
}
default:
@@ -259,7 +259,7 @@ status_t AudioSource::dataCallbackTimestamp(
ALOGV("dataCallbackTimestamp: %lld us", timeUs);
Mutex::Autolock autoLock(mLock);
if (!mStarted) {
- LOGW("Spurious callback from AudioRecord. Drop the audio data.");
+ ALOGW("Spurious callback from AudioRecord. Drop the audio data.");
return OK;
}
@@ -301,7 +301,7 @@ status_t AudioSource::dataCallbackTimestamp(
audioBuffer.i16, audioBuffer.size);
} else {
if (audioBuffer.size == 0) {
- LOGW("Nothing is available from AudioRecord callback buffer");
+ ALOGW("Nothing is available from AudioRecord callback buffer");
buffer->release();
return OK;
}
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 6fb16f5f2a0b..7a2d7b30ae91 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -132,7 +132,7 @@ struct AwesomeNativeWindowRenderer : public AwesomeRenderer {
status_t err = mNativeWindow->queueBuffer(
mNativeWindow.get(), buffer->graphicBuffer().get());
if (err != 0) {
- LOGE("queueBuffer failed with error %s (%d)", strerror(-err),
+ ALOGE("queueBuffer failed with error %s (%d)", strerror(-err),
-err);
return;
}
@@ -280,9 +280,9 @@ status_t AwesomePlayer::setDataSource_l(
}
if (!(mFlags & INCOGNITO)) {
- LOGI("setDataSource_l('%s')", mUri.string());
+ ALOGI("setDataSource_l('%s')", mUri.string());
} else {
- LOGI("setDataSource_l(URL suppressed)");
+ ALOGI("setDataSource_l(URL suppressed)");
}
// The actual work will be done during preparation in the call to
@@ -483,7 +483,7 @@ void AwesomePlayer::reset_l() {
if (mFlags & PREPARING) {
modifyFlags(PREPARE_CANCELLED, SET);
if (mConnectingDataSource != NULL) {
- LOGI("interrupting the connection process");
+ ALOGI("interrupting the connection process");
mConnectingDataSource->disconnect();
}
@@ -686,7 +686,7 @@ void AwesomePlayer::onBufferingUpdate() {
if ((mFlags & PLAYING) && !eos
&& (cachedDataRemaining < kLowWaterMarkBytes)) {
- LOGI("cache is running low (< %d) , pausing.",
+ ALOGI("cache is running low (< %d) , pausing.",
kLowWaterMarkBytes);
modifyFlags(CACHE_UNDERRUN, SET);
pause_l();
@@ -695,7 +695,7 @@ void AwesomePlayer::onBufferingUpdate() {
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
} else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
if (mFlags & CACHE_UNDERRUN) {
- LOGI("cache has filled up (> %d), resuming.",
+ ALOGI("cache has filled up (> %d), resuming.",
kHighWaterMarkBytes);
modifyFlags(CACHE_UNDERRUN, CLEAR);
play_l();
@@ -742,7 +742,7 @@ void AwesomePlayer::onBufferingUpdate() {
if ((mFlags & PLAYING) && !eos
&& (cachedDurationUs < kLowWaterMarkUs)) {
- LOGI("cache is running low (%.2f secs) , pausing.",
+ ALOGI("cache is running low (%.2f secs) , pausing.",
cachedDurationUs / 1E6);
modifyFlags(CACHE_UNDERRUN, SET);
pause_l();
@@ -751,7 +751,7 @@ void AwesomePlayer::onBufferingUpdate() {
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
} else if (eos || cachedDurationUs > kHighWaterMarkUs) {
if (mFlags & CACHE_UNDERRUN) {
- LOGI("cache has filled up (%.2f secs), resuming.",
+ ALOGI("cache has filled up (%.2f secs), resuming.",
cachedDurationUs / 1E6);
modifyFlags(CACHE_UNDERRUN, CLEAR);
play_l();
@@ -1192,7 +1192,7 @@ status_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
status_t err = initVideoDecoder();
if (err != OK) {
- LOGE("failed to reinstantiate video decoder after surface change.");
+ ALOGE("failed to reinstantiate video decoder after surface change.");
return err;
}
@@ -1667,7 +1667,7 @@ void AwesomePlayer::onVideoEvent() {
if (mSeeking == SEEK_VIDEO_ONLY) {
if (mSeekTimeUs > timeUs) {
- LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us",
+ ALOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us",
mSeekTimeUs, timeUs);
}
}
@@ -1683,7 +1683,7 @@ void AwesomePlayer::onVideoEvent() {
if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
status_t err = startAudioPlayer_l();
if (err != OK) {
- LOGE("Starting the audio player failed w/ err %d", err);
+ ALOGE("Starting the audio player failed w/ err %d", err);
return;
}
}
@@ -1715,7 +1715,7 @@ void AwesomePlayer::onVideoEvent() {
int64_t latenessUs = nowUs - timeUs;
if (latenessUs > 0) {
- LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6);
+ ALOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6);
}
}
@@ -1730,7 +1730,7 @@ void AwesomePlayer::onVideoEvent() {
&& mAudioPlayer != NULL
&& mAudioPlayer->getMediaTimeMapping(
&realTimeUs, &mediaTimeUs)) {
- LOGI("we're much too late (%.2f secs), video skipping ahead",
+ ALOGI("we're much too late (%.2f secs), video skipping ahead",
latenessUs / 1E6);
mVideoBuffer->release();
@@ -1975,7 +1975,7 @@ status_t AwesomePlayer::finishSetDataSource_l() {
if (err != OK) {
mConnectingDataSource.clear();
- LOGI("mConnectingDataSource->connect() returned %d", err);
+ ALOGI("mConnectingDataSource->connect() returned %d", err);
return err;
}
@@ -2073,7 +2073,7 @@ status_t AwesomePlayer::finishSetDataSource_l() {
}
if (mFlags & PREPARE_CANCELLED) {
- LOGI("Prepare cancelled while waiting for initial cache fill.");
+ ALOGI("Prepare cancelled while waiting for initial cache fill.");
return UNKNOWN_ERROR;
}
}
@@ -2155,7 +2155,7 @@ void AwesomePlayer::onPrepareAsyncEvent() {
Mutex::Autolock autoLock(mLock);
if (mFlags & PREPARE_CANCELLED) {
- LOGI("prepare was cancelled before doing anything");
+ ALOGI("prepare was cancelled before doing anything");
abortPrepare(UNKNOWN_ERROR);
return;
}
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index 080faa646761..1850c9caf260 100755
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -111,7 +111,7 @@ static int32_t getColorFormat(const char* colorFormat) {
return OMX_TI_COLOR_FormatYUV420PackedSemiPlanar;
}
- LOGE("Uknown color format (%s), please add it to "
+ ALOGE("Uknown color format (%s), please add it to "
"CameraSource::getColorFormat", colorFormat);
CHECK_EQ(0, "Unknown color format");
@@ -301,7 +301,7 @@ status_t CameraSource::configureCamera(
bool isCameraParamChanged = false;
if (width != -1 && height != -1) {
if (!isVideoSizeSupported(width, height, sizes)) {
- LOGE("Video dimension (%dx%d) is unsupported", width, height);
+ ALOGE("Video dimension (%dx%d) is unsupported", width, height);
return BAD_VALUE;
}
if (isSetVideoSizeSupportedByCamera) {
@@ -314,7 +314,7 @@ status_t CameraSource::configureCamera(
(width != -1 && height == -1)) {
// If one and only one of the width and height is -1
// we reject such a request.
- LOGE("Requested video size (%dx%d) is not supported", width, height);
+ ALOGE("Requested video size (%dx%d) is not supported", width, height);
return BAD_VALUE;
} else { // width == -1 && height == -1
// Do not configure the camera.
@@ -330,7 +330,7 @@ status_t CameraSource::configureCamera(
char buf[4];
snprintf(buf, 4, "%d", frameRate);
if (strstr(supportedFrameRates, buf) == NULL) {
- LOGE("Requested frame rate (%d) is not supported: %s",
+ ALOGE("Requested frame rate (%d) is not supported: %s",
frameRate, supportedFrameRates);
return BAD_VALUE;
}
@@ -347,7 +347,7 @@ status_t CameraSource::configureCamera(
// Either frame rate or frame size needs to be changed.
String8 s = params->flatten();
if (OK != mCamera->setParameters(s)) {
- LOGE("Could not change settings."
+ ALOGE("Could not change settings."
" Someone else is using camera %p?", mCamera.get());
return -EBUSY;
}
@@ -387,7 +387,7 @@ status_t CameraSource::checkVideoSize(
params.getVideoSize(&frameWidthActual, &frameHeightActual);
}
if (frameWidthActual < 0 || frameHeightActual < 0) {
- LOGE("Failed to retrieve video frame size (%dx%d)",
+ ALOGE("Failed to retrieve video frame size (%dx%d)",
frameWidthActual, frameHeightActual);
return UNKNOWN_ERROR;
}
@@ -396,7 +396,7 @@ status_t CameraSource::checkVideoSize(
// video frame size.
if (width != -1 && height != -1) {
if (frameWidthActual != width || frameHeightActual != height) {
- LOGE("Failed to set video frame size to %dx%d. "
+ ALOGE("Failed to set video frame size to %dx%d. "
"The actual video size is %dx%d ", width, height,
frameWidthActual, frameHeightActual);
return UNKNOWN_ERROR;
@@ -425,14 +425,14 @@ status_t CameraSource::checkFrameRate(
ALOGV("checkFrameRate");
int32_t frameRateActual = params.getPreviewFrameRate();
if (frameRateActual < 0) {
- LOGE("Failed to retrieve preview frame rate (%d)", frameRateActual);
+ ALOGE("Failed to retrieve preview frame rate (%d)", frameRateActual);
return UNKNOWN_ERROR;
}
// Check the actual video frame rate against the target/requested
// video frame rate.
if (frameRate != -1 && (frameRateActual - frameRate) != 0) {
- LOGE("Failed to set preview frame rate to %d fps. The actual "
+ ALOGE("Failed to set preview frame rate to %d fps. The actual "
"frame rate is %d", frameRate, frameRateActual);
return UNKNOWN_ERROR;
}
@@ -489,7 +489,7 @@ status_t CameraSource::initWithCameraAccess(
status_t err = OK;
if ((err = isCameraAvailable(camera, proxy, cameraId)) != OK) {
- LOGE("Camera connection could not be established.");
+ ALOGE("Camera connection could not be established.");
return err;
}
CameraParameters params(mCamera->getParameters());
@@ -579,7 +579,7 @@ status_t CameraSource::start(MetaData *meta) {
ALOGV("start");
CHECK(!mStarted);
if (mInitCheck != OK) {
- LOGE("CameraSource is not initialized yet");
+ ALOGE("CameraSource is not initialized yet");
return mInitCheck;
}
@@ -649,7 +649,7 @@ status_t CameraSource::stop() {
if (NO_ERROR !=
mFrameCompleteCondition.waitRelative(mLock,
mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) {
- LOGW("Timed out waiting for outstanding frames being encoded: %d",
+ ALOGW("Timed out waiting for outstanding frames being encoded: %d",
mFramesBeingEncoded.size());
}
}
@@ -660,13 +660,13 @@ status_t CameraSource::stop() {
}
if (mCollectStats) {
- LOGI("Frames received/encoded/dropped: %d/%d/%d in %lld us",
+ ALOGI("Frames received/encoded/dropped: %d/%d/%d in %lld us",
mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped,
mLastFrameTimestampUs - mFirstFrameTimeUs);
}
if (mNumGlitches > 0) {
- LOGW("%d long delays between neighboring video frames", mNumGlitches);
+ ALOGW("%d long delays between neighboring video frames", mNumGlitches);
}
CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped);
@@ -744,10 +744,10 @@ status_t CameraSource::read(
mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) {
if (mCameraRecordingProxy != 0 &&
!mCameraRecordingProxy->asBinder()->isBinderAlive()) {
- LOGW("camera recording proxy is gone");
+ ALOGW("camera recording proxy is gone");
return ERROR_END_OF_STREAM;
}
- LOGW("Timed out waiting for incoming camera video frames: %lld us",
+ ALOGW("Timed out waiting for incoming camera video frames: %lld us",
mLastFrameTimestampUs);
}
}
@@ -832,7 +832,7 @@ void CameraSource::ProxyListener::dataCallbackTimestamp(
}
void CameraSource::DeathNotifier::binderDied(const wp<IBinder>& who) {
- LOGI("Camera recording proxy died");
+ ALOGI("Camera recording proxy died");
}
} // namespace android
diff --git a/media/libstagefright/CameraSourceTimeLapse.cpp b/media/libstagefright/CameraSourceTimeLapse.cpp
index 22c3182b8540..263ab5059896 100644
--- a/media/libstagefright/CameraSourceTimeLapse.cpp
+++ b/media/libstagefright/CameraSourceTimeLapse.cpp
@@ -140,7 +140,7 @@ bool CameraSourceTimeLapse::trySettingVideoSize(
if (mCamera->setParameters(params.flatten()) == OK) {
isSuccessful = true;
} else {
- LOGE("Failed to set preview size to %dx%d", width, height);
+ ALOGE("Failed to set preview size to %dx%d", width, height);
isSuccessful = false;
}
}
@@ -260,7 +260,7 @@ bool CameraSourceTimeLapse::skipFrameAndModifyTimeStamp(int64_t *timestampUs) {
// Really make sure that this video recording frame will not be dropped.
if (*timestampUs < mStartTimeUs) {
- LOGI("set timestampUs to start time stamp %lld us", mStartTimeUs);
+ ALOGI("set timestampUs to start time stamp %lld us", mStartTimeUs);
*timestampUs = mStartTimeUs;
}
return false;
diff --git a/media/libstagefright/DRMExtractor.cpp b/media/libstagefright/DRMExtractor.cpp
index 1f3d58181471..9452ab17180a 100644
--- a/media/libstagefright/DRMExtractor.cpp
+++ b/media/libstagefright/DRMExtractor.cpp
@@ -286,7 +286,7 @@ bool SniffDRM(
*mimeType = String8("drm+es_based+") + decryptHandle->mimeType;
} else if (decryptHandle->decryptApiType == DecryptApiType::WV_BASED) {
*mimeType = MEDIA_MIMETYPE_CONTAINER_WVM;
- LOGW("SniffWVM: found match\n");
+ ALOGW("SniffWVM: found match\n");
}
*confidence = 10.0f;
diff --git a/media/libstagefright/ESDS.cpp b/media/libstagefright/ESDS.cpp
index 1b225fa56fc5..4a0c35c67841 100644
--- a/media/libstagefright/ESDS.cpp
+++ b/media/libstagefright/ESDS.cpp
@@ -162,7 +162,7 @@ status_t ESDS::parseESDescriptor(size_t offset, size_t size) {
offset -= 2;
size += 2;
- LOGW("Found malformed 'esds' atom, ignoring missing OCR_ES_Id.");
+ ALOGW("Found malformed 'esds' atom, ignoring missing OCR_ES_Id.");
}
}
diff --git a/media/libstagefright/FLACExtractor.cpp b/media/libstagefright/FLACExtractor.cpp
index a0c08e295598..668d7f7d9efe 100644
--- a/media/libstagefright/FLACExtractor.cpp
+++ b/media/libstagefright/FLACExtractor.cpp
@@ -327,7 +327,7 @@ FLAC__StreamDecoderWriteStatus FLACParser::writeCallback(
mWriteCompleted = true;
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
} else {
- LOGE("FLACParser::writeCallback unexpected");
+ ALOGE("FLACParser::writeCallback unexpected");
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
}
}
@@ -340,7 +340,7 @@ void FLACParser::metadataCallback(const FLAC__StreamMetadata *metadata)
mStreamInfo = metadata->data.stream_info;
mStreamInfoValid = true;
} else {
- LOGE("FLACParser::metadataCallback unexpected STREAMINFO");
+ ALOGE("FLACParser::metadataCallback unexpected STREAMINFO");
}
break;
case FLAC__METADATA_TYPE_VORBIS_COMMENT:
@@ -366,14 +366,14 @@ void FLACParser::metadataCallback(const FLAC__StreamMetadata *metadata)
}
break;
default:
- LOGW("FLACParser::metadataCallback unexpected type %u", metadata->type);
+ ALOGW("FLACParser::metadataCallback unexpected type %u", metadata->type);
break;
}
}
void FLACParser::errorCallback(FLAC__StreamDecoderErrorStatus status)
{
- LOGE("FLACParser::errorCallback status=%d", status);
+ ALOGE("FLACParser::errorCallback status=%d", status);
mErrorStatus = status;
}
@@ -477,7 +477,7 @@ status_t FLACParser::init()
// The new should succeed, since probably all it does is a malloc
// that always succeeds in Android. But to avoid dependence on the
// libFLAC internals, we check and log here.
- LOGE("new failed");
+ ALOGE("new failed");
return NO_INIT;
}
FLAC__stream_decoder_set_md5_checking(mDecoder, false);
@@ -497,12 +497,12 @@ status_t FLACParser::init()
if (initStatus != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
// A failure here probably indicates a programming error and so is
// unlikely to happen. But we check and log here similarly to above.
- LOGE("init_stream failed %d", initStatus);
+ ALOGE("init_stream failed %d", initStatus);
return NO_INIT;
}
// parse all metadata
if (!FLAC__stream_decoder_process_until_end_of_metadata(mDecoder)) {
- LOGE("end_of_metadata failed");
+ ALOGE("end_of_metadata failed");
return NO_INIT;
}
if (mStreamInfoValid) {
@@ -512,7 +512,7 @@ status_t FLACParser::init()
case 2:
break;
default:
- LOGE("unsupported channel count %u", getChannels());
+ ALOGE("unsupported channel count %u", getChannels());
return NO_INIT;
}
// check bit depth
@@ -522,7 +522,7 @@ status_t FLACParser::init()
case 24:
break;
default:
- LOGE("unsupported bits per sample %u", getBitsPerSample());
+ ALOGE("unsupported bits per sample %u", getBitsPerSample());
return NO_INIT;
}
// check sample rate
@@ -539,7 +539,7 @@ status_t FLACParser::init()
break;
default:
// 96000 would require a proper downsampler in AudioFlinger
- LOGE("unsupported sample rate %u", getSampleRate());
+ ALOGE("unsupported sample rate %u", getSampleRate());
return NO_INIT;
}
// configure the appropriate copy function, defaulting to trespass
@@ -572,7 +572,7 @@ status_t FLACParser::init()
(getTotalSamples() * 1000000LL) / getSampleRate());
}
} else {
- LOGE("missing STREAMINFO");
+ ALOGE("missing STREAMINFO");
return NO_INIT;
}
if (mFileMetadata != 0) {
@@ -603,13 +603,13 @@ MediaBuffer *FLACParser::readBuffer(bool doSeek, FLAC__uint64 sample)
if (doSeek) {
// We implement the seek callback, so this works without explicit flush
if (!FLAC__stream_decoder_seek_absolute(mDecoder, sample)) {
- LOGE("FLACParser::readBuffer seek to sample %llu failed", sample);
+ ALOGE("FLACParser::readBuffer seek to sample %llu failed", sample);
return NULL;
}
ALOGV("FLACParser::readBuffer seek to sample %llu succeeded", sample);
} else {
if (!FLAC__stream_decoder_process_single(mDecoder)) {
- LOGE("FLACParser::readBuffer process_single failed");
+ ALOGE("FLACParser::readBuffer process_single failed");
return NULL;
}
}
@@ -620,13 +620,13 @@ MediaBuffer *FLACParser::readBuffer(bool doSeek, FLAC__uint64 sample)
// verify that block header keeps the promises made by STREAMINFO
unsigned blocksize = mWriteHeader.blocksize;
if (blocksize == 0 || blocksize > getMaxBlockSize()) {
- LOGE("FLACParser::readBuffer write invalid blocksize %u", blocksize);
+ ALOGE("FLACParser::readBuffer write invalid blocksize %u", blocksize);
return NULL;
}
if (mWriteHeader.sample_rate != getSampleRate() ||
mWriteHeader.channels != getChannels() ||
mWriteHeader.bits_per_sample != getBitsPerSample()) {
- LOGE("FLACParser::readBuffer write changed parameters mid-stream");
+ ALOGE("FLACParser::readBuffer write changed parameters mid-stream");
}
// acquire a media buffer
CHECK(mGroup != NULL);
diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp
index 0794f5770df4..73cb48c74248 100644
--- a/media/libstagefright/FileSource.cpp
+++ b/media/libstagefright/FileSource.cpp
@@ -101,7 +101,7 @@ ssize_t FileSource::readAt(off64_t offset, void *data, size_t size) {
} else {
off64_t result = lseek64(mFd, offset + mOffset, SEEK_SET);
if (result == -1) {
- LOGE("seek to %lld failed", offset + mOffset);
+ ALOGE("seek to %lld failed", offset + mOffset);
return UNKNOWN_ERROR;
}
diff --git a/media/libstagefright/HTTPBase.cpp b/media/libstagefright/HTTPBase.cpp
index 3c5a8a52b82b..d7eea3f0f418 100644
--- a/media/libstagefright/HTTPBase.cpp
+++ b/media/libstagefright/HTTPBase.cpp
@@ -111,11 +111,11 @@ status_t HTTPBase::setBandwidthStatCollectFreq(int32_t freqMs) {
if (freqMs < kMinBandwidthCollectFreqMs
|| freqMs > kMaxBandwidthCollectFreqMs) {
- LOGE("frequency (%d ms) is out of range [1000, 60000]", freqMs);
+ ALOGE("frequency (%d ms) is out of range [1000, 60000]", freqMs);
return BAD_VALUE;
}
- LOGI("frequency set to %d ms", freqMs);
+ ALOGI("frequency set to %d ms", freqMs);
mBandWidthCollectFreqMs = freqMs;
return OK;
}
@@ -139,7 +139,7 @@ bool HTTPBase::getUID(uid_t *uid) const {
void HTTPBase::RegisterSocketUserTag(int sockfd, uid_t uid, uint32_t kTag) {
int res = qtaguid_tagSocket(sockfd, kTag, uid);
if (res != 0) {
- LOGE("Failed tagging socket %d for uid %d (My UID=%d)", sockfd, uid, geteuid());
+ ALOGE("Failed tagging socket %d for uid %d (My UID=%d)", sockfd, uid, geteuid());
}
}
@@ -147,7 +147,7 @@ void HTTPBase::RegisterSocketUserTag(int sockfd, uid_t uid, uint32_t kTag) {
void HTTPBase::UnRegisterSocketUserTag(int sockfd) {
int res = qtaguid_untagSocket(sockfd);
if (res != 0) {
- LOGE("Failed untagging socket %d (My UID=%d)", sockfd, geteuid());
+ ALOGE("Failed untagging socket %d (My UID=%d)", sockfd, geteuid());
}
}
diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp
index ab1dc5c99d05..2215c07558fc 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -431,7 +431,7 @@ status_t MP3Source::read(
int32_t bitrate;
if (!mMeta->findInt32(kKeyBitRate, &bitrate)) {
// bitrate is in bits/sec.
- LOGI("no bitrate");
+ ALOGI("no bitrate");
return ERROR_UNSUPPORTED;
}
@@ -487,7 +487,7 @@ status_t MP3Source::read(
off64_t pos = mCurrentPos;
if (!Resync(mDataSource, mFixedHeader, &pos, NULL, NULL)) {
- LOGE("Unable to resync. Signalling end of stream.");
+ ALOGE("Unable to resync. Signalling end of stream.");
buffer->release();
buffer = NULL;
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 0a69df4ff833..bc8801514346 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -1250,7 +1250,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
char buffer[23];
if (chunk_data_size != 7 &&
chunk_data_size != 23) {
- LOGE("Incorrect D263 box size %lld", chunk_data_size);
+ ALOGE("Incorrect D263 box size %lld", chunk_data_size);
return ERROR_MALFORMED;
}
@@ -1500,9 +1500,9 @@ status_t MPEG4Extractor::parseTrackHeader(
int32_t dy = U32_AT(&buffer[matrixOffset + 20]);
#if 0
- LOGI("x' = %.2f * x + %.2f * y + %.2f",
+ ALOGI("x' = %.2f * x + %.2f * y + %.2f",
a00 / 65536.0f, a01 / 65536.0f, dx / 65536.0f);
- LOGI("y' = %.2f * x + %.2f * y + %.2f",
+ ALOGI("y' = %.2f * x + %.2f * y + %.2f",
a10 / 65536.0f, a11 / 65536.0f, dy / 65536.0f);
#endif
@@ -1519,7 +1519,7 @@ status_t MPEG4Extractor::parseTrackHeader(
} else if (a00 == -kFixedOne && a01 == 0 && a10 == 0 && a11 == -kFixedOne) {
rotationDegrees = 180;
} else {
- LOGW("We only support 0,90,180,270 degree rotation matrices");
+ ALOGW("We only support 0,90,180,270 degree rotation matrices");
rotationDegrees = 0;
}
@@ -1751,7 +1751,7 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(
// The media subtype is MP3 audio
// Our software MP3 audio decoder may not be able to handle
// packetized MP3 audio; for now, lets just return ERROR_UNSUPPORTED
- LOGE("MP3 track in MP4/3GPP file is not supported");
+ ALOGE("MP3 track in MP4/3GPP file is not supported");
return ERROR_UNSUPPORTED;
}
@@ -2036,7 +2036,7 @@ status_t MPEG4Source::read(
CHECK_EQ(OK, mSampleTable->getMetaDataForSample(
syncSampleIndex, NULL, NULL, &syncSampleTime));
- LOGI("seek to time %lld us => sample at time %lld us, "
+ ALOGI("seek to time %lld us => sample at time %lld us, "
"sync sample at time %lld us",
seekTimeUs,
sampleTime * 1000000ll / mTimescale,
@@ -2123,7 +2123,7 @@ status_t MPEG4Source::read(
size_t nal_size = parseNALSize(src);
if (mBuffer->range_length() < mNALLengthSize + nal_size) {
- LOGE("incomplete NAL unit.");
+ ALOGE("incomplete NAL unit.");
mBuffer->release();
mBuffer = NULL;
@@ -2187,7 +2187,7 @@ status_t MPEG4Source::read(
}
if (isMalFormed) {
- LOGE("Video is malformed");
+ ALOGE("Video is malformed");
mBuffer->release();
mBuffer = NULL;
return ERROR_MALFORMED;
@@ -2422,7 +2422,7 @@ bool SniffMPEG4(
}
if (LegacySniffMPEG4(source, mimeType, confidence)) {
- LOGW("Identified supported mpeg4 through LegacySniffMPEG4.");
+ ALOGW("Identified supported mpeg4 through LegacySniffMPEG4.");
return true;
}
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index a368e0a2dd72..06dd875289b7 100755
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -327,7 +327,7 @@ status_t MPEG4Writer::Track::dump(
status_t MPEG4Writer::addSource(const sp<MediaSource> &source) {
Mutex::Autolock l(mLock);
if (mStarted) {
- LOGE("Attempt to add source AFTER recording is started");
+ ALOGE("Attempt to add source AFTER recording is started");
return UNKNOWN_ERROR;
}
Track *track = new Track(this, source, mTracks.size());
@@ -406,7 +406,7 @@ int64_t MPEG4Writer::estimateMoovBoxSize(int32_t bitRate) {
size = MAX_MOOV_BOX_SIZE;
}
- LOGI("limits: %lld/%lld bytes/us, bit rate: %d bps and the estimated"
+ ALOGI("limits: %lld/%lld bytes/us, bit rate: %d bps and the estimated"
" moov size %lld bytes",
mMaxFileSizeLimitBytes, mMaxFileDurationLimitUs, bitRate, size);
return factor * size;
@@ -443,7 +443,7 @@ status_t MPEG4Writer::start(MetaData *param) {
// If file size is set to be larger than the 32 bit file
// size limit, treat it as an error.
if (mMaxFileSizeLimitBytes > kMax32BitFileSize) {
- LOGW("32-bit file size limit (%lld bytes) too big. "
+ ALOGW("32-bit file size limit (%lld bytes) too big. "
"It is changed to %lld bytes",
mMaxFileSizeLimitBytes, kMax32BitFileSize);
mMaxFileSizeLimitBytes = kMax32BitFileSize;
@@ -701,7 +701,7 @@ status_t MPEG4Writer::stop() {
mMoovBoxBuffer = NULL;
mMoovBoxBufferOffset = 0;
} else {
- LOGI("The mp4 file will not be streamable.");
+ ALOGI("The mp4 file will not be streamable.");
}
CHECK(mBoxes.empty());
@@ -1084,12 +1084,12 @@ bool MPEG4Writer::reachedEOS() {
}
void MPEG4Writer::setStartTimestampUs(int64_t timeUs) {
- LOGI("setStartTimestampUs: %lld", timeUs);
+ ALOGI("setStartTimestampUs: %lld", timeUs);
CHECK(timeUs >= 0);
Mutex::Autolock autoLock(mLock);
if (mStartTimestampUs < 0 || mStartTimestampUs > timeUs) {
mStartTimestampUs = timeUs;
- LOGI("Earliest track starting time: %lld", mStartTimestampUs);
+ ALOGI("Earliest track starting time: %lld", mStartTimestampUs);
}
}
@@ -1173,7 +1173,7 @@ void MPEG4Writer::Track::addOneSttsTableEntry(
size_t sampleCount, int32_t duration) {
if (duration == 0) {
- LOGW("0-duration samples found: %d", sampleCount);
+ ALOGW("0-duration samples found: %d", sampleCount);
}
SttsTableEntry sttsEntry(sampleCount, duration);
mSttsTableEntries.push_back(sttsEntry);
@@ -1481,7 +1481,7 @@ status_t MPEG4Writer::Track::start(MetaData *params) {
startTimeOffsetUs = kInitialDelayTimeUs;
}
startTimeUs += startTimeOffsetUs;
- LOGI("Start time offset: %lld us", startTimeOffsetUs);
+ ALOGI("Start time offset: %lld us", startTimeOffsetUs);
}
meta->setInt64(kKeyTime, startTimeUs);
@@ -1525,7 +1525,7 @@ status_t MPEG4Writer::Track::pause() {
status_t MPEG4Writer::Track::stop() {
ALOGD("Stopping %s track", mIsAudio? "Audio": "Video");
if (!mStarted) {
- LOGE("Stop() called but track is not started");
+ ALOGE("Stop() called but track is not started");
return ERROR_END_OF_STREAM;
}
@@ -1596,14 +1596,14 @@ const uint8_t *MPEG4Writer::Track::parseParamSet(
const uint8_t *nextStartCode = findNextStartCode(data, length);
*paramSetLen = nextStartCode - data;
if (*paramSetLen == 0) {
- LOGE("Param set is malformed, since its length is 0");
+ ALOGE("Param set is malformed, since its length is 0");
return NULL;
}
AVCParamSet paramSet(*paramSetLen, data);
if (type == kNalUnitTypeSeqParamSet) {
if (*paramSetLen < 4) {
- LOGE("Seq parameter set malformed");
+ ALOGE("Seq parameter set malformed");
return NULL;
}
if (mSeqParamSets.empty()) {
@@ -1614,7 +1614,7 @@ const uint8_t *MPEG4Writer::Track::parseParamSet(
if (mProfileIdc != data[1] ||
mProfileCompatible != data[2] ||
mLevelIdc != data[3]) {
- LOGE("Inconsistent profile/level found in seq parameter sets");
+ ALOGE("Inconsistent profile/level found in seq parameter sets");
return NULL;
}
}
@@ -1632,7 +1632,7 @@ status_t MPEG4Writer::Track::copyAVCCodecSpecificData(
// 2 bytes for each of the parameter set length field
// plus the 7 bytes for the header
if (size < 4 + 7) {
- LOGE("Codec specific data length too short: %d", size);
+ ALOGE("Codec specific data length too short: %d", size);
return ERROR_MALFORMED;
}
@@ -1661,7 +1661,7 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData(
getNalUnitType(*(tmp + 4), &type);
if (type == kNalUnitTypeSeqParamSet) {
if (gotPps) {
- LOGE("SPS must come before PPS");
+ ALOGE("SPS must come before PPS");
return ERROR_MALFORMED;
}
if (!gotSps) {
@@ -1670,7 +1670,7 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData(
nextStartCode = parseParamSet(tmp + 4, bytesLeft - 4, type, &paramSetLen);
} else if (type == kNalUnitTypePicParamSet) {
if (!gotSps) {
- LOGE("SPS must come before PPS");
+ ALOGE("SPS must come before PPS");
return ERROR_MALFORMED;
}
if (!gotPps) {
@@ -1678,7 +1678,7 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData(
}
nextStartCode = parseParamSet(tmp + 4, bytesLeft - 4, type, &paramSetLen);
} else {
- LOGE("Only SPS and PPS Nal units are expected");
+ ALOGE("Only SPS and PPS Nal units are expected");
return ERROR_MALFORMED;
}
@@ -1696,12 +1696,12 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData(
// Check on the number of seq parameter sets
size_t nSeqParamSets = mSeqParamSets.size();
if (nSeqParamSets == 0) {
- LOGE("Cound not find sequence parameter set");
+ ALOGE("Cound not find sequence parameter set");
return ERROR_MALFORMED;
}
if (nSeqParamSets > 0x1F) {
- LOGE("Too many seq parameter sets (%d) found", nSeqParamSets);
+ ALOGE("Too many seq parameter sets (%d) found", nSeqParamSets);
return ERROR_MALFORMED;
}
}
@@ -1710,11 +1710,11 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData(
// Check on the number of pic parameter sets
size_t nPicParamSets = mPicParamSets.size();
if (nPicParamSets == 0) {
- LOGE("Cound not find picture parameter set");
+ ALOGE("Cound not find picture parameter set");
return ERROR_MALFORMED;
}
if (nPicParamSets > 0xFF) {
- LOGE("Too many pic parameter sets (%d) found", nPicParamSets);
+ ALOGE("Too many pic parameter sets (%d) found", nPicParamSets);
return ERROR_MALFORMED;
}
}
@@ -1727,7 +1727,7 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData(
// These profiles requires additional parameter set extensions
if (mProfileIdc == 100 || mProfileIdc == 110 ||
mProfileIdc == 122 || mProfileIdc == 144) {
- LOGE("Sorry, no support for profile_idc: %d!", mProfileIdc);
+ ALOGE("Sorry, no support for profile_idc: %d!", mProfileIdc);
return BAD_VALUE;
}
}
@@ -1739,12 +1739,12 @@ status_t MPEG4Writer::Track::makeAVCCodecSpecificData(
const uint8_t *data, size_t size) {
if (mCodecSpecificData != NULL) {
- LOGE("Already have codec specific data");
+ ALOGE("Already have codec specific data");
return ERROR_MALFORMED;
}
if (size < 4) {
- LOGE("Codec specific data length too short: %d", size);
+ ALOGE("Codec specific data length too short: %d", size);
return ERROR_MALFORMED;
}
@@ -2146,10 +2146,10 @@ status_t MPEG4Writer::Track::threadEntry() {
sendTrackSummary(hasMultipleTracks);
- LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s",
+ ALOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s",
count, nZeroLengthFrames, mNumSamples, mIsAudio? "audio": "video");
if (mIsAudio) {
- LOGI("Audio track drift time: %lld us", mOwner->getDriftTimeUs());
+ ALOGI("Audio track drift time: %lld us", mOwner->getDriftTimeUs());
}
if (err == ERROR_END_OF_STREAM) {
@@ -2160,12 +2160,12 @@ status_t MPEG4Writer::Track::threadEntry() {
bool MPEG4Writer::Track::isTrackMalFormed() const {
if (mSampleSizes.empty()) { // no samples written
- LOGE("The number of recorded samples is 0");
+ ALOGE("The number of recorded samples is 0");
return true;
}
if (!mIsAudio && mNumStssTableEntries == 0) { // no sync frames for video
- LOGE("There are no sync frames for video track");
+ ALOGE("There are no sync frames for video track");
return true;
}
@@ -2308,13 +2308,13 @@ status_t MPEG4Writer::Track::checkCodecSpecificData() const {
!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) {
if (!mCodecSpecificData ||
mCodecSpecificDataSize <= 0) {
- LOGE("Missing codec specific data");
+ ALOGE("Missing codec specific data");
return ERROR_MALFORMED;
}
} else {
if (mCodecSpecificData ||
mCodecSpecificDataSize > 0) {
- LOGE("Unexepected codec specific data found");
+ ALOGE("Unexepected codec specific data found");
return ERROR_MALFORMED;
}
}
@@ -2378,7 +2378,7 @@ void MPEG4Writer::Track::writeVideoFourCCBox() {
} else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) {
mOwner->beginBox("avc1");
} else {
- LOGE("Unknown mime type '%s'.", mime);
+ ALOGE("Unknown mime type '%s'.", mime);
CHECK(!"should not be here, unknown mime type.");
}
@@ -2432,7 +2432,7 @@ void MPEG4Writer::Track::writeAudioFourCCBox() {
} else if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mime)) {
fourcc = "mp4a";
} else {
- LOGE("Unknown mime type '%s'.", mime);
+ ALOGE("Unknown mime type '%s'.", mime);
CHECK(!"should not be here, unknown mime type.");
}
diff --git a/media/libstagefright/MediaBuffer.cpp b/media/libstagefright/MediaBuffer.cpp
index 0b14f1ecfbf6..96271e41788e 100644
--- a/media/libstagefright/MediaBuffer.cpp
+++ b/media/libstagefright/MediaBuffer.cpp
@@ -135,7 +135,7 @@ size_t MediaBuffer::range_length() const {
void MediaBuffer::set_range(size_t offset, size_t length) {
if ((mGraphicBuffer == NULL) && (offset + length > mSize)) {
- LOGE("offset = %d, length = %d, mSize = %d", offset, length, mSize);
+ ALOGE("offset = %d, length = %d, mSize = %d", offset, length, mSize);
}
CHECK((mGraphicBuffer != NULL) || (offset + length <= mSize));
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp
index 20d0632d33d7..249c29854a03 100644
--- a/media/libstagefright/NuCachedSource2.cpp
+++ b/media/libstagefright/NuCachedSource2.cpp
@@ -302,7 +302,7 @@ void NuCachedSource2::fetchInternal() {
mNumRetriesLeft = 0;
return;
} else if (err != OK) {
- LOGI("The attempt to reconnect failed, %d retries remaining",
+ ALOGI("The attempt to reconnect failed, %d retries remaining",
mNumRetriesLeft);
return;
@@ -317,11 +317,11 @@ void NuCachedSource2::fetchInternal() {
Mutex::Autolock autoLock(mLock);
if (n < 0) {
- LOGE("source returned error %ld, %d retries left", n, mNumRetriesLeft);
+ ALOGE("source returned error %ld, %d retries left", n, mNumRetriesLeft);
mFinalStatus = n;
mCache->releasePage(page);
} else if (n == 0) {
- LOGI("ERROR_END_OF_STREAM");
+ ALOGI("ERROR_END_OF_STREAM");
mNumRetriesLeft = 0;
mFinalStatus = ERROR_END_OF_STREAM;
@@ -329,7 +329,7 @@ void NuCachedSource2::fetchInternal() {
mCache->releasePage(page);
} else {
if (mFinalStatus != OK) {
- LOGI("retrying a previously failed read succeeded.");
+ ALOGI("retrying a previously failed read succeeded.");
}
mNumRetriesLeft = kMaxNumRetries;
mFinalStatus = OK;
@@ -355,7 +355,7 @@ void NuCachedSource2::onFetch() {
if (mFetching || keepAlive) {
if (keepAlive) {
- LOGI("Keep alive");
+ ALOGI("Keep alive");
}
fetchInternal();
@@ -363,7 +363,7 @@ void NuCachedSource2::onFetch() {
mLastFetchTimeUs = ALooper::GetNowUs();
if (mFetching && mCache->totalSize() >= mHighwaterThresholdBytes) {
- LOGI("Cache full, done prefetching for now");
+ ALOGI("Cache full, done prefetching for now");
mFetching = false;
if (mDisconnectAtHighwatermark
@@ -448,7 +448,7 @@ void NuCachedSource2::restartPrefetcherIfNecessary_l(
size_t actualBytes = mCache->releaseFromStart(maxBytes);
mCacheOffset += actualBytes;
- LOGI("restarting prefetcher, totalSize = %d", mCache->totalSize());
+ ALOGI("restarting prefetcher, totalSize = %d", mCache->totalSize());
mFetching = true;
}
@@ -584,7 +584,7 @@ status_t NuCachedSource2::seekInternal_l(off64_t offset) {
return OK;
}
- LOGI("new range: offset= %lld", offset);
+ ALOGI("new range: offset= %lld", offset);
mCacheOffset = offset;
@@ -634,7 +634,7 @@ void NuCachedSource2::updateCacheParamsFromString(const char *s) {
if (sscanf(s, "%ld/%ld/%d",
&lowwaterMarkKb, &highwaterMarkKb, &keepAliveSecs) != 3) {
- LOGE("Failed to parse cache parameters from '%s'.", s);
+ ALOGE("Failed to parse cache parameters from '%s'.", s);
return;
}
@@ -651,7 +651,7 @@ void NuCachedSource2::updateCacheParamsFromString(const char *s) {
}
if (mLowwaterThresholdBytes >= mHighwaterThresholdBytes) {
- LOGE("Illegal low/highwater marks specified, reverting to defaults.");
+ ALOGE("Illegal low/highwater marks specified, reverting to defaults.");
mLowwaterThresholdBytes = kDefaultLowWaterThreshold;
mHighwaterThresholdBytes = kDefaultHighWaterThreshold;
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index f9f92d262492..60d9bb727800 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -179,9 +179,9 @@ static const CodecInfo kEncoderInfo[] = {
#undef OPTIONAL
-#define CODEC_LOGI(x, ...) LOGI("[%s] "x, mComponentName, ##__VA_ARGS__)
+#define CODEC_LOGI(x, ...) ALOGI("[%s] "x, mComponentName, ##__VA_ARGS__)
#define CODEC_LOGV(x, ...) ALOGV("[%s] "x, mComponentName, ##__VA_ARGS__)
-#define CODEC_LOGE(x, ...) LOGE("[%s] "x, mComponentName, ##__VA_ARGS__)
+#define CODEC_LOGE(x, ...) ALOGE("[%s] "x, mComponentName, ##__VA_ARGS__)
struct OMXCodecObserver : public BnOMXObserver {
OMXCodecObserver() {
@@ -484,7 +484,7 @@ sp<MediaSource> OMXCodec::Create(
// For OMX.SEC.* decoders we can enable a special mode that
// gives the client access to the framebuffer contents.
- LOGW("Component '%s' does not give the client access to "
+ ALOGW("Component '%s' does not give the client access to "
"the framebuffer contents. Skipping.",
componentName);
@@ -625,7 +625,7 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) {
status_t err;
if ((err = parseAVCCodecSpecificData(
data, size, &profile, &level)) != OK) {
- LOGE("Malformed AVC codec specific data.");
+ ALOGE("Malformed AVC codec specific data.");
return err;
}
@@ -639,7 +639,7 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) {
// does not handle this gracefully and would clobber the heap
// and wreak havoc instead...
- LOGE("Profile and/or level exceed the decoder's capabilities.");
+ ALOGE("Profile and/or level exceed the decoder's capabilities.");
return ERROR_UNSUPPORTED;
}
} else if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) {
@@ -981,7 +981,7 @@ void OMXCodec::setVideoInputFormat(
} else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) {
compressionFormat = OMX_VIDEO_CodingH263;
} else {
- LOGE("Not a supported video mime type: %s", mime);
+ ALOGE("Not a supported video mime type: %s", mime);
CHECK(!"Should not be here. Not a supported video mime type.");
}
@@ -1093,7 +1093,7 @@ status_t OMXCodec::setupErrorCorrectionParameters() {
mNode, OMX_IndexParamVideoErrorCorrection,
&errorCorrectionType, sizeof(errorCorrectionType));
if (err != OK) {
- LOGW("Error correction param query is not supported");
+ ALOGW("Error correction param query is not supported");
return OK; // Optional feature. Ignore this failure
}
@@ -1107,7 +1107,7 @@ status_t OMXCodec::setupErrorCorrectionParameters() {
mNode, OMX_IndexParamVideoErrorCorrection,
&errorCorrectionType, sizeof(errorCorrectionType));
if (err != OK) {
- LOGW("Error correction param configuration is not supported");
+ ALOGW("Error correction param configuration is not supported");
}
// Optional feature. Ignore the failure.
@@ -1375,7 +1375,7 @@ status_t OMXCodec::setVideoOutputFormat(
} else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG2, mime)) {
compressionFormat = OMX_VIDEO_CodingMPEG2;
} else {
- LOGE("Not a supported video mime type: %s", mime);
+ ALOGE("Not a supported video mime type: %s", mime);
CHECK(!"Should not be here. Not a supported video mime type.");
}
@@ -1579,7 +1579,7 @@ void OMXCodec::setComponentRole(
&roleParams, sizeof(roleParams));
if (err != OK) {
- LOGW("Failed to set standard component role '%s'.", role);
+ ALOGW("Failed to set standard component role '%s'.", role);
}
}
}
@@ -1664,7 +1664,7 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
}
if ((mFlags & kEnableGrallocUsageProtected) && portIndex == kPortIndexOutput) {
- LOGE("protected output buffers must be stent to an ANativeWindow");
+ ALOGE("protected output buffers must be stent to an ANativeWindow");
return PERMISSION_DENIED;
}
@@ -1673,7 +1673,7 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
&& portIndex == kPortIndexInput) {
err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE);
if (err != OK) {
- LOGE("Storing meta data in video buffers is not supported");
+ ALOGE("Storing meta data in video buffers is not supported");
return err;
}
}
@@ -1735,7 +1735,7 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
}
if (err != OK) {
- LOGE("allocate_buffer_with_backup failed");
+ ALOGE("allocate_buffer_with_backup failed");
return err;
}
@@ -1849,7 +1849,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
def.format.video.eColorFormat);
if (err != 0) {
- LOGE("native_window_set_buffers_geometry failed: %s (%d)",
+ ALOGE("native_window_set_buffers_geometry failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -1863,7 +1863,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
OMX_U32 usage = 0;
err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage);
if (err != 0) {
- LOGW("querying usage flags from OMX IL component failed: %d", err);
+ ALOGW("querying usage flags from OMX IL component failed: %d", err);
// XXX: Currently this error is logged, but not fatal.
usage = 0;
}
@@ -1881,11 +1881,11 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
mNativeWindow.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
&queuesToNativeWindow);
if (err != 0) {
- LOGE("error authenticating native window: %d", err);
+ ALOGE("error authenticating native window: %d", err);
return err;
}
if (queuesToNativeWindow != 1) {
- LOGE("native window could not be authenticated");
+ ALOGE("native window could not be authenticated");
return PERMISSION_DENIED;
}
}
@@ -1894,7 +1894,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
err = native_window_set_usage(
mNativeWindow.get(), usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP);
if (err != 0) {
- LOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err);
+ ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err);
return err;
}
@@ -1902,7 +1902,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
err = mNativeWindow->query(mNativeWindow.get(),
NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs);
if (err != 0) {
- LOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)",
+ ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -1925,7 +1925,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
err = native_window_set_buffer_count(
mNativeWindow.get(), def.nBufferCountActual);
if (err != 0) {
- LOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
+ ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
-err);
return err;
}
@@ -1938,7 +1938,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
ANativeWindowBuffer* buf;
err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf);
if (err != 0) {
- LOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err);
+ ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err);
break;
}
@@ -2052,7 +2052,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = native_window_api_disconnect(mNativeWindow.get(),
NATIVE_WINDOW_API_MEDIA);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: api_disconnect failed: %s (%d)",
+ ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -2060,7 +2060,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = native_window_api_connect(mNativeWindow.get(),
NATIVE_WINDOW_API_CPU);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: api_connect failed: %s (%d)",
+ ALOGE("error pushing blank frames: api_connect failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -2068,7 +2068,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = native_window_set_scaling_mode(mNativeWindow.get(),
NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)",
+ ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2076,7 +2076,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1,
HAL_PIXEL_FORMAT_RGBX_8888);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)",
+ ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2084,7 +2084,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = native_window_set_usage(mNativeWindow.get(),
GRALLOC_USAGE_SW_WRITE_OFTEN);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: set_usage failed: %s (%d)",
+ ALOGE("error pushing blank frames: set_usage failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2092,7 +2092,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = mNativeWindow->query(mNativeWindow.get(),
NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query "
+ ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query "
"failed: %s (%d)", strerror(-err), -err);
goto error;
}
@@ -2100,7 +2100,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
numBufs = minUndequeuedBufs + 1;
err = native_window_set_buffer_count(mNativeWindow.get(), numBufs);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: set_buffer_count failed: %s (%d)",
+ ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2112,7 +2112,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
for (int i = 0; i < numBufs + 1; i++) {
err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &anb);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)",
+ ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2121,7 +2121,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = mNativeWindow->lockBuffer(mNativeWindow.get(),
buf->getNativeBuffer());
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: lockBuffer failed: %s (%d)",
+ ALOGE("error pushing blank frames: lockBuffer failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2130,7 +2130,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
uint32_t* img = NULL;
err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: lock failed: %s (%d)",
+ ALOGE("error pushing blank frames: lock failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2139,7 +2139,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = buf->unlock();
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: unlock failed: %s (%d)",
+ ALOGE("error pushing blank frames: unlock failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2147,7 +2147,7 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {
err = mNativeWindow->queueBuffer(mNativeWindow.get(),
buf->getNativeBuffer());
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: queueBuffer failed: %s (%d)",
+ ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)",
strerror(-err), -err);
goto error;
}
@@ -2174,7 +2174,7 @@ error:
err = native_window_api_disconnect(mNativeWindow.get(),
NATIVE_WINDOW_API_CPU);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: api_disconnect failed: %s (%d)",
+ ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -2182,7 +2182,7 @@ error:
err = native_window_api_connect(mNativeWindow.get(),
NATIVE_WINDOW_API_MEDIA);
if (err != NO_ERROR) {
- LOGE("error pushing blank frames: api_connect failed: %s (%d)",
+ ALOGE("error pushing blank frames: api_connect failed: %s (%d)",
strerror(-err), -err);
return err;
}
@@ -2214,7 +2214,7 @@ int64_t OMXCodec::retrieveDecodingTimeUs(bool isCodecSpecific) {
void OMXCodec::on_message(const omx_message &msg) {
if (mState == ERROR) {
- LOGW("Dropping OMX message - we're in ERROR state.");
+ ALOGW("Dropping OMX message - we're in ERROR state.");
return;
}
@@ -2242,7 +2242,7 @@ void OMXCodec::on_message(const omx_message &msg) {
CHECK(i < buffers->size());
if ((*buffers)[i].mStatus != OWNED_BY_COMPONENT) {
- LOGW("We already own input buffer %p, yet received "
+ ALOGW("We already own input buffer %p, yet received "
"an EMPTY_BUFFER_DONE.", buffer);
}
@@ -2302,7 +2302,7 @@ void OMXCodec::on_message(const omx_message &msg) {
BufferInfo *info = &buffers->editItemAt(i);
if (info->mStatus != OWNED_BY_COMPONENT) {
- LOGW("We already own output buffer %p, yet received "
+ ALOGW("We already own output buffer %p, yet received "
"a FILL_BUFFER_DONE.", buffer);
}
@@ -3556,7 +3556,7 @@ void OMXCodec::setAMRFormat(bool isWAMR, int32_t bitRate) {
status_t OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t bitRate) {
if (numChannels > 2)
- LOGW("Number of channels: (%d) \n", numChannels);
+ ALOGW("Number of channels: (%d) \n", numChannels);
if (mIsEncoder) {
//////////////// input port ////////////////////
diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp
index 5a68d7973982..73efc278224f 100644
--- a/media/libstagefright/OggExtractor.cpp
+++ b/media/libstagefright/OggExtractor.cpp
@@ -189,9 +189,9 @@ status_t OggSource::read(
#if 0
int64_t timeUs;
if (packet->meta_data()->findInt64(kKeyTime, &timeUs)) {
- LOGI("found time = %lld us", timeUs);
+ ALOGI("found time = %lld us", timeUs);
} else {
- LOGI("NO time");
+ ALOGI("NO time");
}
#endif
@@ -777,7 +777,7 @@ void MyVorbisExtractor::parseFileMetaData() {
const char *comment = mVc.user_comments[i];
size_t commentLength = mVc.comment_lengths[i];
parseVorbisComment(mFileMeta, comment, commentLength);
- //LOGI("comment #%d: '%s'", i + 1, mVc.user_comments[i]);
+ //ALOGI("comment #%d: '%s'", i + 1, mVc.user_comments[i]);
}
}
@@ -899,7 +899,7 @@ static void extractAlbumArt(
uint8_t *flac = DecodeBase64((const char *)data, size, &flacSize);
if (flac == NULL) {
- LOGE("malformed base64 encoded data.");
+ ALOGE("malformed base64 encoded data.");
return;
}
diff --git a/media/libstagefright/SampleIterator.cpp b/media/libstagefright/SampleIterator.cpp
index 7b8e008417ab..81ec5c109f92 100644
--- a/media/libstagefright/SampleIterator.cpp
+++ b/media/libstagefright/SampleIterator.cpp
@@ -77,7 +77,7 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) {
if (sampleIndex >= mStopChunkSampleIndex) {
status_t err;
if ((err = findChunkRange(sampleIndex)) != OK) {
- LOGE("findChunkRange failed");
+ ALOGE("findChunkRange failed");
return err;
}
}
@@ -93,7 +93,7 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) {
status_t err;
if ((err = getChunkOffset(chunk, &mCurrentChunkOffset)) != OK) {
- LOGE("getChunkOffset return error");
+ ALOGE("getChunkOffset return error");
return err;
}
@@ -107,7 +107,7 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) {
size_t sampleSize;
if ((err = getSampleSizeDirect(
firstChunkSampleIndex + i, &sampleSize)) != OK) {
- LOGE("getSampleSizeDirect return error");
+ ALOGE("getSampleSizeDirect return error");
return err;
}
@@ -134,7 +134,7 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) {
status_t err;
if ((err = findSampleTime(sampleIndex, &mCurrentSampleTime)) != OK) {
- LOGE("findSampleTime return error");
+ ALOGE("findSampleTime return error");
return err;
}
diff --git a/media/libstagefright/SampleTable.cpp b/media/libstagefright/SampleTable.cpp
index 3e287fa58181..d9858d76464d 100644
--- a/media/libstagefright/SampleTable.cpp
+++ b/media/libstagefright/SampleTable.cpp
@@ -347,7 +347,7 @@ status_t SampleTable::setTimeToSampleParams(
status_t SampleTable::setCompositionTimeToSampleParams(
off64_t data_offset, size_t data_size) {
- LOGI("There are reordered frames present.");
+ ALOGI("There are reordered frames present.");
if (mCompositionTimeDeltaEntries != NULL || data_size < 8) {
return ERROR_MALFORMED;
@@ -634,7 +634,7 @@ status_t SampleTable::findSyncSampleNear(
}
if (left == mNumSyncSamples) {
if (flags == kFlagAfter) {
- LOGE("tried to find a sync frame after the last one: %d", left);
+ ALOGE("tried to find a sync frame after the last one: %d", left);
return ERROR_OUT_OF_RANGE;
}
left = left - 1;
diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp
index 4345184c7c7d..bd7a2269023e 100644
--- a/media/libstagefright/StagefrightMediaScanner.cpp
+++ b/media/libstagefright/StagefrightMediaScanner.cpp
@@ -57,7 +57,7 @@ static MediaScanResult HandleMIDI(
// get the library configuration and do sanity check
const S_EAS_LIB_CONFIG* pLibConfig = EAS_Config();
if ((pLibConfig == NULL) || (LIB_VERSION != pLibConfig->libVersion)) {
- LOGE("EAS library/header mismatch\n");
+ ALOGE("EAS library/header mismatch\n");
return MEDIA_SCAN_RESULT_ERROR;
}
EAS_I32 temp;
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index 2634da0e96a2..43bfd9e30c52 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -127,7 +127,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
status_t err = decoder->start();
if (err != OK) {
- LOGW("OMXCodec::start returned error %d (0x%08x)\n", err, err);
+ ALOGW("OMXCodec::start returned error %d (0x%08x)\n", err, err);
return NULL;
}
@@ -138,7 +138,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
if (seekMode < MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC ||
seekMode > MediaSource::ReadOptions::SEEK_CLOSEST) {
- LOGE("Unknown seek mode: %d", seekMode);
+ ALOGE("Unknown seek mode: %d", seekMode);
return NULL;
}
@@ -264,7 +264,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
decoder->stop();
if (err != OK) {
- LOGE("Colorconverter failed to convert frame.");
+ ALOGE("Colorconverter failed to convert frame.");
delete frame;
frame = NULL;
@@ -292,7 +292,7 @@ VideoFrame *StagefrightMetadataRetriever::getFrameAtTime(
int32_t drm = 0;
if (fileMeta->findInt32(kKeyIsDRM, &drm) && drm != 0) {
- LOGE("frame grab not allowed.");
+ ALOGE("frame grab not allowed.");
return NULL;
}
diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp
index 2f807d0d116b..2233d1bf5d04 100644
--- a/media/libstagefright/SurfaceMediaSource.cpp
+++ b/media/libstagefright/SurfaceMediaSource.cpp
@@ -112,7 +112,7 @@ status_t SurfaceMediaSource::setBufferCountServer(int bufferCount) {
status_t SurfaceMediaSource::setBufferCount(int bufferCount) {
ALOGV("SurfaceMediaSource::setBufferCount");
if (bufferCount > NUM_BUFFER_SLOTS) {
- LOGE("setBufferCount: bufferCount is larger than the number of buffer slots");
+ ALOGE("setBufferCount: bufferCount is larger than the number of buffer slots");
return BAD_VALUE;
}
@@ -120,7 +120,7 @@ status_t SurfaceMediaSource::setBufferCount(int bufferCount) {
// Error out if the user has dequeued buffers
for (int i = 0 ; i < mBufferCount ; i++) {
if (mSlots[i].mBufferState == BufferSlot::DEQUEUED) {
- LOGE("setBufferCount: client owns some buffers");
+ ALOGE("setBufferCount: client owns some buffers");
return INVALID_OPERATION;
}
}
@@ -155,7 +155,7 @@ status_t SurfaceMediaSource::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
ALOGV("SurfaceMediaSource::requestBuffer");
Mutex::Autolock lock(mMutex);
if (slot < 0 || mBufferCount <= slot) {
- LOGE("requestBuffer: slot index out of range [0, %d]: %d",
+ ALOGE("requestBuffer: slot index out of range [0, %d]: %d",
mBufferCount, slot);
return BAD_VALUE;
}
@@ -183,7 +183,7 @@ status_t SurfaceMediaSource::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
// we might declare mHeight and mWidth and check against those here.
if ((w != 0) || (h != 0)) {
if ((w != mDefaultWidth) || (h != mDefaultHeight)) {
- LOGE("dequeuebuffer: invalid buffer size! Req: %dx%d, Found: %dx%d",
+ ALOGE("dequeuebuffer: invalid buffer size! Req: %dx%d, Found: %dx%d",
mDefaultWidth, mDefaultHeight, w, h);
return BAD_VALUE;
}
@@ -284,7 +284,7 @@ status_t SurfaceMediaSource::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
// than allowed.
const int avail = mBufferCount - (dequeuedCount+1);
if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) {
- LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
+ ALOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),
dequeuedCount);
return -EBUSY;
@@ -346,7 +346,7 @@ status_t SurfaceMediaSource::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
mGraphicBufferAlloc->createGraphicBuffer(
w, h, format, usage, &error));
if (graphicBuffer == 0) {
- LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer failed");
+ ALOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer failed");
return error;
}
if (updateFormat) {
@@ -363,13 +363,13 @@ status_t SurfaceMediaSource::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
status_t SurfaceMediaSource::setSynchronousMode(bool enabled) {
Mutex::Autolock lock(mMutex);
if (mStopped) {
- LOGE("setSynchronousMode: SurfaceMediaSource has been stopped!");
+ ALOGE("setSynchronousMode: SurfaceMediaSource has been stopped!");
return NO_INIT;
}
if (!enabled) {
// Async mode is not allowed
- LOGE("SurfaceMediaSource can be used only synchronous mode!");
+ ALOGE("SurfaceMediaSource can be used only synchronous mode!");
return INVALID_OPERATION;
}
@@ -390,7 +390,7 @@ status_t SurfaceMediaSource::connect(int api,
Mutex::Autolock lock(mMutex);
if (mStopped) {
- LOGE("Connect: SurfaceMediaSource has been stopped!");
+ ALOGE("Connect: SurfaceMediaSource has been stopped!");
return NO_INIT;
}
@@ -431,7 +431,7 @@ status_t SurfaceMediaSource::disconnect(int api) {
Mutex::Autolock lock(mMutex);
if (mStopped) {
- LOGE("disconnect: SurfaceMediaSoource is already stopped!");
+ ALOGE("disconnect: SurfaceMediaSoource is already stopped!");
return NO_INIT;
}
@@ -467,15 +467,15 @@ status_t SurfaceMediaSource::queueBuffer(int bufIndex, int64_t timestamp,
*outTransform = 0;
if (bufIndex < 0 || bufIndex >= mBufferCount) {
- LOGE("queueBuffer: slot index out of range [0, %d]: %d",
+ ALOGE("queueBuffer: slot index out of range [0, %d]: %d",
mBufferCount, bufIndex);
return -EINVAL;
} else if (mSlots[bufIndex].mBufferState != BufferSlot::DEQUEUED) {
- LOGE("queueBuffer: slot %d is not owned by the client (state=%d)",
+ ALOGE("queueBuffer: slot %d is not owned by the client (state=%d)",
bufIndex, mSlots[bufIndex].mBufferState);
return -EINVAL;
} else if (!mSlots[bufIndex].mRequestBufferCalled) {
- LOGE("queueBuffer: slot %d was enqueued without requesting a "
+ ALOGE("queueBuffer: slot %d was enqueued without requesting a "
"buffer", bufIndex);
return -EINVAL;
}
@@ -561,11 +561,11 @@ void SurfaceMediaSource::cancelBuffer(int bufIndex) {
ALOGV("SurfaceMediaSource::cancelBuffer");
Mutex::Autolock lock(mMutex);
if (bufIndex < 0 || bufIndex >= mBufferCount) {
- LOGE("cancelBuffer: slot index out of range [0, %d]: %d",
+ ALOGE("cancelBuffer: slot index out of range [0, %d]: %d",
mBufferCount, bufIndex);
return;
} else if (mSlots[bufIndex].mBufferState != BufferSlot::DEQUEUED) {
- LOGE("cancelBuffer: slot %d is not owned by the client (state=%d)",
+ ALOGE("cancelBuffer: slot %d is not owned by the client (state=%d)",
bufIndex, mSlots[bufIndex].mBufferState);
return;
}
@@ -814,7 +814,7 @@ void SurfaceMediaSource::passMetadataBufferLocked(MediaBuffer **buffer) {
new MediaBuffer(4 + sizeof(buffer_handle_t));
char *data = (char *)tempBuffer->data();
if (data == NULL) {
- LOGE("Cannot allocate memory for metadata buffer!");
+ ALOGE("Cannot allocate memory for metadata buffer!");
return;
}
OMX_U32 type = kMetadataBufferTypeGrallocSource;
diff --git a/media/libstagefright/TimedEventQueue.cpp b/media/libstagefright/TimedEventQueue.cpp
index 43511eccaef6..12c9c36606cd 100644
--- a/media/libstagefright/TimedEventQueue.cpp
+++ b/media/libstagefright/TimedEventQueue.cpp
@@ -265,7 +265,7 @@ void TimedEventQueue::threadEntry() {
static int64_t kMaxTimeoutUs = 10000000ll; // 10 secs
bool timeoutCapped = false;
if (delay_us > kMaxTimeoutUs) {
- LOGW("delay_us exceeds max timeout: %lld us", delay_us);
+ ALOGW("delay_us exceeds max timeout: %lld us", delay_us);
// We'll never block for more than 10 secs, instead
// we will split up the full timeout into chunks of
@@ -315,7 +315,7 @@ sp<TimedEventQueue::Event> TimedEventQueue::removeEventFromQueue_l(
}
}
- LOGW("Event %d was not found in the queue, already cancelled?", id);
+ ALOGW("Event %d was not found in the queue, already cancelled?", id);
return NULL;
}
diff --git a/media/libstagefright/VBRISeeker.cpp b/media/libstagefright/VBRISeeker.cpp
index ecff538ac360..6ac5a83e523c 100644
--- a/media/libstagefright/VBRISeeker.cpp
+++ b/media/libstagefright/VBRISeeker.cpp
@@ -120,7 +120,7 @@ sp<VBRISeeker> VBRISeeker::CreateFromSource(
delete[] buffer;
buffer = NULL;
- LOGI("Found VBRI header.");
+ ALOGI("Found VBRI header.");
return seeker;
}
diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp
index 26eda0c4cfb1..2092cb6d55af 100644
--- a/media/libstagefright/WVMExtractor.cpp
+++ b/media/libstagefright/WVMExtractor.cpp
@@ -53,7 +53,7 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
}
if (gVendorLibHandle == NULL) {
- LOGE("Failed to open libwvm.so");
+ ALOGE("Failed to open libwvm.so");
return;
}
}
@@ -67,7 +67,7 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
mImpl = (*getInstanceFunc)(source);
CHECK(mImpl != NULL);
} else {
- LOGE("Failed to locate GetInstance in libwvm.so");
+ ALOGE("Failed to locate GetInstance in libwvm.so");
}
}
diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp
index 1ed9e577575a..65c1848af53e 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -290,7 +290,7 @@ sp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit) {
memcpy(out, picParamSet->data(), picParamSet->size());
#if 0
- LOGI("AVC seq param set");
+ ALOGI("AVC seq param set");
hexdump(seqParamSet->data(), seqParamSet->size());
#endif
@@ -301,7 +301,7 @@ sp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit) {
meta->setInt32(kKeyWidth, width);
meta->setInt32(kKeyHeight, height);
- LOGI("found AVC codec config (%d x %d, %s-profile level %d.%d)",
+ ALOGI("found AVC codec config (%d x %d, %s-profile level %d.%d)",
width, height, AVCProfileToString(profile), level / 10, level % 10);
return meta;
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp
index c408b2cc69d7..da9d28067793 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp
+++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp
@@ -116,7 +116,7 @@ status_t SoftAAC::initDecoder() {
Int err = PVMP4AudioDecoderInitLibrary(mConfig, mDecoderBuf);
if (err != MP4AUDEC_SUCCESS) {
- LOGE("Failed to initialize MP4 audio decoder");
+ ALOGE("Failed to initialize MP4 audio decoder");
return UNKNOWN_ERROR;
}
@@ -326,7 +326,7 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) {
mUpsamplingFactor = mConfig->aacPlusUpsamplingFactor;
// Check on the sampling rate to see whether it is changed.
if (mConfig->samplingRate != prevSamplingRate) {
- LOGW("Sample rate was %d Hz, but now is %d Hz",
+ ALOGW("Sample rate was %d Hz, but now is %d Hz",
prevSamplingRate, mConfig->samplingRate);
// We'll hold onto the input buffer and will decode
@@ -341,7 +341,7 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) {
mConfig->extendedAudioObjectType == MP4AUDIO_LTP) {
if (mUpsamplingFactor == 2) {
// The stream turns out to be not aacPlus mode anyway
- LOGW("Disable AAC+/eAAC+ since extended audio object "
+ ALOGW("Disable AAC+/eAAC+ since extended audio object "
"type is %d",
mConfig->extendedAudioObjectType);
mConfig->aacPlusEnabled = 0;
@@ -351,7 +351,7 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) {
// aacPlus mode does not buy us anything, but to cause
// 1. CPU load to increase, and
// 2. a half speed of decoding
- LOGW("Disable AAC+/eAAC+ since upsampling factor is 1");
+ ALOGW("Disable AAC+/eAAC+ since upsampling factor is 1");
mConfig->aacPlusEnabled = 0;
}
}
@@ -367,7 +367,7 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) {
inHeader->nFilledLen -= mConfig->inputBufferUsedLength;
inHeader->nOffset += mConfig->inputBufferUsedLength;
} else {
- LOGW("AAC decoder returned error %d, substituting silence",
+ ALOGW("AAC decoder returned error %d, substituting silence",
decoderErr);
memset(outHeader->pBuffer + outHeader->nOffset, 0, numOutBytes);
diff --git a/media/libstagefright/codecs/aacenc/AACEncoder.cpp b/media/libstagefright/codecs/aacenc/AACEncoder.cpp
index 2b15b758c1e1..2b8633d746ac 100644
--- a/media/libstagefright/codecs/aacenc/AACEncoder.cpp
+++ b/media/libstagefright/codecs/aacenc/AACEncoder.cpp
@@ -53,7 +53,7 @@ status_t AACEncoder::initCheck() {
CHECK(mApiHandle);
if (VO_ERR_NONE != voGetAACEncAPI(mApiHandle)) {
- LOGE("Failed to get api handle");
+ ALOGE("Failed to get api handle");
return UNKNOWN_ERROR;
}
@@ -70,11 +70,11 @@ status_t AACEncoder::initCheck() {
userData.memflag = VO_IMF_USERMEMOPERATOR;
userData.memData = (VO_PTR) mMemOperator;
if (VO_ERR_NONE != mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAAC, &userData)) {
- LOGE("Failed to init AAC encoder");
+ ALOGE("Failed to init AAC encoder");
return UNKNOWN_ERROR;
}
if (OK != setAudioSpecificConfigData()) {
- LOGE("Failed to configure AAC encoder");
+ ALOGE("Failed to configure AAC encoder");
return UNKNOWN_ERROR;
}
@@ -86,7 +86,7 @@ status_t AACEncoder::initCheck() {
params.nChannels = mChannels;
params.adtsUsed = 0; // We add adts header in the file writer if needed.
if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AAC_ENCPARAM, &params)) {
- LOGE("Failed to set AAC encoder parameters");
+ ALOGE("Failed to set AAC encoder parameters");
return UNKNOWN_ERROR;
}
@@ -106,7 +106,7 @@ static status_t getSampleRateTableIndex(int32_t sampleRate, int32_t &index) {
}
}
- LOGE("Sampling rate %d bps is not supported", sampleRate);
+ ALOGE("Sampling rate %d bps is not supported", sampleRate);
return UNKNOWN_ERROR;
}
@@ -117,7 +117,7 @@ status_t AACEncoder::setAudioSpecificConfigData() {
int32_t index;
CHECK_EQ(OK, getSampleRateTableIndex(mSampleRate, index));
if (mChannels > 2 || mChannels <= 0) {
- LOGE("Unsupported number of channels(%d)", mChannels);
+ ALOGE("Unsupported number of channels(%d)", mChannels);
return UNKNOWN_ERROR;
}
@@ -135,7 +135,7 @@ AACEncoder::~AACEncoder() {
status_t AACEncoder::start(MetaData *params) {
if (mStarted) {
- LOGW("Call start() when encoder already started");
+ ALOGW("Call start() when encoder already started");
return OK;
}
@@ -153,7 +153,7 @@ status_t AACEncoder::start(MetaData *params) {
status_t err = mSource->start(params);
if (err != OK) {
- LOGE("AudioSource is not available");
+ ALOGE("AudioSource is not available");
return err;
}
@@ -177,7 +177,7 @@ status_t AACEncoder::stop() {
}
if (!mStarted) {
- LOGW("Call stop() when encoder has not started");
+ ALOGW("Call stop() when encoder has not started");
return ERROR_END_OF_STREAM;
}
diff --git a/media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp b/media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp
index c0a588f7cb37..7602f2dcbf16 100644
--- a/media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp
+++ b/media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp
@@ -304,7 +304,7 @@ void SoftAMR::onQueueFilled(OMX_U32 portIndex) {
MIME_IETF);
if (numBytesRead == -1) {
- LOGE("PV AMR decoder AMRDecode() call failed");
+ ALOGE("PV AMR decoder AMRDecode() call failed");
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
mSignalledError = true;
diff --git a/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp b/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
index d361ef4292cc..3afbc4f51985 100644
--- a/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
+++ b/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
@@ -71,7 +71,7 @@ static Mode PickModeFromBitrate(int32_t bps) {
status_t AMRNBEncoder::start(MetaData *params) {
if (mStarted) {
- LOGW("Call start() when encoder already started");
+ ALOGW("Call start() when encoder already started");
return OK;
}
@@ -84,7 +84,7 @@ status_t AMRNBEncoder::start(MetaData *params) {
status_t err = mSource->start(params);
if (err != OK) {
- LOGE("AudioSource is not available");
+ ALOGE("AudioSource is not available");
return err;
}
@@ -105,7 +105,7 @@ status_t AMRNBEncoder::start(MetaData *params) {
status_t AMRNBEncoder::stop() {
if (!mStarted) {
- LOGW("Call stop() when encoder has not started.");
+ ALOGW("Call stop() when encoder has not started.");
return OK;
}
diff --git a/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp b/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
index 5eacc160fd29..60b1163eef31 100644
--- a/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
+++ b/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
@@ -80,7 +80,7 @@ status_t AMRWBEncoder::initCheck() {
CHECK(mApiHandle);
if (VO_ERR_NONE != voGetAMRWBEncAPI(mApiHandle)) {
- LOGE("Failed to get api handle");
+ ALOGE("Failed to get api handle");
return UNKNOWN_ERROR;
}
@@ -97,20 +97,20 @@ status_t AMRWBEncoder::initCheck() {
userData.memflag = VO_IMF_USERMEMOPERATOR;
userData.memData = (VO_PTR) mMemOperator;
if (VO_ERR_NONE != mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAMRWB, &userData)) {
- LOGE("Failed to init AMRWB encoder");
+ ALOGE("Failed to init AMRWB encoder");
return UNKNOWN_ERROR;
}
// Configure AMRWB encoder$
VOAMRWBMODE mode = pickModeFromBitRate(mBitRate);
if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AMRWB_MODE, &mode)) {
- LOGE("Failed to set AMRWB encoder mode to %d", mode);
+ ALOGE("Failed to set AMRWB encoder mode to %d", mode);
return UNKNOWN_ERROR;
}
VOAMRWBFRAMETYPE type = VOAMRWB_RFC3267;
if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &type)) {
- LOGE("Failed to set AMRWB encoder frame type to %d", type);
+ ALOGE("Failed to set AMRWB encoder frame type to %d", type);
return UNKNOWN_ERROR;
}
@@ -125,7 +125,7 @@ AMRWBEncoder::~AMRWBEncoder() {
status_t AMRWBEncoder::start(MetaData *params) {
if (mStarted) {
- LOGW("Call start() when encoder already started");
+ ALOGW("Call start() when encoder already started");
return OK;
}
@@ -140,7 +140,7 @@ status_t AMRWBEncoder::start(MetaData *params) {
status_t err = mSource->start(params);
if (err != OK) {
- LOGE("AudioSource is not available");
+ ALOGE("AudioSource is not available");
return err;
}
mStarted = true;
@@ -150,7 +150,7 @@ status_t AMRWBEncoder::start(MetaData *params) {
status_t AMRWBEncoder::stop() {
if (!mStarted) {
- LOGW("Call stop() when encoder has not started");
+ ALOGW("Call stop() when encoder has not started");
return OK;
}
diff --git a/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp b/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
index 18c5550aa4e7..e202a2b64992 100644
--- a/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
+++ b/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
@@ -41,7 +41,7 @@ static status_t ConvertOmxAvcProfileToAvcSpecProfile(
*pvProfile = AVC_BASELINE;
return OK;
default:
- LOGE("Unsupported omx profile: %d", omxProfile);
+ ALOGE("Unsupported omx profile: %d", omxProfile);
}
return BAD_VALUE;
}
@@ -100,7 +100,7 @@ static status_t ConvertOmxAvcLevelToAvcSpecLevel(
level = AVC_LEVEL5_1;
break;
default:
- LOGE("Unknown omx level: %d", omxLevel);
+ ALOGE("Unknown omx level: %d", omxLevel);
return BAD_VALUE;
}
*pvLevel = level;
@@ -178,7 +178,7 @@ AVCEncoder::AVCEncoder(
mInputFrameData(NULL),
mGroup(NULL) {
- LOGI("Construct software AVCEncoder");
+ ALOGI("Construct software AVCEncoder");
mHandle = new tagAVCHandle;
memset(mHandle, 0, sizeof(tagAVCHandle));
@@ -214,7 +214,7 @@ status_t AVCEncoder::initCheck(const sp<MetaData>& meta) {
CHECK(meta->findInt32(kKeyColorFormat, &mVideoColorFormat));
if (mVideoColorFormat != OMX_COLOR_FormatYUV420Planar) {
if (mVideoColorFormat != OMX_COLOR_FormatYUV420SemiPlanar) {
- LOGE("Color format %d is not supported", mVideoColorFormat);
+ ALOGE("Color format %d is not supported", mVideoColorFormat);
return BAD_VALUE;
}
// Allocate spare buffer only when color conversion is needed.
@@ -226,7 +226,7 @@ status_t AVCEncoder::initCheck(const sp<MetaData>& meta) {
// XXX: Remove this restriction
if (mVideoWidth % 16 != 0 || mVideoHeight % 16 != 0) {
- LOGE("Video frame size %dx%d must be a multiple of 16",
+ ALOGE("Video frame size %dx%d must be a multiple of 16",
mVideoWidth, mVideoHeight);
return BAD_VALUE;
}
@@ -336,14 +336,14 @@ status_t AVCEncoder::start(MetaData *params) {
}
if (mStarted) {
- LOGW("Call start() when encoder already started");
+ ALOGW("Call start() when encoder already started");
return OK;
}
AVCEnc_Status err;
err = PVAVCEncInitialize(mHandle, mEncParams, NULL, NULL);
if (err != AVCENC_SUCCESS) {
- LOGE("Failed to initialize the encoder: %d", err);
+ ALOGE("Failed to initialize the encoder: %d", err);
return UNKNOWN_ERROR;
}
@@ -368,7 +368,7 @@ status_t AVCEncoder::start(MetaData *params) {
status_t AVCEncoder::stop() {
ALOGV("stop");
if (!mStarted) {
- LOGW("Call stop() when encoder has not started");
+ ALOGW("Call stop() when encoder has not started");
return OK;
}
@@ -461,7 +461,7 @@ status_t AVCEncoder::read(
*out = outputBuffer;
return OK;
default:
- LOGE("Nal type (%d) other than SPS/PPS is unexpected", type);
+ ALOGE("Nal type (%d) other than SPS/PPS is unexpected", type);
return UNKNOWN_ERROR;
}
}
@@ -476,7 +476,7 @@ status_t AVCEncoder::read(
status_t err = mSource->read(&mInputBuffer, options);
if (err != OK) {
if (err != ERROR_END_OF_STREAM) {
- LOGE("Failed to read input video frame: %d", err);
+ ALOGE("Failed to read input video frame: %d", err);
}
outputBuffer->release();
return err;
diff --git a/media/libstagefright/codecs/g711/dec/SoftG711.cpp b/media/libstagefright/codecs/g711/dec/SoftG711.cpp
index 15e2c2663b67..32ef0031f43c 100644
--- a/media/libstagefright/codecs/g711/dec/SoftG711.cpp
+++ b/media/libstagefright/codecs/g711/dec/SoftG711.cpp
@@ -210,7 +210,7 @@ void SoftG711::onQueueFilled(OMX_U32 portIndex) {
}
if (inHeader->nFilledLen > kMaxNumSamplesPerFrame) {
- LOGE("input buffer too large (%ld).", inHeader->nFilledLen);
+ ALOGE("input buffer too large (%ld).", inHeader->nFilledLen);
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
mSignalledError = true;
diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
index bedfc58fac25..a34a0caef68e 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -207,7 +207,7 @@ OMX_ERRORTYPE SoftMPEG4::internalGetParameter(
(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params;
if (profileLevel->nPortIndex != 0) { // Input port only
- LOGE("Invalid port index: %ld", profileLevel->nPortIndex);
+ ALOGE("Invalid port index: %ld", profileLevel->nPortIndex);
return OMX_ErrorUnsupportedIndex;
}
@@ -371,7 +371,7 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
mHandle, vol_data, &vol_size, 1, mWidth, mHeight, mode);
if (!success) {
- LOGW("PVInitVideoDecoder failed. Unsupported content?");
+ ALOGW("PVInitVideoDecoder failed. Unsupported content?");
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
mSignalledError = true;
@@ -430,7 +430,7 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
mHandle, &bitstream, &timestamp, &tmp,
&useExtTimestamp,
outHeader->pBuffer) != PV_TRUE) {
- LOGE("failed to decode video frame.");
+ ALOGE("failed to decode video frame.");
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
mSignalledError = true;
diff --git a/media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp b/media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp
index 2e3d12de4f64..d53860336285 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp
+++ b/media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp
@@ -43,16 +43,16 @@ static status_t ConvertOmxProfileLevel(
switch (omxProfile) {
case OMX_VIDEO_H263ProfileBaseline:
if (omxLevel > OMX_VIDEO_H263Level45) {
- LOGE("Unsupported level (%d) for H263", omxLevel);
+ ALOGE("Unsupported level (%d) for H263", omxLevel);
return BAD_VALUE;
} else {
- LOGW("PV does not support level configuration for H263");
+ ALOGW("PV does not support level configuration for H263");
profileLevel = CORE_PROFILE_LEVEL2;
break;
}
break;
default:
- LOGE("Unsupported profile (%d) for H263", omxProfile);
+ ALOGE("Unsupported profile (%d) for H263", omxProfile);
return BAD_VALUE;
}
} else { // MPEG4
@@ -72,7 +72,7 @@ static status_t ConvertOmxProfileLevel(
profileLevel = SIMPLE_PROFILE_LEVEL3;
break;
default:
- LOGE("Unsupported level (%d) for MPEG4 simple profile",
+ ALOGE("Unsupported level (%d) for MPEG4 simple profile",
omxLevel);
return BAD_VALUE;
}
@@ -89,7 +89,7 @@ static status_t ConvertOmxProfileLevel(
profileLevel = SIMPLE_SCALABLE_PROFILE_LEVEL2;
break;
default:
- LOGE("Unsupported level (%d) for MPEG4 simple "
+ ALOGE("Unsupported level (%d) for MPEG4 simple "
"scalable profile", omxLevel);
return BAD_VALUE;
}
@@ -103,7 +103,7 @@ static status_t ConvertOmxProfileLevel(
profileLevel = CORE_PROFILE_LEVEL2;
break;
default:
- LOGE("Unsupported level (%d) for MPEG4 core "
+ ALOGE("Unsupported level (%d) for MPEG4 core "
"profile", omxLevel);
return BAD_VALUE;
}
@@ -120,13 +120,13 @@ static status_t ConvertOmxProfileLevel(
profileLevel = CORE_SCALABLE_PROFILE_LEVEL3;
break;
default:
- LOGE("Unsupported level (%d) for MPEG4 core "
+ ALOGE("Unsupported level (%d) for MPEG4 core "
"scalable profile", omxLevel);
return BAD_VALUE;
}
break;
default:
- LOGE("Unsupported MPEG4 profile (%d)", omxProfile);
+ ALOGE("Unsupported MPEG4 profile (%d)", omxProfile);
return BAD_VALUE;
}
}
@@ -178,7 +178,7 @@ M4vH263Encoder::M4vH263Encoder(
mInputFrameData(NULL),
mGroup(NULL) {
- LOGI("Construct software M4vH263Encoder");
+ ALOGI("Construct software M4vH263Encoder");
mHandle = new tagvideoEncControls;
memset(mHandle, 0, sizeof(tagvideoEncControls));
@@ -207,7 +207,7 @@ status_t M4vH263Encoder::initCheck(const sp<MetaData>& meta) {
CHECK(meta->findInt32(kKeyColorFormat, &mVideoColorFormat));
if (mVideoColorFormat != OMX_COLOR_FormatYUV420Planar) {
if (mVideoColorFormat != OMX_COLOR_FormatYUV420SemiPlanar) {
- LOGE("Color format %d is not supported", mVideoColorFormat);
+ ALOGE("Color format %d is not supported", mVideoColorFormat);
return BAD_VALUE;
}
// Allocate spare buffer only when color conversion is needed.
@@ -219,7 +219,7 @@ status_t M4vH263Encoder::initCheck(const sp<MetaData>& meta) {
// XXX: Remove this restriction
if (mVideoWidth % 16 != 0 || mVideoHeight % 16 != 0) {
- LOGE("Video frame size %dx%d must be a multiple of 16",
+ ALOGE("Video frame size %dx%d must be a multiple of 16",
mVideoWidth, mVideoHeight);
return BAD_VALUE;
}
@@ -227,7 +227,7 @@ status_t M4vH263Encoder::initCheck(const sp<MetaData>& meta) {
mEncParams = new tagvideoEncOptions;
memset(mEncParams, 0, sizeof(tagvideoEncOptions));
if (!PVGetDefaultEncOption(mEncParams, 0)) {
- LOGE("Failed to get default encoding parameters");
+ ALOGE("Failed to get default encoding parameters");
return BAD_VALUE;
}
@@ -314,12 +314,12 @@ status_t M4vH263Encoder::start(MetaData *params) {
}
if (mStarted) {
- LOGW("Call start() when encoder already started");
+ ALOGW("Call start() when encoder already started");
return OK;
}
if (!PVInitVideoEncoder(mHandle, mEncParams)) {
- LOGE("Failed to initialize the encoder");
+ ALOGE("Failed to initialize the encoder");
return UNKNOWN_ERROR;
}
@@ -341,7 +341,7 @@ status_t M4vH263Encoder::start(MetaData *params) {
status_t M4vH263Encoder::stop() {
ALOGV("stop");
if (!mStarted) {
- LOGW("Call stop() when encoder has not started");
+ ALOGW("Call stop() when encoder has not started");
return OK;
}
@@ -386,7 +386,7 @@ status_t M4vH263Encoder::read(
// Output codec specific data
if (mNumInputFrames < 0) {
if (!PVGetVolHeader(mHandle, outPtr, &dataLength, 0)) {
- LOGE("Failed to get VOL header");
+ ALOGE("Failed to get VOL header");
return UNKNOWN_ERROR;
}
ALOGV("Output VOL header: %d bytes", dataLength);
@@ -401,7 +401,7 @@ status_t M4vH263Encoder::read(
status_t err = mSource->read(&mInputBuffer, options);
if (OK != err) {
if (err != ERROR_END_OF_STREAM) {
- LOGE("Failed to read from data source");
+ ALOGE("Failed to read from data source");
}
outputBuffer->release();
return err;
@@ -460,7 +460,7 @@ status_t M4vH263Encoder::read(
if (!PVEncodeVideoFrame(mHandle, &vin, &vout,
&modTimeMs, outPtr, &dataLength, &nLayer) ||
!PVGetHintTrack(mHandle, &hintTrack)) {
- LOGE("Failed to encode frame or get hink track at frame %lld",
+ ALOGE("Failed to encode frame or get hink track at frame %lld",
mNumInputFrames);
outputBuffer->release();
mInputBuffer->release();
diff --git a/media/libstagefright/codecs/mp3dec/SoftMP3.cpp b/media/libstagefright/codecs/mp3dec/SoftMP3.cpp
index 43fb30a5244f..ad5529538b09 100644
--- a/media/libstagefright/codecs/mp3dec/SoftMP3.cpp
+++ b/media/libstagefright/codecs/mp3dec/SoftMP3.cpp
@@ -223,10 +223,10 @@ void SoftMP3::onQueueFilled(OMX_U32 portIndex) {
if (decoderErr != NO_ENOUGH_MAIN_DATA_ERROR ||
mConfig->outputFrameSize == 0) {
- LOGE("mp3 decoder returned error %d", decoderErr);
+ ALOGE("mp3 decoder returned error %d", decoderErr);
if (mConfig->outputFrameSize == 0) {
- LOGE("Output frame size is 0");
+ ALOGE("Output frame size is 0");
}
notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL);
diff --git a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
index c5fe199e956a..bf9ab3a68025 100644
--- a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
+++ b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
@@ -138,7 +138,7 @@ status_t SoftVPX::initDecoder() {
cfg.threads = GetCPUCoreCount();
if ((vpx_err = vpx_codec_dec_init(
(vpx_codec_ctx_t *)mCtx, &vpx_codec_vp8_dx_algo, &cfg, 0))) {
- LOGE("on2 decoder failed to initialize. (%d)", vpx_err);
+ ALOGE("on2 decoder failed to initialize. (%d)", vpx_err);
return UNKNOWN_ERROR;
}
@@ -254,7 +254,7 @@ void SoftVPX::onQueueFilled(OMX_U32 portIndex) {
inHeader->nFilledLen,
NULL,
0)) {
- LOGE("on2 decoder failed to decode frame.");
+ ALOGE("on2 decoder failed to decode frame.");
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
return;
diff --git a/media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp b/media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp
index dede3ac9cb89..6c3f834aec34 100644
--- a/media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp
+++ b/media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp
@@ -204,7 +204,7 @@ OMX_ERRORTYPE SoftAVC::internalGetParameter(
(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params;
if (profileLevel->nPortIndex != kInputPortIndex) {
- LOGE("Invalid port index: %ld", profileLevel->nPortIndex);
+ ALOGE("Invalid port index: %ld", profileLevel->nPortIndex);
return OMX_ErrorUnsupportedIndex;
}
@@ -371,7 +371,7 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) {
}
inPicture.dataLen = 0;
if (ret < 0) {
- LOGE("Decoder failed: %d", ret);
+ ALOGE("Decoder failed: %d", ret);
notify(OMX_EventError, OMX_ErrorUndefined,
ERROR_MALFORMED, NULL);
diff --git a/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp b/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp
index 47dbd5ceab14..ac88107544b6 100644
--- a/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp
+++ b/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp
@@ -353,14 +353,14 @@ void SoftVorbis::onQueueFilled(OMX_U32 portIndex) {
int err = vorbis_dsp_synthesis(mState, &pack, 1);
if (err != 0) {
- LOGW("vorbis_dsp_synthesis returned %d", err);
+ ALOGW("vorbis_dsp_synthesis returned %d", err);
} else {
numFrames = vorbis_dsp_pcmout(
mState, (int16_t *)outHeader->pBuffer,
kMaxNumSamplesPerBuffer);
if (numFrames < 0) {
- LOGE("vorbis_dsp_pcmout returned %d", numFrames);
+ ALOGE("vorbis_dsp_pcmout returned %d", numFrames);
numFrames = 0;
}
}
diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
index 32460212815f..e892f921fca3 100644
--- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp
+++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
@@ -135,7 +135,7 @@ void SoftwareRenderer::render(
ANativeWindowBuffer *buf;
int err;
if ((err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf)) != 0) {
- LOGW("Surface::dequeueBuffer returned error %d", err);
+ ALOGW("Surface::dequeueBuffer returned error %d", err);
return;
}
@@ -225,7 +225,7 @@ void SoftwareRenderer::render(
CHECK_EQ(0, mapper.unlock(buf->handle));
if ((err = mNativeWindow->queueBuffer(mNativeWindow.get(), buf)) != 0) {
- LOGW("Surface::queueBuffer returned error %d", err);
+ ALOGW("Surface::queueBuffer returned error %d", err);
}
buf = NULL;
}
diff --git a/media/libstagefright/foundation/AHierarchicalStateMachine.cpp b/media/libstagefright/foundation/AHierarchicalStateMachine.cpp
index 3b3f78665609..40c5a3c0500d 100644
--- a/media/libstagefright/foundation/AHierarchicalStateMachine.cpp
+++ b/media/libstagefright/foundation/AHierarchicalStateMachine.cpp
@@ -63,7 +63,7 @@ void AHierarchicalStateMachine::onMessageReceived(const sp<AMessage> &msg) {
return;
}
- LOGW("Warning message %s unhandled in root state.",
+ ALOGW("Warning message %s unhandled in root state.",
msg->debugString().c_str());
}
diff --git a/media/libstagefright/foundation/ALooperRoster.cpp b/media/libstagefright/foundation/ALooperRoster.cpp
index e399f2f64a99..dff931d496e7 100644
--- a/media/libstagefright/foundation/ALooperRoster.cpp
+++ b/media/libstagefright/foundation/ALooperRoster.cpp
@@ -82,7 +82,7 @@ status_t ALooperRoster::postMessage_l(
ssize_t index = mHandlers.indexOfKey(msg->target());
if (index < 0) {
- LOGW("failed to post message. Target handler not registered.");
+ ALOGW("failed to post message. Target handler not registered.");
return -ENOENT;
}
@@ -91,7 +91,7 @@ status_t ALooperRoster::postMessage_l(
sp<ALooper> looper = info.mLooper.promote();
if (looper == NULL) {
- LOGW("failed to post message. "
+ ALOGW("failed to post message. "
"Target handler %d still registered, but object gone.",
msg->target());
@@ -113,7 +113,7 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
ssize_t index = mHandlers.indexOfKey(msg->target());
if (index < 0) {
- LOGW("failed to deliver message. Target handler not registered.");
+ ALOGW("failed to deliver message. Target handler not registered.");
return;
}
@@ -121,7 +121,7 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
handler = info.mHandler.promote();
if (handler == NULL) {
- LOGW("failed to deliver message. "
+ ALOGW("failed to deliver message. "
"Target handler %d registered, but object gone.",
msg->target());
diff --git a/media/libstagefright/foundation/AMessage.cpp b/media/libstagefright/foundation/AMessage.cpp
index f039bc13ef6c..0a6776ef5130 100644
--- a/media/libstagefright/foundation/AMessage.cpp
+++ b/media/libstagefright/foundation/AMessage.cpp
@@ -471,7 +471,7 @@ sp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
default:
{
- LOGE("This type of object cannot cross process boundaries.");
+ ALOGE("This type of object cannot cross process boundaries.");
TRESPASS();
}
}
@@ -535,7 +535,7 @@ void AMessage::writeToParcel(Parcel *parcel) const {
default:
{
- LOGE("This type of object cannot cross process boundaries.");
+ ALOGE("This type of object cannot cross process boundaries.");
TRESPASS();
}
}
diff --git a/media/libstagefright/foundation/hexdump.cpp b/media/libstagefright/foundation/hexdump.cpp
index 9f6bf9e1a2db..16c1ca517c31 100644
--- a/media/libstagefright/foundation/hexdump.cpp
+++ b/media/libstagefright/foundation/hexdump.cpp
@@ -67,7 +67,7 @@ void hexdump(const void *_data, size_t size) {
}
}
- LOGI("%s", line.c_str());
+ ALOGI("%s", line.c_str());
offset += 16;
}
diff --git a/media/libstagefright/httplive/LiveDataSource.cpp b/media/libstagefright/httplive/LiveDataSource.cpp
index 5f5c6d4be800..7560642a72f5 100644
--- a/media/libstagefright/httplive/LiveDataSource.cpp
+++ b/media/libstagefright/httplive/LiveDataSource.cpp
@@ -59,7 +59,7 @@ ssize_t LiveDataSource::readAtNonBlocking(
Mutex::Autolock autoLock(mLock);
if (offset != mOffset) {
- LOGE("Attempt at reading non-sequentially from LiveDataSource.");
+ ALOGE("Attempt at reading non-sequentially from LiveDataSource.");
return -EPIPE;
}
@@ -89,7 +89,7 @@ ssize_t LiveDataSource::readAt(off64_t offset, void *data, size_t size) {
ssize_t LiveDataSource::readAt_l(off64_t offset, void *data, size_t size) {
if (offset != mOffset) {
- LOGE("Attempt at reading non-sequentially from LiveDataSource.");
+ ALOGE("Attempt at reading non-sequentially from LiveDataSource.");
return -EPIPE;
}
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp
index 6f4b8757d40b..0cddd2e7e4ee 100644
--- a/media/libstagefright/httplive/LiveSession.cpp
+++ b/media/libstagefright/httplive/LiveSession.cpp
@@ -168,9 +168,9 @@ void LiveSession::onConnect(const sp<AMessage> &msg) {
}
if (!(mFlags & kFlagIncognito)) {
- LOGI("onConnect '%s'", url.c_str());
+ ALOGI("onConnect '%s'", url.c_str());
} else {
- LOGI("onConnect <URL suppressed>");
+ ALOGI("onConnect <URL suppressed>");
}
mMasterURL = url;
@@ -179,7 +179,7 @@ void LiveSession::onConnect(const sp<AMessage> &msg) {
sp<M3UParser> playlist = fetchPlaylist(url.c_str(), &dummy);
if (playlist == NULL) {
- LOGE("unable to fetch master playlist '%s'.", url.c_str());
+ ALOGE("unable to fetch master playlist '%s'.", url.c_str());
mDataSource->queueEOS(ERROR_IO);
return;
@@ -207,7 +207,7 @@ void LiveSession::onConnect(const sp<AMessage> &msg) {
}
void LiveSession::onDisconnect() {
- LOGI("onDisconnect");
+ ALOGI("onDisconnect");
mDataSource->queueEOS(ERROR_END_OF_STREAM);
@@ -360,7 +360,7 @@ sp<M3UParser> LiveSession::fetchPlaylist(const char *url, bool *unchanged) {
new M3UParser(url, buffer->data(), buffer->size());
if (playlist->initCheck() != OK) {
- LOGE("failed to parse .m3u8 playlist");
+ ALOGE("failed to parse .m3u8 playlist");
return NULL;
}
@@ -531,7 +531,7 @@ rinse_repeat:
// We succeeded in fetching the playlist, but it was
// unchanged from the last time we tried.
} else {
- LOGE("failed to load playlist at url '%s'", url.c_str());
+ ALOGE("failed to load playlist at url '%s'", url.c_str());
mDataSource->queueEOS(ERROR_IO);
return;
}
@@ -596,7 +596,7 @@ rinse_repeat:
int32_t newSeqNumber = firstSeqNumberInPlaylist + index;
if (newSeqNumber != mSeqNumber) {
- LOGI("seeking to seq no %d", newSeqNumber);
+ ALOGI("seeking to seq no %d", newSeqNumber);
mSeqNumber = newSeqNumber;
@@ -633,7 +633,7 @@ rinse_repeat:
if (mPrevBandwidthIndex != (ssize_t)bandwidthIndex) {
// Go back to the previous bandwidth.
- LOGI("new bandwidth does not have the sequence number "
+ ALOGI("new bandwidth does not have the sequence number "
"we're looking for, switching back to previous bandwidth");
mLastPlaylistFetchTimeUs = -1;
@@ -653,13 +653,13 @@ rinse_repeat:
// we've missed the boat, let's start from the lowest sequence
// number available and signal a discontinuity.
- LOGI("We've missed the boat, restarting playback.");
+ ALOGI("We've missed the boat, restarting playback.");
mSeqNumber = lastSeqNumberInPlaylist;
explicitDiscontinuity = true;
// fall through
} else {
- LOGE("Cannot find sequence number %d in playlist "
+ ALOGE("Cannot find sequence number %d in playlist "
"(contains %d - %d)",
mSeqNumber, firstSeqNumberInPlaylist,
firstSeqNumberInPlaylist + mPlaylist->size() - 1);
@@ -693,7 +693,7 @@ rinse_repeat:
sp<ABuffer> buffer;
status_t err = fetchFile(uri.c_str(), &buffer, range_offset, range_length);
if (err != OK) {
- LOGE("failed to fetch .ts segment at url '%s'", uri.c_str());
+ ALOGE("failed to fetch .ts segment at url '%s'", uri.c_str());
mDataSource->queueEOS(err);
return;
}
@@ -703,7 +703,7 @@ rinse_repeat:
err = decryptBuffer(mSeqNumber - firstSeqNumberInPlaylist, buffer);
if (err != OK) {
- LOGE("decryptBuffer failed w/ error %d", err);
+ ALOGE("decryptBuffer failed w/ error %d", err);
mDataSource->queueEOS(err);
return;
@@ -712,7 +712,7 @@ rinse_repeat:
if (buffer->size() == 0 || buffer->data()[0] != 0x47) {
// Not a transport stream???
- LOGE("This doesn't look like a transport stream...");
+ ALOGE("This doesn't look like a transport stream...");
mBandwidthItems.removeAt(bandwidthIndex);
@@ -721,7 +721,7 @@ rinse_repeat:
return;
}
- LOGI("Retrying with a different bandwidth stream.");
+ ALOGI("Retrying with a different bandwidth stream.");
mLastPlaylistFetchTimeUs = -1;
bandwidthIndex = getBandwidthIndex();
@@ -744,7 +744,7 @@ rinse_repeat:
if (seekDiscontinuity || explicitDiscontinuity || bandwidthChanged) {
// Signal discontinuity.
- LOGI("queueing discontinuity (seek=%d, explicit=%d, bandwidthChanged=%d)",
+ ALOGI("queueing discontinuity (seek=%d, explicit=%d, bandwidthChanged=%d)",
seekDiscontinuity, explicitDiscontinuity, bandwidthChanged);
sp<ABuffer> tmp = new ABuffer(188);
@@ -796,13 +796,13 @@ status_t LiveSession::decryptBuffer(
if (method == "NONE") {
return OK;
} else if (!(method == "AES-128")) {
- LOGE("Unsupported cipher method '%s'", method.c_str());
+ ALOGE("Unsupported cipher method '%s'", method.c_str());
return ERROR_UNSUPPORTED;
}
AString keyURI;
if (!itemMeta->findString("cipher-uri", &keyURI)) {
- LOGE("Missing key uri");
+ ALOGE("Missing key uri");
return ERROR_MALFORMED;
}
@@ -844,7 +844,7 @@ status_t LiveSession::decryptBuffer(
}
if (err != OK) {
- LOGE("failed to fetch cipher key from '%s'.", keyURI.c_str());
+ ALOGE("failed to fetch cipher key from '%s'.", keyURI.c_str());
return ERROR_IO;
}
@@ -853,7 +853,7 @@ status_t LiveSession::decryptBuffer(
AES_KEY aes_key;
if (AES_set_decrypt_key(key->data(), 128, &aes_key) != 0) {
- LOGE("failed to set AES decryption key.");
+ ALOGE("failed to set AES decryption key.");
return UNKNOWN_ERROR;
}
@@ -863,7 +863,7 @@ status_t LiveSession::decryptBuffer(
if (itemMeta->findString("cipher-iv", &iv)) {
if ((!iv.startsWith("0x") && !iv.startsWith("0X"))
|| iv.size() != 16 * 2 + 2) {
- LOGE("malformed cipher IV '%s'.", iv.c_str());
+ ALOGE("malformed cipher IV '%s'.", iv.c_str());
return ERROR_MALFORMED;
}
@@ -872,7 +872,7 @@ status_t LiveSession::decryptBuffer(
char c1 = tolower(iv.c_str()[2 + 2 * i]);
char c2 = tolower(iv.c_str()[3 + 2 * i]);
if (!isxdigit(c1) || !isxdigit(c2)) {
- LOGE("malformed cipher IV '%s'.", iv.c_str());
+ ALOGE("malformed cipher IV '%s'.", iv.c_str());
return ERROR_MALFORMED;
}
uint8_t nibble1 = isdigit(c1) ? c1 - '0' : c1 - 'a' + 10;
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp
index a50970e96f52..7d3cf0543376 100644
--- a/media/libstagefright/httplive/M3UParser.cpp
+++ b/media/libstagefright/httplive/M3UParser.cpp
@@ -169,7 +169,7 @@ status_t M3UParser::parse(const void *_data, size_t size) {
line.setTo(&data[offset], offsetLF - offset);
}
- // LOGI("#%s#", line.c_str());
+ // ALOGI("#%s#", line.c_str());
if (line.empty()) {
offset = offsetLF + 1;
@@ -451,7 +451,7 @@ status_t M3UParser::parseCipherInfo(
if (MakeURL(baseURI.c_str(), val.c_str(), &absURI)) {
val = absURI;
} else {
- LOGE("failed to make absolute url for '%s'.",
+ ALOGE("failed to make absolute url for '%s'.",
val.c_str());
}
}
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp
index 943a937bfa35..6dde9d8201a6 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -129,7 +129,7 @@ struct id3_header {
}
if (size > kMaxMetadataSize) {
- LOGE("skipping huge ID3 metadata of size %d", size);
+ ALOGE("skipping huge ID3 metadata of size %d", size);
return false;
}
diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp
index 474c794665c7..4fbf47ee979c 100644
--- a/media/libstagefright/matroska/MatroskaExtractor.cpp
+++ b/media/libstagefright/matroska/MatroskaExtractor.cpp
@@ -245,7 +245,7 @@ void BlockIterator::advance_l() {
if (res < 0) {
// I/O error
- LOGE("Cluster::Parse returned result %ld", res);
+ ALOGE("Cluster::Parse returned result %ld", res);
mCluster = NULL;
break;
@@ -563,7 +563,7 @@ MatroskaExtractor::MatroskaExtractor(const sp<DataSource> &source)
#if 0
const mkvparser::SegmentInfo *info = mSegment->GetInfo();
- LOGI("muxing app: %s, writing app: %s",
+ ALOGI("muxing app: %s, writing app: %s",
info->GetMuxingAppAsUTF8(),
info->GetWritingAppAsUTF8());
#endif
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index da911e46d007..3f4de1fd30dc 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -282,7 +282,7 @@ status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
ssize_t index = mStreams.indexOfKey(info.mPID);
if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
- LOGI("uh oh. stream PIDs have changed.");
+ ALOGI("uh oh. stream PIDs have changed.");
PIDsChanged = true;
break;
}
@@ -290,18 +290,18 @@ status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
if (PIDsChanged) {
#if 0
- LOGI("before:");
+ ALOGI("before:");
for (size_t i = 0; i < mStreams.size(); ++i) {
sp<Stream> stream = mStreams.editValueAt(i);
- LOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
+ ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
}
- LOGI("after:");
+ ALOGI("after:");
for (size_t i = 0; i < infos.size(); ++i) {
StreamInfo &info = infos.editItemAt(i);
- LOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
+ ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
}
#endif
@@ -340,7 +340,7 @@ status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
}
if (!success) {
- LOGI("Stream PIDs changed and we cannot recover.");
+ ALOGI("Stream PIDs changed and we cannot recover.");
return ERROR_MALFORMED;
}
}
@@ -475,7 +475,7 @@ status_t ATSParser::Stream::parse(
// Increment in multiples of 64K.
neededSize = (neededSize + 65535) & ~65535;
- LOGI("resizing buffer to %d bytes", neededSize);
+ ALOGI("resizing buffer to %d bytes", neededSize);
sp<ABuffer> newBuffer = new ABuffer(neededSize);
memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
@@ -634,7 +634,7 @@ status_t ATSParser::Stream::parsePES(ABitReader *br) {
CHECK_EQ(br->getBits(1), 1u);
ALOGV("PTS = %llu", PTS);
- // LOGI("PTS = %.2f secs", PTS / 90000.0f);
+ // ALOGI("PTS = %.2f secs", PTS / 90000.0f);
optional_bytes_remaining -= 5;
@@ -697,7 +697,7 @@ status_t ATSParser::Stream::parsePES(ABitReader *br) {
PES_packet_length - 3 - PES_header_data_length;
if (br->numBitsLeft() < dataLength * 8) {
- LOGE("PES packet does not carry enough data to contain "
+ ALOGE("PES packet does not carry enough data to contain "
"payload. (numBitsLeft = %d, required = %d)",
br->numBitsLeft(), dataLength * 8);
@@ -968,7 +968,7 @@ status_t ATSParser::parseTS(ABitReader *br) {
unsigned continuity_counter = br->getBits(4);
ALOGV("continuity_counter = %u", continuity_counter);
- // LOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
+ // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
if (adaptation_field_control == 2 || adaptation_field_control == 3) {
parseAdaptationField(br);
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index edb423202efd..7fd99a803243 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -144,7 +144,7 @@ status_t ElementaryStreamQueue::appendData(
}
if (startOffset > 0) {
- LOGI("found something resembling an H.264/MPEG syncword at "
+ ALOGI("found something resembling an H.264/MPEG syncword at "
"offset %ld",
startOffset);
}
@@ -177,7 +177,7 @@ status_t ElementaryStreamQueue::appendData(
}
if (startOffset > 0) {
- LOGI("found something resembling an H.264/MPEG syncword at "
+ ALOGI("found something resembling an H.264/MPEG syncword at "
"offset %ld",
startOffset);
}
@@ -210,7 +210,7 @@ status_t ElementaryStreamQueue::appendData(
}
if (startOffset > 0) {
- LOGI("found something resembling an AAC syncword at offset %ld",
+ ALOGI("found something resembling an AAC syncword at offset %ld",
startOffset);
}
@@ -237,7 +237,7 @@ status_t ElementaryStreamQueue::appendData(
}
if (startOffset > 0) {
- LOGI("found something resembling an MPEG audio "
+ ALOGI("found something resembling an MPEG audio "
"syncword at offset %ld",
startOffset);
}
@@ -280,7 +280,7 @@ status_t ElementaryStreamQueue::appendData(
#if 0
if (mMode == AAC) {
- LOGI("size = %d, timeUs = %.2f secs", size, timeUs / 1E6);
+ ALOGI("size = %d, timeUs = %.2f secs", size, timeUs / 1E6);
hexdump(data, size);
}
#endif
@@ -337,7 +337,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
CHECK(mFormat->findInt32(kKeySampleRate, &sampleRate));
CHECK(mFormat->findInt32(kKeyChannelCount, &numChannels));
- LOGI("found AAC codec config (%d Hz, %d channels)",
+ ALOGI("found AAC codec config (%d Hz, %d channels)",
sampleRate, numChannels);
} else {
// profile_ObjectType, sampling_frequency_index, private_bits,
@@ -408,7 +408,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
if (timeUs >= 0) {
accessUnit->meta()->setInt64("timeUs", timeUs);
} else {
- LOGW("no time for AAC access unit");
+ ALOGW("no time for AAC access unit");
}
return accessUnit;
@@ -714,7 +714,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEGVideo() {
mFormat->setInt32(kKeyWidth, width);
mFormat->setInt32(kKeyHeight, height);
- LOGI("found MPEG2 video codec config (%d x %d)", width, height);
+ ALOGI("found MPEG2 video codec config (%d x %d)", width, height);
sp<ABuffer> csd = new ABuffer(offset);
memcpy(csd->data(), data, offset);
@@ -880,7 +880,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEG4Video() {
mFormat->setInt32(kKeyWidth, width);
mFormat->setInt32(kKeyHeight, height);
- LOGI("found MPEG4 video codec config (%d x %d)",
+ ALOGI("found MPEG4 video codec config (%d x %d)",
width, height);
sp<ABuffer> csd = new ABuffer(offset);
diff --git a/media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp b/media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp
index df30a9cc7738..dd714c9933aa 100644
--- a/media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp
+++ b/media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp
@@ -315,7 +315,7 @@ ssize_t MPEG2PSExtractor::dequeuePES() {
unsigned descriptor_tag = br.getBits(8);
unsigned descriptor_length = br.getBits(8);
- LOGI("found descriptor tag 0x%02x of length %u",
+ ALOGI("found descriptor tag 0x%02x of length %u",
descriptor_tag, descriptor_length);
if (offset + 2 + descriptor_length > program_stream_info_length) {
@@ -338,7 +338,7 @@ ssize_t MPEG2PSExtractor::dequeuePES() {
unsigned stream_type = br.getBits(8);
unsigned elementary_stream_id = br.getBits(8);
- LOGI("elementary stream id 0x%02x has stream type 0x%02x",
+ ALOGI("elementary stream id 0x%02x has stream type 0x%02x",
elementary_stream_id, stream_type);
mStreamTypeByESID.add(elementary_stream_id, stream_type);
@@ -409,7 +409,7 @@ ssize_t MPEG2PSExtractor::dequeuePES() {
CHECK_EQ(br.getBits(1), 1u);
ALOGV("PTS = %llu", PTS);
- // LOGI("PTS = %.2f secs", PTS / 90000.0f);
+ // ALOGI("PTS = %.2f secs", PTS / 90000.0f);
optional_bytes_remaining -= 5;
@@ -471,7 +471,7 @@ ssize_t MPEG2PSExtractor::dequeuePES() {
PES_packet_length - 3 - PES_header_data_length;
if (br.numBitsLeft() < dataLength * 8) {
- LOGE("PES packet does not carry enough data to contain "
+ ALOGE("PES packet does not carry enough data to contain "
"payload. (numBitsLeft = %d, required = %d)",
br.numBitsLeft(), dataLength * 8);
@@ -568,7 +568,7 @@ MPEG2PSExtractor::Track::Track(
if (supported) {
mQueue = new ElementaryStreamQueue(mode);
} else {
- LOGI("unsupported stream ID 0x%02x", stream_id);
+ ALOGI("unsupported stream ID 0x%02x", stream_id);
}
}
diff --git a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
index 17cf45ad8b12..03033f51e4d9 100644
--- a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
+++ b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
@@ -199,7 +199,7 @@ void MPEG2TSExtractor::init() {
}
}
- LOGI("haveAudio=%d, haveVideo=%d", haveAudio, haveVideo);
+ ALOGI("haveAudio=%d, haveVideo=%d", haveAudio, haveVideo);
}
status_t MPEG2TSExtractor::feedMore() {
diff --git a/media/libstagefright/omx/OMXMaster.cpp b/media/libstagefright/omx/OMXMaster.cpp
index c8278ab216db..d69893935fa0 100644
--- a/media/libstagefright/omx/OMXMaster.cpp
+++ b/media/libstagefright/omx/OMXMaster.cpp
@@ -81,7 +81,7 @@ void OMXMaster::addPlugin(OMXPluginBase *plugin) {
String8 name8(name);
if (mPluginByComponentName.indexOfKey(name8) >= 0) {
- LOGE("A component of name '%s' already exists, ignoring this one.",
+ ALOGE("A component of name '%s' already exists, ignoring this one.",
name8.string());
continue;
@@ -91,7 +91,7 @@ void OMXMaster::addPlugin(OMXPluginBase *plugin) {
}
if (err != OMX_ErrorNoMore) {
- LOGE("OMX plugin failed w/ error 0x%08x after registering %d "
+ ALOGE("OMX plugin failed w/ error 0x%08x after registering %d "
"components", err, mPluginByComponentName.size());
}
}
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 802c4291e472..8938e3311beb 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -150,7 +150,7 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
&& state != OMX_StateIdle
&& state != OMX_StateInvalid) {
if (++iteration > kMaxNumIterations) {
- LOGE("component failed to enter Idle state, aborting.");
+ ALOGE("component failed to enter Idle state, aborting.");
state = OMX_StateInvalid;
break;
}
@@ -179,7 +179,7 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
&& state != OMX_StateLoaded
&& state != OMX_StateInvalid) {
if (++iteration > kMaxNumIterations) {
- LOGE("component failed to enter Loaded state, aborting.");
+ ALOGE("component failed to enter Loaded state, aborting.");
state = OMX_StateInvalid;
break;
}
@@ -209,7 +209,7 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
mHandle = NULL;
if (err != OMX_ErrorNone) {
- LOGE("FreeHandle FAILED with error 0x%08x.", err);
+ ALOGE("FreeHandle FAILED with error 0x%08x.", err);
}
mOwner->invalidateNodeID(mNodeID);
@@ -285,7 +285,7 @@ status_t OMXNodeInstance::enableGraphicBuffers(
&index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex failed");
+ ALOGE("OMX_GetExtensionIndex failed");
return StatusFromOMXError(err);
}
@@ -302,7 +302,7 @@ status_t OMXNodeInstance::enableGraphicBuffers(
err = OMX_SetParameter(mHandle, index, &params);
if (err != OMX_ErrorNone) {
- LOGE("OMX_EnableAndroidNativeBuffers failed with error %d (0x%08x)",
+ ALOGE("OMX_EnableAndroidNativeBuffers failed with error %d (0x%08x)",
err, err);
return UNKNOWN_ERROR;
@@ -323,7 +323,7 @@ status_t OMXNodeInstance::getGraphicBufferUsage(
&index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex failed");
+ ALOGE("OMX_GetExtensionIndex failed");
return StatusFromOMXError(err);
}
@@ -340,7 +340,7 @@ status_t OMXNodeInstance::getGraphicBufferUsage(
err = OMX_GetParameter(mHandle, index, &params);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetAndroidNativeBufferUsage failed with error %d (0x%08x)",
+ ALOGE("OMX_GetAndroidNativeBufferUsage failed with error %d (0x%08x)",
err, err);
return UNKNOWN_ERROR;
}
@@ -361,7 +361,7 @@ status_t OMXNodeInstance::storeMetaDataInBuffers(
OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex %s failed", name);
+ ALOGE("OMX_GetExtensionIndex %s failed", name);
return StatusFromOMXError(err);
}
@@ -375,7 +375,7 @@ status_t OMXNodeInstance::storeMetaDataInBuffers(
params.nPortIndex = portIndex;
params.bStoreMetaData = enable;
if ((err = OMX_SetParameter(mHandle, index, &params)) != OMX_ErrorNone) {
- LOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err);
+ ALOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err);
return UNKNOWN_ERROR;
}
return err;
@@ -395,7 +395,7 @@ status_t OMXNodeInstance::useBuffer(
params->size(), static_cast<OMX_U8 *>(params->pointer()));
if (err != OMX_ErrorNone) {
- LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
+ ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
delete buffer_meta;
buffer_meta = NULL;
@@ -429,7 +429,7 @@ status_t OMXNodeInstance::useGraphicBuffer2_l(
OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def);
if (err != OMX_ErrorNone)
{
- LOGE("%s::%d:Error getting OMX_IndexParamPortDefinition", __FUNCTION__, __LINE__);
+ ALOGE("%s::%d:Error getting OMX_IndexParamPortDefinition", __FUNCTION__, __LINE__);
return err;
}
@@ -448,7 +448,7 @@ status_t OMXNodeInstance::useGraphicBuffer2_l(
bufferHandle);
if (err != OMX_ErrorNone) {
- LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
+ ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
delete bufferMeta;
bufferMeta = NULL;
*buffer = 0;
@@ -488,7 +488,7 @@ status_t OMXNodeInstance::useGraphicBuffer(
&index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex failed");
+ ALOGE("OMX_GetExtensionIndex failed");
return StatusFromOMXError(err);
}
@@ -510,7 +510,7 @@ status_t OMXNodeInstance::useGraphicBuffer(
err = OMX_SetParameter(mHandle, index, &params);
if (err != OMX_ErrorNone) {
- LOGE("OMX_UseAndroidNativeBuffer failed with error %d (0x%08x)", err,
+ ALOGE("OMX_UseAndroidNativeBuffer failed with error %d (0x%08x)", err,
err);
delete bufferMeta;
@@ -543,7 +543,7 @@ status_t OMXNodeInstance::allocateBuffer(
mHandle, &header, portIndex, buffer_meta, size);
if (err != OMX_ErrorNone) {
- LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
+ ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
delete buffer_meta;
buffer_meta = NULL;
@@ -576,7 +576,7 @@ status_t OMXNodeInstance::allocateBufferWithBackup(
mHandle, &header, portIndex, buffer_meta, params->size());
if (err != OMX_ErrorNone) {
- LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
+ ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
delete buffer_meta;
buffer_meta = NULL;
@@ -672,7 +672,7 @@ void OMXNodeInstance::onMessage(const omx_message &msg) {
}
void OMXNodeInstance::onObserverDied(OMXMaster *master) {
- LOGE("!!! Observer died. Quickly, do something, ... anything...");
+ ALOGE("!!! Observer died. Quickly, do something, ... anything...");
// Try to force shutdown of the node and hope for the best.
freeNode(master);
@@ -742,7 +742,7 @@ void OMXNodeInstance::removeActiveBuffer(
}
if (!found) {
- LOGW("Attempt to remove an active buffer we know nothing about...");
+ ALOGW("Attempt to remove an active buffer we know nothing about...");
}
}
diff --git a/media/libstagefright/omx/SoftOMXPlugin.cpp b/media/libstagefright/omx/SoftOMXPlugin.cpp
index 8aeb76372a80..da3ae42426db 100644
--- a/media/libstagefright/omx/SoftOMXPlugin.cpp
+++ b/media/libstagefright/omx/SoftOMXPlugin.cpp
@@ -72,7 +72,7 @@ OMX_ERRORTYPE SoftOMXPlugin::makeComponentInstance(
void *libHandle = dlopen(libName.c_str(), RTLD_NOW);
if (libHandle == NULL) {
- LOGE("unable to dlopen %s", libName.c_str());
+ ALOGE("unable to dlopen %s", libName.c_str());
return OMX_ErrorComponentNotFound;
}
diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp
index d4354dba2587..8faf54494aa8 100644
--- a/media/libstagefright/omx/tests/OMXHarness.cpp
+++ b/media/libstagefright/omx/tests/OMXHarness.cpp
@@ -174,7 +174,7 @@ status_t Harness::getPortDefinition(
#define EXPECT(condition, info) \
if (!(condition)) { \
- LOGE(info); printf("\n * " info "\n"); return UNKNOWN_ERROR; \
+ ALOGE(info); printf("\n * " info "\n"); return UNKNOWN_ERROR; \
}
#define EXPECT_SUCCESS(err, info) \
@@ -571,7 +571,7 @@ status_t Harness::testSeek(
const char *mime = GetMimeFromComponentRole(componentRole);
if (!mime) {
- LOGI("Cannot perform seek test with this componentRole (%s)",
+ ALOGI("Cannot perform seek test with this componentRole (%s)",
componentRole);
return OK;
@@ -597,7 +597,7 @@ status_t Harness::testSeek(
int64_t durationUs;
CHECK(source->getFormat()->findInt64(kKeyDuration, &durationUs));
- LOGI("stream duration is %lld us (%.2f secs)",
+ ALOGI("stream duration is %lld us (%.2f secs)",
durationUs, durationUs / 1E6);
static const int32_t kNumIterations = 5000;
@@ -617,19 +617,19 @@ status_t Harness::testSeek(
requestedSeekTimeUs = -1;
- LOGI("requesting linear read");
+ ALOGI("requesting linear read");
} else {
if (i == 0 || r < 0.55) {
// 5% chance of seeking beyond end of stream.
requestedSeekTimeUs = durationUs;
- LOGI("requesting seek beyond EOF");
+ ALOGI("requesting seek beyond EOF");
} else {
requestedSeekTimeUs =
(int64_t)(uniform_rand() * durationUs);
- LOGI("requesting seek to %lld us (%.2f secs)",
+ ALOGI("requesting seek to %lld us (%.2f secs)",
requestedSeekTimeUs, requestedSeekTimeUs / 1E6);
}
@@ -649,7 +649,7 @@ status_t Harness::testSeek(
buffer = NULL;
}
- LOGI("nearest keyframe is at %lld us (%.2f secs)",
+ ALOGI("nearest keyframe is at %lld us (%.2f secs)",
actualSeekTimeUs, actualSeekTimeUs / 1E6);
}
@@ -733,7 +733,7 @@ status_t Harness::testSeek(
status_t Harness::test(
const char *componentName, const char *componentRole) {
printf("testing %s [%s] ... ", componentName, componentRole);
- LOGI("testing %s [%s].", componentName, componentRole);
+ ALOGI("testing %s [%s].", componentName, componentRole);
status_t err1 = testStateTransitions(componentName, componentRole);
status_t err2 = testSeek(componentName, componentRole);
diff --git a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp
index 11d9c220959c..b0c7007c3737 100644
--- a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp
+++ b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp
@@ -196,7 +196,7 @@ static status_t parseAudioSpecificConfig(ABitReader *bits, sp<ABuffer> *asc) {
unsigned syncExtensionType = bits->getBits(11);
if (syncExtensionType == 0x2b7) {
- LOGI("found syncExtension");
+ ALOGI("found syncExtension");
CHECK_EQ(parseAudioObjectType(bits, &extensionAudioObjectType),
(status_t)OK);
@@ -217,7 +217,7 @@ static status_t parseAudioSpecificConfig(ABitReader *bits, sp<ABuffer> *asc) {
// Apparently an extension is always considered an even
// multiple of 8 bits long.
- LOGI("Skipping %d bits after sync extension",
+ ALOGI("Skipping %d bits after sync extension",
8 - (numBitsInExtension & 7));
bits->skipBits(8 - (numBitsInExtension & 7));
@@ -424,7 +424,7 @@ sp<ABuffer> AMPEG4AudioAssembler::removeLATMFraming(const sp<ABuffer> &buffer) {
}
if (offset < buffer->size()) {
- LOGI("ignoring %d bytes of trailing data", buffer->size() - offset);
+ ALOGI("ignoring %d bytes of trailing data", buffer->size() - offset);
}
CHECK_LE(offset, buffer->size());
diff --git a/media/libstagefright/rtsp/APacketSource.cpp b/media/libstagefright/rtsp/APacketSource.cpp
index 3f4cdb5e9bb3..6cf1301934ab 100644
--- a/media/libstagefright/rtsp/APacketSource.cpp
+++ b/media/libstagefright/rtsp/APacketSource.cpp
@@ -193,7 +193,7 @@ static sp<ABuffer> MakeAVCCodecSpecificData(
if (i == 0) {
FindAVCDimensions(nal, width, height);
- LOGI("dimensions %dx%d", *width, *height);
+ ALOGI("dimensions %dx%d", *width, *height);
}
}
@@ -371,7 +371,7 @@ static sp<ABuffer> MakeMPEG4VideoCodecSpecificData(
return NULL;
}
- LOGI("VOL dimensions = %dx%d", *width, *height);
+ ALOGI("VOL dimensions = %dx%d", *width, *height);
size_t len1 = config->size() + GetSizeWidth(config->size()) + 1;
size_t len2 = len1 + GetSizeWidth(len1) + 1 + 13;
diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp
index c5d8740d806f..8c9dd8d3d5ce 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -294,7 +294,7 @@ void ARTPConnection::onPollStreams() {
if (err == -ECONNRESET) {
// socket failure, this stream is dead, Jim.
- LOGW("failed to receive RTP/RTCP datagram.");
+ ALOGW("failed to receive RTP/RTCP datagram.");
it = mStreams.erase(it);
continue;
}
@@ -347,7 +347,7 @@ void ARTPConnection::onPollStreams() {
} while (n < 0 && errno == EINTR);
if (n <= 0) {
- LOGW("failed to send RTCP receiver report (%s).",
+ ALOGW("failed to send RTCP receiver report (%s).",
n == 0 ? "connection gone" : strerror(errno));
it = mStreams.erase(it);
@@ -396,7 +396,7 @@ status_t ARTPConnection::receive(StreamInfo *s, bool receiveRTP) {
buffer->setRange(0, nbytes);
- // LOGI("received %d bytes.", buffer->size());
+ // ALOGI("received %d bytes.", buffer->size());
status_t err;
if (receiveRTP) {
@@ -561,7 +561,7 @@ status_t ARTPConnection::parseRTCP(StreamInfo *s, const sp<ABuffer> &buffer) {
default:
{
- LOGW("Unknown RTCP packet type %u of size %d",
+ ALOGW("Unknown RTCP packet type %u of size %d",
(unsigned)data[1], headerLength);
break;
}
@@ -606,7 +606,7 @@ status_t ARTPConnection::parseSR(
uint32_t rtpTime = u32at(&data[16]);
#if 0
- LOGI("XXX timeUpdate: ssrc=0x%08x, rtpTime %u == ntpTime %.3f",
+ ALOGI("XXX timeUpdate: ssrc=0x%08x, rtpTime %u == ntpTime %.3f",
id,
rtpTime,
(ntpTime >> 32) + (double)(ntpTime & 0xffffffff) / (1ll << 32));
diff --git a/media/libstagefright/rtsp/ARTPSession.cpp b/media/libstagefright/rtsp/ARTPSession.cpp
index c6bcb1225a77..7a05b888f630 100644
--- a/media/libstagefright/rtsp/ARTPSession.cpp
+++ b/media/libstagefright/rtsp/ARTPSession.cpp
@@ -53,24 +53,24 @@ status_t ARTPSession::setup(const sp<ASessionDescription> &desc) {
if (!mDesc->findAttribute(i, "c=", &connection)) {
// No per-stream connection information, try global fallback.
if (!mDesc->findAttribute(0, "c=", &connection)) {
- LOGE("Unable to find connection attribute.");
+ ALOGE("Unable to find connection attribute.");
return mInitCheck;
}
}
if (!(connection == "IN IP4 127.0.0.1")) {
- LOGE("We only support localhost connections for now.");
+ ALOGE("We only support localhost connections for now.");
return mInitCheck;
}
unsigned port;
if (!validateMediaFormat(i, &port) || (port & 1) != 0) {
- LOGE("Invalid media format.");
+ ALOGE("Invalid media format.");
return mInitCheck;
}
sp<APacketSource> source = new APacketSource(mDesc, i);
if (source->initCheck() != OK) {
- LOGE("Unsupported format.");
+ ALOGE("Unsupported format.");
return mInitCheck;
}
@@ -159,7 +159,7 @@ void ARTPSession::onMessageReceived(const sp<AMessage> &msg) {
printf("access unit complete size=%d\tntp-time=0x%016llx\n",
accessUnit->size(), ntpTime);
#else
- LOGI("access unit complete, size=%d, ntp-time=%llu",
+ ALOGI("access unit complete, size=%d, ntp-time=%llu",
accessUnit->size(), ntpTime);
hexdump(accessUnit->data(), accessUnit->size());
#endif
@@ -170,7 +170,7 @@ void ARTPSession::onMessageReceived(const sp<AMessage> &msg) {
CHECK(!memcmp("\x00\x00\x00\x01", accessUnit->data(), 4));
unsigned x = accessUnit->data()[4];
- LOGI("access unit complete: nalType=0x%02x, nalRefIdc=0x%02x",
+ ALOGI("access unit complete: nalType=0x%02x, nalRefIdc=0x%02x",
x & 0x1f, (x & 0x60) >> 5);
#endif
@@ -181,7 +181,7 @@ void ARTPSession::onMessageReceived(const sp<AMessage> &msg) {
int32_t damaged;
if (accessUnit->meta()->findInt32("damaged", &damaged)
&& damaged != 0) {
- LOGI("ignoring damaged AU");
+ ALOGI("ignoring damaged AU");
} else
#endif
{
diff --git a/media/libstagefright/rtsp/ARTPSource.cpp b/media/libstagefright/rtsp/ARTPSource.cpp
index dc5f17ed6f6b..ed687906df8a 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -147,7 +147,7 @@ bool ARTPSource::queuePacket(const sp<ABuffer> &buffer) {
}
if (it != mQueue.end() && (uint32_t)(*it)->int32Data() == seqNum) {
- LOGW("Discarding duplicate buffer");
+ ALOGW("Discarding duplicate buffer");
return false;
}
@@ -174,7 +174,7 @@ void ARTPSource::addFIR(const sp<ABuffer> &buffer) {
mLastFIRRequestUs = nowUs;
if (buffer->size() + 20 > buffer->capacity()) {
- LOGW("RTCP buffer too small to accomodate FIR.");
+ ALOGW("RTCP buffer too small to accomodate FIR.");
return;
}
@@ -212,7 +212,7 @@ void ARTPSource::addFIR(const sp<ABuffer> &buffer) {
void ARTPSource::addReceiverReport(const sp<ABuffer> &buffer) {
if (buffer->size() + 32 > buffer->capacity()) {
- LOGW("RTCP buffer too small to accomodate RR.");
+ ALOGW("RTCP buffer too small to accomodate RR.");
return;
}
diff --git a/media/libstagefright/rtsp/ARTPWriter.cpp b/media/libstagefright/rtsp/ARTPWriter.cpp
index b602511de736..0d070434aacd 100644
--- a/media/libstagefright/rtsp/ARTPWriter.cpp
+++ b/media/libstagefright/rtsp/ARTPWriter.cpp
@@ -269,7 +269,7 @@ void ARTPWriter::onRead(const sp<AMessage> &msg) {
status_t err = mSource->read(&mediaBuf);
if (err != OK) {
- LOGI("reached EOS.");
+ ALOGI("reached EOS.");
Mutex::Autolock autoLock(mLock);
mFlags |= kFlagEOS;
@@ -520,7 +520,7 @@ void ARTPWriter::dumpSessionDesc() {
sdp.append("a=fmtp:" PT_STR " octed-align\r\n");
}
- LOGI("%s", sdp.c_str());
+ ALOGI("%s", sdp.c_str());
}
void ARTPWriter::makeH264SPropParamSets(MediaBuffer *buffer) {
diff --git a/media/libstagefright/rtsp/ARTSPConnection.cpp b/media/libstagefright/rtsp/ARTSPConnection.cpp
index d8107bcc38bb..80a010e2f466 100644
--- a/media/libstagefright/rtsp/ARTSPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTSPConnection.cpp
@@ -55,7 +55,7 @@ ARTSPConnection::ARTSPConnection(bool uidValid, uid_t uid)
ARTSPConnection::~ARTSPConnection() {
if (mSocket >= 0) {
- LOGE("Connection is still open, closing the socket.");
+ ALOGE("Connection is still open, closing the socket.");
if (mUIDValid) {
HTTPBase::UnRegisterSocketUserTag(mSocket);
}
@@ -235,7 +235,7 @@ void ARTSPConnection::onConnect(const sp<AMessage> &msg) {
// right here, since we currently have no way of asking the user
// for this information.
- LOGE("Malformed rtsp url %s", url.c_str());
+ ALOGE("Malformed rtsp url %s", url.c_str());
reply->setInt32("result", ERROR_MALFORMED);
reply->post();
@@ -250,7 +250,7 @@ void ARTSPConnection::onConnect(const sp<AMessage> &msg) {
struct hostent *ent = gethostbyname(host.c_str());
if (ent == NULL) {
- LOGE("Unknown host %s", host.c_str());
+ ALOGE("Unknown host %s", host.c_str());
reply->setInt32("result", -ENOENT);
reply->post();
@@ -376,7 +376,7 @@ void ARTSPConnection::onCompleteConnection(const sp<AMessage> &msg) {
CHECK_EQ(optionLen, (socklen_t)sizeof(err));
if (err != 0) {
- LOGE("err = %d (%s)", err, strerror(err));
+ ALOGE("err = %d (%s)", err, strerror(err));
reply->setInt32("result", -err);
@@ -446,12 +446,12 @@ void ARTSPConnection::onSendRequest(const sp<AMessage> &msg) {
if (n == 0) {
// Server closed the connection.
- LOGE("Server unexpectedly closed the connection.");
+ ALOGE("Server unexpectedly closed the connection.");
reply->setInt32("result", ERROR_IO);
reply->post();
} else {
- LOGE("Error sending rtsp request. (%s)", strerror(errno));
+ ALOGE("Error sending rtsp request. (%s)", strerror(errno));
reply->setInt32("result", -errno);
reply->post();
}
@@ -536,10 +536,10 @@ status_t ARTSPConnection::receive(void *data, size_t size) {
if (n == 0) {
// Server closed the connection.
- LOGE("Server unexpectedly closed the connection.");
+ ALOGE("Server unexpectedly closed the connection.");
return ERROR_IO;
} else {
- LOGE("Error reading rtsp response. (%s)", strerror(errno));
+ ALOGE("Error reading rtsp response. (%s)", strerror(errno));
return -errno;
}
}
@@ -615,7 +615,7 @@ bool ARTSPConnection::receiveRTSPReponse() {
notify->setObject("buffer", buffer);
notify->post();
} else {
- LOGW("received binary data, but no one cares.");
+ ALOGW("received binary data, but no one cares.");
}
return true;
@@ -624,7 +624,7 @@ bool ARTSPConnection::receiveRTSPReponse() {
sp<ARTSPResponse> response = new ARTSPResponse;
response->mStatusLine = statusLine;
- LOGI("status: %s", response->mStatusLine.c_str());
+ ALOGI("status: %s", response->mStatusLine.c_str());
ssize_t space1 = response->mStatusLine.find(" ");
if (space1 < 0) {
@@ -740,7 +740,7 @@ bool ARTSPConnection::receiveRTSPReponse() {
msg->setMessage("reply", reply);
msg->setString("request", request.c_str(), request.size());
- LOGI("re-sending request with authentication headers...");
+ ALOGI("re-sending request with authentication headers...");
onSendRequest(msg);
return true;
@@ -793,9 +793,9 @@ bool ARTSPConnection::handleServerRequest(const sp<ARTSPResponse> &request) {
if (n <= 0) {
if (n == 0) {
// Server closed the connection.
- LOGE("Server unexpectedly closed the connection.");
+ ALOGE("Server unexpectedly closed the connection.");
} else {
- LOGE("Error sending rtsp response (%s).", strerror(errno));
+ ALOGE("Error sending rtsp response (%s).", strerror(errno));
}
performDisconnect();
diff --git a/media/libstagefright/rtsp/ASessionDescription.cpp b/media/libstagefright/rtsp/ASessionDescription.cpp
index 56fdd9d3ee77..a9b33308b1ad 100644
--- a/media/libstagefright/rtsp/ASessionDescription.cpp
+++ b/media/libstagefright/rtsp/ASessionDescription.cpp
@@ -80,7 +80,7 @@ bool ASessionDescription::parse(const void *data, size_t size) {
return false;
}
- LOGI("%s", line.c_str());
+ ALOGI("%s", line.c_str());
switch (line.c_str()[0]) {
case 'v':
diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h
index 21ef298bf6ca..2391c5c78f69 100644
--- a/media/libstagefright/rtsp/MyHandler.h
+++ b/media/libstagefright/rtsp/MyHandler.h
@@ -155,7 +155,7 @@ struct MyHandler : public AHandler {
mSessionURL.append(StringPrintf("%u", port));
mSessionURL.append(path);
- LOGI("rewritten session url: '%s'", mSessionURL.c_str());
+ ALOGI("rewritten session url: '%s'", mSessionURL.c_str());
}
mSessionHost = host;
@@ -264,12 +264,12 @@ struct MyHandler : public AHandler {
if (!GetAttribute(transport.c_str(),
"source",
&source)) {
- LOGW("Missing 'source' field in Transport response. Using "
+ ALOGW("Missing 'source' field in Transport response. Using "
"RTSP endpoint address.");
struct hostent *ent = gethostbyname(mSessionHost.c_str());
if (ent == NULL) {
- LOGE("Failed to look up address of session host '%s'",
+ ALOGE("Failed to look up address of session host '%s'",
mSessionHost.c_str());
return false;
@@ -283,7 +283,7 @@ struct MyHandler : public AHandler {
if (!GetAttribute(transport.c_str(),
"server_port",
&server_port)) {
- LOGI("Missing 'server_port' field in Transport response.");
+ ALOGI("Missing 'server_port' field in Transport response.");
return false;
}
@@ -292,7 +292,7 @@ struct MyHandler : public AHandler {
|| rtpPort <= 0 || rtpPort > 65535
|| rtcpPort <=0 || rtcpPort > 65535
|| rtcpPort != rtpPort + 1) {
- LOGE("Server picked invalid RTP/RTCP port pair %s,"
+ ALOGE("Server picked invalid RTP/RTCP port pair %s,"
" RTP port must be even, RTCP port must be one higher.",
server_port.c_str());
@@ -300,7 +300,7 @@ struct MyHandler : public AHandler {
}
if (rtpPort & 1) {
- LOGW("Server picked an odd RTP port, it should've picked an "
+ ALOGW("Server picked an odd RTP port, it should've picked an "
"even one, we'll let it pass for now, but this may break "
"in the future.");
}
@@ -327,7 +327,7 @@ struct MyHandler : public AHandler {
(const sockaddr *)&addr, sizeof(addr));
if (n < (ssize_t)buf->size()) {
- LOGE("failed to poke a hole for RTP packets");
+ ALOGE("failed to poke a hole for RTP packets");
return false;
}
@@ -338,7 +338,7 @@ struct MyHandler : public AHandler {
(const sockaddr *)&addr, sizeof(addr));
if (n < (ssize_t)buf->size()) {
- LOGE("failed to poke a hole for RTCP packets");
+ ALOGE("failed to poke a hole for RTCP packets");
return false;
}
@@ -354,7 +354,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("connection request completed with result %d (%s)",
+ ALOGI("connection request completed with result %d (%s)",
result, strerror(-result));
if (result == OK) {
@@ -392,7 +392,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("DESCRIBE completed with result %d (%s)",
+ ALOGI("DESCRIBE completed with result %d (%s)",
result, strerror(-result));
if (result == OK) {
@@ -429,7 +429,7 @@ struct MyHandler : public AHandler {
response->mContent->size());
if (!mSessionDesc->isValid()) {
- LOGE("Failed to parse session description.");
+ ALOGE("Failed to parse session description.");
result = ERROR_MALFORMED;
} else {
ssize_t i = response->mHeaders.indexOfKey("content-base");
@@ -450,7 +450,7 @@ struct MyHandler : public AHandler {
// it with the absolute session URL to get
// something usable...
- LOGW("Server specified a non-absolute base URL"
+ ALOGW("Server specified a non-absolute base URL"
", combining it with the session URL to "
"get something usable...");
@@ -468,7 +468,7 @@ struct MyHandler : public AHandler {
// The first "track" is merely session meta
// data.
- LOGW("Session doesn't contain any playable "
+ ALOGW("Session doesn't contain any playable "
"tracks. Aborting.");
result = ERROR_UNSUPPORTED;
} else {
@@ -499,7 +499,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("SETUP(%d) completed with result %d (%s)",
+ ALOGI("SETUP(%d) completed with result %d (%s)",
index, result, strerror(-result));
if (result == OK) {
@@ -527,12 +527,12 @@ struct MyHandler : public AHandler {
strtoul(timeoutStr.c_str(), &end, 10);
if (end == timeoutStr.c_str() || *end != '\0') {
- LOGW("server specified malformed timeout '%s'",
+ ALOGW("server specified malformed timeout '%s'",
timeoutStr.c_str());
mKeepAliveTimeoutUs = kDefaultKeepAliveTimeoutUs;
} else if (timeoutSecs < 15) {
- LOGW("server specified too short a timeout "
+ ALOGW("server specified too short a timeout "
"(%lu secs), using default.",
timeoutSecs);
@@ -540,7 +540,7 @@ struct MyHandler : public AHandler {
} else {
mKeepAliveTimeoutUs = timeoutSecs * 1000000ll;
- LOGI("server specified timeout of %lu secs.",
+ ALOGI("server specified timeout of %lu secs.",
timeoutSecs);
}
}
@@ -625,7 +625,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("PLAY completed with result %d (%s)",
+ ALOGI("PLAY completed with result %d (%s)",
result, strerror(-result));
if (result == OK) {
@@ -682,7 +682,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("OPTIONS completed with result %d (%s)",
+ ALOGI("OPTIONS completed with result %d (%s)",
result, strerror(-result));
int32_t generation;
@@ -759,7 +759,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("TEARDOWN completed with result %d (%s)",
+ ALOGI("TEARDOWN completed with result %d (%s)",
result, strerror(-result));
sp<AMessage> reply = new AMessage('disc', id());
@@ -793,11 +793,11 @@ struct MyHandler : public AHandler {
if (mNumAccessUnitsReceived == 0) {
#if 1
- LOGI("stream ended? aborting.");
+ ALOGI("stream ended? aborting.");
(new AMessage('abor', id()))->post();
break;
#else
- LOGI("haven't seen an AU in a looong time.");
+ ALOGI("haven't seen an AU in a looong time.");
#endif
}
@@ -848,7 +848,7 @@ struct MyHandler : public AHandler {
int32_t eos;
if (msg->findInt32("eos", &eos)) {
- LOGI("received BYE on track index %d", trackIndex);
+ ALOGI("received BYE on track index %d", trackIndex);
#if 0
track->mPacketSource->signalEOS(ERROR_END_OF_STREAM);
#endif
@@ -884,7 +884,7 @@ struct MyHandler : public AHandler {
case 'seek':
{
if (!mSeekable) {
- LOGW("This is a live stream, ignoring seek request.");
+ ALOGW("This is a live stream, ignoring seek request.");
sp<AMessage> msg = mNotify->dup();
msg->setInt32("what", kWhatSeekDone);
@@ -961,7 +961,7 @@ struct MyHandler : public AHandler {
int32_t result;
CHECK(msg->findInt32("result", &result));
- LOGI("PLAY completed with result %d (%s)",
+ ALOGI("PLAY completed with result %d (%s)",
result, strerror(-result));
mCheckPending = false;
@@ -983,12 +983,12 @@ struct MyHandler : public AHandler {
ALOGV("rtp-info: %s", response->mHeaders.valueAt(i).c_str());
- LOGI("seek completed.");
+ ALOGI("seek completed.");
}
}
if (result != OK) {
- LOGE("seek failed, aborting.");
+ ALOGE("seek failed, aborting.");
(new AMessage('abor', id()))->post();
}
@@ -1017,7 +1017,7 @@ struct MyHandler : public AHandler {
{
if (!mReceivedFirstRTCPPacket) {
if (mReceivedFirstRTPPacket && !mTryFakeRTCP) {
- LOGW("We received RTP packets but no RTCP packets, "
+ ALOGW("We received RTP packets but no RTCP packets, "
"using fake timestamps.");
mTryFakeRTCP = true;
@@ -1026,7 +1026,7 @@ struct MyHandler : public AHandler {
fakeTimestamps();
} else if (!mReceivedFirstRTPPacket && !mTryTCPInterleaving) {
- LOGW("Never received any data, switching transports.");
+ ALOGW("Never received any data, switching transports.");
mTryTCPInterleaving = true;
@@ -1034,7 +1034,7 @@ struct MyHandler : public AHandler {
msg->setInt32("reconnect", true);
msg->post();
} else {
- LOGW("Never received any data, disconnecting.");
+ ALOGW("Never received any data, disconnecting.");
(new AMessage('abor', id()))->post();
}
}
@@ -1101,7 +1101,7 @@ struct MyHandler : public AHandler {
if (!ASessionDescription::parseNTPRange(val.c_str(), &npt1, &npt2)) {
// This is a live stream and therefore not seekable.
- LOGI("This is a live stream");
+ ALOGI("This is a live stream");
return;
}
@@ -1233,7 +1233,7 @@ private:
new APacketSource(mSessionDesc, index);
if (source->initCheck() != OK) {
- LOGW("Unsupported format. Ignoring track #%d.", index);
+ ALOGW("Unsupported format. Ignoring track #%d.", index);
sp<AMessage> reply = new AMessage('setu', id());
reply->setSize("index", index);
diff --git a/media/libstagefright/rtsp/UDPPusher.cpp b/media/libstagefright/rtsp/UDPPusher.cpp
index 576b3ca9165c..47ea6f162c8d 100644
--- a/media/libstagefright/rtsp/UDPPusher.cpp
+++ b/media/libstagefright/rtsp/UDPPusher.cpp
@@ -71,7 +71,7 @@ void UDPPusher::start() {
bool UDPPusher::onPush() {
uint32_t length;
if (fread(&length, 1, sizeof(length), mFile) < sizeof(length)) {
- LOGI("No more data to push.");
+ ALOGI("No more data to push.");
return false;
}
@@ -81,7 +81,7 @@ bool UDPPusher::onPush() {
sp<ABuffer> buffer = new ABuffer(length);
if (fread(buffer->data(), 1, length, mFile) < length) {
- LOGE("File truncated?.");
+ ALOGE("File truncated?.");
return false;
}
@@ -93,7 +93,7 @@ bool UDPPusher::onPush() {
uint32_t timeMs;
if (fread(&timeMs, 1, sizeof(timeMs), mFile) < sizeof(timeMs)) {
- LOGI("No more data to push.");
+ ALOGI("No more data to push.");
return false;
}
@@ -113,7 +113,7 @@ void UDPPusher::onMessageReceived(const sp<AMessage> &msg) {
case kWhatPush:
{
if (!onPush() && !(ntohs(mRemoteAddr.sin_port) & 1)) {
- LOGI("emulating BYE packet");
+ ALOGI("emulating BYE packet");
sp<ABuffer> buffer = new ABuffer(8);
uint8_t *data = buffer->data();
diff --git a/media/libstagefright/rtsp/rtp_test.cpp b/media/libstagefright/rtsp/rtp_test.cpp
index f0cb5a57b1d8..d43cd2a4ed4b 100644
--- a/media/libstagefright/rtsp/rtp_test.cpp
+++ b/media/libstagefright/rtsp/rtp_test.cpp
@@ -204,7 +204,7 @@ int main(int argc, char **argv) {
continue;
}
- LOGE("decoder returned error 0x%08x", err);
+ ALOGE("decoder returned error 0x%08x", err);
break;
}
diff --git a/media/libstagefright/tests/DummyRecorder.cpp b/media/libstagefright/tests/DummyRecorder.cpp
index fbb606da9e9f..ac37b2841507 100644
--- a/media/libstagefright/tests/DummyRecorder.cpp
+++ b/media/libstagefright/tests/DummyRecorder.cpp
@@ -47,7 +47,7 @@ status_t DummyRecorder::start() {
pthread_attr_destroy(&attr);
if (err) {
- LOGE("Error creating thread!");
+ ALOGE("Error creating thread!");
return -ENODEV;
}
return OK;
diff --git a/media/libstagefright/tests/SurfaceMediaSource_test.cpp b/media/libstagefright/tests/SurfaceMediaSource_test.cpp
index 6be5e9a41828..76b507f99123 100644
--- a/media/libstagefright/tests/SurfaceMediaSource_test.cpp
+++ b/media/libstagefright/tests/SurfaceMediaSource_test.cpp
@@ -731,7 +731,7 @@ TEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuYV12BufferNpotWriteMediaS
const char *fileName = "/sdcard/outputSurfEncMSource.mp4";
int fd = open(fileName, O_RDWR | O_CREAT, 0744);
if (fd < 0) {
- LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
+ ALOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
}
CHECK(fd >= 0);
@@ -861,7 +861,7 @@ TEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaSameImageEachBufNpotWrite) {
const char *fileName = "/sdcard/outputSurfEncMSourceGL.mp4";
int fd = open(fileName, O_RDWR | O_CREAT, 0744);
if (fd < 0) {
- LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
+ ALOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
}
CHECK(fd >= 0);
@@ -904,7 +904,7 @@ TEST_F(SurfaceMediaSourceGLTest, EncodingFromGLRgbaDiffImageEachBufNpotWrite) {
const char *fileName = "/sdcard/outputSurfEncMSourceGLDiff.mp4";
int fd = open(fileName, O_RDWR | O_CREAT, 0744);
if (fd < 0) {
- LOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
+ ALOGE("ERROR: Could not open the the file %s, fd = %d !!", fileName, fd);
}
CHECK(fd >= 0);
diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp
index 7c8a747c518f..3014b0bc0548 100644
--- a/media/libstagefright/timedtext/TimedTextPlayer.cpp
+++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp
@@ -91,7 +91,7 @@ status_t TimedTextPlayer::start(uint8_t index) {
if (index >=
mTextTrackVector.size() + mTextOutOfBandVector.size()) {
- LOGE("Incorrect text track index: %d", index);
+ ALOGE("Incorrect text track index: %d", index);
return BAD_VALUE;
}
diff --git a/media/libstagefright/yuv/YUVImage.cpp b/media/libstagefright/yuv/YUVImage.cpp
index b71206273f45..0d67c96b5dff 100644
--- a/media/libstagefright/yuv/YUVImage.cpp
+++ b/media/libstagefright/yuv/YUVImage.cpp
@@ -54,7 +54,7 @@ size_t YUVImage::bufferSize(YUVFormat yuvFormat, int32_t width, int32_t height)
// Y takes numberOfPixels bytes and U/V take numberOfPixels/4 bytes each.
numberOfBytes = (size_t)(numberOfPixels + (numberOfPixels >> 1));
} else {
- LOGE("Format not supported");
+ ALOGE("Format not supported");
}
return numberOfBytes;
}
@@ -74,7 +74,7 @@ bool YUVImage::initializeYUVPointers() {
mVdata = mYdata + numberOfPixels;
mUdata = mVdata + 1;
} else {
- LOGE("Format not supported");
+ ALOGE("Format not supported");
return false;
}
return true;
@@ -98,7 +98,7 @@ bool YUVImage::getOffsets(int32_t x, int32_t y,
*uOffset = 2*uvOffset;
*vOffset = 2*uvOffset;
} else {
- LOGE("Format not supported");
+ ALOGE("Format not supported");
return false;
}
@@ -122,7 +122,7 @@ bool YUVImage::getOffsetIncrementsPerDataRow(
*uDataOffsetIncrement = 2*uvDataOffsetIncrement;
*vDataOffsetIncrement = 2*uvDataOffsetIncrement;
} else {
- LOGE("Format not supported");
+ ALOGE("Format not supported");
return false;
}
diff --git a/media/mediaserver/main_mediaserver.cpp b/media/mediaserver/main_mediaserver.cpp
index b5f85f9e1681..21496a978d6d 100644
--- a/media/mediaserver/main_mediaserver.cpp
+++ b/media/mediaserver/main_mediaserver.cpp
@@ -31,7 +31,7 @@ int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
- LOGI("ServiceManager: %p", sm.get());
+ ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp
index cfea7e89d3ec..930f0b05cbbe 100644
--- a/media/mtp/MtpDataPacket.cpp
+++ b/media/mtp/MtpDataPacket.cpp
@@ -418,7 +418,7 @@ int MtpDataPacket::readData(struct usb_request *request, void* buffer, int lengt
// Queue a read request. Call readDataWait to wait for result
int MtpDataPacket::readDataAsync(struct usb_request *req) {
if (usb_request_queue(req)) {
- LOGE("usb_endpoint_queue failed, errno: %d", errno);
+ ALOGE("usb_endpoint_queue failed, errno: %d", errno);
return -1;
}
return 0;
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
index b3702251c6c7..bf7795cb9054 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -53,7 +53,7 @@ static bool isMtpDevice(uint16_t vendor, uint16_t product) {
MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
struct usb_device *device = usb_device_new(deviceName, fd);
if (!device) {
- LOGE("usb_device_new failed for %s", deviceName);
+ ALOGE("usb_device_new failed for %s", deviceName);
return NULL;
}
@@ -134,7 +134,7 @@ MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
for (int i = 0; i < 3; i++) {
ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter);
if (!ep || ep->bDescriptorType != USB_DT_ENDPOINT) {
- LOGE("endpoints not found\n");
+ ALOGE("endpoints not found\n");
usb_device_close(device);
return NULL;
}
@@ -149,13 +149,13 @@ MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
}
}
if (!ep_in_desc || !ep_out_desc || !ep_intr_desc) {
- LOGE("endpoints not found\n");
+ ALOGE("endpoints not found\n");
usb_device_close(device);
return NULL;
}
if (usb_device_claim_interface(device, interface->bInterfaceNumber)) {
- LOGE("usb_device_claim_interface failed errno: %d\n", errno);
+ ALOGE("usb_device_claim_interface failed errno: %d\n", errno);
usb_device_close(device);
return NULL;
}
@@ -168,7 +168,7 @@ MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
}
usb_device_close(device);
- LOGE("device not found");
+ ALOGE("device not found");
return NULL;
}
@@ -232,7 +232,7 @@ void MtpDevice::print() {
mDeviceInfo->print();
if (mDeviceInfo->mDeviceProperties) {
- LOGI("***** DEVICE PROPERTIES *****\n");
+ ALOGI("***** DEVICE PROPERTIES *****\n");
int count = mDeviceInfo->mDeviceProperties->size();
for (int i = 0; i < count; i++) {
MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i];
@@ -246,11 +246,11 @@ void MtpDevice::print() {
}
if (mDeviceInfo->mPlaybackFormats) {
- LOGI("***** OBJECT PROPERTIES *****\n");
+ ALOGI("***** OBJECT PROPERTIES *****\n");
int count = mDeviceInfo->mPlaybackFormats->size();
for (int i = 0; i < count; i++) {
MtpObjectFormat format = (*mDeviceInfo->mPlaybackFormats)[i];
- LOGI("*** FORMAT: %s\n", MtpDebug::getFormatCodeName(format));
+ ALOGI("*** FORMAT: %s\n", MtpDebug::getFormatCodeName(format));
MtpObjectPropertyList* props = getObjectPropsSupported(format);
if (props) {
for (int j = 0; j < props->size(); j++) {
@@ -260,7 +260,7 @@ void MtpDevice::print() {
property->print();
delete property;
} else {
- LOGE("could not fetch property: %s",
+ ALOGE("could not fetch property: %s",
MtpDebug::getObjectPropCodeName(prop));
}
}
@@ -584,7 +584,7 @@ bool MtpDevice::readObject(MtpObjectHandle handle,
&& mData.readDataHeader(mRequestIn1)) {
uint32_t length = mData.getContainerLength();
if (length - MTP_CONTAINER_HEADER_SIZE != objectSize) {
- LOGE("readObject error objectSize: %d, length: %d",
+ ALOGE("readObject error objectSize: %d, length: %d",
objectSize, length);
goto fail;
}
@@ -617,7 +617,7 @@ bool MtpDevice::readObject(MtpObjectHandle handle,
// queue up a read request
req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
if (mData.readDataAsync(req)) {
- LOGE("readDataAsync failed");
+ ALOGE("readDataAsync failed");
goto fail;
}
} else {
@@ -627,7 +627,7 @@ bool MtpDevice::readObject(MtpObjectHandle handle,
if (writeBuffer) {
// write previous buffer
if (!callback(writeBuffer, offset, writeLength, clientData)) {
- LOGE("write failed");
+ ALOGE("write failed");
// wait for pending read before failing
if (req)
mData.readDataWait(mDevice);
@@ -669,7 +669,7 @@ bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int gro
ALOGD("readObject: %s", destPath);
int fd = ::open(destPath, O_RDWR | O_CREAT | O_TRUNC);
if (fd < 0) {
- LOGE("open failed for %s", destPath);
+ ALOGE("open failed for %s", destPath);
return false;
}
@@ -718,7 +718,7 @@ bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int gro
// queue up a read request
req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
if (mData.readDataAsync(req)) {
- LOGE("readDataAsync failed");
+ ALOGE("readDataAsync failed");
goto fail;
}
} else {
@@ -728,7 +728,7 @@ bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int gro
if (writeBuffer) {
// write previous buffer
if (write(fd, writeBuffer, writeLength) != writeLength) {
- LOGE("write failed");
+ ALOGE("write failed");
// wait for pending read before failing
if (req)
mData.readDataWait(mDevice);
diff --git a/media/mtp/MtpPacket.cpp b/media/mtp/MtpPacket.cpp
index 39815d4a7e1a..dd0784367b9a 100644
--- a/media/mtp/MtpPacket.cpp
+++ b/media/mtp/MtpPacket.cpp
@@ -36,7 +36,7 @@ MtpPacket::MtpPacket(int bufferSize)
{
mBuffer = (uint8_t *)malloc(bufferSize);
if (!mBuffer) {
- LOGE("out of memory!");
+ ALOGE("out of memory!");
abort();
}
}
@@ -57,7 +57,7 @@ void MtpPacket::allocate(int length) {
int newLength = length + mAllocationIncrement;
mBuffer = (uint8_t *)realloc(mBuffer, newLength);
if (!mBuffer) {
- LOGE("out of memory!");
+ ALOGE("out of memory!");
abort();
}
mBufferSize = newLength;
@@ -134,7 +134,7 @@ void MtpPacket::setTransactionID(MtpTransactionID id) {
uint32_t MtpPacket::getParameter(int index) const {
if (index < 1 || index > 5) {
- LOGE("index %d out of range in MtpPacket::getParameter", index);
+ ALOGE("index %d out of range in MtpPacket::getParameter", index);
return 0;
}
return getUInt32(MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t));
@@ -142,7 +142,7 @@ uint32_t MtpPacket::getParameter(int index) const {
void MtpPacket::setParameter(int index, uint32_t value) {
if (index < 1 || index > 5) {
- LOGE("index %d out of range in MtpPacket::setParameter", index);
+ ALOGE("index %d out of range in MtpPacket::setParameter", index);
return;
}
int offset = MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t);
diff --git a/media/mtp/MtpProperty.cpp b/media/mtp/MtpProperty.cpp
index 8016c352dbbc..64dd45b6212c 100644
--- a/media/mtp/MtpProperty.cpp
+++ b/media/mtp/MtpProperty.cpp
@@ -91,7 +91,7 @@ MtpProperty::MtpProperty(MtpPropertyCode propCode,
mDefaultValue.u.u64 = defaultValue;
break;
default:
- LOGE("unknown type %04X in MtpProperty::MtpProperty", type);
+ ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
}
}
}
@@ -267,7 +267,7 @@ void MtpProperty::setFormRange(int min, int max, int step) {
mStepSize.u.u64 = step;
break;
default:
- LOGE("unsupported type for MtpProperty::setRange");
+ ALOGE("unsupported type for MtpProperty::setRange");
break;
}
}
@@ -306,7 +306,7 @@ void MtpProperty::setFormEnum(const int* values, int count) {
mEnumValues[i].u.u64 = value;
break;
default:
- LOGE("unsupported type for MtpProperty::setEnum");
+ ALOGE("unsupported type for MtpProperty::setEnum");
break;
}
}
@@ -320,18 +320,18 @@ void MtpProperty::print() {
MtpString buffer;
bool deviceProp = isDeviceProperty();
if (deviceProp)
- LOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
+ ALOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
else
- LOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
- LOGI(" type %04X", mType);
- LOGI(" writeable %s", (mWriteable ? "true" : "false"));
+ ALOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
+ ALOGI(" type %04X", mType);
+ ALOGI(" writeable %s", (mWriteable ? "true" : "false"));
buffer = " default value: ";
print(mDefaultValue, buffer);
- LOGI("%s", (const char *)buffer);
+ ALOGI("%s", (const char *)buffer);
if (deviceProp) {
buffer = " current value: ";
print(mCurrentValue, buffer);
- LOGI("%s", (const char *)buffer);
+ ALOGI("%s", (const char *)buffer);
}
switch (mFormFlag) {
case kFormNone:
@@ -344,7 +344,7 @@ void MtpProperty::print() {
buffer += ", ";
print(mStepSize, buffer);
buffer += ")";
- LOGI("%s", (const char *)buffer);
+ ALOGI("%s", (const char *)buffer);
break;
case kFormEnum:
buffer = " Enum { ";
@@ -353,13 +353,13 @@ void MtpProperty::print() {
buffer += " ";
}
buffer += "}";
- LOGI("%s", (const char *)buffer);
+ ALOGI("%s", (const char *)buffer);
break;
case kFormDateTime:
- LOGI(" DateTime\n");
+ ALOGI(" DateTime\n");
break;
default:
- LOGI(" form %d\n", mFormFlag);
+ ALOGI(" form %d\n", mFormFlag);
break;
}
}
@@ -402,7 +402,7 @@ void MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
buffer.appendFormat("%s", value.str);
break;
default:
- LOGE("unsupported type for MtpProperty::print\n");
+ ALOGE("unsupported type for MtpProperty::print\n");
break;
}
}
@@ -456,7 +456,7 @@ void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
value.str = strdup(stringBuffer);
break;
default:
- LOGE("unknown type %04X in MtpProperty::readValue", mType);
+ ALOGE("unknown type %04X in MtpProperty::readValue", mType);
}
}
@@ -511,7 +511,7 @@ void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
packet.putEmptyString();
break;
default:
- LOGE("unknown type %04X in MtpProperty::writeValue", mType);
+ ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
}
}
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 838c13ed4bf4..560618722d3e 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -179,7 +179,7 @@ void MtpServer::run() {
if (dataIn) {
int ret = mData.read(fd);
if (ret < 0) {
- LOGE("data read returned %d, errno: %d", ret, errno);
+ ALOGE("data read returned %d, errno: %d", ret, errno);
if (errno == ECANCELED) {
// return to top of loop and wait for next command
continue;
@@ -200,7 +200,7 @@ void MtpServer::run() {
mData.dump();
ret = mData.write(fd);
if (ret < 0) {
- LOGE("request write returned %d, errno: %d", ret, errno);
+ ALOGE("request write returned %d, errno: %d", ret, errno);
if (errno == ECANCELED) {
// return to top of loop and wait for next command
continue;
@@ -214,7 +214,7 @@ void MtpServer::run() {
ret = mResponse.write(fd);
mResponse.dump();
if (ret < 0) {
- LOGE("request write returned %d, errno: %d", ret, errno);
+ ALOGE("request write returned %d, errno: %d", ret, errno);
if (errno == ECANCELED) {
// return to top of loop and wait for next command
continue;
@@ -296,7 +296,7 @@ void MtpServer::removeEditObject(MtpObjectHandle handle) {
return;
}
}
- LOGE("ObjectEdit not found in removeEditObject");
+ ALOGE("ObjectEdit not found in removeEditObject");
}
void MtpServer::commitEdit(ObjectEdit* edit) {
@@ -314,7 +314,7 @@ bool MtpServer::handleRequest() {
if (mSendObjectHandle != kInvalidObjectHandle && operation != MTP_OPERATION_SEND_OBJECT) {
// FIXME - need to delete mSendObjectHandle from the database
- LOGE("expected SendObject after SendObjectInfo");
+ ALOGE("expected SendObject after SendObjectInfo");
mSendObjectHandle = kInvalidObjectHandle;
}
@@ -408,7 +408,7 @@ bool MtpServer::handleRequest() {
response = doEndEditObject();
break;
default:
- LOGE("got unsupported command %s", MtpDebug::getOperationCodeName(operation));
+ ALOGE("got unsupported command %s", MtpDebug::getOperationCodeName(operation));
response = MTP_RESPONSE_OPERATION_NOT_SUPPORTED;
break;
}
@@ -917,7 +917,7 @@ MtpResponseCode MtpServer::doSendObject() {
int ret, initialData;
if (mSendObjectHandle == kInvalidObjectHandle) {
- LOGE("Expected SendObjectInfo before SendObject");
+ ALOGE("Expected SendObjectInfo before SendObject");
result = MTP_RESPONSE_NO_VALID_OBJECT_INFO;
goto done;
}
@@ -984,7 +984,7 @@ static void deleteRecursive(const char* path) {
char pathbuf[PATH_MAX];
int pathLength = strlen(path);
if (pathLength >= sizeof(pathbuf) - 1) {
- LOGE("path too long: %s\n", path);
+ ALOGE("path too long: %s\n", path);
}
strcpy(pathbuf, path);
if (pathbuf[pathLength - 1] != '/') {
@@ -995,7 +995,7 @@ static void deleteRecursive(const char* path) {
DIR* dir = opendir(path);
if (!dir) {
- LOGE("opendir %s failed: %s", path, strerror(errno));
+ ALOGE("opendir %s failed: %s", path, strerror(errno));
return;
}
@@ -1010,7 +1010,7 @@ static void deleteRecursive(const char* path) {
int nameLength = strlen(name);
if (nameLength > pathRemaining) {
- LOGE("path %s/%s too long\n", path, name);
+ ALOGE("path %s/%s too long\n", path, name);
continue;
}
strcpy(fileSpot, name);
@@ -1036,7 +1036,7 @@ static void deletePath(const char* path) {
unlink(path);
}
} else {
- LOGE("deletePath stat failed for %s: %s", path, strerror(errno));
+ ALOGE("deletePath stat failed for %s: %s", path, strerror(errno));
}
}
@@ -1098,7 +1098,7 @@ MtpResponseCode MtpServer::doSendPartialObject() {
ObjectEdit* edit = getEditObject(handle);
if (!edit) {
- LOGE("object not open for edit in doSendPartialObject");
+ ALOGE("object not open for edit in doSendPartialObject");
return MTP_RESPONSE_GENERAL_ERROR;
}
@@ -1155,7 +1155,7 @@ MtpResponseCode MtpServer::doTruncateObject() {
MtpObjectHandle handle = mRequest.getParameter(1);
ObjectEdit* edit = getEditObject(handle);
if (!edit) {
- LOGE("object not open for edit in doTruncateObject");
+ ALOGE("object not open for edit in doTruncateObject");
return MTP_RESPONSE_GENERAL_ERROR;
}
@@ -1173,7 +1173,7 @@ MtpResponseCode MtpServer::doTruncateObject() {
MtpResponseCode MtpServer::doBeginEditObject() {
MtpObjectHandle handle = mRequest.getParameter(1);
if (getEditObject(handle)) {
- LOGE("object already open for edit in doBeginEditObject");
+ ALOGE("object already open for edit in doBeginEditObject");
return MTP_RESPONSE_GENERAL_ERROR;
}
@@ -1186,7 +1186,7 @@ MtpResponseCode MtpServer::doBeginEditObject() {
int fd = open((const char *)path, O_RDWR | O_EXCL);
if (fd < 0) {
- LOGE("open failed for %s in doBeginEditObject (%d)", (const char *)path, errno);
+ ALOGE("open failed for %s in doBeginEditObject (%d)", (const char *)path, errno);
return MTP_RESPONSE_GENERAL_ERROR;
}
@@ -1198,7 +1198,7 @@ MtpResponseCode MtpServer::doEndEditObject() {
MtpObjectHandle handle = mRequest.getParameter(1);
ObjectEdit* edit = getEditObject(handle);
if (!edit) {
- LOGE("object not open for edit in doEndEditObject");
+ ALOGE("object not open for edit in doEndEditObject");
return MTP_RESPONSE_GENERAL_ERROR;
}
diff --git a/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp b/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
index 209e71c10a5b..42df66cf0c69 100644
--- a/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
+++ b/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
@@ -113,7 +113,7 @@ bool OmxJpegImageDecoder::onDecode(SkStream* stream,
// mode == DecodePixels
if (!this->allocPixelRef(bm, NULL)) {
- LOGI("Cannot allocPixelRef()!");
+ ALOGI("Cannot allocPixelRef()!");
return false;
}
@@ -141,7 +141,7 @@ bool OmxJpegImageDecoder::decodeSource(sp<MediaSource> decoder,
const sp<MediaSource>& source, SkBitmap* bm) {
status_t rt = decoder->start();
if (rt != OK) {
- LOGE("Cannot start OMX Decoder!");
+ ALOGE("Cannot start OMX Decoder!");
return false;
}
int64_t startTime = getNowUs();
diff --git a/native/android/looper.cpp b/native/android/looper.cpp
index 615493fe9a6c..455e950da033 100644
--- a/native/android/looper.cpp
+++ b/native/android/looper.cpp
@@ -44,7 +44,7 @@ void ALooper_release(ALooper* looper) {
int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
sp<Looper> looper = Looper::getForThread();
if (looper == NULL) {
- LOGE("ALooper_pollOnce: No looper for this thread!");
+ ALOGE("ALooper_pollOnce: No looper for this thread!");
return ALOOPER_POLL_ERROR;
}
@@ -55,7 +55,7 @@ int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outDa
int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
sp<Looper> looper = Looper::getForThread();
if (looper == NULL) {
- LOGE("ALooper_pollAll: No looper for this thread!");
+ ALOGE("ALooper_pollAll: No looper for this thread!");
return ALOOPER_POLL_ERROR;
}
diff --git a/native/android/storage_manager.cpp b/native/android/storage_manager.cpp
index a4233e7a6e05..f2f36b625de6 100644
--- a/native/android/storage_manager.cpp
+++ b/native/android/storage_manager.cpp
@@ -87,13 +87,13 @@ public:
bool initialize() {
sp<IServiceManager> sm = defaultServiceManager();
if (sm == NULL) {
- LOGE("Couldn't get default ServiceManager\n");
+ ALOGE("Couldn't get default ServiceManager\n");
return false;
}
mMountService = interface_cast<IMountService>(sm->getService(String16("mount")));
if (mMountService == NULL) {
- LOGE("Couldn't get connection to MountService\n");
+ ALOGE("Couldn't get connection to MountService\n");
return false;
}
@@ -121,7 +121,7 @@ public:
target->cb(filename, state, target->data);
delete target;
} else {
- LOGI("Didn't find the callback handler for: %s\n", filename);
+ ALOGI("Didn't find the callback handler for: %s\n", filename);
}
}
diff --git a/opengl/libagl/TextureObjectManager.cpp b/opengl/libagl/TextureObjectManager.cpp
index 022de09ddc7c..6a006aabfac1 100644
--- a/opengl/libagl/TextureObjectManager.cpp
+++ b/opengl/libagl/TextureObjectManager.cpp
@@ -195,7 +195,7 @@ status_t EGLTextureObject::reallocate(
return NO_MEMORY;
}
- LOGW_IF(level-1 >= mNumExtraLod,
+ ALOGW_IF(level-1 >= mNumExtraLod,
"specifying mipmap level %d, but # of level is %d",
level, mNumExtraLod+1);
diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp
index 9ceb5e9f92cb..eb55beefd9af 100644
--- a/opengl/libagl/egl.cpp
+++ b/opengl/libagl/egl.cpp
@@ -184,7 +184,7 @@ egl_surface_t::~egl_surface_t()
free(depth.data);
}
bool egl_surface_t::isValid() const {
- LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
+ ALOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
return magic == MAGIC;
}
@@ -397,7 +397,7 @@ EGLBoolean egl_window_surface_v2_t::connect()
// pin the buffer down
if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
- LOGE("connect() failed to lock buffer %p (%ux%u)",
+ ALOGE("connect() failed to lock buffer %p (%ux%u)",
buffer, buffer->width, buffer->height);
return setError(EGL_BAD_ACCESS, EGL_FALSE);
// FIXME: we should make sure we're not accessing the buffer anymore
@@ -552,7 +552,7 @@ EGLBoolean egl_window_surface_v2_t::swapBuffers()
// finally pin the buffer down
if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
- LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
+ ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
buffer, buffer->width, buffer->height);
return setError(EGL_BAD_ACCESS, EGL_FALSE);
// FIXME: we should make sure we're not accessing the buffer anymore
@@ -721,7 +721,7 @@ egl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break;
case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break;
default:
- LOGE("incompatible pixel format for pbuffer (format=%d)", f);
+ ALOGE("incompatible pixel format for pbuffer (format=%d)", f);
pbuffer.data = 0;
break;
}
diff --git a/opengl/libagl/mipmap.cpp b/opengl/libagl/mipmap.cpp
index ccd77b7dc845..e142a58d00b4 100644
--- a/opengl/libagl/mipmap.cpp
+++ b/opengl/libagl/mipmap.cpp
@@ -174,7 +174,7 @@ status_t buildAPyramid(ogles_context_t* c, EGLTextureObject* tex)
}
}
} else {
- LOGE("Unsupported format (%d)", base->format);
+ ALOGE("Unsupported format (%d)", base->format);
return BAD_TYPE;
}
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 561862b5ee36..2fc612522f7a 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -278,7 +278,7 @@ void *Loader::load_driver(const char* kind, const char *tag,
void* dso = dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL);
if (dso == 0) {
const char* err = dlerror();
- LOGE("load_driver(%s): %s", driver_absolute_path, err?err:"unknown");
+ ALOGE("load_driver(%s): %s", driver_absolute_path, err?err:"unknown");
return 0;
}
@@ -287,7 +287,7 @@ void *Loader::load_driver(const char* kind, const char *tag,
if (mask & EGL) {
getProcAddress = (getProcAddressType)dlsym(dso, "eglGetProcAddress");
- LOGE_IF(!getProcAddress,
+ ALOGE_IF(!getProcAddress,
"can't find eglGetProcAddress() in %s", driver_absolute_path);
egl_t* egl = &cnx->egl;
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index da1b39772b98..e053589a878b 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -141,7 +141,7 @@ void setGLHooksThreadSpecific(gl_hooks_t const *value) {
static int gl_no_context() {
if (egl_tls_t::logNoContextCall()) {
- LOGE("call to OpenGL ES API with no current context "
+ ALOGE("call to OpenGL ES API with no current context "
"(logged once per thread)");
char value[PROPERTY_VALUE_MAX];
property_get("debug.egl.callstack", value, "0");
@@ -287,7 +287,7 @@ EGLBoolean egl_init_drivers() {
}
void gl_unimplemented() {
- LOGE("called unimplemented OpenGL ES API");
+ ALOGE("called unimplemented OpenGL ES API");
}
// ----------------------------------------------------------------------------
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
index fb613971eb77..664f2582d255 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -352,7 +352,7 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config,
EGLint format;
if (native_window_api_connect(window, NATIVE_WINDOW_API_EGL) != OK) {
- LOGE("EGLNativeWindowType %p already connected to another API",
+ ALOGE("EGLNativeWindowType %p already connected to another API",
window);
return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
}
@@ -363,7 +363,7 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config,
if (format != 0) {
int err = native_window_set_buffers_format(window, format);
if (err != 0) {
- LOGE("error setting native window pixel format: %s (%d)",
+ ALOGE("error setting native window pixel format: %s (%d)",
strerror(-err), err);
native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
@@ -674,7 +674,7 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw,
egl_tls_t::setContext(EGL_NO_CONTEXT);
}
} else {
- // this will LOGE the error
+ // this will ALOGE the error
result = setError(c->cnx->egl.eglGetError(), EGL_FALSE);
}
return result;
@@ -886,7 +886,7 @@ __eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname)
addr = sGLExtentionMap.valueFor(name);
const int slot = sGLExtentionSlot;
- LOGE_IF(slot >= MAX_NUMBER_OF_GL_EXTENSIONS,
+ ALOGE_IF(slot >= MAX_NUMBER_OF_GL_EXTENSIONS,
"no more slots for eglGetProcAddress(\"%s\")",
procname);
diff --git a/opengl/libs/EGL/egl_cache.cpp b/opengl/libs/EGL/egl_cache.cpp
index c4a7466ec537..7fd6519c2de7 100644
--- a/opengl/libs/EGL/egl_cache.cpp
+++ b/opengl/libs/EGL/egl_cache.cpp
@@ -101,7 +101,7 @@ void egl_cache_t::initialize(egl_display_t *display) {
cnx->egl.eglGetProcAddress(
"eglSetBlobCacheFuncsANDROID"));
if (eglSetBlobCacheFuncsANDROID == NULL) {
- LOGE("EGL_ANDROID_blob_cache advertised by display %d, "
+ ALOGE("EGL_ANDROID_blob_cache advertised by display %d, "
"but unable to get eglSetBlobCacheFuncsANDROID", i);
continue;
}
@@ -110,7 +110,7 @@ void egl_cache_t::initialize(egl_display_t *display) {
android::setBlob, android::getBlob);
EGLint err = cnx->egl.eglGetError();
if (err != EGL_SUCCESS) {
- LOGE("eglSetBlobCacheFuncsANDROID resulted in an error: "
+ ALOGE("eglSetBlobCacheFuncsANDROID resulted in an error: "
"%#x", err);
}
}
@@ -133,7 +133,7 @@ void egl_cache_t::setBlob(const void* key, EGLsizeiANDROID keySize,
Mutex::Autolock lock(mMutex);
if (keySize < 0 || valueSize < 0) {
- LOGW("EGL_ANDROID_blob_cache set: negative sizes are not allowed");
+ ALOGW("EGL_ANDROID_blob_cache set: negative sizes are not allowed");
return;
}
@@ -172,7 +172,7 @@ EGLsizeiANDROID egl_cache_t::getBlob(const void* key, EGLsizeiANDROID keySize,
Mutex::Autolock lock(mMutex);
if (keySize < 0 || valueSize < 0) {
- LOGW("EGL_ANDROID_blob_cache set: negative sizes are not allowed");
+ ALOGW("EGL_ANDROID_blob_cache set: negative sizes are not allowed");
return 0;
}
@@ -226,7 +226,7 @@ void egl_cache_t::saveBlobCacheLocked() {
// The file exists, delete it and try again.
if (unlink(fname) == -1) {
// No point in retrying if the unlink failed.
- LOGE("error unlinking cache file %s: %s (%d)", fname,
+ ALOGE("error unlinking cache file %s: %s (%d)", fname,
strerror(errno), errno);
return;
}
@@ -234,7 +234,7 @@ void egl_cache_t::saveBlobCacheLocked() {
fd = open(fname, O_CREAT | O_EXCL | O_RDWR, 0);
}
if (fd == -1) {
- LOGE("error creating cache file %s: %s (%d)", fname,
+ ALOGE("error creating cache file %s: %s (%d)", fname,
strerror(errno), errno);
return;
}
@@ -242,7 +242,7 @@ void egl_cache_t::saveBlobCacheLocked() {
size_t fileSize = headerSize + cacheSize;
if (ftruncate(fd, fileSize) == -1) {
- LOGE("error setting cache file size: %s (%d)", strerror(errno),
+ ALOGE("error setting cache file size: %s (%d)", strerror(errno),
errno);
close(fd);
unlink(fname);
@@ -252,7 +252,7 @@ void egl_cache_t::saveBlobCacheLocked() {
uint8_t* buf = reinterpret_cast<uint8_t*>(mmap(NULL, fileSize,
PROT_WRITE, MAP_SHARED, fd, 0));
if (buf == MAP_FAILED) {
- LOGE("error mmaping cache file: %s (%d)", strerror(errno),
+ ALOGE("error mmaping cache file: %s (%d)", strerror(errno),
errno);
close(fd);
unlink(fname);
@@ -262,7 +262,7 @@ void egl_cache_t::saveBlobCacheLocked() {
status_t err = mBlobCache->flatten(buf + headerSize, cacheSize, NULL,
0);
if (err != OK) {
- LOGE("error writing cache contents: %s (%d)", strerror(-err),
+ ALOGE("error writing cache contents: %s (%d)", strerror(-err),
-err);
munmap(buf, fileSize);
close(fd);
@@ -288,7 +288,7 @@ void egl_cache_t::loadBlobCacheLocked() {
int fd = open(mFilename.string(), O_RDONLY, 0);
if (fd == -1) {
if (errno != ENOENT) {
- LOGE("error opening cache file %s: %s (%d)", mFilename.string(),
+ ALOGE("error opening cache file %s: %s (%d)", mFilename.string(),
strerror(errno), errno);
}
return;
@@ -296,7 +296,7 @@ void egl_cache_t::loadBlobCacheLocked() {
struct stat statBuf;
if (fstat(fd, &statBuf) == -1) {
- LOGE("error stat'ing cache file: %s (%d)", strerror(errno), errno);
+ ALOGE("error stat'ing cache file: %s (%d)", strerror(errno), errno);
close(fd);
return;
}
@@ -304,7 +304,7 @@ void egl_cache_t::loadBlobCacheLocked() {
// Sanity check the size before trying to mmap it.
size_t fileSize = statBuf.st_size;
if (fileSize > maxTotalSize * 2) {
- LOGE("cache file is too large: %#llx", statBuf.st_size);
+ ALOGE("cache file is too large: %#llx", statBuf.st_size);
close(fd);
return;
}
@@ -312,7 +312,7 @@ void egl_cache_t::loadBlobCacheLocked() {
uint8_t* buf = reinterpret_cast<uint8_t*>(mmap(NULL, fileSize,
PROT_READ, MAP_PRIVATE, fd, 0));
if (buf == MAP_FAILED) {
- LOGE("error mmaping cache file: %s (%d)", strerror(errno),
+ ALOGE("error mmaping cache file: %s (%d)", strerror(errno),
errno);
close(fd);
return;
@@ -321,13 +321,13 @@ void egl_cache_t::loadBlobCacheLocked() {
// Check the file magic and CRC
size_t cacheSize = fileSize - headerSize;
if (memcmp(buf, cacheFileMagic, 4) != 0) {
- LOGE("cache file has bad mojo");
+ ALOGE("cache file has bad mojo");
close(fd);
return;
}
uint32_t* crc = reinterpret_cast<uint32_t*>(buf + 4);
if (crc32c(buf + headerSize, cacheSize) != *crc) {
- LOGE("cache file failed CRC check");
+ ALOGE("cache file failed CRC check");
close(fd);
return;
}
@@ -335,7 +335,7 @@ void egl_cache_t::loadBlobCacheLocked() {
status_t err = mBlobCache->unflatten(buf + headerSize, cacheSize, NULL,
0);
if (err != OK) {
- LOGE("error reading cache contents: %s (%d)", strerror(-err),
+ ALOGE("error reading cache contents: %s (%d)", strerror(-err),
-err);
munmap(buf, fileSize);
close(fd);
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index ad5bdfc75554..53eaf9a1366a 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -201,7 +201,7 @@ EGLBoolean egl_display_t::initialize(EGLint *major, EGLint *minor) {
EGL_CLIENT_APIS);
} else {
- LOGW("%d: eglInitialize(%p) failed (%s)", i, idpy,
+ ALOGW("%d: eglInitialize(%p) failed (%s)", i, idpy,
egl_tls_t::egl_strerror(cnx->egl.eglGetError()));
}
}
@@ -309,7 +309,7 @@ EGLBoolean egl_display_t::terminate() {
egl_connection_t* const cnx = &gEGLImpl[i];
if (cnx->dso && disp[i].state == egl_display_t::INITIALIZED) {
if (cnx->egl.eglTerminate(disp[i].dpy) == EGL_FALSE) {
- LOGW("%d: eglTerminate(%p) failed (%s)", i, disp[i].dpy,
+ ALOGW("%d: eglTerminate(%p) failed (%s)", i, disp[i].dpy,
egl_tls_t::egl_strerror(cnx->egl.eglGetError()));
}
// REVISIT: it's unclear what to do if eglTerminate() fails
@@ -327,7 +327,7 @@ EGLBoolean egl_display_t::terminate() {
// there are no reference to them, it which case, we're free to
// delete them.
size_t count = objects.size();
- LOGW_IF(count, "eglTerminate() called w/ %d objects remaining", count);
+ ALOGW_IF(count, "eglTerminate() called w/ %d objects remaining", count);
for (size_t i=0 ; i<count ; i++) {
egl_object_t* o = objects.itemAt(i);
o->destroy();
diff --git a/opengl/libs/EGL/egl_object.cpp b/opengl/libs/EGL/egl_object.cpp
index 20cdc7eb408e..26e8c3eb10c4 100644
--- a/opengl/libs/EGL/egl_object.cpp
+++ b/opengl/libs/EGL/egl_object.cpp
@@ -45,7 +45,7 @@ void egl_object_t::terminate() {
display->removeObject(this);
if (decRef() == 1) {
// shouldn't happen because this is called from LocalRef
- LOGE("egl_object_t::terminate() removed the last reference!");
+ ALOGE("egl_object_t::terminate() removed the last reference!");
}
}
diff --git a/opengl/libs/EGL/egl_object.h b/opengl/libs/EGL/egl_object.h
index df1b261dd5ed..7106fa5ebf56 100644
--- a/opengl/libs/EGL/egl_object.h
+++ b/opengl/libs/EGL/egl_object.h
@@ -110,7 +110,7 @@ void egl_object_t::LocalRef<N,T>::release() const {
if (ref) {
if (ref->decRef() == 1) {
// shouldn't happen because this is called from LocalRef
- LOGE("LocalRef::release() removed the last reference!");
+ ALOGE("LocalRef::release() removed the last reference!");
}
}
}
@@ -131,7 +131,7 @@ protected:
if (window != NULL) {
native_window_set_buffers_format(window, 0);
if (native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL)) {
- LOGW("EGLNativeWindowType %p disconnect failed", window);
+ ALOGW("EGLNativeWindowType %p disconnect failed", window);
}
}
}
diff --git a/opengl/libs/EGL/egl_tls.cpp b/opengl/libs/EGL/egl_tls.cpp
index 6946ecd7ea8a..41cfae1b63a1 100644
--- a/opengl/libs/EGL/egl_tls.cpp
+++ b/opengl/libs/EGL/egl_tls.cpp
@@ -73,7 +73,7 @@ void egl_tls_t::setErrorEtcImpl(
egl_tls_t* tls = getTLS();
if (tls->error != error) {
if (!quiet) {
- LOGE("%s:%d error %x (%s)",
+ ALOGE("%s:%d error %x (%s)",
caller, line, error, egl_strerror(error));
char value[PROPERTY_VALUE_MAX];
property_get("debug.egl.callstack", value, "0");
diff --git a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
index e525d023e552..7bbaa18bc61d 100644
--- a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
+++ b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
@@ -100,7 +100,7 @@ unsigned GetBytesPerPixel(const GLenum format, const GLenum type)
case GL_UNSIGNED_BYTE:
break;
default:
- LOGE("GetBytesPerPixel: unknown type %x", type);
+ ALOGE("GetBytesPerPixel: unknown type %x", type);
}
switch (format) {
@@ -115,7 +115,7 @@ unsigned GetBytesPerPixel(const GLenum format, const GLenum type)
case 0x80E1: // GL_BGRA_EXT
return 4;
default:
- LOGE("GetBytesPerPixel: unknown format %x", format);
+ ALOGE("GetBytesPerPixel: unknown format %x", format);
}
return 1; // in doubt...
diff --git a/opengl/libs/GLES_CM/gl.cpp b/opengl/libs/GLES_CM/gl.cpp
index ee29f12faf73..2d31a35177c2 100644
--- a/opengl/libs/GLES_CM/gl.cpp
+++ b/opengl/libs/GLES_CM/gl.cpp
@@ -132,7 +132,7 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
#define CHECK_GL_ERRORS(_api) \
do { GLint err = glGetError(); \
- LOGE_IF(err != GL_NO_ERROR, "%s failed (0x%04X)", #_api, err); \
+ ALOGE_IF(err != GL_NO_ERROR, "%s failed (0x%04X)", #_api, err); \
} while(false);
#else
diff --git a/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp b/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
index 0fe97ceb25f8..c237d75fcd4f 100644
--- a/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
@@ -84,7 +84,7 @@ void GLTrace_start() {
int clientSocket = gltrace::acceptClientConnection(port);
if (clientSocket < 0) {
- LOGE("Error creating GLTrace server socket. Quitting application.");
+ ALOGE("Error creating GLTrace server socket. Quitting application.");
exit(-1);
}
diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
index 5a439e356cb0..5220aa41e688 100644
--- a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
@@ -51,7 +51,7 @@ unsigned getBytesPerTexel(const GLenum format, const GLenum type) {
case GL_UNSIGNED_BYTE:
break;
default:
- LOGE("GetBytesPerPixel: unknown type %x", type);
+ ALOGE("GetBytesPerPixel: unknown type %x", type);
}
switch (format) {
@@ -66,7 +66,7 @@ unsigned getBytesPerTexel(const GLenum format, const GLenum type) {
case 0x80E1: // GL_BGRA_EXT
return 4;
default:
- LOGE("GetBytesPerPixel: unknown format %x", format);
+ ALOGE("GetBytesPerPixel: unknown format %x", format);
}
return 1; // in doubt...
@@ -139,7 +139,7 @@ void fixup_glTexImage2D(GLMessage *glmsg) {
if (data != NULL) {
arg_data->add_rawbytes(data, bytesPerTexel * width * height);
} else {
- LOGE("fixup_glTexImage2D: image data is NULL.\n");
+ ALOGE("fixup_glTexImage2D: image data is NULL.\n");
arg_data->set_type(GLMessage::DataType::VOID);
// FIXME:
// This will create the texture, but it will be uninitialized.
diff --git a/opengl/libs/GLES_trace/src/gltrace_transport.cpp b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
index 7758e48baaa1..ce3fae59a11e 100644
--- a/opengl/libs/GLES_trace/src/gltrace_transport.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
@@ -31,7 +31,7 @@ namespace gltrace {
int acceptClientConnection(int serverPort) {
int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket < 0) {
- LOGE("Error (%d) while creating socket. Check if app has network permissions.",
+ ALOGE("Error (%d) while creating socket. Check if app has network permissions.",
serverSocket);
return -1;
}
@@ -45,13 +45,13 @@ int acceptClientConnection(int serverPort) {
socklen_t sockaddr_len = sizeof(sockaddr_in);
if (bind(serverSocket, (struct sockaddr *) &server, sizeof(server)) < 0) {
close(serverSocket);
- LOGE("Failed to bind the server socket");
+ ALOGE("Failed to bind the server socket");
return -1;
}
if (listen(serverSocket, 1) < 0) {
close(serverSocket);
- LOGE("Failed to listen on server socket");
+ ALOGE("Failed to listen on server socket");
return -1;
}
@@ -60,7 +60,7 @@ int acceptClientConnection(int serverPort) {
int clientSocket = accept(serverSocket, (struct sockaddr *)&client, &sockaddr_len);
if (clientSocket < 0) {
close(serverSocket);
- LOGE("Failed to accept client connection");
+ ALOGE("Failed to accept client connection");
return -1;
}
diff --git a/opengl/tests/gl2_jni/jni/gl_code.cpp b/opengl/tests/gl2_jni/jni/gl_code.cpp
index c2fabe6c302f..fa6bd93eadec 100644
--- a/opengl/tests/gl2_jni/jni/gl_code.cpp
+++ b/opengl/tests/gl2_jni/jni/gl_code.cpp
@@ -14,13 +14,13 @@
static void printGLString(const char *name, GLenum s) {
const char *v = (const char *) glGetString(s);
- LOGI("GL %s = %s\n", name, v);
+ ALOGI("GL %s = %s\n", name, v);
}
static void checkGlError(const char* op) {
for (GLint error = glGetError(); error; error
= glGetError()) {
- LOGI("after %s() glError (0x%x)\n", op, error);
+ ALOGI("after %s() glError (0x%x)\n", op, error);
}
}
@@ -48,7 +48,7 @@ GLuint loadShader(GLenum shaderType, const char* pSource) {
char* buf = (char*) malloc(infoLen);
if (buf) {
glGetShaderInfoLog(shader, infoLen, NULL, buf);
- LOGE("Could not compile shader %d:\n%s\n",
+ ALOGE("Could not compile shader %d:\n%s\n",
shaderType, buf);
free(buf);
}
@@ -87,7 +87,7 @@ GLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
char* buf = (char*) malloc(bufLength);
if (buf) {
glGetProgramInfoLog(program, bufLength, NULL, buf);
- LOGE("Could not link program:\n%s\n", buf);
+ ALOGE("Could not link program:\n%s\n", buf);
free(buf);
}
}
@@ -107,15 +107,15 @@ bool setupGraphics(int w, int h) {
printGLString("Renderer", GL_RENDERER);
printGLString("Extensions", GL_EXTENSIONS);
- LOGI("setupGraphics(%d, %d)", w, h);
+ ALOGI("setupGraphics(%d, %d)", w, h);
gProgram = createProgram(gVertexShader, gFragmentShader);
if (!gProgram) {
- LOGE("Could not create program.");
+ ALOGE("Could not create program.");
return false;
}
gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
checkGlError("glGetAttribLocation");
- LOGI("glGetAttribLocation(\"vPosition\") = %d\n",
+ ALOGI("glGetAttribLocation(\"vPosition\") = %d\n",
gvPositionHandle);
glViewport(0, 0, w, h);
diff --git a/opengl/tests/gl_jni/jni/gl_code.cpp b/opengl/tests/gl_jni/jni/gl_code.cpp
index ef66841f2792..cf86020a3d89 100644
--- a/opengl/tests/gl_jni/jni/gl_code.cpp
+++ b/opengl/tests/gl_jni/jni/gl_code.cpp
@@ -18,7 +18,7 @@ GLfloat background;
static void printGLString(const char *name, GLenum s) {
const char *v = (const char *) glGetString(s);
- LOGI("GL %s = %s\n", name, v);
+ ALOGI("GL %s = %s\n", name, v);
}
static void gluLookAt(float eyeX, float eyeY, float eyeZ,
diff --git a/opengl/tests/gl_perf/fill_common.cpp b/opengl/tests/gl_perf/fill_common.cpp
index a069f67ac8fd..389381fb329b 100644
--- a/opengl/tests/gl_perf/fill_common.cpp
+++ b/opengl/tests/gl_perf/fill_common.cpp
@@ -26,7 +26,7 @@ static uint32_t gHeight = 0;
static void checkGlError(const char* op) {
for (GLint error = glGetError(); error; error
= glGetError()) {
- LOGE("after %s() glError (0x%x)\n", op, error);
+ ALOGE("after %s() glError (0x%x)\n", op, error);
}
}
@@ -44,7 +44,7 @@ GLuint loadShader(GLenum shaderType, const char* pSource) {
char* buf = (char*) malloc(infoLen);
if (buf) {
glGetShaderInfoLog(shader, infoLen, NULL, buf);
- LOGE("Could not compile shader %d:\n%s\n", shaderType, buf);
+ ALOGE("Could not compile shader %d:\n%s\n", shaderType, buf);
free(buf);
}
glDeleteShader(shader);
@@ -94,7 +94,7 @@ GLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
char* buf = (char*) malloc(bufLength);
if (buf) {
glGetProgramInfoLog(program, bufLength, NULL, buf);
- LOGE("Could not link program:\n%s\n", buf);
+ ALOGE("Could not link program:\n%s\n", buf);
free(buf);
}
}
@@ -132,7 +132,7 @@ static void endTimer(int count) {
} else {
printf("%s, %f, %f\n", gCurrentTestName, mpps, dc60);
}
- LOGI("%s, %f, %f\r\n", gCurrentTestName, mpps, dc60);
+ ALOGI("%s, %f, %f\r\n", gCurrentTestName, mpps, dc60);
}
diff --git a/opengl/tests/gl_perfapp/jni/gl_code.cpp b/opengl/tests/gl_perfapp/jni/gl_code.cpp
index f99337152c02..2f0418373ad8 100644
--- a/opengl/tests/gl_perfapp/jni/gl_code.cpp
+++ b/opengl/tests/gl_perfapp/jni/gl_code.cpp
@@ -43,7 +43,7 @@ void doTest() {
int texSize = ((stateClock >> 1) & 0x1) + 1;
if (testNum >= gFragmentTestCount) {
- LOGI("done\n");
+ ALOGI("done\n");
if (fOut) {
fclose(fOut);
fOut = NULL;
@@ -52,7 +52,7 @@ void doTest() {
return;
}
- // LOGI("doTest %d %d %d\n", texCount, extraMath, testSubState);
+ // ALOGI("doTest %d %d %d\n", texCount, extraMath, testSubState);
// for (uint32_t num = 0; num < gFragmentTestCount; num++) {
doSingleTest(testNum, texSize);
@@ -74,17 +74,17 @@ JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * env, jobj
genTextures();
const char* fileName = "/sdcard/glperf.csv";
if (fOut != NULL) {
- LOGI("Closing partially written output.n");
+ ALOGI("Closing partially written output.n");
fclose(fOut);
fOut = NULL;
}
- LOGI("Writing to: %s\n",fileName);
+ ALOGI("Writing to: %s\n",fileName);
fOut = fopen(fileName, "w");
if (fOut == NULL) {
- LOGE("Could not open: %s\n", fileName);
+ ALOGE("Could not open: %s\n", fileName);
}
- LOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
+ ALOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
if (fOut) fprintf(fOut,"varColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\r\n");
}
}
diff --git a/opengl/tests/gldual/jni/gl_code.cpp b/opengl/tests/gldual/jni/gl_code.cpp
index f1f0a1f7544d..22867ed6bae5 100644
--- a/opengl/tests/gldual/jni/gl_code.cpp
+++ b/opengl/tests/gldual/jni/gl_code.cpp
@@ -14,13 +14,13 @@
static void printGLString(const char *name, GLenum s) {
const char *v = (const char *) glGetString(s);
- LOGI("GL %s = %s\n", name, v);
+ ALOGI("GL %s = %s\n", name, v);
}
static void checkGlError(const char* op) {
for (GLint error = glGetError(); error; error
= glGetError()) {
- LOGI("after %s() glError (0x%x)\n", op, error);
+ ALOGI("after %s() glError (0x%x)\n", op, error);
}
}
@@ -48,7 +48,7 @@ GLuint loadShader(GLenum shaderType, const char* pSource) {
char* buf = (char*) malloc(infoLen);
if (buf) {
glGetShaderInfoLog(shader, infoLen, NULL, buf);
- LOGE("Could not compile shader %d:\n%s\n",
+ ALOGE("Could not compile shader %d:\n%s\n",
shaderType, buf);
free(buf);
}
@@ -87,7 +87,7 @@ GLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
char* buf = (char*) malloc(bufLength);
if (buf) {
glGetProgramInfoLog(program, bufLength, NULL, buf);
- LOGE("Could not link program:\n%s\n", buf);
+ ALOGE("Could not link program:\n%s\n", buf);
free(buf);
}
}
@@ -107,15 +107,15 @@ bool setupGraphics(int w, int h) {
printGLString("Renderer", GL_RENDERER);
printGLString("Extensions", GL_EXTENSIONS);
- LOGI("setupGraphics(%d, %d)", w, h);
+ ALOGI("setupGraphics(%d, %d)", w, h);
gProgram = createProgram(gVertexShader, gFragmentShader);
if (!gProgram) {
- LOGE("Could not create program.");
+ ALOGE("Could not create program.");
return false;
}
gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
checkGlError("glGetAttribLocation");
- LOGI("glGetAttribLocation(\"vPosition\") = %d\n",
+ ALOGI("glGetAttribLocation(\"vPosition\") = %d\n",
gvPositionHandle);
glViewport(0, 0, w, h);
diff --git a/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp b/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
index 6579f95261e2..7390bb705b9d 100644
--- a/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
+++ b/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
@@ -39,7 +39,7 @@ static jlong native_measureDirectory(JNIEnv* env, jobject clazz, jstring directo
int dirfd = open(path, O_DIRECTORY, O_RDONLY);
if (dirfd < 0) {
- LOGI("error opening: %s: %s", path, strerror(errno));
+ ALOGI("error opening: %s: %s", path, strerror(errno));
} else {
ret = calculate_dir_size(dirfd);
close(dirfd);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 2232995c5c64..c4a92f7f3ad1 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -358,7 +358,15 @@ class GlobalScreenshot {
dims[0] = Math.abs(dims[0]);
dims[1] = Math.abs(dims[1]);
}
+
+ // Take the screenshot
mScreenBitmap = Surface.screenshot((int) dims[0], (int) dims[1]);
+ if (mScreenBitmap == null) {
+ notifyScreenshotError(mContext, mNotificationManager);
+ finisher.run();
+ return;
+ }
+
if (requiresRotation) {
// Rotate the screenshot to the current orientation
Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels,
@@ -372,13 +380,6 @@ class GlobalScreenshot {
mScreenBitmap = ss;
}
- // If we couldn't take the screenshot, notify the user
- if (mScreenBitmap == null) {
- notifyScreenshotError(mContext, mNotificationManager);
- finisher.run();
- return;
- }
-
// Optimizations
mScreenBitmap.setHasAlpha(false);
mScreenBitmap.prepareToDraw();
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 8255823f96b0..cc656517dd26 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -105,14 +105,14 @@ static const uint32_t kMaxThreadSleepTimeShift = 2;
static bool recordingAllowed() {
if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
bool ok = checkCallingPermission(String16("android.permission.RECORD_AUDIO"));
- if (!ok) LOGE("Request requires android.permission.RECORD_AUDIO");
+ if (!ok) ALOGE("Request requires android.permission.RECORD_AUDIO");
return ok;
}
static bool settingsAllowed() {
if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
bool ok = checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"));
- if (!ok) LOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
+ if (!ok) ALOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
return ok;
}
@@ -122,7 +122,7 @@ static void addBatteryData(uint32_t params) {
defaultServiceManager()->getService(String16("media.player"));
sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
if (service.get() == NULL) {
- LOGW("Cannot connect to the MediaPlayerService for battery tracking");
+ ALOGW("Cannot connect to the MediaPlayerService for battery tracking");
return;
}
@@ -139,7 +139,7 @@ static int load_audio_interface(const char *if_name, const hw_module_t **mod,
goto out;
rc = audio_hw_device_open(*mod, dev);
- LOGE_IF(rc, "couldn't open audio hw device in %s.%s (%s)",
+ ALOGE_IF(rc, "couldn't open audio hw device in %s.%s (%s)",
AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
if (rc)
goto out;
@@ -185,13 +185,13 @@ void AudioFlinger::onFirstRef()
if (rc)
continue;
- LOGI("Loaded %s audio interface from %s (%s)", audio_interfaces[i],
+ ALOGI("Loaded %s audio interface from %s (%s)", audio_interfaces[i],
mod->name, mod->id);
mAudioHwDevs.push(dev);
if (!mPrimaryHardwareDev) {
mPrimaryHardwareDev = dev;
- LOGI("Using '%s' (%s.%s) as the primary audio interface",
+ ALOGI("Using '%s' (%s.%s) as the primary audio interface",
mod->name, mod->id, audio_interfaces[i]);
}
}
@@ -199,7 +199,7 @@ void AudioFlinger::onFirstRef()
mHardwareStatus = AUDIO_HW_INIT;
if (!mPrimaryHardwareDev || mAudioHwDevs.size() == 0) {
- LOGE("Primary audio interface not found");
+ ALOGE("Primary audio interface not found");
return;
}
@@ -400,7 +400,7 @@ sp<IAudioTrack> AudioFlinger::createTrack(
int lSessionId;
if (streamType >= AUDIO_STREAM_CNT) {
- LOGE("createTrack() invalid stream type %d", streamType);
+ ALOGE("createTrack() invalid stream type %d", streamType);
lStatus = BAD_VALUE;
goto Exit;
}
@@ -410,7 +410,7 @@ sp<IAudioTrack> AudioFlinger::createTrack(
PlaybackThread *thread = checkPlaybackThread_l(output);
PlaybackThread *effectThread = NULL;
if (thread == NULL) {
- LOGE("unknown output thread");
+ ALOGE("unknown output thread");
lStatus = BAD_VALUE;
goto Exit;
}
@@ -432,7 +432,7 @@ sp<IAudioTrack> AudioFlinger::createTrack(
// prevent same audio session on different output threads
uint32_t sessions = t->hasAudioSession(*sessionId);
if (sessions & PlaybackThread::TRACK_SESSION) {
- LOGE("createTrack() session ID %d already in use", *sessionId);
+ ALOGE("createTrack() session ID %d already in use", *sessionId);
lStatus = BAD_VALUE;
goto Exit;
}
@@ -484,7 +484,7 @@ uint32_t AudioFlinger::sampleRate(int output) const
Mutex::Autolock _l(mLock);
PlaybackThread *thread = checkPlaybackThread_l(output);
if (thread == NULL) {
- LOGW("sampleRate() unknown thread %d", output);
+ ALOGW("sampleRate() unknown thread %d", output);
return 0;
}
return thread->sampleRate();
@@ -495,7 +495,7 @@ int AudioFlinger::channelCount(int output) const
Mutex::Autolock _l(mLock);
PlaybackThread *thread = checkPlaybackThread_l(output);
if (thread == NULL) {
- LOGW("channelCount() unknown thread %d", output);
+ ALOGW("channelCount() unknown thread %d", output);
return 0;
}
return thread->channelCount();
@@ -506,7 +506,7 @@ uint32_t AudioFlinger::format(int output) const
Mutex::Autolock _l(mLock);
PlaybackThread *thread = checkPlaybackThread_l(output);
if (thread == NULL) {
- LOGW("format() unknown thread %d", output);
+ ALOGW("format() unknown thread %d", output);
return 0;
}
return thread->format();
@@ -517,7 +517,7 @@ size_t AudioFlinger::frameCount(int output) const
Mutex::Autolock _l(mLock);
PlaybackThread *thread = checkPlaybackThread_l(output);
if (thread == NULL) {
- LOGW("frameCount() unknown thread %d", output);
+ ALOGW("frameCount() unknown thread %d", output);
return 0;
}
return thread->frameCount();
@@ -528,7 +528,7 @@ uint32_t AudioFlinger::latency(int output) const
Mutex::Autolock _l(mLock);
PlaybackThread *thread = checkPlaybackThread_l(output);
if (thread == NULL) {
- LOGW("latency() unknown thread %d", output);
+ ALOGW("latency() unknown thread %d", output);
return 0;
}
return thread->latency();
@@ -576,7 +576,7 @@ status_t AudioFlinger::setMode(int mode)
return PERMISSION_DENIED;
}
if ((mode < 0) || (mode >= AUDIO_MODE_CNT)) {
- LOGW("Illegal value: setMode(%d)", mode);
+ ALOGW("Illegal value: setMode(%d)", mode);
return BAD_VALUE;
}
@@ -663,7 +663,7 @@ status_t AudioFlinger::setStreamVolume(int stream, float value, int output)
}
if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT) {
- LOGE("setStreamVolume() invalid stream %d", stream);
+ ALOGE("setStreamVolume() invalid stream %d", stream);
return BAD_VALUE;
}
@@ -698,7 +698,7 @@ status_t AudioFlinger::setStreamMute(int stream, bool muted)
if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT ||
uint32_t(stream) == AUDIO_STREAM_ENFORCED_AUDIBLE) {
- LOGE("setStreamMute() invalid stream %d", stream);
+ ALOGE("setStreamMute() invalid stream %d", stream);
return BAD_VALUE;
}
@@ -1180,7 +1180,7 @@ void AudioFlinger::ThreadBase::acquireWakeLock_l()
sp<IBinder> binder =
defaultServiceManager()->checkService(String16("power"));
if (binder == 0) {
- LOGW("Thread %s cannot connect to the power manager service", mName);
+ ALOGW("Thread %s cannot connect to the power manager service", mName);
} else {
mPowerManager = interface_cast<IPowerManager>(binder);
binder->linkToDeath(mDeathRecipient);
@@ -1228,7 +1228,7 @@ void AudioFlinger::ThreadBase::PMDeathRecipient::binderDied(const wp<IBinder>& w
if (thread != 0) {
thread->clearPowerManager();
}
- LOGW("power manager service died !!!");
+ ALOGW("power manager service died !!!");
}
void AudioFlinger::ThreadBase::setEffectSuspended(
@@ -1469,9 +1469,9 @@ status_t AudioFlinger::PlaybackThread::readyToRun()
{
status_t status = initCheck();
if (status == NO_ERROR) {
- LOGI("AudioFlinger's thread %p ready to run", this);
+ ALOGI("AudioFlinger's thread %p ready to run", this);
} else {
- LOGE("No working audio driver found.");
+ ALOGE("No working audio driver found.");
}
return status;
}
@@ -1499,7 +1499,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTra
if (mType == DIRECT) {
if ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM) {
if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) {
- LOGE("createTrack_l() Bad parameter: sampleRate %d format %d, channelMask 0x%08x \""
+ ALOGE("createTrack_l() Bad parameter: sampleRate %d format %d, channelMask 0x%08x \""
"for output %p with format %d",
sampleRate, format, channelMask, mOutput, mFormat);
lStatus = BAD_VALUE;
@@ -1509,7 +1509,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTra
} else {
// Resampler implementation limits input sampling rate to 2 x output sampling rate.
if (sampleRate > mSampleRate*2) {
- LOGE("Sample rate out of range: %d mSampleRate %d", sampleRate, mSampleRate);
+ ALOGE("Sample rate out of range: %d mSampleRate %d", sampleRate, mSampleRate);
lStatus = BAD_VALUE;
goto Exit;
}
@@ -1517,7 +1517,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTra
lStatus = initCheck();
if (lStatus != NO_ERROR) {
- LOGE("Audio driver not initialized.");
+ ALOGE("Audio driver not initialized.");
goto Exit;
}
@@ -1534,7 +1534,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTra
if (t != 0) {
uint32_t actual = AudioSystem::getStrategyForStream((audio_stream_type_t)t->type());
if (sessionId == t->sessionId() && strategy != actual) {
- LOGE("createTrack_l() mismatched strategy; expected %u but found %u",
+ ALOGE("createTrack_l() mismatched strategy; expected %u but found %u",
strategy, actual);
lStatus = BAD_VALUE;
goto Exit;
@@ -1561,7 +1561,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTra
// invalidate track immediately if the stream type was moved to another thread since
// createTrack() was called by the client process.
if (!mStreamTypes[streamType].valid) {
- LOGW("createTrack_l() on thread %p: invalidating track on stream %d",
+ ALOGW("createTrack_l() on thread %p: invalidating track on stream %d",
this, streamType);
android_atomic_or(CBLK_INVALID_ON, &track->mCblk->flags);
}
@@ -1847,7 +1847,7 @@ AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, Aud
// FIXME - Current mixer implementation only supports stereo output
if (mChannelCount == 1) {
- LOGE("Invalid audio hardware channel count");
+ ALOGE("Invalid audio hardware channel count");
}
}
@@ -1897,7 +1897,7 @@ bool AudioFlinger::MixerThread::threadLoop()
double minimum = stats.minimum();
double maximum = stats.maximum();
cpu.resetStatistics();
- LOGI("CPU usage over past %.1f secs (%u mixer loops at %.1f mean ms per loop):\n us per mix loop: mean=%.0f stddev=%.0f min=%.0f max=%.0f\n %% of wall: mean=%.1f stddev=%.1f min=%.1f max=%.1f",
+ ALOGI("CPU usage over past %.1f secs (%u mixer loops at %.1f mean ms per loop):\n us per mix loop: mean=%.0f stddev=%.0f min=%.0f max=%.0f\n %% of wall: mean=%.1f stddev=%.1f min=%.1f max=%.1f",
elapsed * .000000001, n, perLoop * .000001,
mean * .001,
stddev * .001,
@@ -2038,7 +2038,7 @@ bool AudioFlinger::MixerThread::threadLoop()
if (!mStandby && delta > maxPeriod) {
mNumDelayedWrites++;
if ((now - lastWarning) > kWarningThrottleNs) {
- LOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
+ ALOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
ns2ms(delta), mNumDelayedWrites, this);
lastWarning = now;
}
@@ -2102,12 +2102,13 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
sp<Track> t = activeTracks[i].promote();
if (t == 0) continue;
+ // this const just means the local variable doesn't change
Track* const track = t.get();
audio_track_cblk_t* cblk = track->cblk();
// The first time a track is added we wait
// for all its buffers to be filled before processing it
- mAudioMixer->setActiveTrack(track->name());
+ int name = track->name();
// make sure that we have enough frames to mix one full buffer.
// enforce this condition only once to enable draining the buffer in case the client
// app does not call stop() and relies on underrun to stop:
@@ -2133,7 +2134,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
if ((cblk->framesReady() >= minFrames) && track->isReady() &&
!track->isPaused() && !track->isTerminated())
{
- //ALOGV("track %d u=%08x, s=%08x [OK] on thread %p", track->name(), cblk->user, cblk->server, this);
+ //ALOGV("track %d u=%08x, s=%08x [OK] on thread %p", name, cblk->user, cblk->server, this);
mixedTracks++;
@@ -2146,8 +2147,8 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
if (chain != 0) {
tracksWithEffect++;
} else {
- LOGW("prepareTracks_l(): track %08x attached to effect but no chain found on session %d",
- track->name(), track->sessionId());
+ ALOGW("prepareTracks_l(): track %d attached to effect but no chain found on session %d",
+ name, track->sessionId());
}
}
@@ -2160,7 +2161,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
track->mState = TrackBase::ACTIVE;
param = AudioMixer::RAMP_VOLUME;
}
- mAudioMixer->setParameter(AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
+ mAudioMixer->setParameter(name, AudioMixer::RESAMPLE, AudioMixer::RESET, NULL);
} else if (cblk->server != 0) {
// If the track is stopped before the first frame was mixed,
// do not apply ramp
@@ -2212,26 +2213,31 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
aux = int16_t(va);
// XXX: these things DON'T need to be done each time
- mAudioMixer->setBufferProvider(track);
- mAudioMixer->enable();
+ mAudioMixer->setBufferProvider(name, track);
+ mAudioMixer->enable(name);
- mAudioMixer->setParameter(param, AudioMixer::VOLUME0, (void *)left);
- mAudioMixer->setParameter(param, AudioMixer::VOLUME1, (void *)right);
- mAudioMixer->setParameter(param, AudioMixer::AUXLEVEL, (void *)aux);
+ mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, (void *)left);
+ mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, (void *)right);
+ mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, (void *)aux);
mAudioMixer->setParameter(
+ name,
AudioMixer::TRACK,
AudioMixer::FORMAT, (void *)track->format());
mAudioMixer->setParameter(
+ name,
AudioMixer::TRACK,
AudioMixer::CHANNEL_MASK, (void *)track->channelMask());
mAudioMixer->setParameter(
+ name,
AudioMixer::RESAMPLE,
AudioMixer::SAMPLE_RATE,
(void *)(cblk->sampleRate));
mAudioMixer->setParameter(
+ name,
AudioMixer::TRACK,
AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
mAudioMixer->setParameter(
+ name,
AudioMixer::TRACK,
AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
@@ -2239,7 +2245,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
track->mRetryCount = kMaxTrackRetries;
mixerStatus = MIXER_TRACKS_READY;
} else {
- //ALOGV("track %d u=%08x, s=%08x [NOT READY] on thread %p", track->name(), cblk->user, cblk->server, this);
+ //ALOGV("track %d u=%08x, s=%08x [NOT READY] on thread %p", name, cblk->user, cblk->server, this);
if (track->isStopped()) {
track->reset();
}
@@ -2251,7 +2257,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
// No buffers for this track. Give it a few chances to
// fill a buffer, then remove it from active list.
if (--(track->mRetryCount) <= 0) {
- ALOGV("BUFFER TIMEOUT: remove(%d) from active list on thread %p", track->name(), this);
+ ALOGV("BUFFER TIMEOUT: remove(%d) from active list on thread %p", name, this);
tracksToRemove->add(track);
// indicate to client process that the track was disabled because of underrun
android_atomic_or(CBLK_DISABLED_ON, &cblk->flags);
@@ -2259,7 +2265,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
mixerStatus = MIXER_TRACKS_ENABLED;
}
}
- mAudioMixer->disable();
+ mAudioMixer->disable(name);
}
}
@@ -3158,7 +3164,7 @@ bool AudioFlinger::DuplicatingThread::outputsReady(SortedVector< sp<OutputTrack>
for (size_t i = 0; i < outputTracks.size(); i++) {
sp <ThreadBase> thread = outputTracks[i]->thread().promote();
if (thread == 0) {
- LOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p", outputTracks[i].get());
+ ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p", outputTracks[i].get());
return false;
}
PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
@@ -3232,7 +3238,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
mBufferEnd = (uint8_t *)mBuffer + bufferSize;
}
} else {
- LOGE("not enough memory for AudioTrack size=%u", size);
+ ALOGE("not enough memory for AudioTrack size=%u", size);
client->heap()->dump("AudioTrack");
return;
}
@@ -3326,7 +3332,7 @@ void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t f
// Check validity of returned pointer in case the track control block would have been corrupted.
if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd ||
((unsigned long)bufferStart & (unsigned long)(cblk->frameSize - 1))) {
- LOGE("TrackBase::getBuffer buffer out of range:\n start: %p, end %p , mBuffer %p mBufferEnd %p\n \
+ ALOGE("TrackBase::getBuffer buffer out of range:\n start: %p, end %p , mBuffer %p mBufferEnd %p\n \
server %d, serverBase %d, user %d, userBase %d",
bufferStart, bufferEnd, mBuffer, mBufferEnd,
cblk->server, cblk->serverBase, cblk->user, cblk->userBase);
@@ -3362,7 +3368,7 @@ AudioFlinger::PlaybackThread::Track::Track(
}
ALOGV("Track constructor name %d, calling thread %d", mName, IPCThreadState::self()->getCallingPid());
if (mName < 0) {
- LOGE("no more track names available");
+ ALOGE("no more track names available");
}
mVolume[0] = 1.0f;
mVolume[1] = 1.0f;
@@ -3789,7 +3795,7 @@ AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(
mCblk, mBuffer, mCblk->buffers,
mCblk->frameCount, mCblk->sampleRate, mChannelMask, mBufferEnd);
} else {
- LOGW("Error creating output track on thread %p", playbackThread);
+ ALOGW("Error creating output track on thread %p", playbackThread);
}
}
@@ -3844,7 +3850,7 @@ bool AudioFlinger::PlaybackThread::OutputTrack::write(int16_t* data, uint32_t fr
memset(pInBuffer->raw, 0, startFrames * channelCount * sizeof(int16_t));
mBufferQueue.add(pInBuffer);
} else {
- LOGW ("OutputTrack::write() %p no more buffers in queue", this);
+ ALOGW ("OutputTrack::write() %p no more buffers in queue", this);
}
}
}
@@ -3911,7 +3917,7 @@ bool AudioFlinger::PlaybackThread::OutputTrack::write(int16_t* data, uint32_t fr
mBufferQueue.add(pInBuffer);
ALOGV("OutputTrack::write() %p thread %p adding overflow buffer %d", this, mThread.unsafe_get(), mBufferQueue.size());
} else {
- LOGW("OutputTrack::write() %p thread %p no more overflow buffers", mThread.unsafe_get(), this);
+ ALOGW("OutputTrack::write() %p thread %p no more overflow buffers", mThread.unsafe_get(), this);
}
}
}
@@ -4254,7 +4260,7 @@ void AudioFlinger::RecordThread::onFirstRef()
status_t AudioFlinger::RecordThread::readyToRun()
{
status_t status = initCheck();
- LOGW_IF(status != NO_ERROR,"RecordThread %p could not initialize", this);
+ ALOGW_IF(status != NO_ERROR,"RecordThread %p could not initialize", this);
return status;
}
@@ -4374,7 +4380,7 @@ bool AudioFlinger::RecordThread::threadLoop()
mRsmpInIndex = 0;
}
if (mBytesRead < 0) {
- LOGE("Error reading audio input");
+ ALOGE("Error reading audio input");
if (mActiveTrack->mState == TrackBase::ACTIVE) {
// Force input into standby so that it tries to
// recover at next read attempt
@@ -4420,7 +4426,7 @@ bool AudioFlinger::RecordThread::threadLoop()
if (!mActiveTrack->setOverflow()) {
nsecs_t now = systemTime();
if ((now - lastWarning) > kWarningThrottleNs) {
- LOGW("RecordThread: buffer overflow");
+ ALOGW("RecordThread: buffer overflow");
lastWarning = now;
}
}
@@ -4464,7 +4470,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createR
lStatus = initCheck();
if (lStatus != NO_ERROR) {
- LOGE("Audio driver not initialized.");
+ ALOGE("Audio driver not initialized.");
goto Exit;
}
@@ -4620,7 +4626,7 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer*
if (framesReady == 0) {
mBytesRead = mInput->stream->read(mInput->stream, mRsmpInBuffer, mInputBytes);
if (mBytesRead < 0) {
- LOGE("RecordThread::getNextBuffer() Error reading audio input");
+ ALOGE("RecordThread::getNextBuffer() Error reading audio input");
if (mActiveTrack->mState == TrackBase::ACTIVE) {
// Force input into standby so that it tries to
// recover at next read attempt
@@ -4961,7 +4967,7 @@ int AudioFlinger::openDuplicateOutput(int output1, int output2)
MixerThread *thread2 = checkMixerThread_l(output2);
if (thread1 == NULL || thread2 == NULL) {
- LOGW("openDuplicateOutput() wrong output mixer type for output %d or %d", output1, output2);
+ ALOGW("openDuplicateOutput() wrong output mixer type for output %d or %d", output1, output2);
return 0;
}
@@ -5157,7 +5163,7 @@ status_t AudioFlinger::setStreamOutput(uint32_t stream, int output)
Mutex::Autolock _l(mLock);
MixerThread *dstThread = checkMixerThread_l(output);
if (dstThread == NULL) {
- LOGW("setStreamOutput() bad output id %d", output);
+ ALOGW("setStreamOutput() bad output id %d", output);
return BAD_VALUE;
}
@@ -5226,7 +5232,7 @@ void AudioFlinger::releaseAudioSessionId(int audioSession)
return;
}
}
- LOGW("session id %d not found for pid %d", audioSession, caller);
+ ALOGW("session id %d not found for pid %d", audioSession, caller);
}
void AudioFlinger::purgeStaleEffects_l() {
@@ -5437,14 +5443,14 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
// if uuid is specified, request effect descriptor
lStatus = EffectGetDescriptor(&pDesc->uuid, &desc);
if (lStatus < 0) {
- LOGW("createEffect() error %d from EffectGetDescriptor", lStatus);
+ ALOGW("createEffect() error %d from EffectGetDescriptor", lStatus);
goto Exit;
}
} else {
// if uuid is not specified, look for an available implementation
// of the required type in effect factory
if (EffectIsNullUuid(&pDesc->type)) {
- LOGW("createEffect() no effect type");
+ ALOGW("createEffect() no effect type");
lStatus = BAD_VALUE;
goto Exit;
}
@@ -5455,13 +5461,13 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
lStatus = EffectQueryNumberEffects(&numEffects);
if (lStatus < 0) {
- LOGW("createEffect() error %d from EffectQueryNumberEffects", lStatus);
+ ALOGW("createEffect() error %d from EffectQueryNumberEffects", lStatus);
goto Exit;
}
for (uint32_t i = 0; i < numEffects; i++) {
lStatus = EffectQueryEffect(i, &desc);
if (lStatus < 0) {
- LOGW("createEffect() error %d from EffectQueryEffect", lStatus);
+ ALOGW("createEffect() error %d from EffectQueryEffect", lStatus);
continue;
}
if (memcmp(&desc.type, &pDesc->type, sizeof(effect_uuid_t)) == 0) {
@@ -5478,7 +5484,7 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
}
if (!found) {
lStatus = BAD_VALUE;
- LOGW("createEffect() effect not found");
+ ALOGW("createEffect() effect not found");
goto Exit;
}
// For same effect type, chose auxiliary version over insert version if
@@ -5539,7 +5545,7 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
if (thread == NULL) {
thread = checkPlaybackThread_l(io);
if (thread == NULL) {
- LOGE("createEffect() unknown output thread");
+ ALOGE("createEffect() unknown output thread");
lStatus = BAD_VALUE;
goto Exit;
}
@@ -5575,17 +5581,17 @@ status_t AudioFlinger::moveEffects(int sessionId, int srcOutput, int dstOutput)
sessionId, srcOutput, dstOutput);
Mutex::Autolock _l(mLock);
if (srcOutput == dstOutput) {
- LOGW("moveEffects() same dst and src outputs %d", dstOutput);
+ ALOGW("moveEffects() same dst and src outputs %d", dstOutput);
return NO_ERROR;
}
PlaybackThread *srcThread = checkPlaybackThread_l(srcOutput);
if (srcThread == NULL) {
- LOGW("moveEffects() bad srcOutput %d", srcOutput);
+ ALOGW("moveEffects() bad srcOutput %d", srcOutput);
return BAD_VALUE;
}
PlaybackThread *dstThread = checkPlaybackThread_l(dstOutput);
if (dstThread == NULL) {
- LOGW("moveEffects() bad dstOutput %d", dstOutput);
+ ALOGW("moveEffects() bad dstOutput %d", dstOutput);
return BAD_VALUE;
}
@@ -5607,7 +5613,7 @@ status_t AudioFlinger::moveEffectChain_l(int sessionId,
sp<EffectChain> chain = srcThread->getEffectChain_l(sessionId);
if (chain == 0) {
- LOGW("moveEffectChain_l() effect chain for session %d not on source thread %p",
+ ALOGW("moveEffectChain_l() effect chain for session %d not on source thread %p",
sessionId, srcThread);
return INVALID_OPERATION;
}
@@ -5637,7 +5643,7 @@ status_t AudioFlinger::moveEffectChain_l(int sessionId,
if (dstChain == 0) {
dstChain = effect->chain().promote();
if (dstChain == 0) {
- LOGW("moveEffectChain_l() cannot get chain from effect %p", effect.get());
+ ALOGW("moveEffectChain_l() cannot get chain from effect %p", effect.get());
srcThread->addEffect_l(effect);
return NO_INIT;
}
@@ -5679,14 +5685,14 @@ sp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
lStatus = initCheck();
if (lStatus != NO_ERROR) {
- LOGW("createEffect_l() Audio driver not initialized.");
+ ALOGW("createEffect_l() Audio driver not initialized.");
goto Exit;
}
// Do not allow effects with session ID 0 on direct output or duplicating threads
// TODO: add rule for hw accelerated effects on direct outputs with non PCM format
if (sessionId == AUDIO_SESSION_OUTPUT_MIX && mType != MIXER) {
- LOGW("createEffect_l() Cannot add auxiliary effect %s to session %d",
+ ALOGW("createEffect_l() Cannot add auxiliary effect %s to session %d",
desc->name, sessionId);
lStatus = BAD_VALUE;
goto Exit;
@@ -5696,7 +5702,7 @@ sp<AudioFlinger::EffectHandle> AudioFlinger::ThreadBase::createEffect_l(
(desc->flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_PRE_PROC) ||
(mType != RECORD &&
(desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC)) {
- LOGW("createEffect_l() effect %s (flags %08x) created on wrong thread type %d",
+ ALOGW("createEffect_l() effect %s (flags %08x) created on wrong thread type %d",
desc->name, desc->flags, mType);
lStatus = BAD_VALUE;
goto Exit;
@@ -5805,7 +5811,7 @@ status_t AudioFlinger::ThreadBase::addEffect_l(const sp<EffectModule>& effect)
ALOGV("addEffect_l() %p chain %p effect %p", this, chain.get(), effect.get());
if (chain->getEffectFromId_l(effect->id()) != 0) {
- LOGW("addEffect_l() %p effect %s already present in chain %p",
+ ALOGW("addEffect_l() %p effect %s already present in chain %p",
this, effect->desc().name, chain.get());
return BAD_VALUE;
}
@@ -5838,7 +5844,7 @@ void AudioFlinger::ThreadBase::removeEffect_l(const sp<EffectModule>& effect) {
removeEffectChain_l(chain);
}
} else {
- LOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
+ ALOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
}
}
@@ -6060,7 +6066,7 @@ status_t AudioFlinger::RecordThread::addEffectChain_l(const sp<EffectChain>& cha
size_t AudioFlinger::RecordThread::removeEffectChain_l(const sp<EffectChain>& chain)
{
ALOGV("removeEffectChain_l() %p from thread %p", chain.get(), this);
- LOGW_IF(mEffectChains.size() != 1,
+ ALOGW_IF(mEffectChains.size() != 1,
"removeEffectChain_l() %p invalid chain size %d on thread %p",
chain.get(), mEffectChains.size(), this);
if (mEffectChains.size() == 1) {
@@ -6702,7 +6708,8 @@ void AudioFlinger::EffectModule::setSuspended(bool suspended)
Mutex::Autolock _l(mLock);
mSuspended = suspended;
}
-bool AudioFlinger::EffectModule::suspended()
+
+bool AudioFlinger::EffectModule::suspended() const
{
Mutex::Autolock _l(mLock);
return mSuspended;
@@ -6822,7 +6829,7 @@ AudioFlinger::EffectHandle::EffectHandle(const sp<EffectModule>& effect,
mBuffer = (uint8_t *)mCblk + bufOffset;
}
} else {
- LOGE("not enough memory for Effect size=%u", EFFECT_PARAM_BUFFER_SIZE + sizeof(effect_param_cblk_t));
+ ALOGE("not enough memory for Effect size=%u", EFFECT_PARAM_BUFFER_SIZE + sizeof(effect_param_cblk_t));
return;
}
}
@@ -6957,12 +6964,12 @@ status_t AudioFlinger::EffectHandle::command(uint32_t cmdCode,
int *p = (int *)(mBuffer + mCblk->serverIndex);
int size = *p++;
if (((uint8_t *)p + size) > mBuffer + mCblk->clientIndex) {
- LOGW("command(): invalid parameter block size");
+ ALOGW("command(): invalid parameter block size");
break;
}
effect_param_t *param = (effect_param_t *)p;
if (param->psize == 0 || param->vsize == 0) {
- LOGW("command(): null parameter or value size");
+ ALOGW("command(): null parameter or value size");
mCblk->serverIndex += size;
continue;
}
@@ -7138,7 +7145,7 @@ void AudioFlinger::EffectChain::process_l()
{
sp<ThreadBase> thread = mThread.promote();
if (thread == 0) {
- LOGW("process_l(): cannot promote mixer thread");
+ ALOGW("process_l(): cannot promote mixer thread");
return;
}
bool isGlobalSession = (mSessionId == AUDIO_SESSION_OUTPUT_MIX) ||
@@ -7234,7 +7241,7 @@ status_t AudioFlinger::EffectChain::addEffect_l(const sp<EffectModule>& effect)
// check invalid effect chaining combinations
if (insertPref == EFFECT_FLAG_INSERT_EXCLUSIVE ||
iPref == EFFECT_FLAG_INSERT_EXCLUSIVE) {
- LOGW("addEffect_l() could not insert effect %s: exclusive conflict with %s", desc.name, d.name);
+ ALOGW("addEffect_l() could not insert effect %s: exclusive conflict with %s", desc.name, d.name);
return INVALID_OPERATION;
}
// remember position of first insert effect and by default
@@ -7470,7 +7477,7 @@ void AudioFlinger::EffectChain::setEffectSuspended_l(
}
desc = mSuspendedEffects.valueAt(index);
if (desc->mRefCount <= 0) {
- LOGW("setEffectSuspended_l() restore refcount should not be 0 %d", desc->mRefCount);
+ ALOGW("setEffectSuspended_l() restore refcount should not be 0 %d", desc->mRefCount);
desc->mRefCount = 1;
}
if (--desc->mRefCount == 0) {
@@ -7517,7 +7524,7 @@ void AudioFlinger::EffectChain::setEffectSuspendedAll_l(bool suspend)
}
desc = mSuspendedEffects.valueAt(index);
if (desc->mRefCount <= 0) {
- LOGW("setEffectSuspendedAll_l() restore refcount should not be 0 %d", desc->mRefCount);
+ ALOGW("setEffectSuspendedAll_l() restore refcount should not be 0 %d", desc->mRefCount);
desc->mRefCount = 1;
}
if (--desc->mRefCount == 0) {
@@ -7597,7 +7604,7 @@ void AudioFlinger::EffectChain::checkSuspendOnEffectEnabled(const sp<EffectModul
setEffectSuspended_l(&effect->desc().type, enabled);
index = mSuspendedEffects.indexOfKey(effect->desc().type.timeLow);
if (index < 0) {
- LOGW("checkSuspendOnEffectEnabled() Fx should be suspended here!");
+ ALOGW("checkSuspendOnEffectEnabled() Fx should be suspended here!");
return;
}
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 7baa8fc7324e..cf8d4959ceca 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -730,7 +730,7 @@ private:
void suspend() { mSuspended++; }
void restore() { if (mSuspended) mSuspended--; }
- bool isSuspended() { return (mSuspended != 0); }
+ bool isSuspended() const { return (mSuspended != 0); }
virtual String8 getParameters(const String8& keys);
virtual void audioConfigChanged_l(int event, int param = 0);
virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
@@ -1115,7 +1115,7 @@ private:
status_t start();
status_t stop();
void setSuspended(bool suspended);
- bool suspended();
+ bool suspended() const;
sp<EffectHandle> controlHandle();
@@ -1138,7 +1138,7 @@ private:
status_t start_l();
status_t stop_l();
- Mutex mLock; // mutex for process, commands and handles list protection
+mutable Mutex mLock; // mutex for process, commands and handles list protection
wp<ThreadBase> mThread; // parent thread
wp<EffectChain> mChain; // parent effect chain
int mId; // this instance unique ID
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp
index fb1ca8766eb3..bc5cb9b7aba7 100644
--- a/services/audioflinger/AudioMixer.cpp
+++ b/services/audioflinger/AudioMixer.cpp
@@ -41,7 +41,7 @@ namespace android {
// ----------------------------------------------------------------------------
AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate)
- : mActiveTrack(0), mTrackNames(0), mSampleRate(sampleRate)
+ : mTrackNames(0), mSampleRate(sampleRate)
{
// AudioMixer is not yet capable of multi-channel beyond stereo
assert(2 == MAX_NUM_CHANNELS);
@@ -135,120 +135,120 @@ void AudioMixer::deleteTrackName(int name)
mTrackNames &= ~(1<<name);
}
-void AudioMixer::enable()
+void AudioMixer::enable(int name)
{
- if (mState.tracks[ mActiveTrack ].enabled != 1) {
- mState.tracks[ mActiveTrack ].enabled = 1;
- ALOGV("enable(%d)", mActiveTrack);
- invalidateState(1<<mActiveTrack);
+ name -= TRACK0;
+ assert(uint32_t(name) < MAX_NUM_TRACKS);
+ track_t& track = mState.tracks[name];
+
+ if (track.enabled != 1) {
+ track.enabled = 1;
+ ALOGV("enable(%d)", name);
+ invalidateState(1 << name);
}
}
-void AudioMixer::disable()
+void AudioMixer::disable(int name)
{
- if (mState.tracks[ mActiveTrack ].enabled != 0) {
- mState.tracks[ mActiveTrack ].enabled = 0;
- ALOGV("disable(%d)", mActiveTrack);
- invalidateState(1<<mActiveTrack);
+ name -= TRACK0;
+ assert(uint32_t(name) < MAX_NUM_TRACKS);
+ track_t& track = mState.tracks[name];
+
+ if (track.enabled != 0) {
+ track.enabled = 0;
+ ALOGV("disable(%d)", name);
+ invalidateState(1 << name);
}
}
-void AudioMixer::setActiveTrack(int track)
+void AudioMixer::setParameter(int name, int target, int param, void *value)
{
- // this also catches track < TRACK0
- track -= TRACK0;
- assert(uint32_t(track) < MAX_NUM_TRACKS);
- mActiveTrack = track;
-}
+ name -= TRACK0;
+ assert(uint32_t(name) < MAX_NUM_TRACKS);
+ track_t& track = mState.tracks[name];
-void AudioMixer::setParameter(int target, int name, void *value)
-{
int valueInt = (int)value;
int32_t *valueBuf = (int32_t *)value;
switch (target) {
case TRACK:
- switch (name) {
+ switch (param) {
case CHANNEL_MASK: {
uint32_t mask = (uint32_t)value;
- if (mState.tracks[ mActiveTrack ].channelMask != mask) {
+ if (track.channelMask != mask) {
uint8_t channelCount = popcount(mask);
assert((channelCount <= MAX_NUM_CHANNELS) && (channelCount));
- mState.tracks[ mActiveTrack ].channelMask = mask;
- mState.tracks[ mActiveTrack ].channelCount = channelCount;
+ track.channelMask = mask;
+ track.channelCount = channelCount;
ALOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask);
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
} break;
case MAIN_BUFFER:
- if (mState.tracks[ mActiveTrack ].mainBuffer != valueBuf) {
- mState.tracks[ mActiveTrack ].mainBuffer = valueBuf;
+ if (track.mainBuffer != valueBuf) {
+ track.mainBuffer = valueBuf;
ALOGV("setParameter(TRACK, MAIN_BUFFER, %p)", valueBuf);
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
break;
case AUX_BUFFER:
- if (mState.tracks[ mActiveTrack ].auxBuffer != valueBuf) {
- mState.tracks[ mActiveTrack ].auxBuffer = valueBuf;
+ if (track.auxBuffer != valueBuf) {
+ track.auxBuffer = valueBuf;
ALOGV("setParameter(TRACK, AUX_BUFFER, %p)", valueBuf);
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
break;
default:
- // bad name
+ // bad param
assert(false);
}
break;
case RESAMPLE:
- switch (name) {
- case SAMPLE_RATE: {
+ switch (param) {
+ case SAMPLE_RATE:
assert(valueInt > 0);
- track_t& track = mState.tracks[ mActiveTrack ];
if (track.setResampler(uint32_t(valueInt), mSampleRate)) {
ALOGV("setParameter(RESAMPLE, SAMPLE_RATE, %u)",
uint32_t(valueInt));
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
- } break;
- case RESET: {
- track_t& track = mState.tracks[ mActiveTrack ];
+ break;
+ case RESET:
track.resetResampler();
- invalidateState(1<<mActiveTrack);
- } break;
+ invalidateState(1 << name);
+ break;
default:
- // bad name
+ // bad param
assert(false);
}
break;
case RAMP_VOLUME:
case VOLUME:
- switch (name) {
+ switch (param) {
case VOLUME0:
- case VOLUME1: {
- track_t& track = mState.tracks[ mActiveTrack ];
- if (track.volume[name-VOLUME0] != valueInt) {
+ case VOLUME1:
+ if (track.volume[param-VOLUME0] != valueInt) {
ALOGV("setParameter(VOLUME, VOLUME0/1: %04x)", valueInt);
- track.prevVolume[name-VOLUME0] = track.volume[name-VOLUME0] << 16;
- track.volume[name-VOLUME0] = valueInt;
+ track.prevVolume[param-VOLUME0] = track.volume[param-VOLUME0] << 16;
+ track.volume[param-VOLUME0] = valueInt;
if (target == VOLUME) {
- track.prevVolume[name-VOLUME0] = valueInt << 16;
- track.volumeInc[name-VOLUME0] = 0;
+ track.prevVolume[param-VOLUME0] = valueInt << 16;
+ track.volumeInc[param-VOLUME0] = 0;
} else {
- int32_t d = (valueInt<<16) - track.prevVolume[name-VOLUME0];
+ int32_t d = (valueInt<<16) - track.prevVolume[param-VOLUME0];
int32_t volInc = d / int32_t(mState.frameCount);
- track.volumeInc[name-VOLUME0] = volInc;
+ track.volumeInc[param-VOLUME0] = volInc;
if (volInc == 0) {
- track.prevVolume[name-VOLUME0] = valueInt << 16;
+ track.prevVolume[param-VOLUME0] = valueInt << 16;
}
}
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
- } break;
- case AUXLEVEL: {
- track_t& track = mState.tracks[ mActiveTrack ];
+ break;
+ case AUXLEVEL:
if (track.auxLevel != valueInt) {
ALOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt);
track.prevAuxLevel = track.auxLevel << 16;
@@ -264,11 +264,11 @@ void AudioMixer::setParameter(int target, int name, void *value)
track.prevAuxLevel = valueInt << 16;
}
}
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
- } break;
+ break;
default:
- // bad name
+ // bad param
assert(false);
}
break;
@@ -343,9 +343,11 @@ size_t AudioMixer::getUnreleasedFrames(int name)
return 0;
}
-void AudioMixer::setBufferProvider(AudioBufferProvider* buffer)
+void AudioMixer::setBufferProvider(int name, AudioBufferProvider* buffer)
{
- mState.tracks[ mActiveTrack ].bufferProvider = buffer;
+ name -= TRACK0;
+ assert(uint32_t(name) < MAX_NUM_TRACKS);
+ mState.tracks[name].bufferProvider = buffer;
}
@@ -358,7 +360,7 @@ void AudioMixer::process()
void AudioMixer::process__validate(state_t* state)
{
- LOGW_IF(!state->needsChanged,
+ ALOGW_IF(!state->needsChanged,
"in process__validate() but nothing's invalid");
uint32_t changed = state->needsChanged;
@@ -997,7 +999,7 @@ void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state)
// been enabled for mixing.
if (in == NULL || ((unsigned long)in & 3)) {
memset(out, 0, numFrames*MAX_NUM_CHANNELS*sizeof(int16_t));
- LOGE_IF(((unsigned long)in & 3), "process stereo track: input buffer alignment pb: buffer %p track %d, channels %d, needs %08x",
+ ALOGE_IF(((unsigned long)in & 3), "process stereo track: input buffer alignment pb: buffer %p track %d, channels %d, needs %08x",
in, i, t.channelCount, t.needs);
return;
}
diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h
index 9c129b86471f..4ba6845620ee 100644
--- a/services/audioflinger/AudioMixer.h
+++ b/services/audioflinger/AudioMixer.h
@@ -42,7 +42,7 @@ public:
enum { // names
- // track units (MAX_NUM_TRACKS units)
+ // track names (MAX_NUM_TRACKS units)
TRACK0 = 0x1000,
// 0x2000 is unused
@@ -69,16 +69,16 @@ public:
};
+ // For all APIs with "name": TRACK0 <= name < TRACK0 + MAX_NUM_TRACKS
int getTrackName();
void deleteTrackName(int name);
- void enable();
- void disable();
+ void enable(int name);
+ void disable(int name);
- void setActiveTrack(int track);
- void setParameter(int target, int name, void *value);
+ void setParameter(int name, int target, int param, void *value);
- void setBufferProvider(AudioBufferProvider* bufferProvider);
+ void setBufferProvider(int name, AudioBufferProvider* bufferProvider);
void process();
uint32_t trackNames() const { return mTrackNames; }
@@ -171,7 +171,7 @@ private:
track_t tracks[MAX_NUM_TRACKS]; __attribute__((aligned(32)));
};
- int mActiveTrack;
+ // bitmask of allocated track names, where bit 0 corresponds to TRACK0 etc.
uint32_t mTrackNames;
const uint32_t mSampleRate;
diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp
index bc4c90c2c08e..f572fcebf417 100644
--- a/services/audioflinger/AudioPolicyService.cpp
+++ b/services/audioflinger/AudioPolicyService.cpp
@@ -52,7 +52,7 @@ static const int kDumpLockSleep = 20000;
static bool checkPermission() {
if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
bool ok = checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"));
- if (!ok) LOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
+ if (!ok) ALOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
return ok;
}
@@ -83,18 +83,18 @@ AudioPolicyService::AudioPolicyService()
return;
rc = audio_policy_dev_open(module, &mpAudioPolicyDev);
- LOGE_IF(rc, "couldn't open audio policy device (%s)", strerror(-rc));
+ ALOGE_IF(rc, "couldn't open audio policy device (%s)", strerror(-rc));
if (rc)
return;
rc = mpAudioPolicyDev->create_audio_policy(mpAudioPolicyDev, &aps_ops, this,
&mpAudioPolicy);
- LOGE_IF(rc, "couldn't create audio policy (%s)", strerror(-rc));
+ ALOGE_IF(rc, "couldn't create audio policy (%s)", strerror(-rc));
if (rc)
return;
rc = mpAudioPolicy->init_check(mpAudioPolicy);
- LOGE_IF(rc, "couldn't init_check the audio policy (%s)", strerror(-rc));
+ ALOGE_IF(rc, "couldn't init_check the audio policy (%s)", strerror(-rc));
if (rc)
return;
@@ -102,7 +102,7 @@ AudioPolicyService::AudioPolicyService()
forced_val = strtol(value, NULL, 0);
mpAudioPolicy->set_can_mute_enforced_audible(mpAudioPolicy, !forced_val);
- LOGI("Loaded audio policy from %s (%s)", module->name, module->id);
+ ALOGI("Loaded audio policy from %s (%s)", module->name, module->id);
// load audio pre processing modules
if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
@@ -338,7 +338,7 @@ audio_io_handle_t AudioPolicyService::getInput(int inputSource,
sp<AudioEffect> fx = new AudioEffect(NULL, &effect->mUuid, -1, 0, 0, audioSession, input);
status_t status = fx->initCheck();
if (status != NO_ERROR && status != ALREADY_EXISTS) {
- LOGW("Failed to create Fx %s on input %d", effect->mName, input);
+ ALOGW("Failed to create Fx %s on input %d", effect->mName, input);
// fx goes out of scope and strong ref on AudioEffect is released
continue;
}
@@ -533,7 +533,7 @@ status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
}
void AudioPolicyService::binderDied(const wp<IBinder>& who) {
- LOGW("binderDied() %p, tid %d, calling tid %d", who.unsafe_get(), gettid(),
+ ALOGW("binderDied() %p, tid %d, calling tid %d", who.unsafe_get(), gettid(),
IPCThreadState::self()->getCallingPid());
}
@@ -726,7 +726,7 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
delete data;
}break;
default:
- LOGW("AudioCommandThread() unknown command %d", command->mCommand);
+ ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
}
delete command;
waitTime = INT64_MAX;
@@ -1027,9 +1027,9 @@ int AudioPolicyService::startTone(audio_policy_tone_t tone,
audio_stream_type_t stream)
{
if (tone != AUDIO_POLICY_TONE_IN_CALL_NOTIFICATION)
- LOGE("startTone: illegal tone requested (%d)", tone);
+ ALOGE("startTone: illegal tone requested (%d)", tone);
if (stream != AUDIO_STREAM_VOICE_CALL)
- LOGE("startTone: illegal stream (%d) requested for tone %d", stream,
+ ALOGE("startTone: illegal stream (%d) requested for tone %d", stream,
tone);
mTonePlaybackThread->startToneCommand(ToneGenerator::TONE_SUP_CALL_WAITING,
AUDIO_STREAM_VOICE_CALL);
@@ -1134,7 +1134,7 @@ size_t AudioPolicyService::readParamValue(cnode *node,
ALOGV("readParamValue() reading string %s", param + *curSize - len);
return len;
}
- LOGW("readParamValue() unknown param type %s", node->name);
+ ALOGW("readParamValue() unknown param type %s", node->name);
return 0;
}
@@ -1155,7 +1155,7 @@ effect_param_t *AudioPolicyService::loadEffectParameter(cnode *root)
// Note: that a pair of random strings is read as 0 0
int *ptr = (int *)fx_param->data;
int *ptr2 = (int *)((char *)param + sizeof(effect_param_t));
- LOGW("loadEffectParameter() ptr %p ptr2 %p", ptr, ptr2);
+ ALOGW("loadEffectParameter() ptr %p ptr2 %p", ptr, ptr2);
*ptr++ = atoi(param->name);
*ptr = atoi(param->value);
fx_param->psize = sizeof(int);
@@ -1164,7 +1164,7 @@ effect_param_t *AudioPolicyService::loadEffectParameter(cnode *root)
}
}
if (param == NULL || value == NULL) {
- LOGW("loadEffectParameter() invalid parameter description %s", root->name);
+ ALOGW("loadEffectParameter() invalid parameter description %s", root->name);
goto error;
}
@@ -1223,7 +1223,7 @@ AudioPolicyService::InputSourceDesc *AudioPolicyService::loadInputSource(
{
cnode *node = root->first_child;
if (node == NULL) {
- LOGW("loadInputSource() empty element %s", root->name);
+ ALOGW("loadInputSource() empty element %s", root->name);
return NULL;
}
InputSourceDesc *source = new InputSourceDesc();
@@ -1247,7 +1247,7 @@ AudioPolicyService::InputSourceDesc *AudioPolicyService::loadInputSource(
node = node->next;
}
if (source->mEffects.size() == 0) {
- LOGW("loadInputSource() no valid effects found in source %s", root->name);
+ ALOGW("loadInputSource() no valid effects found in source %s", root->name);
delete source;
return NULL;
}
@@ -1264,7 +1264,7 @@ status_t AudioPolicyService::loadInputSources(cnode *root, const Vector <EffectD
while (node) {
audio_source_t source = inputSourceNameToEnum(node->name);
if (source == AUDIO_SOURCE_CNT) {
- LOGW("loadInputSources() invalid input source %s", node->name);
+ ALOGW("loadInputSources() invalid input source %s", node->name);
node = node->next;
continue;
}
@@ -1288,7 +1288,7 @@ AudioPolicyService::EffectDesc *AudioPolicyService::loadEffect(cnode *root)
}
effect_uuid_t uuid;
if (AudioEffect::stringToGuid(node->value, &uuid) != NO_ERROR) {
- LOGW("loadEffect() invalid uuid %s", node->value);
+ ALOGW("loadEffect() invalid uuid %s", node->value);
return NULL;
}
EffectDesc *effect = new EffectDesc();
@@ -1354,7 +1354,7 @@ static audio_io_handle_t aps_open_output(void *service,
{
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af == NULL) {
- LOGW("%s: could not get AudioFlinger", __func__);
+ ALOGW("%s: could not get AudioFlinger", __func__);
return 0;
}
@@ -1368,7 +1368,7 @@ static audio_io_handle_t aps_open_dup_output(void *service,
{
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af == NULL) {
- LOGW("%s: could not get AudioFlinger", __func__);
+ ALOGW("%s: could not get AudioFlinger", __func__);
return 0;
}
return af->openDuplicateOutput(output1, output2);
@@ -1387,7 +1387,7 @@ static int aps_suspend_output(void *service, audio_io_handle_t output)
{
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af == NULL) {
- LOGW("%s: could not get AudioFlinger", __func__);
+ ALOGW("%s: could not get AudioFlinger", __func__);
return PERMISSION_DENIED;
}
@@ -1398,7 +1398,7 @@ static int aps_restore_output(void *service, audio_io_handle_t output)
{
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af == NULL) {
- LOGW("%s: could not get AudioFlinger", __func__);
+ ALOGW("%s: could not get AudioFlinger", __func__);
return PERMISSION_DENIED;
}
@@ -1414,7 +1414,7 @@ static audio_io_handle_t aps_open_input(void *service,
{
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af == NULL) {
- LOGW("%s: could not get AudioFlinger", __func__);
+ ALOGW("%s: could not get AudioFlinger", __func__);
return 0;
}
diff --git a/services/audioflinger/AudioResampler.cpp b/services/audioflinger/AudioResampler.cpp
index 7205045d9a1f..fbdcb62cb282 100644
--- a/services/audioflinger/AudioResampler.cpp
+++ b/services/audioflinger/AudioResampler.cpp
@@ -121,7 +121,7 @@ AudioResampler::AudioResampler(int bitDepth, int inChannelCount,
mPhaseFraction(0) {
// sanity check on format
if ((bitDepth != 16) ||(inChannelCount < 1) || (inChannelCount > 2)) {
- LOGE("Unsupported sample format, %d bits, %d channels", bitDepth,
+ ALOGE("Unsupported sample format, %d bits, %d channels", bitDepth,
inChannelCount);
// LOG_ASSERT(0);
}
@@ -190,7 +190,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
size_t outputSampleCount = outFrameCount * 2;
size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate;
- // LOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d\n",
+ // ALOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d\n",
// outFrameCount, inputIndex, phaseFraction, phaseIncrement);
while (outputIndex < outputSampleCount) {
@@ -203,7 +203,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
goto resampleStereo16_exit;
}
- // LOGE("New buffer fetched: %d frames\n", mBuffer.frameCount);
+ // ALOGE("New buffer fetched: %d frames\n", mBuffer.frameCount);
if (mBuffer.frameCount > inputIndex) break;
inputIndex -= mBuffer.frameCount;
@@ -217,7 +217,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
// handle boundary case
while (inputIndex == 0) {
- // LOGE("boundary case\n");
+ // ALOGE("boundary case\n");
out[outputIndex++] += vl * Interp(mX0L, in[0], phaseFraction);
out[outputIndex++] += vr * Interp(mX0R, in[1], phaseFraction);
Advance(&inputIndex, &phaseFraction, phaseIncrement);
@@ -226,7 +226,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
}
// process input samples
- // LOGE("general case\n");
+ // ALOGE("general case\n");
#ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1
if (inputIndex + 2 < mBuffer.frameCount) {
@@ -248,13 +248,13 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
Advance(&inputIndex, &phaseFraction, phaseIncrement);
}
- // LOGE("loop done - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
+ // ALOGE("loop done - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
// if done with buffer, save samples
if (inputIndex >= mBuffer.frameCount) {
inputIndex -= mBuffer.frameCount;
- // LOGE("buffer done, new input index %d", inputIndex);
+ // ALOGE("buffer done, new input index %d", inputIndex);
mX0L = mBuffer.i16[mBuffer.frameCount*2-2];
mX0R = mBuffer.i16[mBuffer.frameCount*2-1];
@@ -265,7 +265,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount,
}
}
- // LOGE("output buffer full - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
+ // ALOGE("output buffer full - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
resampleStereo16_exit:
// save state
@@ -286,7 +286,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount,
size_t outputSampleCount = outFrameCount * 2;
size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate;
- // LOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d\n",
+ // ALOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d\n",
// outFrameCount, inputIndex, phaseFraction, phaseIncrement);
while (outputIndex < outputSampleCount) {
// buffer is empty, fetch a new one
@@ -298,7 +298,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount,
mPhaseFraction = phaseFraction;
goto resampleMono16_exit;
}
- // LOGE("New buffer fetched: %d frames\n", mBuffer.frameCount);
+ // ALOGE("New buffer fetched: %d frames\n", mBuffer.frameCount);
if (mBuffer.frameCount > inputIndex) break;
inputIndex -= mBuffer.frameCount;
@@ -310,7 +310,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount,
// handle boundary case
while (inputIndex == 0) {
- // LOGE("boundary case\n");
+ // ALOGE("boundary case\n");
int32_t sample = Interp(mX0L, in[0], phaseFraction);
out[outputIndex++] += vl * sample;
out[outputIndex++] += vr * sample;
@@ -320,7 +320,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount,
}
// process input samples
- // LOGE("general case\n");
+ // ALOGE("general case\n");
#ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1
if (inputIndex + 2 < mBuffer.frameCount) {
@@ -343,13 +343,13 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount,
}
- // LOGE("loop done - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
+ // ALOGE("loop done - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
// if done with buffer, save samples
if (inputIndex >= mBuffer.frameCount) {
inputIndex -= mBuffer.frameCount;
- // LOGE("buffer done, new input index %d", inputIndex);
+ // ALOGE("buffer done, new input index %d", inputIndex);
mX0L = mBuffer.i16[mBuffer.frameCount-1];
provider->releaseBuffer(&mBuffer);
@@ -359,7 +359,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount,
}
}
- // LOGE("output buffer full - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
+ // ALOGE("output buffer full - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex);
resampleMono16_exit:
// save state
diff --git a/services/audioflinger/AudioResamplerCubic.cpp b/services/audioflinger/AudioResamplerCubic.cpp
index 4d721f62db31..587c7be20601 100644
--- a/services/audioflinger/AudioResamplerCubic.cpp
+++ b/services/audioflinger/AudioResamplerCubic.cpp
@@ -68,7 +68,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount,
provider->getNextBuffer(&mBuffer);
if (mBuffer.raw == NULL)
return;
- // LOGW("New buffer: offset=%p, frames=%dn", mBuffer.raw, mBuffer.frameCount);
+ // ALOGW("New buffer: offset=%p, frames=%dn", mBuffer.raw, mBuffer.frameCount);
}
int16_t *in = mBuffer.i16;
@@ -99,7 +99,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount,
if (mBuffer.raw == NULL)
goto save_state; // ugly, but efficient
in = mBuffer.i16;
- // LOGW("New buffer: offset=%p, frames=%d\n", mBuffer.raw, mBuffer.frameCount);
+ // ALOGW("New buffer: offset=%p, frames=%d\n", mBuffer.raw, mBuffer.frameCount);
}
// advance sample state
@@ -109,7 +109,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount,
}
save_state:
- // LOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction);
+ // ALOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction);
mInputIndex = inputIndex;
mPhaseFraction = phaseFraction;
}
@@ -133,7 +133,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount,
provider->getNextBuffer(&mBuffer);
if (mBuffer.raw == NULL)
return;
- // LOGW("New buffer: offset=%p, frames=%d\n", mBuffer.raw, mBuffer.frameCount);
+ // ALOGW("New buffer: offset=%p, frames=%d\n", mBuffer.raw, mBuffer.frameCount);
}
int16_t *in = mBuffer.i16;
@@ -163,7 +163,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount,
provider->getNextBuffer(&mBuffer);
if (mBuffer.raw == NULL)
goto save_state; // ugly, but efficient
- // LOGW("New buffer: offset=%p, frames=%dn", mBuffer.raw, mBuffer.frameCount);
+ // ALOGW("New buffer: offset=%p, frames=%dn", mBuffer.raw, mBuffer.frameCount);
in = mBuffer.i16;
}
@@ -173,7 +173,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount,
}
save_state:
- // LOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction);
+ // ALOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction);
mInputIndex = inputIndex;
mPhaseFraction = phaseFraction;
}
diff --git a/services/camera/libcameraservice/CameraHardwareInterface.h b/services/camera/libcameraservice/CameraHardwareInterface.h
index 658e25e7e3d2..34087b58b22d 100644
--- a/services/camera/libcameraservice/CameraHardwareInterface.h
+++ b/services/camera/libcameraservice/CameraHardwareInterface.h
@@ -88,21 +88,21 @@ public:
~CameraHardwareInterface()
{
- LOGI("Destroying camera %s", mName.string());
+ ALOGI("Destroying camera %s", mName.string());
if(mDevice) {
int rc = mDevice->common.close(&mDevice->common);
if (rc != OK)
- LOGE("Could not close camera %s: %d", mName.string(), rc);
+ ALOGE("Could not close camera %s: %d", mName.string(), rc);
}
}
status_t initialize(hw_module_t *module)
{
- LOGI("Opening camera %s", mName.string());
+ ALOGI("Opening camera %s", mName.string());
int rc = module->methods->open(module, mName.string(),
(hw_device_t **)&mDevice);
if (rc != OK) {
- LOGE("Could not open camera %s: %d", mName.string(), rc);
+ ALOGE("Could not open camera %s: %d", mName.string(), rc);
return rc;
}
initHalPreviewWindow();
@@ -460,7 +460,7 @@ private:
static_cast<CameraHardwareInterface *>(user);
sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle));
if (index >= mem->mNumBufs) {
- LOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
+ ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
index, mem->mNumBufs);
return;
}
@@ -479,7 +479,7 @@ private:
// MemoryHeapBase.
sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle));
if (index >= mem->mNumBufs) {
- LOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
+ ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
index, mem->mNumBufs);
return;
}
diff --git a/services/camera/libcameraservice/CameraHardwareStub.cpp b/services/camera/libcameraservice/CameraHardwareStub.cpp
index f9226309b525..cdfb2f5e4417 100644
--- a/services/camera/libcameraservice/CameraHardwareStub.cpp
+++ b/services/camera/libcameraservice/CameraHardwareStub.cpp
@@ -57,7 +57,7 @@ void CameraHardwareStub::initDefaultParameters()
p.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
if (setParameters(p) != NO_ERROR) {
- LOGE("Failed to set default parameters?!");
+ ALOGE("Failed to set default parameters?!");
}
}
@@ -340,20 +340,20 @@ status_t CameraHardwareStub::setParameters(const CameraParameters& params)
if (strcmp(params.getPreviewFormat(),
CameraParameters::PIXEL_FORMAT_YUV420SP) != 0) {
- LOGE("Only yuv420sp preview is supported");
+ ALOGE("Only yuv420sp preview is supported");
return -1;
}
if (strcmp(params.getPictureFormat(),
CameraParameters::PIXEL_FORMAT_JPEG) != 0) {
- LOGE("Only jpeg still pictures are supported");
+ ALOGE("Only jpeg still pictures are supported");
return -1;
}
int w, h;
params.getPictureSize(&w, &h);
if (w != kCannedJpegWidth && h != kCannedJpegHeight) {
- LOGE("Still picture size must be size of canned JPEG (%dx%d)",
+ ALOGE("Still picture size must be size of canned JPEG (%dx%d)",
kCannedJpegWidth, kCannedJpegHeight);
return -1;
}
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index d0cafb2520ff..06fc708e053d 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -73,7 +73,7 @@ static CameraService *gCameraService;
CameraService::CameraService()
:mSoundRef(0), mModule(0)
{
- LOGI("CameraService started (pid=%d)", getpid());
+ ALOGI("CameraService started (pid=%d)", getpid());
gCameraService = this;
}
@@ -83,13 +83,13 @@ void CameraService::onFirstRef()
if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,
(const hw_module_t **)&mModule) < 0) {
- LOGE("Could not load camera HAL module");
+ ALOGE("Could not load camera HAL module");
mNumberOfCameras = 0;
}
else {
mNumberOfCameras = mModule->get_number_of_cameras();
if (mNumberOfCameras > MAX_CAMERAS) {
- LOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
+ ALOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
mNumberOfCameras, MAX_CAMERAS);
mNumberOfCameras = MAX_CAMERAS;
}
@@ -97,22 +97,12 @@ void CameraService::onFirstRef()
setCameraFree(i);
}
}
-
- // Read the system property to determine if we have to use the
- // AUDIO_STREAM_ENFORCED_AUDIBLE type.
- char value[PROPERTY_VALUE_MAX];
- property_get("ro.camera.sound.forced", value, "0");
- if (strcmp(value, "0") != 0) {
- mAudioStreamType = AUDIO_STREAM_ENFORCED_AUDIBLE;
- } else {
- mAudioStreamType = AUDIO_STREAM_MUSIC;
- }
}
CameraService::~CameraService() {
for (int i = 0; i < mNumberOfCameras; i++) {
if (mBusy[i]) {
- LOGE("camera %d is still in use in destructor!", i);
+ ALOGE("camera %d is still in use in destructor!", i);
}
}
@@ -148,13 +138,13 @@ sp<ICamera> CameraService::connect(
LOG1("CameraService::connect E (pid %d, id %d)", callingPid, cameraId);
if (!mModule) {
- LOGE("Camera HAL module not loaded");
+ ALOGE("Camera HAL module not loaded");
return NULL;
}
sp<Client> client;
if (cameraId < 0 || cameraId >= mNumberOfCameras) {
- LOGE("CameraService::connect X (pid %d) rejected (invalid cameraId %d).",
+ ALOGE("CameraService::connect X (pid %d) rejected (invalid cameraId %d).",
callingPid, cameraId);
return NULL;
}
@@ -163,7 +153,7 @@ sp<ICamera> CameraService::connect(
property_get("sys.secpolicy.camera.disabled", value, "0");
if (strcmp(value, "1") == 0) {
// Camera is disabled by DevicePolicyManager.
- LOGI("Camera is disabled. connect X (pid %d) rejected", callingPid);
+ ALOGI("Camera is disabled. connect X (pid %d) rejected", callingPid);
return NULL;
}
@@ -176,7 +166,7 @@ sp<ICamera> CameraService::connect(
callingPid);
return client;
} else {
- LOGW("CameraService::connect X (pid %d) rejected (existing client).",
+ ALOGW("CameraService::connect X (pid %d) rejected (existing client).",
callingPid);
return NULL;
}
@@ -185,14 +175,14 @@ sp<ICamera> CameraService::connect(
}
if (mBusy[cameraId]) {
- LOGW("CameraService::connect X (pid %d) rejected"
+ ALOGW("CameraService::connect X (pid %d) rejected"
" (camera %d is still busy).", callingPid, cameraId);
return NULL;
}
struct camera_info info;
if (mModule->get_camera_info(cameraId, &info) != OK) {
- LOGE("Invalid camera id %d", cameraId);
+ ALOGE("Invalid camera id %d", cameraId);
return NULL;
}
@@ -263,7 +253,7 @@ status_t CameraService::onTransact(
if (!checkCallingPermission(
String16("android.permission.CAMERA"))) {
const int uid = getCallingUid();
- LOGE("Permission Denial: "
+ ALOGE("Permission Denial: "
"can't use the camera pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
@@ -295,10 +285,10 @@ void CameraService::setCameraFree(int cameraId) {
MediaPlayer* CameraService::newMediaPlayer(const char *file) {
MediaPlayer* mp = new MediaPlayer();
if (mp->setDataSource(file, NULL) == NO_ERROR) {
- mp->setAudioStreamType(mAudioStreamType);
+ mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);
mp->prepare();
} else {
- LOGE("Failed to load CameraService sounds: %s", file);
+ ALOGE("Failed to load CameraService sounds: %s", file);
return NULL;
}
return mp;
@@ -390,7 +380,7 @@ status_t CameraService::Client::checkPid() const {
int callingPid = getCallingPid();
if (callingPid == mClientPid) return NO_ERROR;
- LOGW("attempt to use a locked camera from a different process"
+ ALOGW("attempt to use a locked camera from a different process"
" (old pid %d, new pid %d)", mClientPid, callingPid);
return EBUSY;
}
@@ -399,7 +389,7 @@ status_t CameraService::Client::checkPidAndHardware() const {
status_t result = checkPid();
if (result != NO_ERROR) return result;
if (mHardware == 0) {
- LOGE("attempt to use a camera after disconnect() (pid %d)", getCallingPid());
+ ALOGE("attempt to use a camera after disconnect() (pid %d)", getCallingPid());
return INVALID_OPERATION;
}
return NO_ERROR;
@@ -429,7 +419,7 @@ status_t CameraService::Client::unlock() {
status_t result = checkPid();
if (result == NO_ERROR) {
if (mHardware->recordingEnabled()) {
- LOGE("Not allowed to unlock camera during recording.");
+ ALOGE("Not allowed to unlock camera during recording.");
return INVALID_OPERATION;
}
mClientPid = 0;
@@ -448,7 +438,7 @@ status_t CameraService::Client::connect(const sp<ICameraClient>& client) {
Mutex::Autolock lock(mLock);
if (mClientPid != 0 && checkPid() != NO_ERROR) {
- LOGW("Tried to connect to a locked camera (old pid %d, new pid %d)",
+ ALOGW("Tried to connect to a locked camera (old pid %d, new pid %d)",
mClientPid, callingPid);
return EBUSY;
}
@@ -471,7 +461,7 @@ static void disconnectWindow(const sp<ANativeWindow>& window) {
status_t result = native_window_api_disconnect(window.get(),
NATIVE_WINDOW_API_CAMERA);
if (result != NO_ERROR) {
- LOGW("native_window_api_disconnect failed: %s (%d)", strerror(-result),
+ ALOGW("native_window_api_disconnect failed: %s (%d)", strerror(-result),
result);
}
}
@@ -483,7 +473,7 @@ void CameraService::Client::disconnect() {
Mutex::Autolock lock(mLock);
if (checkPid() != NO_ERROR) {
- LOGW("different client - don't disconnect");
+ ALOGW("different client - don't disconnect");
return;
}
@@ -536,7 +526,7 @@ status_t CameraService::Client::setPreviewWindow(const sp<IBinder>& binder,
if (window != 0) {
result = native_window_api_connect(window.get(), NATIVE_WINDOW_API_CAMERA);
if (result != NO_ERROR) {
- LOGE("native_window_api_connect failed: %s (%d)", strerror(-result),
+ ALOGE("native_window_api_connect failed: %s (%d)", strerror(-result),
result);
return result;
}
@@ -634,7 +624,7 @@ status_t CameraService::Client::startCameraMode(camera_mode mode) {
return startPreviewMode();
case CAMERA_RECORDING_MODE:
if (mSurface == 0 && mPreviewWindow == 0) {
- LOGE("mSurface or mPreviewWindow must be set before startRecordingMode.");
+ ALOGE("mSurface or mPreviewWindow must be set before startRecordingMode.");
return INVALID_OPERATION;
}
return startRecordingMode();
@@ -686,7 +676,7 @@ status_t CameraService::Client::startRecordingMode() {
mCameraService->playSound(SOUND_RECORDING);
result = mHardware->startRecording();
if (result != NO_ERROR) {
- LOGE("mHardware->startRecording() failed with status %d", result);
+ ALOGE("mHardware->startRecording() failed with status %d", result);
}
return result;
}
@@ -780,7 +770,7 @@ status_t CameraService::Client::takePicture(int msgType) {
if ((msgType & CAMERA_MSG_RAW_IMAGE) &&
(msgType & CAMERA_MSG_RAW_IMAGE_NOTIFY)) {
- LOGE("CAMERA_MSG_RAW_IMAGE and CAMERA_MSG_RAW_IMAGE_NOTIFY"
+ ALOGE("CAMERA_MSG_RAW_IMAGE and CAMERA_MSG_RAW_IMAGE_NOTIFY"
" cannot be both enabled");
return BAD_VALUE;
}
@@ -841,7 +831,7 @@ status_t CameraService::Client::enableShutterSound(bool enable) {
// Disabling shutter sound is not allowed. Deny if the current
// process is not mediaserver.
if (getCallingPid() != getpid()) {
- LOGE("Failed to disable shutter sound. Permission denied (pid %d)", getCallingPid());
+ ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", getCallingPid());
return PERMISSION_DENIED;
}
}
@@ -917,7 +907,7 @@ bool CameraService::Client::lockIfMessageWanted(int32_t msgType) {
}
usleep(CHECK_MESSAGE_INTERVAL * 1000);
}
- LOGW("lockIfMessageWanted(%d): dropped unwanted message", msgType);
+ ALOGW("lockIfMessageWanted(%d): dropped unwanted message", msgType);
return false;
}
@@ -936,12 +926,12 @@ sp<CameraService::Client> CameraService::Client::getClientFromCookie(void* user)
// The checks below are not necessary and are for debugging only.
if (client->mCameraService.get() != gCameraService) {
- LOGE("mismatch service!");
+ ALOGE("mismatch service!");
return NULL;
}
if (client->mHardware == 0) {
- LOGE("mHardware == 0: callback after disconnect()?");
+ ALOGE("mHardware == 0: callback after disconnect()?");
return NULL;
}
@@ -999,7 +989,7 @@ void CameraService::Client::dataCallback(int32_t msgType,
if (!client->lockIfMessageWanted(msgType)) return;
if (dataPtr == 0 && metadata == NULL) {
- LOGE("Null data returned in data callback");
+ ALOGE("Null data returned in data callback");
client->handleGenericNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
return;
}
@@ -1032,7 +1022,7 @@ void CameraService::Client::dataCallbackTimestamp(nsecs_t timestamp,
if (!client->lockIfMessageWanted(msgType)) return;
if (dataPtr == 0) {
- LOGE("Null data returned in data with timestamp callback");
+ ALOGE("Null data returned in data with timestamp callback");
client->handleGenericNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
return;
}
@@ -1187,7 +1177,7 @@ void CameraService::Client::copyFrameAndPostCopiedFrame(
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
}
if (mPreviewBuffer == 0) {
- LOGE("failed to allocate space for preview buffer");
+ ALOGE("failed to allocate space for preview buffer");
mLock.unlock();
return;
}
@@ -1197,7 +1187,7 @@ void CameraService::Client::copyFrameAndPostCopiedFrame(
sp<MemoryBase> frame = new MemoryBase(previewBuffer, 0, size);
if (frame == 0) {
- LOGE("failed to allocate space for frame callback");
+ ALOGE("failed to allocate space for frame callback");
mLock.unlock();
return;
}
@@ -1223,7 +1213,7 @@ int CameraService::Client::getOrientation(int degrees, bool mirror) {
return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
}
}
- LOGE("Invalid setDisplayOrientation degrees=%d", degrees);
+ ALOGE("Invalid setDisplayOrientation degrees=%d", degrees);
return -1;
}
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index cdfbc566f188..bad41f5a1e78 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -76,7 +76,6 @@ private:
void setCameraFree(int cameraId);
// sounds
- audio_stream_type_t mAudioStreamType;
MediaPlayer* newMediaPlayer(const char *file);
Mutex mSoundLock;
diff --git a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp b/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp
index 69f60ca22a7c..1055538c0030 100644
--- a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp
+++ b/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp
@@ -217,7 +217,7 @@ bool MCameraClient::test(OP op, int v1, int v2) {
void MCameraClient::assertTest(OP op, int v1, int v2) {
if (!test(op, v1, v2)) {
- LOGE("assertTest failed: op=%d, v1=%d, v2=%d", op, v1, v2);
+ ALOGE("assertTest failed: op=%d, v1=%d, v2=%d", op, v1, v2);
ASSERT(0);
}
}
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp
index f179208e495d..6db750ee220f 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -246,7 +246,7 @@ status_t EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis,
if (device && test_bit(axis, device->absBitmask)) {
struct input_absinfo info;
if(ioctl(device->fd, EVIOCGABS(axis), &info)) {
- LOGW("Error reading absolute controller %d for device %s fd %d, errno=%d",
+ ALOGW("Error reading absolute controller %d for device %s fd %d, errno=%d",
axis, device->identifier.name.string(), device->fd, errno);
return -errno;
}
@@ -355,7 +355,7 @@ status_t EventHub::getAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t*
if (device && test_bit(axis, device->absBitmask)) {
struct input_absinfo info;
if(ioctl(device->fd, EVIOCGABS(axis), &info)) {
- LOGW("Error reading absolute controller %d for device %s fd %d, errno=%d",
+ ALOGW("Error reading absolute controller %d for device %s fd %d, errno=%d",
axis, device->identifier.name.string(), device->fd, errno);
return -errno;
}
@@ -551,7 +551,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
if (mNeedToReopenDevices) {
mNeedToReopenDevices = false;
- LOGI("Reopening all input devices due to a configuration change.");
+ ALOGI("Reopening all input devices due to a configuration change.");
closeAllDevicesLocked();
mNeedToScanDevices = true;
@@ -614,7 +614,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
if (eventItem.events & EPOLLIN) {
mPendingINotify = true;
} else {
- LOGW("Received unexpected epoll event 0x%08x for INotify.", eventItem.events);
+ ALOGW("Received unexpected epoll event 0x%08x for INotify.", eventItem.events);
}
continue;
}
@@ -629,7 +629,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer));
} while ((nRead == -1 && errno == EINTR) || nRead == sizeof(buffer));
} else {
- LOGW("Received unexpected epoll event 0x%08x for wake read pipe.",
+ ALOGW("Received unexpected epoll event 0x%08x for wake read pipe.",
eventItem.events);
}
continue;
@@ -637,7 +637,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
ssize_t deviceIndex = mDevices.indexOfKey(eventItem.data.u32);
if (deviceIndex < 0) {
- LOGW("Received unexpected epoll event 0x%08x for unknown device id %d.",
+ ALOGW("Received unexpected epoll event 0x%08x for unknown device id %d.",
eventItem.events, eventItem.data.u32);
continue;
}
@@ -648,16 +648,16 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
sizeof(struct input_event) * capacity);
if (readSize == 0 || (readSize < 0 && errno == ENODEV)) {
// Device was removed before INotify noticed.
- LOGW("could not get event, removed? (fd: %d size: %d bufferSize: %d capacity: %d errno: %d)\n",
+ ALOGW("could not get event, removed? (fd: %d size: %d bufferSize: %d capacity: %d errno: %d)\n",
device->fd, readSize, bufferSize, capacity, errno);
deviceChanged = true;
closeDeviceLocked(device);
} else if (readSize < 0) {
if (errno != EAGAIN && errno != EINTR) {
- LOGW("could not get event (errno=%d)", errno);
+ ALOGW("could not get event (errno=%d)", errno);
}
} else if ((readSize % sizeof(struct input_event)) != 0) {
- LOGE("could not get event (wrong size: %d)", readSize);
+ ALOGE("could not get event (wrong size: %d)", readSize);
} else {
int32_t deviceId = device->id == mBuiltInKeyboardId ? 0 : device->id;
@@ -710,7 +710,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
}
}
} else {
- LOGW("Received unexpected epoll event 0x%08x for device %s.",
+ ALOGW("Received unexpected epoll event 0x%08x for device %s.",
eventItem.events, device->identifier.name.string());
}
}
@@ -768,7 +768,7 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz
// Sleep after errors to avoid locking up the system.
// Hopefully the error is transient.
if (errno != EINTR) {
- LOGW("poll failed (errno=%d)\n", errno);
+ ALOGW("poll failed (errno=%d)\n", errno);
usleep(100000);
}
} else {
@@ -803,14 +803,14 @@ void EventHub::wake() {
} while (nWrite == -1 && errno == EINTR);
if (nWrite != 1 && errno != EAGAIN) {
- LOGW("Could not write wake signal, errno=%d", errno);
+ ALOGW("Could not write wake signal, errno=%d", errno);
}
}
void EventHub::scanDevicesLocked() {
status_t res = scanDirLocked(DEVICE_PATH);
if(res < 0) {
- LOGE("scan dir failed for %s\n", DEVICE_PATH);
+ ALOGE("scan dir failed for %s\n", DEVICE_PATH);
}
}
@@ -847,7 +847,7 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
int fd = open(devicePath, O_RDWR);
if(fd < 0) {
- LOGE("could not open %s, %s\n", devicePath, strerror(errno));
+ ALOGE("could not open %s, %s\n", devicePath, strerror(errno));
return -1;
}
@@ -865,7 +865,7 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
for (size_t i = 0; i < mExcludedDevices.size(); i++) {
const String8& item = mExcludedDevices.itemAt(i);
if (identifier.name == item) {
- LOGI("ignoring event id %s driver %s\n", devicePath, item.string());
+ ALOGI("ignoring event id %s driver %s\n", devicePath, item.string());
close(fd);
return -1;
}
@@ -874,7 +874,7 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
// Get device driver version.
int driverVersion;
if(ioctl(fd, EVIOCGVERSION, &driverVersion)) {
- LOGE("could not get driver version for %s, %s\n", devicePath, strerror(errno));
+ ALOGE("could not get driver version for %s, %s\n", devicePath, strerror(errno));
close(fd);
return -1;
}
@@ -882,7 +882,7 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
// Get device identifier.
struct input_id inputId;
if(ioctl(fd, EVIOCGID, &inputId)) {
- LOGE("could not get device input id for %s, %s\n", devicePath, strerror(errno));
+ ALOGE("could not get device input id for %s, %s\n", devicePath, strerror(errno));
close(fd);
return -1;
}
@@ -909,7 +909,7 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
// Make file descriptor non-blocking for use with poll().
if (fcntl(fd, F_SETFL, O_NONBLOCK)) {
- LOGE("Error %d making device file descriptor non-blocking.", errno);
+ ALOGE("Error %d making device file descriptor non-blocking.", errno);
close(fd);
return -1;
}
@@ -919,16 +919,16 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
Device* device = new Device(fd, deviceId, String8(devicePath), identifier);
#if 0
- LOGI("add device %d: %s\n", deviceId, devicePath);
- LOGI(" bus: %04x\n"
+ ALOGI("add device %d: %s\n", deviceId, devicePath);
+ ALOGI(" bus: %04x\n"
" vendor %04x\n"
" product %04x\n"
" version %04x\n",
identifier.bus, identifier.vendor, identifier.product, identifier.version);
- LOGI(" name: \"%s\"\n", identifier.name.string());
- LOGI(" location: \"%s\"\n", identifier.location.string());
- LOGI(" unique id: \"%s\"\n", identifier.uniqueId.string());
- LOGI(" driver: v%d.%d.%d\n",
+ ALOGI(" name: \"%s\"\n", identifier.name.string());
+ ALOGI(" location: \"%s\"\n", identifier.location.string());
+ ALOGI(" unique id: \"%s\"\n", identifier.uniqueId.string());
+ ALOGI(" driver: v%d.%d.%d\n",
driverVersion >> 16, (driverVersion >> 8) & 0xff, driverVersion & 0xff);
#endif
@@ -1072,12 +1072,12 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
eventItem.events = EPOLLIN;
eventItem.data.u32 = deviceId;
if (epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem)) {
- LOGE("Could not add device fd to epoll instance. errno=%d", errno);
+ ALOGE("Could not add device fd to epoll instance. errno=%d", errno);
delete device;
return -1;
}
- LOGI("New device: id=%d, fd=%d, path='%s', name='%s', classes=0x%x, "
+ ALOGI("New device: id=%d, fd=%d, path='%s', name='%s', classes=0x%x, "
"configuration='%s', keyLayout='%s', keyCharacterMap='%s', builtinKeyboard=%s",
deviceId, fd, devicePath, device->identifier.name.string(),
device->classes,
@@ -1103,7 +1103,7 @@ void EventHub::loadConfigurationLocked(Device* device) {
status_t status = PropertyMap::load(device->configurationFile,
&device->configuration);
if (status) {
- LOGE("Error loading input device configuration file for device '%s'. "
+ ALOGE("Error loading input device configuration file for device '%s'. "
"Using default configuration.",
device->identifier.name.string());
}
@@ -1170,18 +1170,18 @@ void EventHub::closeAllDevicesLocked() {
}
void EventHub::closeDeviceLocked(Device* device) {
- LOGI("Removed device: path=%s name=%s id=%d fd=%d classes=0x%x\n",
+ ALOGI("Removed device: path=%s name=%s id=%d fd=%d classes=0x%x\n",
device->path.string(), device->identifier.name.string(), device->id,
device->fd, device->classes);
if (device->id == mBuiltInKeyboardId) {
- LOGW("built-in keyboard device %s (id=%d) is closing! the apps will not like this",
+ ALOGW("built-in keyboard device %s (id=%d) is closing! the apps will not like this",
device->path.string(), mBuiltInKeyboardId);
mBuiltInKeyboardId = -1;
}
if (epoll_ctl(mEpollFd, EPOLL_CTL_DEL, device->fd, NULL)) {
- LOGW("Could not remove device fd from epoll instance. errno=%d", errno);
+ ALOGW("Could not remove device fd from epoll instance. errno=%d", errno);
}
mDevices.removeItem(device->id);
@@ -1202,7 +1202,7 @@ void EventHub::closeDeviceLocked(Device* device) {
// Unlink the device from the opening devices list then delete it.
// We don't need to tell the client that the device was closed because
// it does not even know it was opened in the first place.
- LOGI("Device %s was immediately closed after opening.", device->path.string());
+ ALOGI("Device %s was immediately closed after opening.", device->path.string());
if (pred) {
pred->next = device->next;
} else {
@@ -1231,7 +1231,7 @@ status_t EventHub::readNotifyLocked() {
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return 0;
- LOGW("could not get event, %s\n", strerror(errno));
+ ALOGW("could not get event, %s\n", strerror(errno));
return -1;
}
//printf("got %d bytes of event information\n", res);
@@ -1248,7 +1248,7 @@ status_t EventHub::readNotifyLocked() {
if(event->mask & IN_CREATE) {
openDeviceLocked(devname);
} else {
- LOGI("Removing device '%s' due to inotify event\n", devname);
+ ALOGI("Removing device '%s' due to inotify event\n", devname);
closeDeviceByPathLocked(devname);
}
}
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 4ade5950ab88..f2994abc2e35 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -121,7 +121,7 @@ static bool isValidKeyAction(int32_t action) {
static bool validateKeyEvent(int32_t action) {
if (! isValidKeyAction(action)) {
- LOGE("Key event has invalid action code 0x%x", action);
+ ALOGE("Key event has invalid action code 0x%x", action);
return false;
}
return true;
@@ -152,11 +152,11 @@ static bool isValidMotionAction(int32_t action, size_t pointerCount) {
static bool validateMotionEvent(int32_t action, size_t pointerCount,
const PointerProperties* pointerProperties) {
if (! isValidMotionAction(action, pointerCount)) {
- LOGE("Motion event has invalid action code 0x%x", action);
+ ALOGE("Motion event has invalid action code 0x%x", action);
return false;
}
if (pointerCount < 1 || pointerCount > MAX_POINTERS) {
- LOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.",
+ ALOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.",
pointerCount, MAX_POINTERS);
return false;
}
@@ -164,12 +164,12 @@ static bool validateMotionEvent(int32_t action, size_t pointerCount,
for (size_t i = 0; i < pointerCount; i++) {
int32_t id = pointerProperties[i].id;
if (id < 0 || id > MAX_POINTER_ID) {
- LOGE("Motion event has invalid pointer id %d; value must be between 0 and %d",
+ ALOGE("Motion event has invalid pointer id %d; value must be between 0 and %d",
id, MAX_POINTER_ID);
return false;
}
if (pointerIdBits.hasBit(id)) {
- LOGE("Motion event has duplicate pointer id %d", id);
+ ALOGE("Motion event has duplicate pointer id %d", id);
return false;
}
pointerIdBits.markBit(id);
@@ -564,21 +564,21 @@ void InputDispatcher::dropInboundEventLocked(EventEntry* entry, DropReason dropR
reason = "inbound event was dropped because the policy consumed it";
break;
case DROP_REASON_DISABLED:
- LOGI("Dropped event because input dispatch is disabled.");
+ ALOGI("Dropped event because input dispatch is disabled.");
reason = "inbound event was dropped because input dispatch is disabled";
break;
case DROP_REASON_APP_SWITCH:
- LOGI("Dropped event because of pending overdue app switch.");
+ ALOGI("Dropped event because of pending overdue app switch.");
reason = "inbound event was dropped because of pending overdue app switch";
break;
case DROP_REASON_BLOCKED:
- LOGI("Dropped event because the current application is not responding and the user "
+ ALOGI("Dropped event because the current application is not responding and the user "
"has started interacting with a different application.");
reason = "inbound event was dropped because the current application is not responding "
"and the user has started interacting with a different application";
break;
case DROP_REASON_STALE:
- LOGI("Dropped event because it is stale.");
+ ALOGI("Dropped event because it is stale.");
reason = "inbound event was dropped because it is stale";
break;
default:
@@ -1182,7 +1182,7 @@ int32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime,
goto Unresponsive;
}
- LOGI("Dropping event because there is no focused window or focused application.");
+ ALOGI("Dropping event because there is no focused window or focused application.");
injectionResult = INPUT_EVENT_INJECTION_FAILED;
goto Failed;
}
@@ -1401,7 +1401,7 @@ int32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime,
goto Unresponsive;
}
- LOGI("Dropping event because there is no touched window or focused application.");
+ ALOGI("Dropping event because there is no touched window or focused application.");
injectionResult = INPUT_EVENT_INJECTION_FAILED;
goto Failed;
}
@@ -1770,13 +1770,13 @@ bool InputDispatcher::checkInjectionPermission(const sp<InputWindowHandle>& wind
|| windowHandle->getInfo()->ownerUid != injectionState->injectorUid)
&& !hasInjectionPermission(injectionState->injectorPid, injectionState->injectorUid)) {
if (windowHandle != NULL) {
- LOGW("Permission denied: injecting event from pid %d uid %d to window %s "
+ ALOGW("Permission denied: injecting event from pid %d uid %d to window %s "
"owned by uid %d",
injectionState->injectorPid, injectionState->injectorUid,
windowHandle->getName().string(),
windowHandle->getInfo()->ownerUid);
} else {
- LOGW("Permission denied: injecting event from pid %d uid %d",
+ ALOGW("Permission denied: injecting event from pid %d uid %d",
injectionState->injectorPid, injectionState->injectorUid);
}
return false;
@@ -2160,7 +2160,7 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
keyEntry->eventTime);
if (status) {
- LOGE("channel '%s' ~ Could not publish key event, "
+ ALOGE("channel '%s' ~ Could not publish key event, "
"status=%d", connection->getInputChannelName(), status);
abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
return;
@@ -2223,7 +2223,7 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
usingCoords);
if (status) {
- LOGE("channel '%s' ~ Could not publish motion event, "
+ ALOGE("channel '%s' ~ Could not publish motion event, "
"status=%d", connection->getInputChannelName(), status);
abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
return;
@@ -2255,7 +2255,7 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
break;
}
if (status != OK) {
- LOGE("channel '%s' ~ Could not append motion sample "
+ ALOGE("channel '%s' ~ Could not append motion sample "
"for a reason other than out of memory, status=%d",
connection->getInputChannelName(), status);
abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
@@ -2278,7 +2278,7 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
// Send the dispatch signal.
status = connection->inputPublisher.sendDispatchSignal();
if (status) {
- LOGE("channel '%s' ~ Could not send dispatch signal, status=%d",
+ ALOGE("channel '%s' ~ Could not send dispatch signal, status=%d",
connection->getInputChannelName(), status);
abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
return;
@@ -2313,7 +2313,7 @@ void InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
// while waiting for the next dispatch cycle to begin.
status_t status = connection->inputPublisher.reset();
if (status) {
- LOGE("channel '%s' ~ Could not reset publisher, status=%d",
+ ALOGE("channel '%s' ~ Could not reset publisher, status=%d",
connection->getInputChannelName(), status);
abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
return;
@@ -2400,7 +2400,7 @@ int InputDispatcher::handleReceiveCallback(int receiveFd, int events, void* data
ssize_t connectionIndex = d->mConnectionsByReceiveFd.indexOfKey(receiveFd);
if (connectionIndex < 0) {
- LOGE("Received spurious receive callback for unknown input channel. "
+ ALOGE("Received spurious receive callback for unknown input channel. "
"fd=%d, events=0x%x", receiveFd, events);
return 0; // remove the callback
}
@@ -2409,7 +2409,7 @@ int InputDispatcher::handleReceiveCallback(int receiveFd, int events, void* data
sp<Connection> connection = d->mConnectionsByReceiveFd.valueAt(connectionIndex);
if (!(events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP))) {
if (!(events & ALOOPER_EVENT_INPUT)) {
- LOGW("channel '%s' ~ Received spurious callback for unhandled poll event. "
+ ALOGW("channel '%s' ~ Received spurious callback for unhandled poll event. "
"events=0x%x", connection->getInputChannelName(), events);
return 1;
}
@@ -2423,7 +2423,7 @@ int InputDispatcher::handleReceiveCallback(int receiveFd, int events, void* data
return 1;
}
- LOGE("channel '%s' ~ Failed to receive finished signal. status=%d",
+ ALOGE("channel '%s' ~ Failed to receive finished signal. status=%d",
connection->getInputChannelName(), status);
notify = true;
} else {
@@ -2432,7 +2432,7 @@ int InputDispatcher::handleReceiveCallback(int receiveFd, int events, void* data
// about them.
notify = !connection->monitor;
if (notify) {
- LOGW("channel '%s' ~ Consumer closed input channel or an error occurred. "
+ ALOGW("channel '%s' ~ Consumer closed input channel or an error occurred. "
"events=0x%x", connection->getInputChannelName(), events);
}
}
@@ -2547,7 +2547,7 @@ InputDispatcher::splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet
// different pointer ids than we expected based on the previous ACTION_DOWN
// or ACTION_POINTER_DOWN events that caused us to decide to split the pointers
// in this way.
- LOGW("Dropping split motion event because the pointer count is %d but "
+ ALOGW("Dropping split motion event because the pointer count is %d but "
"we expected there to be %d pointers. This probably means we received "
"a broken sequence of pointer ids from the input device.",
splitPointerCount, pointerIds.count());
@@ -3086,7 +3086,7 @@ int32_t InputDispatcher::injectInputEvent(const InputEvent* event,
}
default:
- LOGW("Cannot inject event of type %d", event->getType());
+ ALOGW("Cannot inject event of type %d", event->getType());
return INPUT_EVENT_INJECTION_FAILED;
}
@@ -3187,13 +3187,13 @@ void InputDispatcher::setInjectionResultLocked(EventEntry* entry, int32_t inject
ALOGV("Asynchronous input event injection succeeded.");
break;
case INPUT_EVENT_INJECTION_FAILED:
- LOGW("Asynchronous input event injection failed.");
+ ALOGW("Asynchronous input event injection failed.");
break;
case INPUT_EVENT_INJECTION_PERMISSION_DENIED:
- LOGW("Asynchronous input event injection permission denied.");
+ ALOGW("Asynchronous input event injection permission denied.");
break;
case INPUT_EVENT_INJECTION_TIMED_OUT:
- LOGW("Asynchronous input event injection timed out.");
+ ALOGW("Asynchronous input event injection timed out.");
break;
}
}
@@ -3635,7 +3635,7 @@ status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChan
AutoMutex _l(mLock);
if (getConnectionIndexLocked(inputChannel) >= 0) {
- LOGW("Attempted to register already registered input channel '%s'",
+ ALOGW("Attempted to register already registered input channel '%s'",
inputChannel->getName().string());
return BAD_VALUE;
}
@@ -3643,7 +3643,7 @@ status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChan
sp<Connection> connection = new Connection(inputChannel, inputWindowHandle, monitor);
status_t status = connection->initialize();
if (status) {
- LOGE("Failed to initialize input publisher for input channel '%s', status=%d",
+ ALOGE("Failed to initialize input publisher for input channel '%s', status=%d",
inputChannel->getName().string(), status);
return status;
}
@@ -3686,7 +3686,7 @@ status_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& i
bool notify) {
ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
if (connectionIndex < 0) {
- LOGW("Attempted to unregister already unregistered input channel '%s'",
+ ALOGW("Attempted to unregister already unregistered input channel '%s'",
inputChannel->getName().string());
return BAD_VALUE;
}
@@ -3762,7 +3762,7 @@ void InputDispatcher::onDispatchCycleFinishedLocked(
void InputDispatcher::onDispatchCycleBrokenLocked(
nsecs_t currentTime, const sp<Connection>& connection) {
- LOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
+ ALOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
connection->getInputChannelName());
CommandEntry* commandEntry = postCommandLocked(
@@ -3774,7 +3774,7 @@ void InputDispatcher::onANRLocked(
nsecs_t currentTime, const sp<InputApplicationHandle>& applicationHandle,
const sp<InputWindowHandle>& windowHandle,
nsecs_t eventTime, nsecs_t waitStartTime) {
- LOGI("Application is not responding: %s. "
+ ALOGI("Application is not responding: %s. "
"%01.1fms since event, %01.1fms since wait started",
getApplicationWindowLabelLocked(applicationHandle, windowHandle).string(),
(currentTime - eventTime) / 1000000.0,
diff --git a/services/input/InputManager.cpp b/services/input/InputManager.cpp
index 5dfa5d5930d8..6a6547bdf03c 100644
--- a/services/input/InputManager.cpp
+++ b/services/input/InputManager.cpp
@@ -53,13 +53,13 @@ void InputManager::initialize() {
status_t InputManager::start() {
status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
if (result) {
- LOGE("Could not start InputDispatcher thread due to error %d.", result);
+ ALOGE("Could not start InputDispatcher thread due to error %d.", result);
return result;
}
result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
if (result) {
- LOGE("Could not start InputReader thread due to error %d.", result);
+ ALOGE("Could not start InputReader thread due to error %d.", result);
mDispatcherThread->requestExit();
return result;
@@ -71,12 +71,12 @@ status_t InputManager::start() {
status_t InputManager::stop() {
status_t result = mReaderThread->requestExitAndWait();
if (result) {
- LOGW("Could not stop InputReader thread due to error %d.", result);
+ ALOGW("Could not stop InputReader thread due to error %d.", result);
}
result = mDispatcherThread->requestExitAndWait();
if (result) {
- LOGW("Could not stop InputDispatcher thread due to error %d.", result);
+ ALOGW("Could not stop InputDispatcher thread due to error %d.", result);
}
return OK;
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index 55ab0f6f97fc..bc1727221462 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -349,9 +349,9 @@ void InputReader::addDeviceLocked(nsecs_t when, int32_t deviceId) {
device->reset(when);
if (device->isIgnored()) {
- LOGI("Device added: id=%d, name='%s' (ignored non-input device)", deviceId, name.string());
+ ALOGI("Device added: id=%d, name='%s' (ignored non-input device)", deviceId, name.string());
} else {
- LOGI("Device added: id=%d, name='%s', sources=0x%08x", deviceId, name.string(),
+ ALOGI("Device added: id=%d, name='%s', sources=0x%08x", deviceId, name.string(),
device->getSources());
}
@@ -359,7 +359,7 @@ void InputReader::addDeviceLocked(nsecs_t when, int32_t deviceId) {
if (deviceIndex < 0) {
mDevices.add(deviceId, device);
} else {
- LOGW("Ignoring spurious device added event for deviceId %d.", deviceId);
+ ALOGW("Ignoring spurious device added event for deviceId %d.", deviceId);
delete device;
return;
}
@@ -372,15 +372,15 @@ void InputReader::removeDeviceLocked(nsecs_t when, int32_t deviceId) {
device = mDevices.valueAt(deviceIndex);
mDevices.removeItemsAt(deviceIndex, 1);
} else {
- LOGW("Ignoring spurious device removed event for deviceId %d.", deviceId);
+ ALOGW("Ignoring spurious device removed event for deviceId %d.", deviceId);
return;
}
if (device->isIgnored()) {
- LOGI("Device removed: id=%d, name='%s' (ignored non-input device)",
+ ALOGI("Device removed: id=%d, name='%s' (ignored non-input device)",
device->getId(), device->getName().string());
} else {
- LOGI("Device removed: id=%d, name='%s', sources=0x%08x",
+ ALOGI("Device removed: id=%d, name='%s', sources=0x%08x",
device->getId(), device->getName().string(), device->getSources());
}
@@ -446,7 +446,7 @@ void InputReader::processEventsForDeviceLocked(int32_t deviceId,
const RawEvent* rawEvents, size_t count) {
ssize_t deviceIndex = mDevices.indexOfKey(deviceId);
if (deviceIndex < 0) {
- LOGW("Discarding event for unknown deviceId %d.", deviceId);
+ ALOGW("Discarding event for unknown deviceId %d.", deviceId);
return;
}
@@ -485,7 +485,7 @@ void InputReader::refreshConfigurationLocked(uint32_t changes) {
mEventHub->setExcludedDevices(mConfig.excludedDeviceNames);
if (changes) {
- LOGI("Reconfiguring input devices. changes=0x%08x", changes);
+ ALOGI("Reconfiguring input devices. changes=0x%08x", changes);
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
if (changes & InputReaderConfiguration::CHANGE_MUST_REOPEN) {
@@ -547,7 +547,7 @@ void InputReader::disableVirtualKeysUntilLocked(nsecs_t time) {
bool InputReader::shouldDropVirtualKeyLocked(nsecs_t now,
InputDevice* device, int32_t keyCode, int32_t scanCode) {
if (now < mDisableVirtualKeysTimeout) {
- LOGI("Dropping virtual key from device %s because virtual keys are "
+ ALOGI("Dropping virtual key from device %s because virtual keys are "
"temporarily disabled for the next %0.3fms. keyCode=%d, scanCode=%d",
device->getName().string(),
(mDisableVirtualKeysTimeout - now) * 0.000001,
@@ -956,7 +956,7 @@ void InputDevice::process(const RawEvent* rawEvents, size_t count) {
#endif
}
} else if (rawEvent->type == EV_SYN && rawEvent->scanCode == SYN_DROPPED) {
- LOGI("Detected input event buffer overrun for device %s.", mName.string());
+ ALOGI("Detected input event buffer overrun for device %s.", mName.string());
mDropUntilNextSync = true;
reset(rawEvent->when);
} else {
@@ -1554,7 +1554,7 @@ void MultiTouchMotionAccumulator::process(const RawEvent* rawEvent) {
if (mCurrentSlot < 0 || size_t(mCurrentSlot) >= mSlotCount) {
#if DEBUG_POINTERS
if (newSlot) {
- LOGW("MultiTouch device emitted invalid slot index %d but it "
+ ALOGW("MultiTouch device emitted invalid slot index %d but it "
"should be between 0 and %d; ignoring this slot.",
mCurrentSlot, mSlotCount - 1);
}
@@ -1905,7 +1905,7 @@ void KeyboardInputMapper::processKey(nsecs_t when, bool down, int32_t keyCode,
mKeyDowns.removeAt(size_t(keyDownIndex));
} else {
// key was not actually down
- LOGI("Dropping key up from device %s because the key was not down. "
+ ALOGI("Dropping key up from device %s because the key was not down. "
"keyCode=%d, scanCode=%d",
getDeviceName().string(), keyCode, scanCode);
return;
@@ -2121,7 +2121,7 @@ void CursorInputMapper::configureParameters() {
if (cursorModeString == "navigation") {
mParameters.mode = Parameters::MODE_NAVIGATION;
} else if (cursorModeString != "pointer" && cursorModeString != "default") {
- LOGW("Invalid value for cursor.mode: '%s'", cursorModeString.string());
+ ALOGW("Invalid value for cursor.mode: '%s'", cursorModeString.string());
}
}
@@ -2530,7 +2530,7 @@ void TouchInputMapper::configureParameters() {
} else if (gestureModeString == "spots") {
mParameters.gestureMode = Parameters::GESTURE_MODE_SPOTS;
} else if (gestureModeString != "default") {
- LOGW("Invalid value for touch.gestureMode: '%s'", gestureModeString.string());
+ ALOGW("Invalid value for touch.gestureMode: '%s'", gestureModeString.string());
}
}
@@ -2560,7 +2560,7 @@ void TouchInputMapper::configureParameters() {
} else if (deviceTypeString == "pointer") {
mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
} else if (deviceTypeString != "default") {
- LOGW("Invalid value for touch.deviceType: '%s'", deviceTypeString.string());
+ ALOGW("Invalid value for touch.deviceType: '%s'", deviceTypeString.string());
}
}
@@ -2654,7 +2654,7 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {
// Ensure we have valid X and Y axes.
if (!mRawPointerAxes.x.valid || !mRawPointerAxes.y.valid) {
- LOGW(INDENT "Touch device '%s' did not report support for X or Y axis! "
+ ALOGW(INDENT "Touch device '%s' did not report support for X or Y axis! "
"The device will be inoperable.", getDeviceName().string());
mDeviceMode = DEVICE_MODE_DISABLED;
return;
@@ -2666,7 +2666,7 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {
mParameters.associatedDisplayIsExternal,
&mAssociatedDisplayWidth, &mAssociatedDisplayHeight,
&mAssociatedDisplayOrientation)) {
- LOGI(INDENT "Touch device '%s' could not query the properties of its associated "
+ ALOGI(INDENT "Touch device '%s' could not query the properties of its associated "
"display %d. The device will be inoperable until the display size "
"becomes available.",
getDeviceName().string(), mParameters.associatedDisplayId);
@@ -2712,7 +2712,7 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {
bool sizeChanged = mSurfaceWidth != width || mSurfaceHeight != height;
if (sizeChanged || deviceModeChanged) {
- LOGI("Device reconfigured: id=%d, name='%s', surface size is now %dx%d, mode is %d",
+ ALOGI("Device reconfigured: id=%d, name='%s', surface size is now %dx%d, mode is %d",
getDeviceId(), getDeviceName().string(), width, height, mDeviceMode);
mSurfaceWidth = width;
@@ -3010,7 +3010,7 @@ void TouchInputMapper::configureVirtualKeys() {
uint32_t flags;
if (getEventHub()->mapKey(getDeviceId(), virtualKey.scanCode,
& keyCode, & flags)) {
- LOGW(INDENT "VirtualKey %d: could not obtain key code, ignoring",
+ ALOGW(INDENT "VirtualKey %d: could not obtain key code, ignoring",
virtualKey.scanCode);
mVirtualKeys.pop(); // drop the key
continue;
@@ -3066,7 +3066,7 @@ void TouchInputMapper::parseCalibration() {
} else if (sizeCalibrationString == "area") {
out.sizeCalibration = Calibration::SIZE_CALIBRATION_AREA;
} else if (sizeCalibrationString != "default") {
- LOGW("Invalid value for touch.size.calibration: '%s'",
+ ALOGW("Invalid value for touch.size.calibration: '%s'",
sizeCalibrationString.string());
}
}
@@ -3089,7 +3089,7 @@ void TouchInputMapper::parseCalibration() {
} else if (pressureCalibrationString == "amplitude") {
out.pressureCalibration = Calibration::PRESSURE_CALIBRATION_AMPLITUDE;
} else if (pressureCalibrationString != "default") {
- LOGW("Invalid value for touch.pressure.calibration: '%s'",
+ ALOGW("Invalid value for touch.pressure.calibration: '%s'",
pressureCalibrationString.string());
}
}
@@ -3108,7 +3108,7 @@ void TouchInputMapper::parseCalibration() {
} else if (orientationCalibrationString == "vector") {
out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_VECTOR;
} else if (orientationCalibrationString != "default") {
- LOGW("Invalid value for touch.orientation.calibration: '%s'",
+ ALOGW("Invalid value for touch.orientation.calibration: '%s'",
orientationCalibrationString.string());
}
}
@@ -3122,7 +3122,7 @@ void TouchInputMapper::parseCalibration() {
} else if (distanceCalibrationString == "scaled") {
out.distanceCalibration = Calibration::DISTANCE_CALIBRATION_SCALED;
} else if (distanceCalibrationString != "default") {
- LOGW("Invalid value for touch.distance.calibration: '%s'",
+ ALOGW("Invalid value for touch.distance.calibration: '%s'",
distanceCalibrationString.string());
}
}
@@ -5686,7 +5686,7 @@ void MultiTouchInputMapper::configureRawPointerAxes() {
&& mRawPointerAxes.slot.minValue == 0 && mRawPointerAxes.slot.maxValue > 0) {
size_t slotCount = mRawPointerAxes.slot.maxValue + 1;
if (slotCount > MAX_SLOTS) {
- LOGW("MultiTouch Device %s reported %d slots but the framework "
+ ALOGW("MultiTouch Device %s reported %d slots but the framework "
"only supports a maximum of %d slots at this time.",
getDeviceName().string(), slotCount, MAX_SLOTS);
slotCount = MAX_SLOTS;
@@ -5822,7 +5822,7 @@ void JoystickInputMapper::configure(nsecs_t when,
// If there are too many axes, start dropping them.
// Prefer to keep explicitly mapped axes.
if (mAxes.size() > PointerCoords::MAX_AXES) {
- LOGI("Joystick '%s' has %d axes but the framework only supports a maximum of %d.",
+ ALOGI("Joystick '%s' has %d axes but the framework only supports a maximum of %d.",
getDeviceName().string(), mAxes.size(), PointerCoords::MAX_AXES);
pruneAxes(true);
pruneAxes(false);
@@ -5843,7 +5843,7 @@ void JoystickInputMapper::configure(nsecs_t when,
axis.axisInfo.axis = nextGenericAxisId;
nextGenericAxisId += 1;
} else {
- LOGI("Ignoring joystick '%s' axis %d because all of the generic axis ids "
+ ALOGI("Ignoring joystick '%s' axis %d because all of the generic axis ids "
"have already been assigned to other axes.",
getDeviceName().string(), mAxes.keyAt(i));
mAxes.removeItemsAt(i--);
@@ -5873,7 +5873,7 @@ void JoystickInputMapper::pruneAxes(bool ignoreExplicitlyMappedAxes) {
if (ignoreExplicitlyMappedAxes && mAxes.valueAt(i).explicitlyMapped) {
continue;
}
- LOGI("Discarding joystick '%s' axis %d because there are too many axes.",
+ ALOGI("Discarding joystick '%s' axis %d because there are too many axes.",
getDeviceName().string(), mAxes.keyAt(i));
mAxes.removeItemsAt(i);
}
diff --git a/services/input/SpriteController.cpp b/services/input/SpriteController.cpp
index 0ae2ab898d67..b15d4c8d3097 100644
--- a/services/input/SpriteController.cpp
+++ b/services/input/SpriteController.cpp
@@ -160,7 +160,7 @@ void SpriteController::doUpdateSprites() {
status_t status = update.state.surfaceControl->setSize(desiredWidth, desiredHeight);
if (status) {
- LOGE("Error %d resizing sprite surface from %dx%d to %dx%d",
+ ALOGE("Error %d resizing sprite surface from %dx%d to %dx%d",
status, update.state.surfaceWidth, update.state.surfaceHeight,
desiredWidth, desiredHeight);
} else {
@@ -172,7 +172,7 @@ void SpriteController::doUpdateSprites() {
if (update.state.surfaceVisible) {
status = update.state.surfaceControl->hide();
if (status) {
- LOGE("Error %d hiding sprite surface after resize.", status);
+ ALOGE("Error %d hiding sprite surface after resize.", status);
} else {
update.state.surfaceVisible = false;
}
@@ -200,7 +200,7 @@ void SpriteController::doUpdateSprites() {
Surface::SurfaceInfo surfaceInfo;
status_t status = surface->lock(&surfaceInfo);
if (status) {
- LOGE("Error %d locking sprite surface before drawing.", status);
+ ALOGE("Error %d locking sprite surface before drawing.", status);
} else {
SkBitmap surfaceBitmap;
ssize_t bpr = surfaceInfo.s * bytesPerPixel(surfaceInfo.format);
@@ -228,7 +228,7 @@ void SpriteController::doUpdateSprites() {
status = surface->unlockAndPost();
if (status) {
- LOGE("Error %d unlocking and posting sprite surface after drawing.", status);
+ ALOGE("Error %d unlocking and posting sprite surface after drawing.", status);
} else {
update.state.surfaceDrawn = true;
update.surfaceChanged = surfaceChanged = true;
@@ -260,7 +260,7 @@ void SpriteController::doUpdateSprites() {
&& (becomingVisible || (update.state.dirty & DIRTY_ALPHA))) {
status = update.state.surfaceControl->setAlpha(update.state.alpha);
if (status) {
- LOGE("Error %d setting sprite surface alpha.", status);
+ ALOGE("Error %d setting sprite surface alpha.", status);
}
}
@@ -271,7 +271,7 @@ void SpriteController::doUpdateSprites() {
update.state.positionX - update.state.icon.hotSpotX,
update.state.positionY - update.state.icon.hotSpotY);
if (status) {
- LOGE("Error %d setting sprite surface position.", status);
+ ALOGE("Error %d setting sprite surface position.", status);
}
}
@@ -284,7 +284,7 @@ void SpriteController::doUpdateSprites() {
update.state.transformationMatrix.dsdy,
update.state.transformationMatrix.dtdy);
if (status) {
- LOGE("Error %d setting sprite surface transformation matrix.", status);
+ ALOGE("Error %d setting sprite surface transformation matrix.", status);
}
}
@@ -293,14 +293,14 @@ void SpriteController::doUpdateSprites() {
&& (becomingVisible || (update.state.dirty & DIRTY_LAYER))) {
status = update.state.surfaceControl->setLayer(surfaceLayer);
if (status) {
- LOGE("Error %d setting sprite surface layer.", status);
+ ALOGE("Error %d setting sprite surface layer.", status);
}
}
if (becomingVisible) {
status = update.state.surfaceControl->show(surfaceLayer);
if (status) {
- LOGE("Error %d showing sprite surface.", status);
+ ALOGE("Error %d showing sprite surface.", status);
} else {
update.state.surfaceVisible = true;
update.surfaceChanged = surfaceChanged = true;
@@ -308,7 +308,7 @@ void SpriteController::doUpdateSprites() {
} else if (becomingHidden) {
status = update.state.surfaceControl->hide();
if (status) {
- LOGE("Error %d hiding sprite surface.", status);
+ ALOGE("Error %d hiding sprite surface.", status);
} else {
update.state.surfaceVisible = false;
update.surfaceChanged = surfaceChanged = true;
@@ -372,7 +372,7 @@ sp<SurfaceControl> SpriteController::obtainSurface(int32_t width, int32_t height
String8("Sprite"), 0, width, height, PIXEL_FORMAT_RGBA_8888);
if (surfaceControl == NULL || !surfaceControl->isValid()
|| !surfaceControl->getSurface()->isValid()) {
- LOGE("Error creating sprite surface.");
+ ALOGE("Error creating sprite surface.");
return NULL;
}
return surfaceControl;
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index bc8ce7ddf651..9573fda5c2ed 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -55,6 +55,7 @@ import com.google.android.collect.Lists;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.net.InetAddress;
+import java.net.Inet4Address;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -1325,7 +1326,17 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
String[] dnsServers = mDefaultDnsServers;
Collection<InetAddress> dnses = linkProperties.getDnses();
if (dnses != null) {
- dnsServers = NetworkUtils.makeStrings(dnses);
+ // we currently only handle IPv4
+ ArrayList<InetAddress> v4Dnses =
+ new ArrayList<InetAddress>(dnses.size());
+ for (InetAddress dnsAddress : dnses) {
+ if (dnsAddress instanceof Inet4Address) {
+ v4Dnses.add(dnsAddress);
+ }
+ }
+ if (v4Dnses.size() > 0) {
+ dnsServers = NetworkUtils.makeStrings(v4Dnses);
+ }
}
try {
mNMService.setDnsForwarders(dnsServers);
@@ -1383,11 +1394,12 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
boolean mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE;
@Override
public void enter() {
+ turnOnMasterTetherSettings(); // may transition us out
+
mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE; // better try something first pass
// or crazy tests cases will fail
chooseUpstreamType(mTryCell);
mTryCell = !mTryCell;
- turnOnMasterTetherSettings(); // may transition us out
}
@Override
public void exit() {
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index 36442a0c4fac..32aa7a48344e 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -713,8 +713,7 @@ final class Settings {
mBackupStoppedPackagesFilename.delete();
FileUtils.setPermissions(mStoppedPackagesFilename.toString(),
FileUtils.S_IRUSR|FileUtils.S_IWUSR
- |FileUtils.S_IRGRP|FileUtils.S_IWGRP
- |FileUtils.S_IROTH,
+ |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
-1, -1);
// Done, all is good!
@@ -951,8 +950,7 @@ final class Settings {
mBackupSettingsFilename.delete();
FileUtils.setPermissions(mSettingsFilename.toString(),
FileUtils.S_IRUSR|FileUtils.S_IWUSR
- |FileUtils.S_IRGRP|FileUtils.S_IWGRP
- |FileUtils.S_IROTH,
+ |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
-1, -1);
// Write package list file now, use a JournaledFile.
@@ -1007,8 +1005,7 @@ final class Settings {
FileUtils.setPermissions(mPackageListFilename.toString(),
FileUtils.S_IRUSR|FileUtils.S_IWUSR
- |FileUtils.S_IRGRP|FileUtils.S_IWGRP
- |FileUtils.S_IROTH,
+ |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
-1, -1);
writeStoppedLPr();
diff --git a/services/jni/com_android_server_AlarmManagerService.cpp b/services/jni/com_android_server_AlarmManagerService.cpp
index 5f189a24d2f3..c2f6151884b3 100644
--- a/services/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/jni/com_android_server_AlarmManagerService.cpp
@@ -46,7 +46,7 @@ static jint android_server_AlarmManagerService_setKernelTimezone(JNIEnv* env, jo
int result = settimeofday(NULL, &tz);
if (result < 0) {
- LOGE("Unable to set kernel timezone to %d: %s\n", minswest, strerror(errno));
+ ALOGE("Unable to set kernel timezone to %d: %s\n", minswest, strerror(errno));
return -1;
} else {
ALOGD("Kernel timezone updated to %d minutes west of GMT\n", minswest);
@@ -74,7 +74,7 @@ static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jin
int result = ioctl(fd, ANDROID_ALARM_SET(type), &ts);
if (result < 0)
{
- LOGE("Unable to set alarm to %lld.%09lld: %s\n", seconds, nanoseconds, strerror(errno));
+ ALOGE("Unable to set alarm to %lld.%09lld: %s\n", seconds, nanoseconds, strerror(errno));
}
}
@@ -89,7 +89,7 @@ static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject
if (result < 0)
{
- LOGE("Unable to wait on alarm: %s\n", strerror(errno));
+ ALOGE("Unable to wait on alarm: %s\n", strerror(errno));
return 0;
}
diff --git a/services/jni/com_android_server_BatteryService.cpp b/services/jni/com_android_server_BatteryService.cpp
index 2ceb5356e624..1cadc4eb8ac4 100644
--- a/services/jni/com_android_server_BatteryService.cpp
+++ b/services/jni/com_android_server_BatteryService.cpp
@@ -93,7 +93,7 @@ static jint getBatteryStatus(const char* status)
case 'U': return gConstants.statusUnknown; // Unknown
default: {
- LOGW("Unknown battery status '%s'", status);
+ ALOGW("Unknown battery status '%s'", status);
return gConstants.statusUnknown;
}
}
@@ -111,7 +111,7 @@ static jint getBatteryHealth(const char* status)
} else if (strcmp(status, "Over voltage") == 0) {
return gConstants.healthOverVoltage;
}
- LOGW("Unknown battery health[1] '%s'", status);
+ ALOGW("Unknown battery health[1] '%s'", status);
return gConstants.healthUnknown;
}
@@ -125,7 +125,7 @@ static jint getBatteryHealth(const char* status)
}
default: {
- LOGW("Unknown battery health[2] '%s'", status);
+ ALOGW("Unknown battery health[2] '%s'", status);
return gConstants.healthUnknown;
}
}
@@ -137,7 +137,7 @@ static int readFromFile(const char* path, char* buf, size_t size)
return -1;
int fd = open(path, O_RDONLY, 0);
if (fd == -1) {
- LOGE("Could not open '%s'", path);
+ ALOGE("Could not open '%s'", path);
return -1;
}
@@ -232,7 +232,7 @@ int register_android_server_BatteryService(JNIEnv* env)
DIR* dir = opendir(POWER_SUPPLY_PATH);
if (dir == NULL) {
- LOGE("Could not open %s\n", POWER_SUPPLY_PATH);
+ ALOGE("Could not open %s\n", POWER_SUPPLY_PATH);
return -1;
}
while ((entry = readdir(dir))) {
@@ -304,28 +304,28 @@ int register_android_server_BatteryService(JNIEnv* env)
closedir(dir);
if (!gPaths.acOnlinePath)
- LOGE("acOnlinePath not found");
+ ALOGE("acOnlinePath not found");
if (!gPaths.usbOnlinePath)
- LOGE("usbOnlinePath not found");
+ ALOGE("usbOnlinePath not found");
if (!gPaths.batteryStatusPath)
- LOGE("batteryStatusPath not found");
+ ALOGE("batteryStatusPath not found");
if (!gPaths.batteryHealthPath)
- LOGE("batteryHealthPath not found");
+ ALOGE("batteryHealthPath not found");
if (!gPaths.batteryPresentPath)
- LOGE("batteryPresentPath not found");
+ ALOGE("batteryPresentPath not found");
if (!gPaths.batteryCapacityPath)
- LOGE("batteryCapacityPath not found");
+ ALOGE("batteryCapacityPath not found");
if (!gPaths.batteryVoltagePath)
- LOGE("batteryVoltagePath not found");
+ ALOGE("batteryVoltagePath not found");
if (!gPaths.batteryTemperaturePath)
- LOGE("batteryTemperaturePath not found");
+ ALOGE("batteryTemperaturePath not found");
if (!gPaths.batteryTechnologyPath)
- LOGE("batteryTechnologyPath not found");
+ ALOGE("batteryTechnologyPath not found");
jclass clazz = env->FindClass("com/android/server/BatteryService");
if (clazz == NULL) {
- LOGE("Can't find com/android/server/BatteryService");
+ ALOGE("Can't find com/android/server/BatteryService");
return -1;
}
@@ -352,7 +352,7 @@ int register_android_server_BatteryService(JNIEnv* env)
clazz = env->FindClass("android/os/BatteryManager");
if (clazz == NULL) {
- LOGE("Can't find android/os/BatteryManager");
+ ALOGE("Can't find android/os/BatteryManager");
return -1;
}
diff --git a/services/jni/com_android_server_InputManager.cpp b/services/jni/com_android_server_InputManager.cpp
index 145f71314408..e163826e1597 100644
--- a/services/jni/com_android_server_InputManager.cpp
+++ b/services/jni/com_android_server_InputManager.cpp
@@ -312,7 +312,7 @@ void NativeInputManager::dump(String8& dump) {
bool NativeInputManager::checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
return true;
@@ -686,7 +686,7 @@ void NativeInputManager::setPointerSpeed(int32_t speed) {
return;
}
- LOGI("Setting pointer speed to %d.", speed);
+ ALOGI("Setting pointer speed to %d.", speed);
mLocked.pointerSpeed = speed;
} // release lock
@@ -702,7 +702,7 @@ void NativeInputManager::setShowTouches(bool enabled) {
return;
}
- LOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled");
+ ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled");
mLocked.showTouches = enabled;
} // release lock
@@ -736,7 +736,7 @@ bool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t
}
if (!inputEventObj) {
- LOGE("Failed to obtain input event object for filterInputEvent.");
+ ALOGE("Failed to obtain input event object for filterInputEvent.");
return true; // dispatch the event normally
}
@@ -774,7 +774,7 @@ void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent,
android_view_KeyEvent_recycle(env, keyEventObj);
env->DeleteLocalRef(keyEventObj);
} else {
- LOGE("Failed to obtain key event object for interceptKeyBeforeQueueing.");
+ ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing.");
wmActions = 0;
}
@@ -879,7 +879,7 @@ nsecs_t NativeInputManager::interceptKeyBeforeDispatching(
}
}
} else {
- LOGE("Failed to obtain key event object for interceptKeyBeforeDispatching.");
+ ALOGE("Failed to obtain key event object for interceptKeyBeforeDispatching.");
}
env->DeleteLocalRef(inputWindowHandleObj);
}
@@ -917,7 +917,7 @@ bool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& input
env->DeleteLocalRef(fallbackKeyEventObj);
}
} else {
- LOGE("Failed to obtain key event object for dispatchUnhandledKey.");
+ ALOGE("Failed to obtain key event object for dispatchUnhandledKey.");
}
env->DeleteLocalRef(inputWindowHandleObj);
}
@@ -958,7 +958,7 @@ static sp<NativeInputManager> gNativeInputManager;
static bool checkInputManagerUnitialized(JNIEnv* env) {
if (gNativeInputManager == NULL) {
- LOGE("Input manager not initialized.");
+ ALOGE("Input manager not initialized.");
jniThrowRuntimeException(env, "Input manager not initialized.");
return true;
}
@@ -971,7 +971,7 @@ static void android_server_InputManager_nativeInit(JNIEnv* env, jclass clazz,
sp<Looper> looper = android_os_MessageQueue_getLooper(env, messageQueueObj);
gNativeInputManager = new NativeInputManager(contextObj, callbacksObj, looper);
} else {
- LOGE("Input manager already initialized.");
+ ALOGE("Input manager already initialized.");
jniThrowRuntimeException(env, "Input manager already initialized.");
}
}
@@ -1068,7 +1068,7 @@ static void throwInputChannelNotInitialized(JNIEnv* env) {
static void android_server_InputManager_handleInputChannelDisposed(JNIEnv* env,
jobject inputChannelObj, const sp<InputChannel>& inputChannel, void* data) {
- LOGW("Input channel object '%s' was disposed without first being unregistered with "
+ ALOGW("Input channel object '%s' was disposed without first being unregistered with "
"the input manager!", inputChannel->getName().string());
if (gNativeInputManager != NULL) {
diff --git a/services/jni/com_android_server_PowerManagerService.cpp b/services/jni/com_android_server_PowerManagerService.cpp
index 08650e1905a3..d2b3118d09a6 100644
--- a/services/jni/com_android_server_PowerManagerService.cpp
+++ b/services/jni/com_android_server_PowerManagerService.cpp
@@ -58,7 +58,7 @@ static const nsecs_t MIN_TIME_BETWEEN_USERACTIVITIES = 500 * 1000000L; // 500ms
static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
return true;
diff --git a/services/jni/com_android_server_UsbDeviceManager.cpp b/services/jni/com_android_server_UsbDeviceManager.cpp
index 40f0dbd81430..0cd94b91fe39 100644
--- a/services/jni/com_android_server_UsbDeviceManager.cpp
+++ b/services/jni/com_android_server_UsbDeviceManager.cpp
@@ -42,7 +42,7 @@ static struct parcel_file_descriptor_offsets_t
static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
}
@@ -66,7 +66,7 @@ static jobjectArray android_server_UsbDeviceManager_getAccessoryStrings(JNIEnv *
{
int fd = open(DRIVER_NAME, O_RDWR);
if (fd < 0) {
- LOGE("could not open %s", DRIVER_NAME);
+ ALOGE("could not open %s", DRIVER_NAME);
return NULL;
}
jclass stringClass = env->FindClass("java/lang/String");
@@ -88,7 +88,7 @@ static jobject android_server_UsbDeviceManager_openAccessory(JNIEnv *env, jobjec
{
int fd = open(DRIVER_NAME, O_RDWR);
if (fd < 0) {
- LOGE("could not open %s", DRIVER_NAME);
+ ALOGE("could not open %s", DRIVER_NAME);
return NULL;
}
jobject fileDescriptor = jniCreateFileDescriptor(env, fd);
@@ -103,7 +103,7 @@ static jboolean android_server_UsbDeviceManager_isStartRequested(JNIEnv *env, jo
{
int fd = open(DRIVER_NAME, O_RDWR);
if (fd < 0) {
- LOGE("could not open %s", DRIVER_NAME);
+ ALOGE("could not open %s", DRIVER_NAME);
return false;
}
int result = ioctl(fd, ACCESSORY_IS_START_REQUESTED);
@@ -125,7 +125,7 @@ int register_android_server_UsbDeviceManager(JNIEnv *env)
{
jclass clazz = env->FindClass("com/android/server/usb/UsbDeviceManager");
if (clazz == NULL) {
- LOGE("Can't find com/android/server/usb/UsbDeviceManager");
+ ALOGE("Can't find com/android/server/usb/UsbDeviceManager");
return -1;
}
diff --git a/services/jni/com_android_server_UsbHostManager.cpp b/services/jni/com_android_server_UsbHostManager.cpp
index f1abf5605143..d0a6cdf2e57b 100644
--- a/services/jni/com_android_server_UsbHostManager.cpp
+++ b/services/jni/com_android_server_UsbHostManager.cpp
@@ -45,7 +45,7 @@ static jmethodID method_usbDeviceRemoved;
static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
}
@@ -57,7 +57,7 @@ static int usb_device_added(const char *devname, void* client_data) {
struct usb_device *device = usb_device_open(devname);
if (!device) {
- LOGE("usb_device_open failed\n");
+ ALOGE("usb_device_open failed\n");
return 0;
}
@@ -135,7 +135,7 @@ static void android_server_UsbHostManager_monitorUsbHostBus(JNIEnv *env, jobject
{
struct usb_host_context* context = usb_host_init();
if (!context) {
- LOGE("usb_host_init failed");
+ ALOGE("usb_host_init failed");
return;
}
// this will never return so it is safe to pass thiz directly
@@ -175,17 +175,17 @@ int register_android_server_UsbHostManager(JNIEnv *env)
{
jclass clazz = env->FindClass("com/android/server/usb/UsbHostManager");
if (clazz == NULL) {
- LOGE("Can't find com/android/server/usb/UsbHostManager");
+ ALOGE("Can't find com/android/server/usb/UsbHostManager");
return -1;
}
method_usbDeviceAdded = env->GetMethodID(clazz, "usbDeviceAdded", "(Ljava/lang/String;IIIII[I[I)V");
if (method_usbDeviceAdded == NULL) {
- LOGE("Can't find usbDeviceAdded");
+ ALOGE("Can't find usbDeviceAdded");
return -1;
}
method_usbDeviceRemoved = env->GetMethodID(clazz, "usbDeviceRemoved", "(Ljava/lang/String;)V");
if (method_usbDeviceRemoved == NULL) {
- LOGE("Can't find usbDeviceRemoved");
+ ALOGE("Can't find usbDeviceRemoved");
return -1;
}
diff --git a/services/jni/com_android_server_VibratorService.cpp b/services/jni/com_android_server_VibratorService.cpp
index 0912d437241c..2b3f74a97184 100644
--- a/services/jni/com_android_server_VibratorService.cpp
+++ b/services/jni/com_android_server_VibratorService.cpp
@@ -36,13 +36,13 @@ static jboolean vibratorExists(JNIEnv *env, jobject clazz)
static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms)
{
- // LOGI("vibratorOn\n");
+ // ALOGI("vibratorOn\n");
vibrator_on(timeout_ms);
}
static void vibratorOff(JNIEnv *env, jobject clazz)
{
- // LOGI("vibratorOff\n");
+ // ALOGI("vibratorOff\n");
vibrator_off();
}
diff --git a/services/jni/com_android_server_connectivity_Vpn.cpp b/services/jni/com_android_server_connectivity_Vpn.cpp
index d9b8a1488d69..ab8c959f692f 100644
--- a/services/jni/com_android_server_connectivity_Vpn.cpp
+++ b/services/jni/com_android_server_connectivity_Vpn.cpp
@@ -63,21 +63,21 @@ static int create_interface(int mtu)
// Allocate interface.
ifr4.ifr_flags = IFF_TUN | IFF_NO_PI;
if (ioctl(tun, TUNSETIFF, &ifr4)) {
- LOGE("Cannot allocate TUN: %s", strerror(errno));
+ ALOGE("Cannot allocate TUN: %s", strerror(errno));
goto error;
}
// Activate interface.
ifr4.ifr_flags = IFF_UP;
if (ioctl(inet4, SIOCSIFFLAGS, &ifr4)) {
- LOGE("Cannot activate %s: %s", ifr4.ifr_name, strerror(errno));
+ ALOGE("Cannot activate %s: %s", ifr4.ifr_name, strerror(errno));
goto error;
}
// Set MTU if it is specified.
ifr4.ifr_mtu = mtu;
if (mtu > 0 && ioctl(inet4, SIOCSIFMTU, &ifr4)) {
- LOGE("Cannot set MTU on %s: %s", ifr4.ifr_name, strerror(errno));
+ ALOGE("Cannot set MTU on %s: %s", ifr4.ifr_name, strerror(errno));
goto error;
}
@@ -92,7 +92,7 @@ static int get_interface_name(char *name, int tun)
{
ifreq ifr4;
if (ioctl(tun, TUNGETIFF, &ifr4)) {
- LOGE("Cannot get interface name: %s", strerror(errno));
+ ALOGE("Cannot get interface name: %s", strerror(errno));
return SYSTEM_ERROR;
}
strncpy(name, ifr4.ifr_name, IFNAMSIZ);
@@ -104,7 +104,7 @@ static int get_interface_index(const char *name)
ifreq ifr4;
strncpy(ifr4.ifr_name, name, IFNAMSIZ);
if (ioctl(inet4, SIOGIFINDEX, &ifr4)) {
- LOGE("Cannot get index of %s: %s", name, strerror(errno));
+ ALOGE("Cannot get index of %s: %s", name, strerror(errno));
return SYSTEM_ERROR;
}
return ifr4.ifr_ifindex;
@@ -176,11 +176,11 @@ static int set_addresses(const char *name, const char *addresses)
}
if (count == BAD_ARGUMENT) {
- LOGE("Invalid address: %s/%d", address, prefix);
+ ALOGE("Invalid address: %s/%d", address, prefix);
} else if (count == SYSTEM_ERROR) {
- LOGE("Cannot add address: %s/%d: %s", address, prefix, strerror(errno));
+ ALOGE("Cannot add address: %s/%d: %s", address, prefix, strerror(errno));
} else if (*addresses) {
- LOGE("Invalid address: %s", addresses);
+ ALOGE("Invalid address: %s", addresses);
count = BAD_ARGUMENT;
}
@@ -265,12 +265,12 @@ static int set_routes(const char *name, const char *routes)
}
if (count == BAD_ARGUMENT) {
- LOGE("Invalid route: %s/%d", address, prefix);
+ ALOGE("Invalid route: %s/%d", address, prefix);
} else if (count == SYSTEM_ERROR) {
- LOGE("Cannot add route: %s/%d: %s",
+ ALOGE("Cannot add route: %s/%d: %s",
address, prefix, strerror(errno));
} else if (*routes) {
- LOGE("Invalid route: %s", routes);
+ ALOGE("Invalid route: %s", routes);
count = BAD_ARGUMENT;
}
@@ -284,7 +284,7 @@ static int reset_interface(const char *name)
ifr4.ifr_flags = 0;
if (ioctl(inet4, SIOCSIFFLAGS, &ifr4) && errno != ENODEV) {
- LOGE("Cannot reset %s: %s", name, strerror(errno));
+ ALOGE("Cannot reset %s: %s", name, strerror(errno));
return SYSTEM_ERROR;
}
return 0;
@@ -297,7 +297,7 @@ static int check_interface(const char *name)
ifr4.ifr_flags = 0;
if (ioctl(inet4, SIOCGIFFLAGS, &ifr4) && errno != ENODEV) {
- LOGE("Cannot check %s: %s", name, strerror(errno));
+ ALOGE("Cannot check %s: %s", name, strerror(errno));
}
return ifr4.ifr_flags;
}
@@ -305,7 +305,7 @@ static int check_interface(const char *name)
static int bind_to_interface(int socket, const char *name)
{
if (setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))) {
- LOGE("Cannot bind socket to %s: %s", name, strerror(errno));
+ ALOGE("Cannot bind socket to %s: %s", name, strerror(errno));
return SYSTEM_ERROR;
}
return 0;
diff --git a/services/jni/com_android_server_location_GpsLocationProvider.cpp b/services/jni/com_android_server_location_GpsLocationProvider.cpp
index 2e5b5d6fa591..50bd46e704e4 100755
--- a/services/jni/com_android_server_location_GpsLocationProvider.cpp
+++ b/services/jni/com_android_server_location_GpsLocationProvider.cpp
@@ -62,7 +62,7 @@ namespace android {
static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
- LOGE("An exception was thrown by callback '%s'.", methodName);
+ ALOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
}
@@ -196,7 +196,7 @@ static void gps_ni_notify_callback(GpsNiNotification *notification)
notification->requestor_id_encoding,
notification->text_encoding, extras);
} else {
- LOGE("out of memory in gps_ni_notify_callback\n");
+ ALOGE("out of memory in gps_ni_notify_callback\n");
}
if (requestor_id)
@@ -376,7 +376,7 @@ static void android_location_GpsLocationProvider_agps_set_reference_location_cel
AGpsRefLocation location;
if (!sAGpsRilInterface) {
- LOGE("no AGPS RIL interface in agps_set_reference_location_cellid");
+ ALOGE("no AGPS RIL interface in agps_set_reference_location_cellid");
return;
}
@@ -390,7 +390,7 @@ static void android_location_GpsLocationProvider_agps_set_reference_location_cel
location.u.cellID.cid = cid;
break;
default:
- LOGE("Neither a GSM nor a UMTS cellid (%s:%d).",__FUNCTION__,__LINE__);
+ ALOGE("Neither a GSM nor a UMTS cellid (%s:%d).",__FUNCTION__,__LINE__);
return;
break;
}
@@ -403,7 +403,7 @@ static void android_location_GpsLocationProvider_agps_send_ni_message(JNIEnv* en
size_t sz;
if (!sAGpsRilInterface) {
- LOGE("no AGPS RIL interface in send_ni_message");
+ ALOGE("no AGPS RIL interface in send_ni_message");
return;
}
if (size < 0)
@@ -418,7 +418,7 @@ static void android_location_GpsLocationProvider_agps_set_id(JNIEnv *env,
jobject obj, jint type, jstring setid_string)
{
if (!sAGpsRilInterface) {
- LOGE("no AGPS RIL interface in agps_set_id");
+ ALOGE("no AGPS RIL interface in agps_set_id");
return;
}
@@ -463,7 +463,7 @@ static void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, j
jbyteArray data, jint length)
{
if (!sGpsXtraInterface) {
- LOGE("no XTRA interface in inject_xtra_data");
+ ALOGE("no XTRA interface in inject_xtra_data");
return;
}
@@ -475,7 +475,7 @@ static void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, j
static void android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv* env, jobject obj, jstring apn)
{
if (!sAGpsInterface) {
- LOGE("no AGPS interface in agps_data_conn_open");
+ ALOGE("no AGPS interface in agps_data_conn_open");
return;
}
if (apn == NULL) {
@@ -490,7 +490,7 @@ static void android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv* env
static void android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv* env, jobject obj)
{
if (!sAGpsInterface) {
- LOGE("no AGPS interface in agps_data_conn_open");
+ ALOGE("no AGPS interface in agps_data_conn_open");
return;
}
sAGpsInterface->data_conn_closed();
@@ -499,7 +499,7 @@ static void android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv* e
static void android_location_GpsLocationProvider_agps_data_conn_failed(JNIEnv* env, jobject obj)
{
if (!sAGpsInterface) {
- LOGE("no AGPS interface in agps_data_conn_open");
+ ALOGE("no AGPS interface in agps_data_conn_open");
return;
}
sAGpsInterface->data_conn_failed();
@@ -509,7 +509,7 @@ static void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jo
jint type, jstring hostname, jint port)
{
if (!sAGpsInterface) {
- LOGE("no AGPS interface in agps_data_conn_open");
+ ALOGE("no AGPS interface in agps_data_conn_open");
return;
}
const char *c_hostname = env->GetStringUTFChars(hostname, NULL);
@@ -521,7 +521,7 @@ static void android_location_GpsLocationProvider_send_ni_response(JNIEnv* env, j
jint notifId, jint response)
{
if (!sGpsNiInterface) {
- LOGE("no NI interface in send_ni_response");
+ ALOGE("no NI interface in send_ni_response");
return;
}
diff --git a/services/jni/onload.cpp b/services/jni/onload.cpp
index 4178039fa55a..286ae9156d99 100644
--- a/services/jni/onload.cpp
+++ b/services/jni/onload.cpp
@@ -43,7 +43,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- LOGE("GetEnv failed!");
+ ALOGE("GetEnv failed!");
return result;
}
LOG_ASSERT(env, "Could not retrieve the env!");
diff --git a/services/sensorservice/Fusion.cpp b/services/sensorservice/Fusion.cpp
index d76f19c1ad47..b724ce24ee8d 100644
--- a/services/sensorservice/Fusion.cpp
+++ b/services/sensorservice/Fusion.cpp
@@ -338,7 +338,7 @@ void Fusion::checkState() {
if (!isPositiveSemidefinite(P[0][0], SYMMETRY_TOLERANCE) ||
!isPositiveSemidefinite(P[1][1], SYMMETRY_TOLERANCE)) {
- LOGW("Sensor fusion diverged; resetting state.");
+ ALOGW("Sensor fusion diverged; resetting state.");
P = 0;
}
}
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index 8f2350630531..2244a868836a 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -105,13 +105,13 @@ SensorDevice::SensorDevice()
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
- LOGE_IF(err, "couldn't load %s module (%s)",
+ ALOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorModule) {
err = sensors_open(&mSensorModule->common, &mSensorDevice);
- LOGE_IF(err, "couldn't open device for module %s (%s)",
+ ALOGE_IF(err, "couldn't open device for module %s (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorDevice) {
@@ -219,7 +219,7 @@ status_t SensorDevice::activate(void* ident, int handle, int enabled)
err = mSensorDevice->activate(mSensorDevice, handle, enabled);
if (enabled) {
- LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err));
+ ALOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err));
if (err == 0) {
BatteryService::getInstance().enableSensor(handle);
}
@@ -256,7 +256,7 @@ status_t SensorDevice::Info::setDelayForIdent(void* ident, int64_t ns)
{
ssize_t index = rates.indexOfKey(ident);
if (index < 0) {
- LOGE("Info::setDelayForIdent(ident=%p, ns=%lld) failed (%s)",
+ ALOGE("Info::setDelayForIdent(ident=%p, ns=%lld) failed (%s)",
ident, ns, strerror(-index));
return BAD_INDEX;
}
diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp
index be8eaff73610..468aa61973e8 100644
--- a/services/sensorservice/SensorInterface.cpp
+++ b/services/sensorservice/SensorInterface.cpp
@@ -34,7 +34,7 @@ HardwareSensor::HardwareSensor(const sensor_t& sensor)
: mSensorDevice(SensorDevice::getInstance()),
mSensor(&sensor)
{
- LOGI("%s", sensor.name);
+ ALOGI("%s", sensor.name);
}
HardwareSensor::~HardwareSensor() {
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 3e4a2f59efec..dd6c426e9f2f 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -234,7 +234,7 @@ bool SensorService::threadLoop()
do {
count = device.poll(buffer, numEventMax);
if (count<0) {
- LOGE("sensor poll failed (%s)", strerror(-count));
+ ALOGE("sensor poll failed (%s)", strerror(-count));
break;
}
@@ -286,7 +286,7 @@ bool SensorService::threadLoop()
}
} while (count >= 0 || Thread::exitPending());
- LOGW("Exiting SensorService::threadLoop => aborting...");
+ ALOGW("Exiting SensorService::threadLoop => aborting...");
abort();
return false;
}
@@ -369,13 +369,13 @@ void SensorService::cleanupConnection(SensorEventConnection* c)
if (c->hasSensor(handle)) {
ALOGD_IF(DEBUG_CONNECTIONS, "%i: disabling handle=0x%08x", i, handle);
SensorInterface* sensor = mSensorMap.valueFor( handle );
- LOGE_IF(!sensor, "mSensorMap[handle=0x%08x] is null!", handle);
+ ALOGE_IF(!sensor, "mSensorMap[handle=0x%08x] is null!", handle);
if (sensor) {
sensor->activate(c, false);
}
}
SensorRecord* rec = mActiveSensors.valueAt(i);
- LOGE_IF(!rec, "mActiveSensors[%d] is null (handle=0x%08x)!", i, handle);
+ ALOGE_IF(!rec, "mActiveSensors[%d] is null (handle=0x%08x)!", i, handle);
ALOGD_IF(DEBUG_CONNECTIONS,
"removing connection %p for sensor[%d].handle=0x%08x",
c, i, handle);
@@ -594,11 +594,11 @@ status_t SensorService::SensorEventConnection::sendEvents(
if (size == -EAGAIN) {
// the destination doesn't accept events anymore, it's probably
// full. For now, we just drop the events on the floor.
- //LOGW("dropping %d events on the floor", count);
+ //ALOGW("dropping %d events on the floor", count);
return size;
}
- //LOGE_IF(size<0, "dropping %d events on the floor (%s)",
+ //ALOGE_IF(size<0, "dropping %d events on the floor (%s)",
// count, strerror(-size));
return size < 0 ? status_t(size) : status_t(NO_ERROR);
diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
index 3bbc75e6f8a6..cf131b11db0b 100644
--- a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
+++ b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
@@ -53,7 +53,7 @@ void checkGLErrors()
GLenum error = glGetError();
if (error == GL_NO_ERROR)
break;
- LOGE("GL error 0x%04x", int(error));
+ ALOGE("GL error 0x%04x", int(error));
} while(true);
}
@@ -62,7 +62,7 @@ void checkEGLErrors(const char* token)
{
EGLint error = eglGetError();
if (error && error != EGL_SUCCESS) {
- LOGE("%s: EGL error 0x%04x (%s)",
+ ALOGE("%s: EGL error 0x%04x (%s)",
token, int(error), EGLUtils::strerror(error));
}
}
@@ -130,7 +130,7 @@ void DisplayHardware::init(uint32_t dpy)
mNativeWindow = new FramebufferNativeWindow();
framebuffer_device_t const * fbDev = mNativeWindow->getDevice();
if (!fbDev) {
- LOGE("Display subsystem failed to initialize. check logs. exiting...");
+ ALOGE("Display subsystem failed to initialize. check logs. exiting...");
exit(0);
}
@@ -173,7 +173,7 @@ void DisplayHardware::init(uint32_t dpy)
char property[PROPERTY_VALUE_MAX];
if (property_get("debug.sf.hw", property, NULL) > 0) {
if (atoi(property) == 0) {
- LOGW("H/W composition disabled");
+ ALOGW("H/W composition disabled");
attribs[2] = EGL_CONFIG_CAVEAT;
attribs[3] = EGL_SLOW_CONFIG;
}
@@ -188,7 +188,7 @@ void DisplayHardware::init(uint32_t dpy)
EGLConfig config = NULL;
err = selectConfigForPixelFormat(display, attribs, format, &config);
- LOGE_IF(err, "couldn't find an EGLConfig matching the screen format");
+ ALOGE_IF(err, "couldn't find an EGLConfig matching the screen format");
EGLint r,g,b,a;
eglGetConfigAttrib(display, config, EGL_RED_SIZE, &r);
@@ -231,7 +231,7 @@ void DisplayHardware::init(uint32_t dpy)
*/
if (property_get("qemu.sf.lcd_density", property, NULL) <= 0) {
if (property_get("ro.sf.lcd_density", property, NULL) <= 0) {
- LOGW("ro.sf.lcd_density not defined, using 160 dpi by default.");
+ ALOGW("ro.sf.lcd_density not defined, using 160 dpi by default.");
strcpy(property, "160");
}
} else {
@@ -270,7 +270,7 @@ void DisplayHardware::init(uint32_t dpy)
result = eglMakeCurrent(display, surface, surface, context);
if (!result) {
- LOGE("Couldn't create a working GLES context. check logs. exiting...");
+ ALOGE("Couldn't create a working GLES context. check logs. exiting...");
exit(0);
}
@@ -287,22 +287,22 @@ void DisplayHardware::init(uint32_t dpy)
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims);
- LOGI("EGL informations:");
- LOGI("# of configs : %d", numConfigs);
- LOGI("vendor : %s", extensions.getEglVendor());
- LOGI("version : %s", extensions.getEglVersion());
- LOGI("extensions: %s", extensions.getEglExtension());
- LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
- LOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, config);
-
- LOGI("OpenGL informations:");
- LOGI("vendor : %s", extensions.getVendor());
- LOGI("renderer : %s", extensions.getRenderer());
- LOGI("version : %s", extensions.getVersion());
- LOGI("extensions: %s", extensions.getExtension());
- LOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize);
- LOGI("GL_MAX_VIEWPORT_DIMS = %d x %d", mMaxViewportDims[0], mMaxViewportDims[1]);
- LOGI("flags = %08x", mFlags);
+ ALOGI("EGL informations:");
+ ALOGI("# of configs : %d", numConfigs);
+ ALOGI("vendor : %s", extensions.getEglVendor());
+ ALOGI("version : %s", extensions.getEglVersion());
+ ALOGI("extensions: %s", extensions.getEglExtension());
+ ALOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
+ ALOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, config);
+
+ ALOGI("OpenGL informations:");
+ ALOGI("vendor : %s", extensions.getVendor());
+ ALOGI("renderer : %s", extensions.getRenderer());
+ ALOGI("version : %s", extensions.getVersion());
+ ALOGI("extensions: %s", extensions.getExtension());
+ ALOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize);
+ ALOGI("GL_MAX_VIEWPORT_DIMS = %d x %d", mMaxViewportDims[0], mMaxViewportDims[1]);
+ ALOGI("flags = %08x", mFlags);
// Unbind the context from this thread
eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
index 174dcd7f435f..f4afeeaa0a10 100644
--- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
+++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
@@ -76,7 +76,7 @@ bool DisplayHardwareBase::DisplayEventThread::threadLoop()
err = read(fd, &buf, 1);
} while (err < 0 && errno == EINTR);
close(fd);
- LOGW_IF(err<0, "ANDROID_WAIT_FOR_FB_SLEEP failed (%s)", strerror(errno));
+ ALOGW_IF(err<0, "ANDROID_WAIT_FOR_FB_SLEEP failed (%s)", strerror(errno));
if (err >= 0) {
sp<SurfaceFlinger> flinger = mFlinger.promote();
ALOGD("About to give-up screen, flinger = %p", flinger.get());
@@ -91,7 +91,7 @@ bool DisplayHardwareBase::DisplayEventThread::threadLoop()
err = read(fd, &buf, 1);
} while (err < 0 && errno == EINTR);
close(fd);
- LOGW_IF(err<0, "ANDROID_WAIT_FOR_FB_WAKE failed (%s)", strerror(errno));
+ ALOGW_IF(err<0, "ANDROID_WAIT_FOR_FB_WAKE failed (%s)", strerror(errno));
if (err >= 0) {
sp<SurfaceFlinger> flinger = mFlinger.promote();
ALOGD("Screen about to return, flinger = %p", flinger.get());
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index be9b2265c7db..f17bf43bfc91 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -44,10 +44,10 @@ HWComposer::HWComposer(const sp<SurfaceFlinger>& flinger)
mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE)
{
int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
- LOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
+ ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
if (err == 0) {
err = hwc_open(mModule, &mHwc);
- LOGE_IF(err, "%s device failed to initialize (%s)",
+ ALOGE_IF(err, "%s device failed to initialize (%s)",
HWC_HARDWARE_COMPOSER, strerror(-err));
if (err == 0) {
if (mHwc->registerProcs) {
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index dc39f883eb9c..92457811e57b 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -209,7 +209,7 @@ bool EventThread::threadLoop() {
}
status_t EventThread::readyToRun() {
- LOGI("EventThread ready to run.");
+ ALOGI("EventThread ready to run.");
return NO_ERROR;
}
diff --git a/services/surfaceflinger/LayerScreenshot.cpp b/services/surfaceflinger/LayerScreenshot.cpp
index 68e66606ed1f..c127fa621fe1 100644
--- a/services/surfaceflinger/LayerScreenshot.cpp
+++ b/services/surfaceflinger/LayerScreenshot.cpp
@@ -93,7 +93,7 @@ uint32_t LayerScreenshot::doTransaction(uint32_t flags)
// we're going from hidden to visible
status_t err = captureLocked();
if (err != NO_ERROR) {
- LOGW("createScreenshotSurface failed (%s)", strerror(-err));
+ ALOGW("createScreenshotSurface failed (%s)", strerror(-err));
}
}
} else if (curr.flags & ISurfaceComposer::eLayerHidden) {
diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp
index 85845c922d76..cbd530c822a5 100644
--- a/services/surfaceflinger/MessageQueue.cpp
+++ b/services/surfaceflinger/MessageQueue.cpp
@@ -70,12 +70,12 @@ void MessageQueue::waitMessage() {
continue;
case ALOOPER_POLL_ERROR:
- LOGE("ALOOPER_POLL_ERROR");
+ ALOGE("ALOOPER_POLL_ERROR");
continue;
default:
// should not happen
- LOGE("Looper::pollOnce() returned unknown status %d", ret);
+ ALOGE("Looper::pollOnce() returned unknown status %d", ret);
continue;
}
} while (true);
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 789e03cab31c..bbb30b029649 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -110,7 +110,7 @@ SurfaceFlinger::SurfaceFlinger()
void SurfaceFlinger::init()
{
- LOGI("SurfaceFlinger is starting");
+ ALOGI("SurfaceFlinger is starting");
// debugging stuff...
char value[PROPERTY_VALUE_MAX];
@@ -127,9 +127,9 @@ void SurfaceFlinger::init()
DdmConnection::start(getServiceName());
}
- LOGI_IF(mDebugRegion, "showupdates enabled");
- LOGI_IF(mDebugBackground, "showbackground enabled");
- LOGI_IF(mDebugDDMS, "DDMS debugging enabled");
+ ALOGI_IF(mDebugRegion, "showupdates enabled");
+ ALOGI_IF(mDebugBackground, "showbackground enabled");
+ ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
}
SurfaceFlinger::~SurfaceFlinger()
@@ -161,7 +161,7 @@ sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
const GraphicPlane& SurfaceFlinger::graphicPlane(int dpy) const
{
- LOGE_IF(uint32_t(dpy) >= DISPLAY_COUNT, "Invalid DisplayID %d", dpy);
+ ALOGE_IF(uint32_t(dpy) >= DISPLAY_COUNT, "Invalid DisplayID %d", dpy);
const GraphicPlane& plane(mGraphicPlanes[dpy]);
return plane;
}
@@ -176,7 +176,7 @@ void SurfaceFlinger::bootFinished()
{
const nsecs_t now = systemTime();
const nsecs_t duration = now - mBootTime;
- LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
+ ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
mBootFinished = true;
// wait patiently for the window manager death
@@ -215,7 +215,7 @@ static inline uint16_t pack565(int r, int g, int b) {
status_t SurfaceFlinger::readyToRun()
{
- LOGI( "SurfaceFlinger's main thread ready to run. "
+ ALOGI( "SurfaceFlinger's main thread ready to run. "
"Initializing graphics H/W...");
// we only support one display currently
@@ -231,10 +231,10 @@ status_t SurfaceFlinger::readyToRun()
// create the shared control-block
mServerHeap = new MemoryHeapBase(4096,
MemoryHeapBase::READ_ONLY, "SurfaceFlinger read-only heap");
- LOGE_IF(mServerHeap==0, "can't create shared memory dealer");
+ ALOGE_IF(mServerHeap==0, "can't create shared memory dealer");
mServerCblk = static_cast<surface_flinger_cblk_t*>(mServerHeap->getBase());
- LOGE_IF(mServerCblk==0, "can't get to shared control block's address");
+ ALOGE_IF(mServerCblk==0, "can't get to shared control block's address");
new(mServerCblk) surface_flinger_cblk_t;
@@ -458,7 +458,7 @@ void SurfaceFlinger::postFramebuffer()
{
// this should never happen. we do the flip anyways so we don't
// risk to cause a deadlock with hwc
- LOGW_IF(mSwapRegion.isEmpty(), "mSwapRegion is empty");
+ ALOGW_IF(mSwapRegion.isEmpty(), "mSwapRegion is empty");
const DisplayHardware& hw(graphicPlane(0).displayHardware());
const nsecs_t now = systemTime();
mDebugInSwapBuffers = now;
@@ -874,7 +874,7 @@ void SurfaceFlinger::setupHardwareComposer(Region& dirtyInOut)
const Vector< sp<LayerBase> >& layers(mVisibleLayersSortedByZ);
size_t count = layers.size();
- LOGE_IF(hwc.getNumLayers() != count,
+ ALOGE_IF(hwc.getNumLayers() != count,
"HAL number of layers (%d) doesn't match surfaceflinger (%d)",
hwc.getNumLayers(), count);
@@ -893,7 +893,7 @@ void SurfaceFlinger::setupHardwareComposer(Region& dirtyInOut)
}
const size_t fbLayerCount = hwc.getLayerCount(HWC_FRAMEBUFFER);
status_t err = hwc.prepare();
- LOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
+ ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
if (err == NO_ERROR) {
// what's happening here is tricky.
@@ -1220,7 +1220,7 @@ void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state,
mCurrentState.orientation = orientation;
transactionFlags |= eTransactionNeeded;
} else if (orientation != eOrientationUnchanged) {
- LOGW("setTransactionState: ignoring unrecognized orientation: %d",
+ ALOGW("setTransactionState: ignoring unrecognized orientation: %d",
orientation);
}
}
@@ -1246,7 +1246,7 @@ void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state,
if (CC_UNLIKELY(err != NO_ERROR)) {
// just in case something goes wrong in SF, return to the
// called after a few seconds.
- LOGW_IF(err == TIMED_OUT, "closeGlobalTransaction timed out!");
+ ALOGW_IF(err == TIMED_OUT, "closeGlobalTransaction timed out!");
mTransationPending = false;
break;
}
@@ -1285,7 +1285,7 @@ sp<ISurface> SurfaceFlinger::createSurface(
sp<ISurface> surfaceHandle;
if (int32_t(w|h) < 0) {
- LOGE("createSurface() failed, w or h is negative (w=%d, h=%d)",
+ ALOGE("createSurface() failed, w or h is negative (w=%d, h=%d)",
int(w), int(h));
return surfaceHandle;
}
@@ -1357,7 +1357,7 @@ sp<Layer> SurfaceFlinger::createNormalSurface(
sp<Layer> layer = new Layer(this, display, client);
status_t err = layer->setBuffers(w, h, format, flags);
if (CC_LIKELY(err != NO_ERROR)) {
- LOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err));
+ ALOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err));
layer.clear();
}
return layer;
@@ -1415,10 +1415,10 @@ status_t SurfaceFlinger::destroySurface(const wp<LayerBaseClient>& layer)
// removed already, which means it is in the purgatory,
// and need to be removed from there.
ssize_t idx = mLayerPurgatory.remove(l);
- LOGE_IF(idx < 0,
+ ALOGE_IF(idx < 0,
"layer=%p is not in the purgatory list", l.get());
}
- LOGE_IF(err<0 && err != NAME_NOT_FOUND,
+ ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
"error removing layer=%p (%s)", l.get(), strerror(-err));
}
return err;
@@ -1651,7 +1651,7 @@ status_t SurfaceFlinger::onTransact(
const int uid = ipc->getCallingUid();
if ((uid != AID_GRAPHICS) &&
!PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
- LOGE("Permission Denial: "
+ ALOGE("Permission Denial: "
"can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
@@ -1665,7 +1665,7 @@ status_t SurfaceFlinger::onTransact(
const int uid = ipc->getCallingUid();
if ((uid != AID_GRAPHICS) &&
!PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
- LOGE("Permission Denial: "
+ ALOGE("Permission Denial: "
"can't read framebuffer pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
@@ -1680,7 +1680,7 @@ status_t SurfaceFlinger::onTransact(
IPCThreadState* ipc = IPCThreadState::self();
const int pid = ipc->getCallingPid();
const int uid = ipc->getCallingUid();
- LOGE("Permission Denial: "
+ ALOGE("Permission Denial: "
"can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
@@ -2497,7 +2497,7 @@ sp<LayerBaseClient> Client::getLayerUser(int32_t i) const
wp<LayerBaseClient> layer(mLayers.valueFor(i));
if (layer != 0) {
lbc = layer.promote();
- LOGE_IF(lbc==0, "getLayerUser(name=%d) is dead", int(i));
+ ALOGE_IF(lbc==0, "getLayerUser(name=%d) is dead", int(i));
}
return lbc;
}
@@ -2515,7 +2515,7 @@ status_t Client::onTransact(
// we're called from a different process, do the real check
if (!PermissionCache::checkCallingPermission(sAccessSurfaceFlinger))
{
- LOGE("Permission Denial: "
+ ALOGE("Permission Denial: "
"can't openGlobalTransaction pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
@@ -2587,7 +2587,7 @@ sp<GraphicBuffer> GraphicBufferAlloc::createGraphicBuffer(uint32_t w, uint32_t h
if (err == NO_MEMORY) {
GraphicBuffer::dumpAllocationsToSystemLog();
}
- LOGE("GraphicBufferAlloc::createGraphicBuffer(w=%d, h=%d) "
+ ALOGE("GraphicBufferAlloc::createGraphicBuffer(w=%d, h=%d) "
"failed (%s), handle=%p",
w, h, strerror(-err), graphicBuffer->handle);
return 0;
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java
index 461989927d44..ffe848d7fe72 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -134,7 +134,8 @@ public abstract class DataConnection extends StateMachine {
// specified here
UNKNOWN(0x10000),
RADIO_NOT_AVAILABLE(0x10001),
- UNACCEPTABLE_NETWORK_PARAMETER(0x10002);
+ UNACCEPTABLE_NETWORK_PARAMETER(0x10002),
+ CONNECTION_TO_DATACONNECTIONAC_BROKEN(0x10003);
private final int mErrorCode;
private static final HashMap<Integer, FailCause> sErrorCodeToFailCauseMap;
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
index 26967a0f6f59..dab72a93f0e3 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -559,14 +559,23 @@ public abstract class DataConnectionTracker extends Handler {
}
protected ApnSetting fetchDunApn() {
+ if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) {
+ log("fetchDunApn: net.tethering.noprovisioning=true ret: null");
+ return null;
+ }
Context c = mPhone.getContext();
String apnData = Settings.Secure.getString(c.getContentResolver(),
Settings.Secure.TETHER_DUN_APN);
ApnSetting dunSetting = ApnSetting.fromString(apnData);
- if (dunSetting != null) return dunSetting;
+ if (dunSetting != null) {
+ if (VDBG) log("fetchDunApn: secure TETHER_DUN_APN dunSetting=" + dunSetting);
+ return dunSetting;
+ }
apnData = c.getResources().getString(R.string.config_tether_apndata);
- return ApnSetting.fromString(apnData);
+ dunSetting = ApnSetting.fromString(apnData);
+ if (VDBG) log("fetchDunApn: config_tether_apndata dunSetting=" + dunSetting);
+ return dunSetting;
}
public String[] getActiveApnTypes() {
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 93a723e096d6..6096cb0b3846 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -76,6 +76,7 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public final class GsmDataConnectionTracker extends DataConnectionTracker {
protected final String LOG_TAG = "GSM";
+ private static final boolean RADIO_TESTS = false;
/**
* Handles changes to the APN db.
@@ -1401,7 +1402,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
sent = mDataStallTxRxSum.txPkts - preTxRxSum.txPkts;
received = mDataStallTxRxSum.rxPkts - preTxRxSum.rxPkts;
- if (VDBG) {
+ if (RADIO_TESTS) {
if (SystemProperties.getBoolean("radio.test.data.stall", false)) {
log("updateDataStallInfo: radio.test.data.stall true received = 0;");
received = 0;
@@ -1906,6 +1907,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
@Override
protected void onDataSetupComplete(AsyncResult ar) {
+ DataConnection.FailCause cause = DataConnection.FailCause.UNKNOWN;
+ boolean handleError = false;
ApnContext apnContext = null;
if(ar.userObj instanceof ApnContext){
@@ -1916,52 +1919,73 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (isDataSetupCompleteOk(ar)) {
DataConnectionAc dcac = apnContext.getDataConnectionAc();
- if (dcac == null) {
- throw new RuntimeException("onDataSetupCompete: No dcac");
- }
- DataConnection dc = apnContext.getDataConnection();
- if (DBG) {
- // TODO We may use apnContext.getApnSetting() directly
- // instead of getWaitingApns().get(0)
- String apnStr = "<unknown>";
- if (apnContext.getWaitingApns() != null
- && !apnContext.getWaitingApns().isEmpty()){
- apnStr = apnContext.getWaitingApns().get(0).apn;
+ if (RADIO_TESTS) {
+ // Note: To change radio.test.onDSC.null.dcac from command line you need to
+ // adb root and adb remount and from the command line you can only change the
+ // value to 1 once. To change it a second time you can reboot or execute
+ // adb shell stop and then adb shell start. The command line to set the value is:
+ // adb shell sqlite3 /data/data/com.android.providers.settings/databases/settings.db "insert into system (name,value) values ('radio.test.onDSC.null.dcac', '1');"
+ ContentResolver cr = mPhone.getContext().getContentResolver();
+ String radioTestProperty = "radio.test.onDSC.null.dcac";
+ if (Settings.System.getInt(cr, radioTestProperty, 0) == 1) {
+ log("onDataSetupComplete: " + radioTestProperty +
+ " is true, set dcac to null and reset property to false");
+ dcac = null;
+ Settings.System.putInt(cr, radioTestProperty, 0);
+ log("onDataSetupComplete: " + radioTestProperty + "=" +
+ Settings.System.getInt(mPhone.getContext().getContentResolver(),
+ radioTestProperty, -1));
}
- log("onDataSetupComplete: success apn=" + apnStr);
}
- ApnSetting apn = apnContext.getApnSetting();
- if (apn.proxy != null && apn.proxy.length() != 0) {
- try {
- String port = apn.port;
- if (TextUtils.isEmpty(port)) port = "8080";
- ProxyProperties proxy = new ProxyProperties(apn.proxy,
- Integer.parseInt(port), null);
- dcac.setLinkPropertiesHttpProxySync(proxy);
- } catch (NumberFormatException e) {
- loge("onDataSetupComplete: NumberFormatException making ProxyProperties (" +
- apn.port + "): " + e);
+ if (dcac == null) {
+ log("onDataSetupComplete: no connection to DC, handle as error");
+ cause = DataConnection.FailCause.CONNECTION_TO_DATACONNECTIONAC_BROKEN;
+ handleError = true;
+ } else {
+ DataConnection dc = apnContext.getDataConnection();
+
+ if (DBG) {
+ // TODO We may use apnContext.getApnSetting() directly
+ // instead of getWaitingApns().get(0)
+ String apnStr = "<unknown>";
+ if (apnContext.getWaitingApns() != null
+ && !apnContext.getWaitingApns().isEmpty()){
+ apnStr = apnContext.getWaitingApns().get(0).apn;
+ }
+ log("onDataSetupComplete: success apn=" + apnStr);
+ }
+ ApnSetting apn = apnContext.getApnSetting();
+ if (apn.proxy != null && apn.proxy.length() != 0) {
+ try {
+ String port = apn.port;
+ if (TextUtils.isEmpty(port)) port = "8080";
+ ProxyProperties proxy = new ProxyProperties(apn.proxy,
+ Integer.parseInt(port), null);
+ dcac.setLinkPropertiesHttpProxySync(proxy);
+ } catch (NumberFormatException e) {
+ loge("onDataSetupComplete: NumberFormatException making ProxyProperties (" +
+ apn.port + "): " + e);
+ }
}
- }
- // everything is setup
- if(TextUtils.equals(apnContext.getApnType(),Phone.APN_TYPE_DEFAULT)) {
- SystemProperties.set("gsm.defaultpdpcontext.active", "true");
- if (canSetPreferApn && mPreferredApn == null) {
- if (DBG) log("onDataSetupComplete: PREFERED APN is null");
- mPreferredApn = apnContext.getApnSetting();
- if (mPreferredApn != null) {
- setPreferredApn(mPreferredApn.id);
+ // everything is setup
+ if(TextUtils.equals(apnContext.getApnType(),Phone.APN_TYPE_DEFAULT)) {
+ SystemProperties.set("gsm.defaultpdpcontext.active", "true");
+ if (canSetPreferApn && mPreferredApn == null) {
+ if (DBG) log("onDataSetupComplete: PREFERED APN is null");
+ mPreferredApn = apnContext.getApnSetting();
+ if (mPreferredApn != null) {
+ setPreferredApn(mPreferredApn.id);
+ }
}
+ } else {
+ SystemProperties.set("gsm.defaultpdpcontext.active", "false");
}
- } else {
- SystemProperties.set("gsm.defaultpdpcontext.active", "false");
+ notifyDefaultData(apnContext);
}
- notifyDefaultData(apnContext);
} else {
String apnString;
- DataConnection.FailCause cause;
cause = (DataConnection.FailCause) (ar.result);
if (DBG) {
@@ -1989,7 +2013,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
apnContext.getWaitingApns().size(),
apnContext.getWaitingApnsPermFailCount()));
}
+ handleError = true;
+ }
+ if (handleError) {
// See if there are more APN's to try
if (apnContext.getWaitingApns().isEmpty()) {
if (apnContext.getWaitingApnsPermFailCount() == 0) {
@@ -2001,9 +2028,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
apnContext.setDataConnection(null);
apnContext.setDataConnectionAc(null);
- if (DBG) {
- log("onDataSetupComplete: permanent error apn=%s" + apnString );
- }
} else {
if (DBG) log("onDataSetupComplete: Not all permanent failures, retry");
// check to see if retry should be overridden for this failure.
diff --git a/test-runner/src/android/test/BandwidthTest.java b/test-runner/src/android/test/BandwidthTest.java
new file mode 100644
index 000000000000..e02ae00c3df8
--- /dev/null
+++ b/test-runner/src/android/test/BandwidthTest.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011 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 android.test;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * This annotation can be used on an {@link junit.framework.TestCase}'s test methods. When the
+ * annotation is present, the test method is profiled for bandwidth metrics and the results
+ * written through instrumentation output. It can also be used on the class itself,
+ * which is equivalent to tagging all test methods with this annotation.
+ *
+ * {@hide} Pending approval for public API.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BandwidthTest {
+}
diff --git a/test-runner/src/android/test/BandwidthTestRunner.java b/test-runner/src/android/test/BandwidthTestRunner.java
new file mode 100644
index 000000000000..9c5478d39388
--- /dev/null
+++ b/test-runner/src/android/test/BandwidthTestRunner.java
@@ -0,0 +1,92 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package android.test;
+
+import android.net.NetworkStats;
+import android.net.NetworkStats.Entry;
+import android.net.TrafficStats;
+import android.os.Bundle;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestListener;
+
+import java.lang.reflect.Method;
+
+/**
+ * A specialized {@link android.app.Instrumentation} that can collect Bandwidth statistics during
+ * the execution of the test.
+ * This is used in place of {@link InstrumentationTestRunner}.
+ * i.e. adb shell am instrumentation -w -e class com.android.foo.FooTest \
+ * com.android.foo/android.test.BandwidthTestRunner
+ *
+ * @see NetworkStats and @see TrafficStats for details of the collected statistics
+ * @hide
+ */
+public class BandwidthTestRunner extends InstrumentationTestRunner implements TestListener {
+ private static final String REPORT_KEY_PACKETS_SENT = "txPackets";
+ private static final String REPORT_KEY_PACKETS_RECEIVED = "rxPackets";
+ private static final String REPORT_KEY_BYTES_SENT = "txBytes";
+ private static final String REPORT_KEY_BYTES_RECEIVED = "rxBytes";
+ private static final String REPORT_KEY_OPERATIONS = "operations";
+
+ private boolean mHasClassAnnotation;
+ private boolean mIsBandwidthTest;
+ private Bundle mTestResult;
+
+ @Override
+ public void onCreate(Bundle arguments) {
+ super.onCreate(arguments);
+ addTestListener(this);
+ }
+
+ public void addError(Test test, Throwable t) {
+ }
+
+ public void addFailure(Test test, AssertionFailedError t) {
+ }
+
+ public void startTest(Test test) {
+ String testClass = test.getClass().getName();
+ String testName = ((TestCase)test).getName();
+ Method testMethod = null;
+ try {
+ testMethod = test.getClass().getMethod(testName);
+ } catch (NoSuchMethodException e) {
+ // ignore- the test with given name does not exist. Will be handled during test
+ // execution
+ }
+ try {
+ // Look for BandwdthTest annotation on both test class and test method
+ if (testMethod != null ) {
+ if (testMethod.isAnnotationPresent(BandwidthTest.class) ){
+ mIsBandwidthTest = true;
+ TrafficStats.startDataProfiling(null);
+ } else if (test.getClass().isAnnotationPresent(BandwidthTest.class)){
+ mIsBandwidthTest = true;
+ TrafficStats.startDataProfiling(null);
+ }
+ }
+ } catch (SecurityException e) {
+ // ignore - the test with given name cannot be accessed. Will be handled during
+ // test execution
+ }
+ }
+
+ public void endTest(Test test) {
+ if (mIsBandwidthTest){
+ mTestResult = new Bundle();
+ mIsBandwidthTest=false;
+ NetworkStats stats = TrafficStats.stopDataProfiling(null);
+ Entry entry = stats.getTotal(null);
+ mTestResult.putLong(REPORT_KEY_BYTES_RECEIVED, entry.rxBytes);
+ mTestResult.putLong(REPORT_KEY_BYTES_SENT, entry.txBytes);
+ mTestResult.putLong(REPORT_KEY_PACKETS_RECEIVED, entry.rxPackets);
+ mTestResult.putLong(REPORT_KEY_PACKETS_SENT, entry.txPackets);
+ mTestResult.putLong(REPORT_KEY_OPERATIONS, entry.operations);
+ System.out.println(mTestResult.toString());
+ sendStatus(0, mTestResult);
+ }
+ }
+}
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index 43285fb2ce07..91e403e2470a 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -399,6 +399,16 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
return mArguments;
}
+ /**
+ * Add a {@link TestListener}
+ * @hide
+ */
+ protected void addTestListener(TestListener listener){
+ if(mTestRunner!=null && listener!=null){
+ mTestRunner.addTestListener(listener);
+ }
+ }
+
List<Predicate<TestMethod>> getBuilderRequirements() {
return new ArrayList<Predicate<TestMethod>>();
}
diff --git a/tests/TileBenchmark/Android.mk b/tests/TileBenchmark/Android.mk
index 430f0f10d94e..5851113cb24c 100644
--- a/tests/TileBenchmark/Android.mk
+++ b/tests/TileBenchmark/Android.mk
@@ -21,12 +21,8 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := TileBenchmark
-include $(BUILD_PACKAGE)
+LOCAL_MODULE_TAGS := tests
-##################################################
-include $(CLEAR_VARS)
-
-include $(BUILD_MULTI_PREBUILT)
+LOCAL_JAVA_LIBRARIES := android.test.runner
-# Use the folloing include to make our test apk.
-include $(call all-makefiles-under,$(LOCAL_PATH))
+include $(BUILD_PACKAGE) \ No newline at end of file
diff --git a/tests/TileBenchmark/AndroidManifest.xml b/tests/TileBenchmark/AndroidManifest.xml
index ab61a9e25bb7..f125c707a399 100644
--- a/tests/TileBenchmark/AndroidManifest.xml
+++ b/tests/TileBenchmark/AndroidManifest.xml
@@ -18,5 +18,9 @@
android:label="@string/playback_activity"
android:theme="@android:style/Theme.Holo.NoActionBar">
</activity>
+ <uses-library android:name="android.test.runner" />
</application>
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.test.tilebenchmark"
+ android:label="Tests for WebView Tiles."/>
</manifest>
diff --git a/tests/TileBenchmark/tests/src/com/test/tilebenchmark/PerformanceTest.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
index 6bf6f6b46c86..cc39b75fe52c 100644
--- a/tests/TileBenchmark/tests/src/com/test/tilebenchmark/PerformanceTest.java
+++ b/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
@@ -80,7 +80,7 @@ public class PerformanceTest extends
private static final String URL_POSTFIX = "/index.html?skip=true";
private static final int MAX_ITERATIONS = 4;
private static final String TEST_DIRS[] = {
- "intl1"//, "alexa_us", "android", "dom", "intl2", "moz", "moz2"
+ "alexa25_2011"//, "alexa_us", "android", "dom", "intl2", "moz", "moz2"
};
public PerformanceTest() {
diff --git a/tests/TileBenchmark/tests/Android.mk b/tests/TileBenchmark/tests/Android.mk
deleted file mode 100644
index 8b235ec3ac9e..000000000000
--- a/tests/TileBenchmark/tests/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := TileBenchmarkTests
-
-LOCAL_INSTRUMENTATION_FOR := TileBenchmark
-
-include $(BUILD_PACKAGE)
diff --git a/tests/TileBenchmark/tests/AndroidManifest.xml b/tests/TileBenchmark/tests/AndroidManifest.xml
deleted file mode 100644
index 703b152d1e62..000000000000
--- a/tests/TileBenchmark/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.test.tilebenchmark.tests">
-
- <application>
- <uses-library android:name="android.test.runner" />
- </application>
-
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.test.tilebenchmark"
- android:label="Tests for WebView Tiles."/>
-</manifest>
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index d7ac15eff011..89942de57eaa 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -425,6 +425,7 @@ static void printCompatibleScreens(ResXMLTree& tree) {
/*
* Handle the "dump" command, to extract select data from an archive.
*/
+extern char CONSOLE_DATA[2925]; // see EOF
int doDump(Bundle* bundle)
{
status_t result = UNKNOWN_ERROR;
@@ -1380,6 +1381,8 @@ int doDump(Bundle* bundle)
}
delete dir;
}
+ } else if (strcmp("badger", option) == 0) {
+ printf(CONSOLE_DATA);
} else if (strcmp("configurations", option) == 0) {
Vector<ResTable_config> configs;
res.getConfigurations(&configs);
@@ -1728,3 +1731,169 @@ int doCrunch(Bundle* bundle)
return NO_ERROR;
}
+
+char CONSOLE_DATA[2925] = {
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 95, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 63,
+ 86, 35, 40, 46, 46, 95, 95, 95, 95, 97, 97, 44, 32, 46, 124, 42, 33, 83,
+ 62, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 46, 58, 59, 61, 59, 61, 81,
+ 81, 81, 81, 66, 96, 61, 61, 58, 46, 46, 46, 58, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 46, 61, 59, 59, 59, 58, 106, 81, 81, 81, 81, 102, 59, 61, 59,
+ 59, 61, 61, 61, 58, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59,
+ 59, 58, 109, 81, 81, 81, 81, 61, 59, 59, 59, 59, 59, 58, 59, 59, 46, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 60, 81, 81, 81, 81, 87,
+ 58, 59, 59, 59, 59, 59, 59, 61, 119, 44, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46,
+ 47, 61, 59, 59, 58, 100, 81, 81, 81, 81, 35, 58, 59, 59, 59, 59, 59, 58,
+ 121, 81, 91, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 109, 58, 59, 59, 61, 81, 81,
+ 81, 81, 81, 109, 58, 59, 59, 59, 59, 61, 109, 81, 81, 76, 46, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 41, 87, 59, 61, 59, 41, 81, 81, 81, 81, 81, 81, 59, 61, 59,
+ 59, 58, 109, 81, 81, 87, 39, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 81, 91, 59,
+ 59, 61, 81, 81, 81, 81, 81, 87, 43, 59, 58, 59, 60, 81, 81, 81, 76, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 52, 91, 58, 45, 59, 87, 81, 81, 81, 81,
+ 70, 58, 58, 58, 59, 106, 81, 81, 81, 91, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 93, 40, 32, 46, 59, 100, 81, 81, 81, 81, 40, 58, 46, 46, 58, 100, 81,
+ 81, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 46, 46, 46, 32, 46, 46, 46, 32, 46, 32, 46, 45, 91, 59, 61, 58, 109,
+ 81, 81, 81, 87, 46, 58, 61, 59, 60, 81, 81, 80, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32,
+ 32, 32, 32, 32, 32, 32, 32, 46, 46, 61, 59, 61, 61, 61, 59, 61, 61, 59,
+ 59, 59, 58, 58, 46, 46, 41, 58, 59, 58, 81, 81, 81, 81, 69, 58, 59, 59,
+ 60, 81, 81, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 58, 59,
+ 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 61, 46,
+ 61, 59, 93, 81, 81, 81, 81, 107, 58, 59, 58, 109, 87, 68, 96, 32, 32, 32,
+ 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 10, 32, 32, 32, 46, 60, 61, 61, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 58, 58, 58, 115, 109, 68, 41, 36, 81,
+ 109, 46, 61, 61, 81, 69, 96, 46, 58, 58, 46, 58, 46, 46, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 46, 32, 95, 81,
+ 67, 61, 61, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 58, 68, 39, 61, 105, 61, 63, 81, 119, 58, 106, 80, 32, 58,
+ 61, 59, 59, 61, 59, 61, 59, 61, 46, 95, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 10, 32, 32, 36, 81, 109, 105, 59, 61, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 46, 58, 37,
+ 73, 108, 108, 62, 52, 81, 109, 34, 32, 61, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 61, 59, 61, 61, 46, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10,
+ 32, 46, 45, 57, 101, 43, 43, 61, 61, 59, 59, 59, 59, 59, 59, 61, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 58, 97, 46, 61, 108, 62, 126, 58, 106, 80, 96,
+ 46, 61, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 61,
+ 97, 103, 97, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 45, 46, 32,
+ 46, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 58, 59, 59, 59, 59, 61,
+ 119, 81, 97, 124, 105, 124, 124, 39, 126, 95, 119, 58, 61, 58, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 119, 81, 81, 99, 32, 32,
+ 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 58, 106, 81, 81, 81, 109, 119,
+ 119, 119, 109, 109, 81, 81, 122, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 58, 115, 81, 87, 81, 102, 32, 32, 32, 32, 32, 32, 10,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 61, 58, 59, 61, 81, 81, 81, 81, 81, 81, 87, 87, 81, 81, 81, 81,
+ 81, 58, 59, 59, 59, 59, 59, 59, 59, 59, 58, 45, 45, 45, 59, 59, 59, 41,
+ 87, 66, 33, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 93, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 40, 58, 59, 59, 59, 58,
+ 45, 32, 46, 32, 32, 32, 32, 32, 46, 32, 126, 96, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 58, 61, 59, 58, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 40, 58, 59, 59, 59, 58, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58,
+ 59, 59, 58, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 40, 58,
+ 59, 59, 59, 46, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 59, 60, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 59, 61, 59, 59, 61, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 58, 59, 59, 93, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 40, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 58, 106,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 76, 58, 59, 59, 59,
+ 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 61, 58, 58, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 87, 58, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 58, 59, 61, 41, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 87, 59,
+ 61, 58, 59, 59, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 58, 61, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 107, 58, 59, 59, 59, 59, 58, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 58, 59, 59, 58, 51, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 102, 94, 59, 59, 59, 59, 59, 61, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 59,
+ 59, 59, 43, 63, 36, 81, 81, 81, 87, 64, 86, 102, 58, 59, 59, 59, 59, 59,
+ 59, 59, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 59, 59, 59, 59, 43, 33,
+ 58, 126, 126, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 32, 46, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46,
+ 61, 59, 59, 59, 58, 45, 58, 61, 59, 58, 58, 58, 61, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 58, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 59, 59, 58, 95,
+ 32, 45, 61, 59, 61, 59, 59, 59, 59, 59, 59, 59, 45, 58, 59, 59, 59, 59,
+ 61, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 58, 61, 59, 59, 59, 59, 59, 61, 59, 61, 46, 46, 32, 45, 45, 45,
+ 59, 58, 45, 45, 46, 58, 59, 59, 59, 59, 59, 59, 61, 46, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 58, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 61, 59, 46, 32, 32, 46, 32, 46, 32, 58, 61, 59, 59,
+ 59, 59, 59, 59, 59, 59, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 45, 59, 59, 59, 59, 59, 59, 59, 59, 58, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 59, 58, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 46, 61, 59, 59, 59, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 61,
+ 46, 61, 59, 59, 59, 59, 59, 59, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59,
+ 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 32, 46, 61, 58, 59, 59, 59, 59,
+ 59, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 58, 59, 59, 59, 59, 59, 59, 59, 59, 46, 46, 32, 32, 32,
+ 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 59, 45, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 32, 45, 61,
+ 59, 59, 59, 59, 59, 58, 32, 46, 32, 32, 32, 32, 32, 32, 32, 58, 59, 59,
+ 59, 59, 59, 58, 45, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 45, 32, 46, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 61, 59, 58, 45, 45, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 46, 32, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10
+ };
diff --git a/tools/aapt/ZipEntry.cpp b/tools/aapt/ZipEntry.cpp
index b00135ea9038..b575988f0277 100644
--- a/tools/aapt/ZipEntry.cpp
+++ b/tools/aapt/ZipEntry.cpp
@@ -90,7 +90,7 @@ status_t ZipEntry::initFromCDE(FILE* fp)
* prefer the CDE values.)
*/
if (!hasDD && !compareHeaders()) {
- LOGW("warning: header mismatch\n");
+ ALOGW("warning: header mismatch\n");
// keep going?
}
@@ -200,7 +200,7 @@ status_t ZipEntry::addPadding(int padding)
if (padding <= 0)
return INVALID_OPERATION;
- //LOGI("HEY: adding %d pad bytes to existing %d in %s\n",
+ //ALOGI("HEY: adding %d pad bytes to existing %d in %s\n",
// padding, mLFH.mExtraFieldLength, mCDE.mFileName);
if (mLFH.mExtraFieldLength > 0) {
diff --git a/tools/aapt/ZipFile.cpp b/tools/aapt/ZipFile.cpp
index a2d5b80063a1..0705be3380db 100644
--- a/tools/aapt/ZipFile.cpp
+++ b/tools/aapt/ZipFile.cpp
@@ -603,7 +603,7 @@ status_t ZipFile::add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry,
if (copyPartialFpToFp(mZipFp, pSourceZip->mZipFp, copyLen, NULL)
!= NO_ERROR)
{
- LOGW("copy of '%s' failed\n", pEntry->mCDE.mFileName);
+ ALOGW("copy of '%s' failed\n", pEntry->mCDE.mFileName);
result = UNKNOWN_ERROR;
goto bail;
}
@@ -780,7 +780,7 @@ status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp,
if (zerr != Z_OK) {
result = UNKNOWN_ERROR;
if (zerr == Z_VERSION_ERROR) {
- LOGE("Installed zlib is not compatible with linked version (%s)\n",
+ ALOGE("Installed zlib is not compatible with linked version (%s)\n",
ZLIB_VERSION);
} else {
ALOGD("Call to deflateInit2 failed (zerr=%d)\n", zerr);
@@ -931,7 +931,7 @@ status_t ZipFile::flush(void)
* of wasted space at the end of the file. Remove it now.
*/
if (ftruncate(fileno(mZipFp), ftell(mZipFp)) != 0) {
- LOGW("ftruncate failed %ld: %s\n", ftell(mZipFp), strerror(errno));
+ ALOGW("ftruncate failed %ld: %s\n", ftell(mZipFp), strerror(errno));
// not fatal
}
@@ -1019,7 +1019,7 @@ status_t ZipFile::crunchArchive(void)
pEntry->getLFHOffset(), span);
if (result != NO_ERROR) {
/* this is why you use a temp file */
- LOGE("error during crunch - archive is toast\n");
+ ALOGE("error during crunch - archive is toast\n");
return result;
}
diff --git a/voip/jni/rtp/AudioGroup.cpp b/voip/jni/rtp/AudioGroup.cpp
index 270b4949b39c..4db57385f786 100644
--- a/voip/jni/rtp/AudioGroup.cpp
+++ b/voip/jni/rtp/AudioGroup.cpp
@@ -510,7 +510,7 @@ private:
bool start()
{
if (run("Network", ANDROID_PRIORITY_AUDIO) != NO_ERROR) {
- LOGE("cannot start network thread");
+ ALOGE("cannot start network thread");
return false;
}
return true;
@@ -530,7 +530,7 @@ private:
bool start()
{
if (run("Device", ANDROID_PRIORITY_AUDIO) != NO_ERROR) {
- LOGE("cannot start device thread");
+ ALOGE("cannot start device thread");
return false;
}
return true;
@@ -573,7 +573,7 @@ bool AudioGroup::set(int sampleRate, int sampleCount)
{
mEventQueue = epoll_create(2);
if (mEventQueue == -1) {
- LOGE("epoll_create: %s", strerror(errno));
+ ALOGE("epoll_create: %s", strerror(errno));
return false;
}
@@ -583,7 +583,7 @@ bool AudioGroup::set(int sampleRate, int sampleCount)
// Create device socket.
int pair[2];
if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pair)) {
- LOGE("socketpair: %s", strerror(errno));
+ ALOGE("socketpair: %s", strerror(errno));
return false;
}
mDeviceSocket = pair[0];
@@ -593,7 +593,7 @@ bool AudioGroup::set(int sampleRate, int sampleCount)
if (!mChain->set(AudioStream::NORMAL, pair[1], NULL, NULL,
sampleRate, sampleCount, -1, -1)) {
close(pair[1]);
- LOGE("cannot initialize device stream");
+ ALOGE("cannot initialize device stream");
return false;
}
@@ -602,7 +602,7 @@ bool AudioGroup::set(int sampleRate, int sampleCount)
tv.tv_sec = 0;
tv.tv_usec = 1000 * sampleCount / sampleRate * 500;
if (setsockopt(pair[0], SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) {
- LOGE("setsockopt: %s", strerror(errno));
+ ALOGE("setsockopt: %s", strerror(errno));
return false;
}
@@ -611,7 +611,7 @@ bool AudioGroup::set(int sampleRate, int sampleCount)
event.events = EPOLLIN;
event.data.ptr = mChain;
if (epoll_ctl(mEventQueue, EPOLL_CTL_ADD, pair[1], &event)) {
- LOGE("epoll_ctl: %s", strerror(errno));
+ ALOGE("epoll_ctl: %s", strerror(errno));
return false;
}
@@ -675,7 +675,7 @@ bool AudioGroup::add(AudioStream *stream)
event.events = EPOLLIN;
event.data.ptr = stream;
if (epoll_ctl(mEventQueue, EPOLL_CTL_ADD, stream->mSocket, &event)) {
- LOGE("epoll_ctl: %s", strerror(errno));
+ ALOGE("epoll_ctl: %s", strerror(errno));
return false;
}
@@ -699,7 +699,7 @@ bool AudioGroup::remove(int socket)
AudioStream *target = stream->mNext;
if (target->mSocket == socket) {
if (epoll_ctl(mEventQueue, EPOLL_CTL_DEL, socket, NULL)) {
- LOGE("epoll_ctl: %s", strerror(errno));
+ ALOGE("epoll_ctl: %s", strerror(errno));
return false;
}
stream->mNext = target->mNext;
@@ -749,7 +749,7 @@ bool AudioGroup::NetworkThread::threadLoop()
epoll_event events[count];
count = epoll_wait(mGroup->mEventQueue, events, count, deadline);
if (count == -1) {
- LOGE("epoll_wait: %s", strerror(errno));
+ ALOGE("epoll_wait: %s", strerror(errno));
return false;
}
for (int i = 0; i < count; ++i) {
@@ -792,7 +792,7 @@ bool AudioGroup::DeviceThread::threadLoop()
sampleRate) != NO_ERROR || output <= 0 ||
AudioRecord::getMinFrameCount(&input, sampleRate,
AUDIO_FORMAT_PCM_16_BIT, 1) != NO_ERROR || input <= 0) {
- LOGE("cannot compute frame count");
+ ALOGE("cannot compute frame count");
return false;
}
ALOGD("reported frame count: output %d, input %d", output, input);
@@ -812,7 +812,7 @@ bool AudioGroup::DeviceThread::threadLoop()
AUDIO_CHANNEL_OUT_MONO, output) != NO_ERROR || record.set(
AUDIO_SOURCE_VOICE_COMMUNICATION, sampleRate, AUDIO_FORMAT_PCM_16_BIT,
AUDIO_CHANNEL_IN_MONO, input) != NO_ERROR) {
- LOGE("cannot initialize audio device");
+ ALOGE("cannot initialize audio device");
return false;
}
ALOGD("latency: output %d, input %d", track.latency(), record.latency());
@@ -884,7 +884,7 @@ bool AudioGroup::DeviceThread::threadLoop()
toWrite -= buffer.frameCount;
track.releaseBuffer(&buffer);
} else if (status != TIMED_OUT && status != WOULD_BLOCK) {
- LOGE("cannot write to AudioTrack");
+ ALOGE("cannot write to AudioTrack");
goto exit;
}
}
@@ -900,14 +900,14 @@ bool AudioGroup::DeviceThread::threadLoop()
toRead -= buffer.frameCount;
record.releaseBuffer(&buffer);
} else if (status != TIMED_OUT && status != WOULD_BLOCK) {
- LOGE("cannot read from AudioRecord");
+ ALOGE("cannot read from AudioRecord");
goto exit;
}
}
}
if (chances <= 0) {
- LOGW("device loop timeout");
+ ALOGW("device loop timeout");
while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1);
}
@@ -1051,7 +1051,7 @@ int registerAudioGroup(JNIEnv *env)
{
gRandom = open("/dev/urandom", O_RDONLY);
if (gRandom == -1) {
- LOGE("urandom: %s", strerror(errno));
+ ALOGE("urandom: %s", strerror(errno));
return -1;
}
@@ -1060,7 +1060,7 @@ int registerAudioGroup(JNIEnv *env)
(gNative = env->GetFieldID(clazz, "mNative", "I")) == NULL ||
(gMode = env->GetFieldID(clazz, "mMode", "I")) == NULL ||
env->RegisterNatives(clazz, gMethods, NELEM(gMethods)) < 0) {
- LOGE("JNI registration failed");
+ ALOGE("JNI registration failed");
return -1;
}
return 0;
diff --git a/voip/jni/rtp/EchoSuppressor.cpp b/voip/jni/rtp/EchoSuppressor.cpp
index 6127d3cf7ed2..e22313681d81 100644
--- a/voip/jni/rtp/EchoSuppressor.cpp
+++ b/voip/jni/rtp/EchoSuppressor.cpp
@@ -177,7 +177,7 @@ void EchoSuppressor::run(int16_t *playbacked, int16_t *recorded)
}
}
}
- //LOGI("corr^2 %.5f, var %8.0f %8.0f, latency %d", corr2, varX, varY,
+ //ALOGI("corr^2 %.5f, var %8.0f %8.0f, latency %d", corr2, varX, varY,
// latency * mScale);
// Do echo suppression.
diff --git a/voip/jni/rtp/RtpStream.cpp b/voip/jni/rtp/RtpStream.cpp
index f5efc17cfcd3..6540099e83f2 100644
--- a/voip/jni/rtp/RtpStream.cpp
+++ b/voip/jni/rtp/RtpStream.cpp
@@ -116,7 +116,7 @@ int registerRtpStream(JNIEnv *env)
if ((clazz = env->FindClass("android/net/rtp/RtpStream")) == NULL ||
(gNative = env->GetFieldID(clazz, "mNative", "I")) == NULL ||
env->RegisterNatives(clazz, gMethods, NELEM(gMethods)) < 0) {
- LOGE("JNI registration failed");
+ ALOGE("JNI registration failed");
return -1;
}
return 0;