Merge "Clean up AudioTrack::mActive and stopped()"
diff --git a/api/16.txt b/api/16.txt
index 13fba29..8e07844 100644
--- a/api/16.txt
+++ b/api/16.txt
@@ -25259,7 +25259,7 @@
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 db3b30d..1f6ba1b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -25433,7 +25433,7 @@
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 12d1669..6fe358c 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -72,7 +72,7 @@
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 f250367..0d5b4ca 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -69,7 +69,7 @@
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 @@
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 5f8b744..ff809d3 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -47,7 +47,7 @@
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 02e1f1c..83c881a 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -87,9 +87,9 @@
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 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 @@
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 @@
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 @@
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 fdc5d5d..7dad6b6 100644
--- a/cmds/dumpsys/dumpsys.cpp
+++ b/cmds/dumpsys/dumpsys.cpp
@@ -31,7 +31,7 @@
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 db72585..dd92bbe 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -30,47 +30,47 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
}
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 @@
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 @@
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 @@
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 @@
} 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 @@
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 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 @@
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 @@
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 @@
}
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 @@
} 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 @@
// 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 @@
} 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 @@
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 @@
}
} 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 @@
}
} 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 @@
} 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 @@
}
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 @@
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 @@
}
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 @@
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 @@
}
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 @@
}
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 @@
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 feb6b92..569b491 100644
--- a/cmds/installd/installd.c
+++ b/cmds/installd/installd.c
@@ -157,11 +157,11 @@
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 @@
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 @@
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 @@
n++;
arg[n] = cmd;
if (n == TOKEN_MAX) {
- LOGE("too many arguments\n");
+ ALOGE("too many arguments\n");
goto done;
}
}
@@ -223,7 +223,7 @@
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 @@
goto done;
}
}
- LOGE("unsupported command '%s'\n", arg[0]);
+ ALOGE("unsupported command '%s'\n", arg[0]);
done:
if (reply[0]) {
@@ -242,7 +242,7 @@
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 @@
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 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 @@
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 a53a93c..52ec9e8 100644
--- a/cmds/installd/utils.c
+++ b/cmds/installd/utils.c
@@ -42,7 +42,7 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
++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 @@
*/
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 0e6286f..9fcc950 100644
--- a/cmds/ip-up-vpn/ip-up-vpn.c
+++ b/cmds/ip-up-vpn/ip-up-vpn.c
@@ -67,7 +67,7 @@
{
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 @@
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 @@
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 @@
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 @@
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 4b4b9b9..05f77e5 100644
--- a/cmds/keystore/keystore.cpp
+++ b/cmds/keystore/keystore.cpp
@@ -133,7 +133,7 @@
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 @@
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 @@
return 1;
}
if (listen(controlSocket, 3) == -1) {
- LOGE("listen: %s", strerror(errno));
+ ALOGE("listen: %s", strerror(errno));
return 1;
}
@@ -785,7 +785,7 @@
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 @@
} 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 @@
}
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 048636c..cca80c3 100644
--- a/cmds/screenshot/screenshot.c
+++ b/cmds/screenshot/screenshot.c
@@ -26,20 +26,20 @@
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 @@
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 @@
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 b03b620..918d4d4 100644
--- a/cmds/servicemanager/binder.c
+++ b/cmds/servicemanager/binder.c
@@ -219,7 +219,7 @@
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 @@
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 @@
r = -1;
break;
default:
- LOGE("parse: OOPS %d\n", cmd);
+ ALOGE("parse: OOPS %d\n", cmd);
return -1;
}
}
@@ -375,17 +375,17 @@
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 2df450f3..42d8977 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 @@
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 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
return -1;
}
default:
- LOGE("unknown code %d\n", txn->code);
+ ALOGE("unknown code %d\n", txn->code);
return -1;
}
@@ -262,7 +262,7 @@
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 b718299..613435d 100644
--- a/cmds/stagefright/record.cpp
+++ b/cmds/stagefright/record.cpp
@@ -96,7 +96,7 @@
++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 7551d31..ae80f88 100644
--- a/cmds/stagefright/sf2.cpp
+++ b/cmds/stagefright/sf2.cpp
@@ -454,7 +454,7 @@
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 24403dc..0d6c738 100644
--- a/cmds/stagefright/stream.cpp
+++ b/cmds/stagefright/stream.cpp
@@ -90,7 +90,7 @@
#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 59360d3..bfbc138 100644
--- a/cmds/system_server/library/system_init.cpp
+++ b/cmds/system_server/library/system_init.cpp
@@ -42,7 +42,7 @@
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 @@
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 @@
// 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 @@
}
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 d67329d..ddff065 100644
--- a/cmds/system_server/system_main.cpp
+++ b/cmds/system_server/system_main.cpp
@@ -44,12 +44,12 @@
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 7f0ea99..894f428 100644
--- a/core/java/android/animation/LayoutTransition.java
+++ b/core/java/android/animation/LayoutTransition.java
@@ -321,13 +321,13 @@
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 32de0cd..dc97ff09 100644
--- a/core/java/android/hardware/CameraSound.java
+++ b/core/java/android/hardware/CameraSound.java
@@ -110,7 +110,6 @@
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 @@
}
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 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 93caabe..18dec52 100644
--- a/core/java/android/view/inputmethod/InputMethodSubtype.java
+++ b/core/java/android/view/inputmethod/InputMethodSubtype.java
@@ -31,17 +31,15 @@
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><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><subtype></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 @@
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 @@
}
/**
- * 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 @@
}
/**
- * @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 @@
* @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 @@
/**
* 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 @@
/**
* 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 97d61ba..0baf2eb 100644
--- a/core/java/android/webkit/HTML5Audio.java
+++ b/core/java/android/webkit/HTML5Audio.java
@@ -311,7 +311,11 @@
}
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 617584b..08d94e2 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -142,7 +142,7 @@
}
// 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 fa82c46..fd58aed 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -27,7 +27,6 @@
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.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.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 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 @@
ViewGroup.OnHierarchyChangeListener {
private class InnerGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
+ @Override
public void onGlobalLayout() {
if (isShown()) {
setGLRectViewport();
@@ -341,6 +343,7 @@
}
private class InnerScrollChangedListener implements ViewTreeObserver.OnScrollChangedListener {
+ @Override
public void onScrollChanged() {
if (isShown()) {
setGLRectViewport();
@@ -348,6 +351,43 @@
}
}
+ /**
+ * 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 @@
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 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 @@
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 @@
.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 @@
*
* @deprecated This method is now obsolete.
*/
+ @Deprecated
public int getVisibleTitleHeight() {
checkThread();
return getVisibleTitleHeightImpl();
@@ -1855,6 +1901,7 @@
// 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 @@
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 @@
// 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 @@
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 @@
}
@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 @@
mWebSettings = getSettings();
}
+ @Override
public void run() {
ArrayList<String> pastEntries = new ArrayList<String>();
@@ -5717,6 +5773,7 @@
* @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 @@
* @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 @@
* @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 @@
}
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 @@
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 @@
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 @@
if (position < 0 || position >= getCount()) {
return null;
}
- return (Container) getItem(position);
+ return getItem(position);
}
@Override
@@ -9132,6 +9190,7 @@
}
}
+ @Override
public void run() {
final ListView listView = (ListView) LayoutInflater.from(mContext)
.inflate(com.android.internal.R.layout.select_dialog, null);
@@ -9142,6 +9201,7 @@
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 @@
}});
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 @@
}
} 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 @@
}
}
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 d99e264..06572e9 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -37,18 +37,14 @@
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 @@
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 @@
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 @@
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 @@
* Clear the picture set. To be called only on the WebCore thread.
*/
/* package */ void clearContent() {
- nativeClearContent();
+ nativeClearContent(mNativeClass);
}
//-------------------------------------------------------------------------
@@ -513,15 +513,16 @@
/**
* 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 @@
*/
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 @@
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 @@
* 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 @@
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 @@
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 @@
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 @@
break;
case UPDATE_FRAME_CACHE_IF_LOADING:
- nativeUpdateFrameCacheIfLoading();
+ nativeUpdateFrameCacheIfLoading(mNativeClass);
break;
case SCROLL_TEXT_INPUT:
@@ -1155,7 +1187,7 @@
} else {
xPercent = ((Float) msg.obj).floatValue();
}
- nativeScrollFocusedTextInput(xPercent, msg.arg2);
+ nativeScrollFocusedTextInput(mNativeClass, xPercent, msg.arg2);
break;
case LOAD_URL: {
@@ -1190,7 +1222,8 @@
!scheme.startsWith("ftp") &&
!scheme.startsWith("about") &&
!scheme.startsWith("javascript")) {
- nativeRegisterURLSchemeAsLocal(scheme);
+ nativeRegisterURLSchemeAsLocal(mNativeClass,
+ scheme);
}
}
}
@@ -1199,7 +1232,7 @@
loadParams.mMimeType,
loadParams.mEncoding,
loadParams.mHistoryUrl);
- nativeContentInvalidateAll();
+ nativeContentInvalidateAll(mNativeClass);
break;
case STOP_LOADING:
@@ -1228,11 +1261,11 @@
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 @@
// 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 @@
WebViewWorker.getHandler().sendEmptyMessage(
WebViewWorker.MSG_PAUSE_CACHE_TRANSACTION);
} else {
- nativeCloseIdleConnections();
+ nativeCloseIdleConnections(mNativeClass);
}
break;
@@ -1293,16 +1326,16 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
}
case SET_ACTIVE:
- nativeSetFocusControllerActive(msg.arg1 == 1);
+ nativeSetFocusControllerActive(mNativeClass, msg.arg1 == 1);
break;
case ADD_JS_INTERFACE:
@@ -1435,39 +1472,39 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
break;
case AUTOFILL_FORM:
- nativeAutoFillForm(msg.arg1);
+ nativeAutoFillForm(mNativeClass, msg.arg1);
mWebView.mPrivateHandler.obtainMessage(WebView.AUTOFILL_COMPLETE, null)
.sendToTarget();
break;
@@ -1853,9 +1896,9 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
return mWebView;
}
- private native void setViewportSettingsFromNative();
+ private native void setViewportSettingsFromNative(int nativeClass);
// called by JNI
private void didFirstLayout(boolean standardLoad) {
@@ -2300,7 +2344,7 @@
return;
}
// set the viewport settings from WebKit
- setViewportSettingsFromNative();
+ setViewportSettingsFromNative(mNativeClass);
// clamp initial scale
if (mViewportInitialScale > 0) {
@@ -2614,18 +2658,22 @@
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 @@
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 12a93ac..a452fec 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -18,10 +18,10 @@
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 @@
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 @@
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 @@
* 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 @@
* @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 @@
*
* @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 @@
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 @@
* @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 @@
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 @@
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 @@
* 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 8e438ff..64fdf34 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -380,7 +380,6 @@
}
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 e4d3aa8..c006615 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -294,7 +294,7 @@
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 @@
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 @@
/* 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 @@
}
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 @@
* 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 @@
* 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 @@
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 @@
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 @@
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 @@
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 f118dc1..4aa13f9 100644
--- a/core/jni/android/graphics/Canvas.cpp
+++ b/core/jni/android/graphics/Canvas.cpp
@@ -762,7 +762,7 @@
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 @@
// 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 64bd207..47ffd94 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -40,7 +40,7 @@
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 7aaca8a..1d0bb506 100644
--- a/core/jni/android/graphics/NinePatchImpl.cpp
+++ b/core/jni/android/graphics/NinePatchImpl.cpp
@@ -297,7 +297,7 @@
}
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 19f53d7..9f3238ab 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -54,8 +54,8 @@
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 de2d8c4..3d350ed 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -112,7 +112,7 @@
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 @@
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 @@
env->DeleteGlobalRef(mWeakThiz);
env->DeleteGlobalRef(mClazz);
} else {
- LOGW("leaking JNI object references");
+ ALOGW("leaking JNI object references");
}
if (needsDetach) {
detachJNI();
@@ -150,7 +150,7 @@
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 @@
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 f88dcd6..2d83851 100644
--- a/core/jni/android/graphics/TextLayout.cpp
+++ b/core/jni/android/graphics/TextLayout.cpp
@@ -52,7 +52,7 @@
// 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 @@
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 @@
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::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 @@
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 1dabe32..a0f9402 100644
--- a/core/jni/android/graphics/TextLayout.h
+++ b/core/jni/android/graphics/TextLayout.h
@@ -81,7 +81,7 @@
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 44ba68e..1b7623d 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -176,7 +176,6 @@
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 @@
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 @@
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 @@
}
}
} 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 6a049e0..929df540 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -73,10 +73,10 @@
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 @@
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 15bb543..ac4fe5b 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -84,8 +84,8 @@
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 @@
// 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 @@
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 @@
}
}
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 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 @@
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 @@
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 @@
}
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 @@
}
}
- LOGW("preDispatchKey called for unknown event: %p", keyEvent);
+ ALOGW("preDispatchKey called for unknown event: %p", keyEvent);
return false;
}
@@ -412,8 +412,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 6ef62a9..066a23e 100644
--- a/core/jni/android_app_backup_FullBackup.cpp
+++ b/core/jni/android_app_backup_FullBackup.cpp
@@ -97,12 +97,12 @@
// 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 1f188ff..3e36677 100644
--- a/core/jni/android_backup_BackupHelperDispatcher.cpp
+++ b/core/jni/android_backup_BackupHelperDispatcher.cpp
@@ -58,7 +58,7 @@
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 @@
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 @@
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 5aef2ad..3b8fb79 100755
--- a/core/jni/android_bluetooth_BluetoothAudioGateway.cpp
+++ b/core/jni/android_bluetooth_BluetoothAudioGateway.cpp
@@ -127,7 +127,7 @@
#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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
(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 @@
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 @@
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 @@
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 @@
}
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 @@
} /* 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 @@
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 @@
}
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 @@
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 @@
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 71697a7..a982182 100644
--- a/core/jni/android_bluetooth_HeadsetBase.cpp
+++ b/core/jni/android_bluetooth_HeadsetBase.cpp
@@ -69,12 +69,12 @@
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 @@
*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 @@
}
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 @@
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 @@
#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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
/* 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 c8dc9c2..5cdaa6c 100644
--- a/core/jni/android_bluetooth_common.cpp
+++ b/core/jni/android_bluetooth_common.cpp
@@ -101,7 +101,7 @@
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 @@
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 @@
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 @@
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 @@
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 1f4da3a..daf4bb2 100644
--- a/core/jni/android_bluetooth_common.h
+++ b/core/jni/android_bluetooth_common.h
@@ -56,14 +56,14 @@
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 9a87a10..f927064 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -71,7 +71,7 @@
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 @@
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 a916ef5..857267a 100644
--- a/core/jni/android_database_SQLiteCompiledSql.cpp
+++ b/core/jni/android_database_SQLiteCompiledSql.cpp
@@ -104,7 +104,7 @@
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 @@
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 2966a71..28c421d 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -79,7 +79,7 @@
// 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 @@
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 @@
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 @@
// 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 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 @@
// 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 @@
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 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 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 @@
} 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 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 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 @@
// 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 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 @@
// 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 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 @@
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 @@
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 @@
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 @@
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 873b2a1..20ff00b 100644
--- a/core/jni/android_database_SQLiteDebug.cpp
+++ b/core/jni/android_database_SQLiteDebug.cpp
@@ -201,25 +201,25 @@
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 c247bbd..2e34c00 100644
--- a/core/jni/android_database_SQLiteProgram.cpp
+++ b/core/jni/android_database_SQLiteProgram.cpp
@@ -176,7 +176,7 @@
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 @@
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 ea4200a..da7ccf0 100644
--- a/core/jni/android_database_SQLiteQuery.cpp
+++ b/core/jni/android_database_SQLiteQuery.cpp
@@ -122,7 +122,7 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 05ffbb1..e376258 100644
--- a/core/jni/android_database_SQLiteStatement.cpp
+++ b/core/jni/android_database_SQLiteStatement.cpp
@@ -169,7 +169,7 @@
// 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 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 f14201e..9147284 100644
--- a/core/jni/android_debug_JNITest.cpp
+++ b/core/jni/android_debug_JNITest.cpp
@@ -39,20 +39,20 @@
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 @@
* 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 @@
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 81dae88..a658561 100644
--- a/core/jni/android_emoji_EmojiFactory.cpp
+++ b/core/jni/android_emoji_EmojiFactory.cpp
@@ -60,7 +60,7 @@
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 @@
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 @@
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 953da79..b89273b 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -173,7 +173,7 @@
// 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 @@
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 @@
}
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 @@
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 @@
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 @@
}
}
} else {
- LOGE("Null byte array!");
+ ALOGE("Null byte array!");
}
}
@@ -899,13 +899,13 @@
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 @@
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 f53e2f7..923781e 100644
--- a/core/jni/android_hardware_UsbDeviceConnection.cpp
+++ b/core/jni/android_hardware_UsbDeviceConnection.cpp
@@ -53,7 +53,7 @@
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 6e1d443..1398968 100644
--- a/core/jni/android_hardware_UsbRequest.cpp
+++ b/core/jni/android_hardware_UsbRequest.cpp
@@ -46,7 +46,7 @@
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 ca13c18..3052553 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -134,7 +134,7 @@
// 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 @@
// 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 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 2573aa6d..4067324 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -176,11 +176,11 @@
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 @@
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 @@
} 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 @@
// 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 @@
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 @@
// 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 @@
// 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 @@
}
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 @@
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 @@
}
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 @@
*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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 66421a98..85c0a9c 100644
--- a/core/jni/android_media_JetPlayer.cpp
+++ b/core/jni/android_media_JetPlayer.cpp
@@ -66,7 +66,7 @@
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 @@
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 @@
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 @@
//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 @@
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 @@
//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 @@
//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 @@
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 @@
//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 @@
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 @@
//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 @@
//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 @@
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 @@
//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 @@
//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 @@
//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 @@
//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 @@
// 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 @@
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 @@
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 965afae..49be1c7 100644
--- a/core/jni/android_media_ToneGenerator.cpp
+++ b/core/jni/android_media_ToneGenerator.cpp
@@ -86,14 +86,14 @@
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 @@
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 c8add70..1426b2c 100644
--- a/core/jni/android_net_LocalSocketImpl.cpp
+++ b/core/jni/android_net_LocalSocketImpl.cpp
@@ -957,7 +957,7 @@
"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 7a61432..0ab659b 100644
--- a/core/jni/android_net_TrafficStats.cpp
+++ b/core/jni/android_net_TrafficStats.cpp
@@ -47,13 +47,13 @@
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 @@
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 f8dc618..9586717 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -184,7 +184,7 @@
}
}
- //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 @@
/* 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 c658aa5..79d8fef 100644
--- a/core/jni/android_os_StatFs.cpp
+++ b/core/jni/android_os_StatFs.cpp
@@ -91,7 +91,7 @@
// 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 @@
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 7f31b00..5639f4f 100644
--- a/core/jni/android_os_UEventObserver.cpp
+++ b/core/jni/android_os_UEventObserver.cpp
@@ -59,7 +59,7 @@
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 2bab4b5..d065a9e 100644
--- a/core/jni/android_server_BluetoothA2dpService.cpp
+++ b/core/jni/android_server_BluetoothA2dpService.cpp
@@ -65,7 +65,7 @@
#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 @@
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 @@
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 @@
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 @@
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 100fca4..9292fc0 100644
--- a/core/jni/android_server_BluetoothEventLoop.cpp
+++ b/core/jni/android_server_BluetoothEventLoop.cpp
@@ -161,7 +161,7 @@
#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 @@
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 @@
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 @@
}
}
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 @@
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 @@
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 @@
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 @@
}
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 @@
return;
}
}
- LOGW("WatchRemove given with unknown watch");
+ ALOGW("WatchRemove given with unknown watch");
}
static void *eventLoopMain(void *ptr) {
@@ -717,7 +717,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
!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 9dbe774..c475261 100644
--- a/core/jni/android_server_BluetoothService.cpp
+++ b/core/jni/android_server_BluetoothService.cpp
@@ -89,7 +89,7 @@
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 @@
#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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
"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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
"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 @@
"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 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 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 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 @@
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 @@
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 c279ced..12beff7 100644
--- a/core/jni/android_server_NetworkManagementSocketTagger.cpp
+++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp
@@ -36,7 +36,7 @@
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 @@
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 9e0ed47..6726c14 100644
--- a/core/jni/android_server_Watchdog.cpp
+++ b/core/jni/android_server_Watchdog.cpp
@@ -48,7 +48,7 @@
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 @@
char buf[128];
DIR* taskdir;
- LOGI("dumpKernelStacks");
+ ALOGI("dumpKernelStacks");
if (!pathStr) {
jniThrowException(env, "java/lang/IllegalArgumentException", "Null path");
return;
@@ -67,7 +67,7 @@
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 9e3d04a..990a617 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -194,8 +194,8 @@
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 @@
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 @@
env->Throw(excep);
vm->DetachCurrentThread();
sleep(60);
- LOGE("Forcefully exiting");
+ ALOGE("Forcefully exiting");
exit(1);
*((int *) 1) = 1;
}
@@ -463,11 +463,11 @@
(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 @@
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 @@
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 @@
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 @@
"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 @@
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_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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 5d51110..a3981ce 100644
--- a/core/jni/android_util_EventLog.cpp
+++ b/core/jni/android_util_EventLog.cpp
@@ -267,7 +267,7 @@
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 @@
*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 @@
*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 65e7130..0327d8c 100644
--- a/core/jni/android_util_FileObserver.cpp
+++ b/core/jni/android_util_FileObserver.cpp
@@ -67,7 +67,7 @@
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 @@
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 2c7bb84..a57aad7 100644
--- a/core/jni/android_util_Log.cpp
+++ b/core/jni/android_util_Log.cpp
@@ -139,7 +139,7 @@
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 bc7e47c..2c494ac 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -227,7 +227,7 @@
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 @@
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 @@
}
}
- //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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
return;
}
- //LOGI("Clearing %d sizes", count);
+ //ALOGI("Clearing %d sizes", count);
for (i=0; i<count; i++) {
sizesArray[i] = 0;
}
@@ -479,7 +479,7 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
}
}
- //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 @@
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 @@
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_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 f61795d..25397b5 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -84,7 +84,7 @@
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 @@
}
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 @@
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 @@
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 383d5ae..23ad154 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -491,7 +491,7 @@
#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 @@
#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 5fcf8fa..fce432b 100644
--- a/core/jni/android_view_InputChannel.cpp
+++ b/core/jni/android_view_InputChannel.cpp
@@ -101,7 +101,7 @@
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 @@
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 @@
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 c8f1f51..ed0acce 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -95,7 +95,7 @@
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 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 @@
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 @@
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 @@
}
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 @@
#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 4b04b8b..27469a2 100644
--- a/core/jni/android_view_KeyEvent.cpp
+++ b/core/jni/android_view_KeyEvent.cpp
@@ -63,7 +63,7 @@
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_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 fef06b2..2def1d1 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -80,7 +80,7 @@
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 @@
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 091341a..8b6dc60 100644
--- a/core/jni/android_view_PointerIcon.cpp
+++ b/core/jni/android_view_PointerIcon.cpp
@@ -43,7 +43,7 @@
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 @@
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 516e421..0da90d7 100644
--- a/core/jni/android_view_VelocityTracker.cpp
+++ b/core/jni/android_view_VelocityTracker.cpp
@@ -154,7 +154,7 @@
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 62ea277..79be2b2 100644
--- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
+++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
@@ -216,18 +216,18 @@
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 @@
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 @@
// 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 @@
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 7d7cdbb..355286e 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 5ba522f..7e92243 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 7d7cdbb..355286e 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 cb453da..3b31199 100644
--- a/docs/html/guide/topics/fundamentals/activities.jd
+++ b/docs/html/guide/topics/fundamentals/activities.jd
@@ -19,9 +19,10 @@
</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 @@
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—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 @@
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 @@
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 @@
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 @@
<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 @@
<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>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>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 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 d6ba646..e8f6cd8 100644
--- a/docs/html/guide/topics/fundamentals/fragments.jd
+++ b/docs/html/guide/topics/fundamentals/fragments.jd
@@ -33,7 +33,7 @@
</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 @@
<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 @@
<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 216420c..5a1f7a2 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 @@
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 @@
<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—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 @@
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—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—two under the current activity. The user presses the HOME key, then
+activities in its stack—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 @@
foreground—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 @@
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 @@
<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 @@
<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 @@
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 @@
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 @@
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"><activity></a></code>
@@ -447,7 +445,7 @@
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 @@
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 84eac73..3f0f1ee 100644
--- a/docs/html/guide/topics/resources/index.jd
+++ b/docs/html/guide/topics/resources/index.jd
@@ -28,18 +28,18 @@
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 @@
</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 252c153..3a176e6 100644
--- a/docs/html/guide/topics/resources/providing-resources.jd
+++ b/docs/html/guide/topics/resources/providing-resources.jd
@@ -207,10 +207,10 @@
<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 @@
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 156aa40..bab9579 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 0000000..7475c67
--- /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
+ VHl5E0yW2kNiBPdfWyR/JRDMJ/16NuYxaeQH9AB0wOyN5xuDKXoBkYh46DZ5CMbdylPE
+ cUgPmPMLgzOaqaIVhP936NJi+TuIAtZw1C4lA9YDLhH8gBV1YMS7AbFIePg+EYLpoJ7j
+ 3Pv9ASNTX7ljuYUOUEMBBAggmE+6ldSt7XKfMZQq9DehVKVLdOAwsGL6BB8VNAtxr0mz
+ OyhACnji+eZwRpMR4L8nYgomvepTeB8JkAK36UpvIu5sYAc1gQWzUatwv4cExAosKbDj
+ MiL+NTGGSxII7xdJwBEQKwAUELGku24d9WA+bBXiHnAHgmkyiQW4XINYgV2XEfPvkQST
+ XiUdgphAMDCEcNDiT5aJIxCzoDvvHUkwGzZznHNHYAgZgS3yXId4mJ5gcB0NVINx5yXp
+ N2uE1IA5B1d4X8RwkEYrgFgACV6n/VomYtMLqQEqQTDFu8J16Cj6CUgADjHuMgrtE4AS
+ 2KPZxgCjIYpkXhcFbWG3/CioBuAJjO54sT3GpHD9v1H0E9rCQf05fCOgBoxMa/Y/QkoA
+ dpBqBFANYk6DSroZFEkgIg6DJ6BaCYgtnHReHrym7aBIqmIdHCRFVCsBuoPXaa+aDl5r
+ 5RthIZiBK0+i1BlTrQRkm2A2aGQF/CEj05j9xBdSbAXApGNQJGwIJHLIijK1Pt1mgEDw
+ CmFhArKj83VTKIGQOEpxVrTy6GAIIDsSiAikKoMzVmiN5vR6Qh4EUAMIjJ9C17oNU4jx
+ EG8IV2jR+YbERGAKN2MiSItMPsyMX2nnwDtukzTzd3ZWuRYToSsIpKq9KbV54YrRf/7M
+ x+3iVlTIYGL4VOv/CgTAGZTu3ZAefnYG6Axv+Zh4BRalb9AZdMsP3g13iFlBhE+NKRV8
+ JRZBoPLogwcnn+NiiQLDAcgK6I4IeRjepr1KanOLAAIi+x3mRb8EgWo6YNGuc0DJ2jkS
+ EFHvDd/fSUgUtKxnhyQ3/lUIhAQQiBUxKP4NHJiRsHibAzHcKV+ZTIrfvAECmdDGHglq
+ Ac8BiiVfioYIQGq0zQHeEi4/RvGroCWUrHwBxZIvRUME0pu+4CMeWH6M4leIiATiAYV+
+ ERNSLPlSNOGYcJUXLD9G7SufFyR9G08MPnJDaiVfCoYIdMoPm1uln/YHaA+JAAGh/QH+
+ cQHZI6IfgflIaI8I9gm9/D4h9Qis9gnXa4k+9oopR2DXXvEZPC9wkOcFtG+Vrp4XrAfF
+ Z2f8JhGpIFkaTTpf0RUIPjMizw1/w2Yx7woEnhsSZ8CXkND53S+kAiXY8ez47NfXD4Ap
+ /OU1JGAKoY6I+gICUAIsH8A6oq2Dh7whIM9OKd4rRDMAz02hsni7lmxZT4hFtfQGRYDA
+ rF/PCNYTnmFNaSRLeTndvprSM6wrDuApKzrPV/DecOELheuKsZ7OHcenJtQGxsva8rBw
+ bTmqAZ4v6P/a8wVnxBskXzpYW01lXMifMWngGRPVli/EagroPWFw/oJzRqmgVbfjADqe
+ NYMzFtTaQnSFQzh1CkePBSmAJICSutjiyCmFekCOmlXTt1BIt1ZG9qmcaHXsmNozp3Dc
+ EM6cblfWL0Hgj54jCRACuliAZhD2Rqppcu54KfHWK0+CMjRhoRAB7EjTzMc9QIH1PdLP
+ MAAJjC4OQmPSg4MqFmBONO6WU6Gb/c1YsBdRAHtQzEgrInoUAXVgCr1YONeuQ8cLJoA7
+ MDgiT3T2IRm2ig+Ba+hD8pn2W+8lcg30oln24aCEA2AFiQ5U0uHDPZmgH5Ee+hEVWxT5
+ Ax6ASb+W5Y7oR3QGPakMjnC63MHGfFS4RAIANKJpFBJ+1IHPtbRbOgC/gL5kGpP7LgN9
+ yeiAYAEAGIFkyMYKp0TrQGBvOos3lq31+NZsYucB2gBozNZ+SYUdxn2hwAcMkCPqrf57
+ aM8n9gaNaMhBfgJAOR11QVOygzpAcMAeldCiEZp0LiAQLQ2IBrwtelS6zcc1aEQM0Bra
+ AIJqdwTBIdhDcUaHKD9oAPQpbb1gq1Zo2HvICi41gW/VGog/V9qDRadO8UUGvPyQDIx7
+ jWIq+iUA0CHI1OyNj3t6afagX7X4aEDEJ42rJ8NOLZ8Mu77cshltwbUn+og9q6Fns9h0
+ gfAfFGA66jXLz4mQw/TFntWEBSq92Rm6fy7VAYPpEoSfbxIW7Cd9y4e9drWQ4vw2I3bw
+ Xyr5ka/QvF+pNdp80WT2pd7uDccTQAHXT29eT25yBr3rR4Nus1p8ur91XbPqI93gOjg4
+ v+DS4gxwyWyp2mh3YX4BDDD48RMM4BZxfEGv06qXC0+JiNd2pfvuGAucYaE1XDsD0UQ6
+ 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
+ AIPtNpotN/vj2Zz/9sXw/a8QeH9fYjDs1ovJsNuiV32BBYwEAQg85KudIfAf2f/p0iJ5
+ CzdNlGE27jdL6XvPVyAAG4AAxAu17ohXAJEIvXGbPAav88mgXc5wXoteeX5kYABGkAUA
+ nuq9MQAA19m4snh+5Gkwnw4BAmCB7kiPwJyrLm/8CMCE1wDxIgDfFdGE6bADELhN2qMg
+ YKQK3bUvVqgBAGJxgPtYidbgdQYsSIedV2rZYZ8IVlBr8nC5andMGLDv4qL4G9GE1+mw
+ VUoG7YaLw6YAjIDREU5XOrwNEIWQ+29yAcGgWYz7rXrloeCQkSovbwKJUntIjOD+a4vk
+ rwSC+aRfz0c9Jo38gB6ADpi9safGYIpeQCQiHrpNHoJxt5IJOw7pAXN+YXBGslW0gvD/
+ Dl1aLH8HUcAajtqlhN96wCWCH7CiDox4NyAWCQ/fJ0IwHdQLnHu/P2Bk6it3tLDQAWoo
+ gAABBPNJt5K6s13uM4ZShf4mmKp0iQ4cBlZMn+CjgmYx5jVpdgcFSAFP7Kk5nNFkBPjv
+ iZiCSa+aCe0jAVLgLl3pTcSdDeygJrBgNmoVH/aQgFiBJQV2XEbEvybGcEkC4f0iCTgC
+ YgWAAiKWdNetox7Mh61izAPuQDBNJrEAV2gQK7DrMmL+PZJg0qukgxATCAaGEA5abhNl
+ 4gjELOjOe0cSzIbNAufcERhCRmAL5+oQD9MTDK6jgWow7rwkbs0aITVgzsEVPjxjOEij
+ FUAsgASv034tG7bphdQAlSCQ4l3hOnQU/QQkAIcYcxmF9glACeyRfGOA0RBFMq+Lgraw
+ W04KqgF4AqM79tweY1K4/t8o+glt4aCeC90IqAEj05pvk5ASgB2kGgFUg6jToJJuBkUS
+ iIhD4AmoVgJiCyedl0evaTsokqpYBwdJEdVKgO7gddqrpgPXWvlGWAhm4MoTL3XGVCsB
+ 2SaYDRp5AX/IyDTmW+ILKbYCYNIxKBI2BBI5ZEXZWp9uM0AgeIWwMA7Z0fm6KZRASByh
+ OCtaeXQwBJAdCUQEUpXBGS22RnN6PSEPAqgBBMaZ4LVuwxRiPMQbwhVadL4hMRGYws2Y
+ CNIikw8z41faOfCO2yTNp3s7q1yLidAV+FPV3pTavHDF6D9/5uP281ZUyGBimKn1fwUC
+ 4AxKD25IDz87A3SGd3xMvAKL0jfoDLrlR++GO8SsIMynxpQKvhKLIFBJ+uDByee4WKLA
+ cACyArojQh6Gt2mvktrcIoCAyH6PedEvQaCa9lu06xxQsnaOBETUe8P3dxISBSzr2SHJ
+ jX8VAkEBBKLPGBT/Bg7MSFi8zYEo7pSvTCbFb94AgWxwY48EtYDnAMWSL0VDBCA12uYA
+ bwmXH6P4VdASSla+gGLJl6IhAulNX/ARDyw/RvErREQC8YBCv4gJKZZ8KZpwTLjKC5Yf
+ o/aVzwsSvo0nBh+5IbWSLwVDBDrlx82t0k/7A7SHRICA0P4A/7iA7BHRj8B8JLRHBPuE
+ Xn6fkHoEVvuE67VEH3vFlCOwa6/4DJ4XOMjzAtq3SlfPC9aD4rMzfpOIVJAsjSadr+gK
+ BJ8ZkeeGv2GzmHcFAs8NiTPgS0jo/O4XUoES7Hh2fPbr6wfAFP7yGhIwhVBHRH0BASgB
+ lg9gHdHWwUPeEJBnpxTvFaIZgOemUFm8XUu2rCfEolp6gyJAYNavZwXrCc+wpjScp7yc
+ bl9N6RnWFfvxlBWd5yt4b7jwhcJ1xVhP547hUxNqA+NlbXlIuLYc1QDPF/R/7fmCM+IN
+ Ei8drK2mMi7kz5g08IyJassXYjUF9J4wOH/BOaNUwKrbcQAdz5rBGQtqbSG6wiGcOoWj
+ x4IUQBJASV10ceSUQj0gR82q6TsopFsrI/tUTrQ6dkztmVM4bghnTrcr65cg8EfPkQQI
+ AV0sQDMIeyPVNDl3vJR465UnQRmasFCIAHakaT7FPECB9T3SzzAACYwuDkJj0oODKhZg
+ TjTullPBm/3NWLAXkR97UMxIKyJ6FAF1YAq9WDjXrkPHCyaAOzA4whk6+5AMW8+P/mvo
+ Q/KZ9lvvJXIN9KJZ9uGghANgBYkOVNKhwz2ZoB+RHvoRPbco8gc8AJN+Lc8d0Y/oDHpS
+ GRyhdLmDjfmocIkEAGhE0yjGb1EHPtfSbukA/AL6kmlM7vss9CWjA4IFAGAEEkEbK5wS
+ rQOBveks3mi+1uNbs4mdB2gDoDFb+yUVchj3hQIfMECOqLfePkB7PrE3aERDDvITAMrp
+ iAuakh3UAYID9qiEFo3QpHMBgWhpQDTgbdGj0m0+rkEjYoDW0AYQVLsjCA7BHoozOkT5
+ 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+
+ 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
+ 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 aafe493..357349c 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 ce9d395..d207db4 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 2c6e33f..bdb6893 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 d6a21d7..aab324d 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 380e7788..64b476f 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 b8c7b45..e219599 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 0000000..7489aeb
--- /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
+ 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
+ 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 fa428a7..57a95ec 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 46d2df5..5265216 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 0000000..73a17a2
--- /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
+ 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
+ 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
+ UECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP
+ 5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHm
+ gjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI
+ ++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVg
+ YJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbpt
+ U3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocs
+ n5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fms
+ Utl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9iago1MCAwIG9iago3MzcKZW5kb2Jq
+ CjggMCBvYmoKWyAvSUNDQmFzZWQgNDkgMCBSIF0KZW5kb2JqCjUyIDAgb2JqCjw8IC9M
+ ZW5ndGggNTMgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AbWb244k
+ t5GG7/Mp8rIH8KSSpzxcGZa8u7AvFmtPLxaG5Qu5POOR0T2yuyUv/Pb+gmQE2VVZNS0f
+ IAgq/c1DMIKMCP7B/Mv4q/Ev48w/aV3GNYTx6f34f+On8Yuvnt14eh5d/uf5NL6dpzTK
+ v13DD+MX//P+6fT+z9//8M3D8PQtQzm/5+EWN8ZA87gvY4zLNK9uGU+P4xe/eAzjz7/L
+ 07pgbdM8+bhsu7UdStt40RYB5ilsyxZHF920xGWt46bSVhYUU5C/bLT107LGODyOKSx5
+ DsPGhzGJZG71DUv03KVn3N0UwxLHhqzrlLY9DacOW8K0Rr+2kWLyU5ojiM5nyKnJpdjw
+ wIrDtK1MpBiKS1UGHb0hVYaRsaxVlXSwkXTVbT5DTtm60hersEqknUVa5/Yxuckt++rY
+ A0PeA824YzFuNu1bTLvHKqHJg2nffVzH54+Y9mxPDXVPufGX7KY/lb311Tt2U/RbmNkE
+ 6HVxPvLDLWmZ/fjuK9lLOt2cdyY7Qu06ePZW8GkZO7sa1tnVMLOiZ9OkJSxmw8EnlOHm
+ hE5bq2WffFpDs6vfEHdPIGpXQ5pdB8M6uxpmFvM6ekOaDIoNJqnZ1VajehgNOY3vUDun
+ 1supnUdObKfAC3vJ8fryntNaVezHt95NITlU+jaM91jzP9kZmOD+w/jb8e7d+zfiAfx4
+ 96Q//lp+DHffvsFu/OWkf7G245vxd+P9L8f/uC/nXe15IY6c4C/vh5m9iPHvTy8F85h6
+ dYk9eibY3dMPnz59++mPb8b7P5VJqttipD1sLsmO4gf6Lj/mNYlmOFY7pzaO+BH+Pge2
+ kVtlS3vfsAewZUr77gZr59jvtVVi0+I5OoRRZSykt1ZpR6lbwNUoNoS0TuvscF919DGk
+ pbRqMijSy6rYw7igEbeGjbFqz4V1lhXp6B1SZWCs1qpiijDSGYJUB/22ukZksLG2qokm
+ lWr1Us+n8eOh9j9gn3Wew7qWH2kV04F4H4crzqCNLl4cx/XCioo1K46hYoPaAmTl6PvN
+ rAOyl7F6K64STdzaWXEMa5r8vi2MVfYIyFJaNSsq0ltRsWZF6zk0ndbROy2rDL0VFev6
+ FUn7karsfT9dY29F1YRasWnrUs8vraiafrzpgggwU0wb52uVqB3DkQvap2XDNcdyzl3n
+ gL5T5/JJf/yv/vj0Ziiu6feK4JEKYo3/oMjXd1+/6b2S5jnZT+Awiue46jB8itPqQ+q3
+ mmHdVlOsbTVPYhE23INtPk+8zWN1W837dXJ44X6reU98IidpW41DUVrZVjOk22qGdVtN
+ sbZBdPS21UyGbssYZltNkX6kKnvfT9fYbTXThG0105ZtNUVwpp3DMPRx/NCHN8sPrH9c
+ t8mvSyLvMx0plnVbD61hZpW4sgkdzqQhmytjdXZKc5q2uL2wU5rJD2dijrmENG+llcmg
+ CDmkyaoYcplGDDN92+gdUmSQsdQZm1yvQbp+UdfY2ck0YVKZtkx2Q17YSVG0fysrMZfg
+ A74Bj1rSgBfBP5CVREeiOuSc5LZL+LmecstAnr+vycmTOZC/ZRcwtMTk3AWUVOHcBZCn
+ Tmwo8r8lTj5seIDoCVEhhEEhkj5PaN7JYRSKngsCbQD8tO2RlTSEfcVApI8GkVsuyyK3
+ ggYlsqLdd0MHXPqCl6zTk5EW4DQ2ISv0MAT2oJvZqdoqzEtdCJeAPHKH5OmR6AJSYJD0
+ V2ZXIOfDAvSdlrKyh66VLr/JU/SIgGeKla10AV478dbQLRvL8mw500uFOFdmFoVMvW7l
+ zjEnUW81lCM+MdB4Ghq0k2aFmAfSVjuJ4D6LOavF3U6+RKM2fQWaWQZtI4qpZlHI9Inv
+ KSN3SJm+07ArEqG8aswKNIUr0HeqK+vMYstXeQbV0Llisye+AG8f8LCQJMVdblHbtCd/
+ NeQnLv6vifm/bgf83x7zneRgPvYH3pPYup17g57uh9FvKy6e41khboC7tqkHvkP0wDeo
+ niYZSPvVY8lIOnQ9zG16O/BNSD3wRJ/ABRdnqgcefiMvhKNbD7wi3dm9gD4LEHZaGzvw
+ HVSX3+SpjrPJXIHT8JGhLrR9HOKtoW7UR1RXzVIh3KfpTluZem3Hd0g98M0Gengemjnt
+ WLah6/lu09uBb0JWSFLDYhbzAaYpG7lD9MBfQOcASWGx7qgyd2ZRVyazayv1dyrPqBpS
+ mc0DiB9W0FrdPvBCR6wz990bB14IuQ2S6VUH/ssula8n/moqL6wTl/h128jPjfAiAWSb
+ ccdzDXtAa3Fa9gRLVwnC0XG19aTjjfhriJFcXStSICH+2khG39l8hpyaXIaRaJFH+BmO
+ SbEBEoibETRHrKNDSCnSZGiYUpQ2kq5muNRDIf7o68oMRvz5bVo897KO/SsMcGP/KrWr
+ 9I3lbdGEyuzfdsj+KaOc2b/hn2H/bFHKekl2r8ZVLGf31biGmSmNU2sIKhH2T9yZbgHj
+ 52ybGIfX5lM+sDOutsIBmUkUa6a00c2QLxjIanCVdGgjKed5oQdi86vybLXXQRyOiTyb
+ 8/DWzWck2z/D/r1kDH+ouTi38vwH/W8hEIc7/X/4vPz3a/Th4f47YzMj7CXOa9WLQ09m
+ fqNZhE6IS9EJ83+NyXyof1AJ7V6hPb9/1rEQNve1wY0otU5tPYP4KqO3r60HDuOID3Wb
+ UN/w9VyL7h+Hjqi9+/13P3xiMcqGSl1nFi79i/+imvPH535SuzMHqXjs+GzI+GmD0Xoc
+ JW/bOkgS350rZq4YlFYZCrAQkrpVqNG6sBiz5HsdEmVsNqpBfpfEmQuVDF7LCZ5ZKlY3
+ dC5CsYohU9qsw8s6rEOkGLRI/YK0H29YJMT2GZOBha6VOkfDPnZStd4QkFQnZqoTnWFM
+ RzYfjrII2OYbOqFtvg772KTtesvyXP4HPpplBZY1eNx+nKEjhYWkOibljWoeeLOZMAZt
+ THKjzTwU7bxRCSsBfpNgUpvhgj62ht14H5i0lGGOFmpDB3zhhhbHR6jhvEHkipQ3SC9B
+ JKvZHaW9ToLWrJegjndECbD8dLY7mxx11Zf1CinDzDNhHZc17RSxtkuK4Bf1UD7r6Xy2
+ w/j0V0stTgZqs2+UUsQBFCbxGf6gUQad6l4hKSS9dzu8ZuBU7MkdCGo8hdEUf9aZ7YdJ
+ aRnQ+Aa6kspLW4p5H13JjYFbTaeucrj7UPUlFEnzVi+LN69YcK5oymZ04gfEEVwnb55+
+ lKRitZoHNquJtD+9Yh47wia2bVkuDvUgDTB501a2sWJj5EK2SKLaHTjxMZunNuG58CwL
+ 1Qput9y2fBrlLCa/BrxLRSSh2LkcUlMyjGOSb3UvsTNfhxsqTsEP+DoHIZkHMZaMrEcH
+ 8ZyCzJx1A3t8XcUkgS+9qZhWjk2YlFu+Tns0obv5KOfn5eJeTAYJDVkF4nKOehdfd9Xp
+ kEJrUQ2thkTQlhnrqoNimAEVF/fYYWIIAigxq/TtnCjWdRFmykwqcS2Pf+owSJFdHF1n
+ 5iBeDYxViuytPznyXNyyX1B8dtXigwWT/pSIz7DmAvGj1vu2Bdp8sLJZNtmqOl+Trc1X
+ MWRo81HItN6ftUArztQiFhYwbNt4x1HKX4qh1omCV+a/G0ZiIpx70Zr1p0zPDaPUTCDL
+ chHIk9VmjH3kWJkUhjqMfVRHpTpvvW9rTXuMkRJblo016HzkACqbzadY1tpR76I1idIt
+ RufcSDitgYLjNEttVxhHrnJg40JKT61aNoNxX4vDH+xUoAvtdt4OrrOyZP2It6O09iA5
+ IL3hlt/LwGFaVnwAZrB2eXVzEF8mjGGWQdvl5VvLbkRZfn1QYNnXeZy2frbyy0BN1pBm
+ ot9bMgpKsO5GMCCtLuG2K+5V5Ki4d8QIXAtbr5EUZ5rcHKng5IcoYb8U9cmisFYWuNUU
+ mZ9MemtzEam105P1srafjWC6gsGsWTL1bE0nhZI5+H7n8ZiDHO4MIoXLULWuG/JzEbkn
+ 1JgjmZhOBasJtZaLHYETlGeiNJ8h2V6QSrLtK8SOa7u563r73NpcjrlENllVmWtwScW1
+ uRrUzdW63vJ0cu0NFO5Wkdm2P76ViA2H22H48gCTJEyWtRMM77XD9SqWnyGVVkSmJXhi
+ jTJgON98DLnyGNYM0kF5hRpptHfTu4fYLZSa6V1Kr2cQbr92pRilJrutd+0AhaJ6t7mq
+ kpHK5ur1ftD1lt4p6w3NypUR7faud8KLSwS2VlIbz2+yXmCUuWA5GYtrUqKkZbyJBP+8
+ Ew0h+drhuoTQM4xYg6VfYFXvjvwv48qQSAaibSOKl3d/yNcw2J+KEatq76HrfVv32qPJ
+ 1s3n2fSZkerm89B1VR9tvr735/TfTGb6N8gTEoKLEqFeYhLJKkLKK63iHHTTo35BuMDL
+ Dufp4Mz93lPoCXu5pRZszVico9NWW0HgnRkq96uIR8c2Flhl5hBLVtfduSypb/fyyo1J
+ +c/IBIiSyCM++htmp7LDyJDL2cUFFELDzrexHooIgUGUQFnRvICMj7c4x0Tm6GtbDY8i
+ n7ZdsGlNFjpMyJ2cQMAbnPdmV9q+Gg71oT1M3m4+tmzxSL28pGE1Wejm63qXfXWWA8nz
+ w0yrJGL7ztOrkWs4UYJ3nh+GmjJYQDlPGcwWSZ4cSefLlAGfJ+zdRs5wFoLvftborU4D
+ rxmUZzTLIu77YlAoTr2FnuzGb/SARWiL7xrFS6fh7mTXbuttPyAID3mDI4mHMxKTZIyE
+ CfpKXz72zx+OEqKaifxB78jtin9Id1x7DCXmtqRX7qCBqlFiywtnt3C6JdDFbG7NEK+a
+ O2wRDoCnloXIqdTzMbNJ5ioG4r58Vgy++294EWU163uN4YWUkrX4iKN21PI923KGi2NS
+ WMfIC+Pb0jKUJEA8bM5XqsSzTrku83g9vy0/swrPFbZNnN2FlL95M6iQ3d68NuaxDqia
+ buRT6OB8579nK+nw+mblQgdBXtI7HqQvPDCgnpXTKU6+wynzVIsXWrhiPFbA6/kN8pYb
+ DE6PcjEYrGMQ2iZhM8qjkjmSZB2MePWUw8RhwE1YOZbHc04WH85/axOL9olQ7R0E3qUn
+ uKVs0wZfMPwr5v2cQc435YFBDjblQhV/gyBahBXLEfX1h4eqJY8GpXO9WP4Ljk+lfw/j
+ h92CrWrV8QAdYW/tePCSvxkgj+owgp48xy1xW7eqnLAXl4zWAYKB7wDyK+x6YR9gVAom
+ A1eCoMMaQUDcsd4WHC+SBdFbmw8/kQUEU4IgSFQvQrf5GtbmG0LrfRwcYV3SJk/W5KaN
+ QxvlHXqNji/c5XBAfJuQwims0vvyTMgznnmVc1Vf6hMW2Hjlpf7PLPLYjx8Z2wqnbJS5
+ 3VQt/N2MPDUEaWi0tn8zKW4ES4u5Nhe1wBo+r9XMrutJaoB+TvjI+uGAhs+BgP+PLesg
+ oBL+LUM4D6j1SQKVLz6L8jw14JKS3w5Df2E/Q9jkcslYYxoMk2q0C9xfHPyqw6dzz1CE
+ xzKQppFstGGQj9zf+EpCR8KhlqdtUrNmNvv/XLEuMhmWK9by0pKHr9oPn7MSPXnjoGMr
+ wiQmQcNUTqYrI9laECnP11ZnzxG8zMCcxH55hsdDDTrLcwQm4JW4vh7oPjTL3yK1kG0n
+ psmUXyPsn3+NUL9FGvK3SCv0Ms8zKUAugVsmP+BUZk89/Mr3B7ooXlHx6oWXt9TKqqoN
+ aYZtrcxkiQ26kUs0I8J9EyPIrk5Da8XTHRxBM2wOz/kpqc5GuM7/3xlWQnjGHuQBQTGH
+ YWYyMp0ydkNMArFANj+PeYqc3Ui64ksdvPIpghrrIOTXD5F4i/Bv/xDpcO/wIdKL76J2
+ cot49PkRXsTK/x9r5Qy3kkty36sD1LcFJLD5D/9f/4uHa/eCEhtvF+oL7SdEuT0Ot5hG
+ ygZfvlJqI+jWRRm2XCLdWKWfVOZNGXUs68fLKW1V2xiSn81Uqp5WRGI5ByYDsvJIuWIS
+ LT+bDOAh8lU6e0kNzjg/uV6XgbVa0LAWnPGo1vsDpPX1in5bLA4nC9glA53QmgwMHdbN
+ Jxfg2vswGSB3Jhnwjpf91LMk+3Py6aGXTyL5erb/XO9WMqDp30EyAMfL12RUZyiDn90Y
+ 2J9aALd4qlHYACs4619qvXm4szj9pPddC88ni56WZLTWOpCN/GT3UQuUPI5pu7+7K5lZ
+ rq9YvqNZVip+lwu++0m7If24Qd9CZfMekArJ+bULJdpCTGnvVCNt1Yp8peWA7/QS/vho
+ rWwAKwzUSnt2DYfNbmc/19X0lq0HLcqXB/mZEN9z9tnP5ZL6l5ZGI9Qfh0JSCan1FzX4
+ 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 0000000..2d64735
--- /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
+ 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
+ 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 eb70074..5de7688 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 0000000..ab71dd1
--- /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
+ GIoAOAAAoOVzeXx+okAgxFQCQSKfz+dxOYgDYEBm2DIZUApCE9CZTDaHy+fD4kViiUQq
+ lcnk2Ekmk0klEolYJAQSPISBEaKwqRNQGwABBhDgAQCxRCqXJymVSpVardbgJrVapVIq
+ FUlymUQiEibyuRwWeIGywiYQQgiYLCAgFElkcoVSrUnWanV6vQFD6fU6rTZFo1Epk+RS
+ MVDgsJEVUD9sCAGyAFwAJuDyBSKJXKHSpGgNBqPJbLFarWlINkxEFQtFW8wmU6pBp9Wo
+ lYgCdASywmYQQgiQCYCAOllrMJqtNnu6w5HpdDqzMBOU7Mx0ZNhtVovJoEvRKOUSkYC/
+ BQToBOQCDi9RJE1SJetSzVa7IzPLtcvt9uR6w8r75BWu1OvN9bhzXNlOR3qaxahPUStk
+ YgoCyoQNugFsABsChUCh0RrMaRnO7ByPN7/Q5ysuQSrFSFTBxUW+woK8XLfL6bBbjDpk
+ BSE4gZFA2yASkA3oTDa4QKbQ6IzWdKfLk1dYVFJWXlFZ5fcHAvuwUiAQ8PurKvaWlRbv
+ zs/NyXLYTIZkgABOoCIhqhGQDRgsLl8kVWj0JpvD5cn3lZRXBqoPHKytPXS4Dj8dPlR7
+ sGb/vqq9e4oKvLucdoshRSkXC3hsJjJCtK2BsgEH4hAQmO1Od55vT0XgQG3dkaMNjU0n
+ mkEtGAnVe6Kp8fix+rramurKsuICT3aGFSDIRIlc6IaoiUDZgM0TSORqnQkQFJTsDdQc
+ qm9oamltP9nR0XnqVBdWOnWqs6Pjm/a2r04cr687WF1ZutvryrAYNAopRAIyQpRmiEVp
+ wOGL5Cqt0eZ0F5ZW7q+tP97cdrLz9NnzF7ov9uCni90Xzp3p6vi6pfHo4Rp/mc+bnW7W
+ aSASkBGiNUNsXAKDzYNOSDZYHTkFpVUH6o6daOs4fe7ipd6+q/3XMFT/1b4rl3sunOls
+ bzn+5cFAmc/jtBu1ShllhGjNAIlI2UCtM6e78koqD9Q1tJzsOt9z5er1gRuDN4eGsdPQ
+ 0M3B77/r//bShTMdrY1HDvr3FOQ4rAZNEhiBSY/SDFQrcAVgg9Q0p8e3d39dw1ffnLnY
+ 2z8wODzy4+jtsbFx3DR2e3R05NbN769923Ous63xSE1ViTfbbtIqpUIeG5rhg0AABqgV
+ ZCqtKd2VvydQe6zlm7M9fd8N3hoduztxb3JycgozQcn3fro7Pjpyc+Dq5fOdrY111eW7
+ 3cgIcjFKxfgoDFAriOUagzXT7auoqT9x8kxP38DQyPjE5PT9mZnZ2dmHeGl2dmbmwfTk
+ T3dGh2/0Xz7X8dWxWj8ygjFFIREgBh+cEGJRHCRKFClGe3ZeSeDQ8bau7r6B4dE7k9Mz
+ c4/m5xcWFhaxEhQ8P//L3Oz9qYnbt270Xzrb3vTl/rLCXQ6zViUT8lgQCJGnJBSJXKFU
+ qTVn5BSWHzjS3HG+9/rQ6N2pB3Pzi49/XV5eXsFMUPLy46X5uZnpibFbA33dXa3Hvqgs
+ 8jhRM4j47KgM6CyIA7XemunxVX7R0NbV0z84cmdq5tHi45XVJ2tra09x09rak9WV5aVf
+ ZqcnRoeu955tb6wLQDPYUpOTIBCihCKckNhwQNIY0rK8Jf7DTSfPXRm4NT754NHi8ura
+ s9+e46lnT1dXluZnpu6O3Ojr7myp319W4Eo3QSAkQiB8sDGgbYEvTko22mFXqD7S3Nl9
+ dfDHiem5heXVp8//WEd6gZWokv94/uzJytKjB/duD1+7dLqtoaYCdgazVkmFYjQGHD5E
+ oil9F8TB0dbTl64Pj03OzD8GBOsvXmGql+u/P3uyvPDw5zsjA1fOtTfWVvo8mRadSgqn
+ pGg+QNsCRKLDvbuipqH9bO/AD3em5xZX1p6vv3z1+vXrN9gJiv7z5frzp6tghInRwb4L
+ HU2H/MVep1WvlgmBwQcHhDjYGgXAwOJwQyQ2njz/7Y0fJ+4/Ahv8/uIVBeAvzET9zl69
+ XP/tyfL8zOTYzf6Lnc0oFLPSYGMQ8jZiIFXprJm5RVW1TR0X+gZH783M//rkt/WXf755
+ Z/l/f/J6p9g3r1+BEaAZpsaHr/V0tXxZXZqXbaMYsOjRfMAVSFV6qzO32H/oREf31Zu3
+ IQ6WgQHYIPRjP/nlvy0wVDAwePH86cri3M/jw9cvdbUeqd6T77Kngg/4GzCgjgdOtDU2
+ d17sH6IYQByEGbz9DzD4xzsMfn/6v6W5n+/c+u7y6VZqc7TDAUG0CQNDGjAIIAbXYFuY
+ XVj+hwEGK3+vRIQB+YBiMH33h4G3DIz/hkFd86meSAbv/XwsXkQy6D3TVn8ADkn2j2WA
+ xaojiozwAWHww8B/ZRBBGI+X2/QBPFGFt84ydTATP8wDPBYdUSUKhHcycSsffJYM/v77
+ rzd//rMvvM+ATY98kIQeI/GEobfOgaAPxqceLqzAO6ZXcESKIIzLS2Dw8o9nq0tz03dH
+ BnrPwr5QDvuCKQUeILAZkQ+SgAE8QgEGtqy80n11LV2wNwKDRWDwAhjgsubIOsMMHk1P
+ IAZfH60pL9yFHiAQBoQB8QHpBZIHJBPJvkD2RnI+WCJnJHi4TnxAGMB7JuIDwgC9dyY+
+ IAyID4LPkUgvkF4gvUB6gTxTpf6+QD1bJ5lIMpFkIslEkokkE9HfHokPCAPig+Bf4Ukv
+ kF4gvUB6IUiA9ALpBdILpBfCBEgekDwgeRDuBnJWJnlA8oDkAcmDMAGSByQPSB6Eu4Gc
+ D0gekDwgeUDyIEyA5AHJA5IH4W4g5wOSByQPSB6QPAgTIHlA8oDkQbgbyPmA5AHJg4/L
+ A3I30Od4TxaVB9u4I+pzZLDNu8JiPk8G790h+f5dYRvfJbrRnXFY3pS1zXvztvIBYYDu
+ 1Q0fvfD5/N/uEt3Zd8rC/co7+25hcsc03LdO7hond87TyOwBmMNBZlCQWSQxZCZNTExc
+ PJlNRGZUxcSQWWXAAB4g7PiZdWR2IfgAxrnu8BmWsDGgZhDBVN8dO8sUBcKOn2lLZhuj
+ jQFGne/wGdcxZNZ5yAg7fOZ9LGUENi9RJFNodEZrutPlySssKikrr6is8vsDgX1YKRAI
+ +P1VFXvLSot35+fmZDlsJkOyEgadw1xjevSR9zDjFiUCjHwHCFKFRmswp2U4s3M83vxC
+ n6+4BKkUI1EFFxf5Cgvyct0up8NuMeo0gADmnMOwd1rcB0M8g0N+kRESGEEISapkXarZ
+ andkZrl2ud2eXG9YeZ+8wpV6vbked44r2+lIT7MY9SlqhUwMLmAxE2jRhr2HIcQHIfCF
+ ErlCnaw1GM1Wmz3d4ch0Op1ZmAlKdmY6Muw2q8Vk0KUgE4goBKgTNrABNAN0A4LA5vIF
+ IqCg0qRoDQajyWyxWq1pSDZMRBULRVvMJlOqQafVqJVyqVjI54ELNkWAEgFBoDNZHB5f
+ KJLI5AqlWpOs1er0egOG0ut1Wm2KRqNSJiECiXwOm8lI2MwFqB9CEMAKQEEgFEukcnmS
+ 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
+ Q6NISEqJ1EeJIiCCUiKhopQgiogKiKCggIQgKIhiIPcM6Pf94rnP/efu55mz3/3uFfvs
+ tc9Zsw4A9FweBEIgHAAQFBxGtD6ii3V0csaSTwEYIAfUgAFweOBCCTqWlqaQyL9pXyYg
+ aag9lyTZGjwh1Wu5kir+JogtVyXQOuvfKP2h0UTIIQAwCYhg8jnA2iTseYBtSTgyjBAG
+ yfiSMM7XAw/hUxCWINpa60G4FsJonwPcQcKeB/gBCUfgfEi6kwCgGILxfsEAkK9BWBPv
+ FYqDpkl+8fhQXBCEzwEA1wwKCoHsY0YhXgRHIEK6mB0IHyLtC9RDLbgRABULyGbsP5zr
+ awBudEG2X/zDiRoDwEgHwNDoP9yW9f5ewViehHoflts3B6PRBYBsZm9vSwjSPw/Abu7e
+ 3o/Kvb3dywAgXgHQHYgLJ0bsy0JOYY8B+E/jg3v+rYGAgkMKsDp4BnOBrcPTEaqIPeQE
+ WR9qgHyS4guVELUrTT1ake4FfQwjD9N9FiIbH/srznxuK14W7AR/+SG8kJTwuGi0OLtE
+ g5SOdL+sntwNeQ6FKMVhZVaVY6qlamMaSE0ZLWftNJ1W3bf6aAN1Q58jeUe7jVZNWEy1
+ zfzN0yxqLPutZq2/2TLaidlrO1g74pxCneNcMo4VHi9zLXTLck/0CPf0xTnhj3rJe2N9
+ qHw++77y6/OvCzgXSAiyCpYJoQtZJwyfqCOmhnqGaYazh29FPI6sjUqIdoiROok6+fZU
+ d2zl6fS4iHj/BHwi/ox/UlhyUkpRalvaRPp2BlPm4Syr7KCc9HOVuXfOj+WtFSAKOYqk
+ /9IptinBl4aXJZfnX7hc0Xzx3qXhypeXF6s2q39doaxlvMpTJ16vds3yun9DZuPNppUW
+ wRv+ra1tFO3uHV2do7fmb3/ugt+lucfQzdhD2wvv/dj3sr/rftlA5KD5A+Eh1NDqw5FH
+ 9cMJjy1HWEdePDk7qjT65mn8M75nPc9Pj2mPw8Z7J5JeGE6STw69zJgym6abfvoq77Xd
+ DMvMxGzhG4e37G+n5y7Oey9ILXx7N7BYsOSzrLaCWVl6f3U1YE1qbeND0zphQ2Zj4+P1
+ TwGbopuLW5Wf3bY5t198yftqsUO9M/jtzHet7z9+3PwZvCu8O/Mrf894bw+Kvzxog6nB
+ OuCG8AVEPtKBTAxFT05NQU3JSSVNfYymG61AV0cvwlDFJMLcxKrMNsThxLnOnc7Li+3i
+ dxCYFHQUeiKiL9ogzixBkOyVRsuYyabItR9eUKBWlFZSUz6qYqPqquavHqYRq5mila1d
+ qFOuW61Xr99k0Gp480jL0Saj68ZXTapMK8yKzHMsUi3jrMKsA2zcbe3t9O0PO/A7Yhx3
+ nVacx1zuHqs5nu0a6ubkruGB9djznMDV4WO9LLz5vLd8+n3z/XD+cgEg4HFgaZBfsELw
+ r5BBQs4JRyKWuBzaGBYZrhGBiHgYeS7KPpor+m1MzcnAUwqxIPbJ6cq4mHinBM1E0TMc
+ SXTJlCnkqRRptOmMZ9kyuDP5s4SyxXKkzsnmHj6vkKeYr1ygXKhcpPiXfLFciWypbJlc
+ ueIFtQr9ixaXjlUGXY6vyq+ur3lw5d1VRB0vdD4crhMbshprm3qap1s+t9LeFGzTaLft
+ 8O+Mu5V/+8qdjq6Bu6P3xrtf9Iz3jvT19bfdrxrIHAx94DKk+1D0EebR1+GZx/0j9U9y
+ RyOfHn+m91xkjGZsY/z5RNuL4snYlx5ThtPirzCvtl+/mumbrXtT9rZ2rnO+f2EIOhN3
+ l5qWL6ykvT+x6rim9UF4HbP+fWPx4+wmfEvos9F2wJeMr9d3Rr9t/+D5ab6b+KtrP/78
+ IBJ8gTnABuF68CGEGxKF7CCLRhmQM5NvUExRblIz0ajR+qAL6Pox3xlkGP2ZaplXWCXZ
+ wthvc8K5FLn9eUp5h7Bb/CwChw8ZCToIuQvjRfCibmIO4iYS0pJ0kh+lnko3y+TIBsmZ
+ HBaWh8lPK7QqZil5K2upYFTmVG+oJanbaQhr7Gg+0CrW9tdR10XrvtG7oZ9sYGsoYLh5
+ pOdojtFxYzHjLyY9pplm9uZY8xWLG5YnrXSsUdYPbXJsbexY7CbtSxyOOXI5vnYqdz7u
+ wuUyBb0/rFypXfvdYt0V3Fc9Kj0dcTS4bnyol6DXpHe6j4rPsm+Rn4Hfln9lgGXAz8Cr
+ QQ7BiOCmkGMESkLrCTciBbE51CUMGXYt3C78Z0RVpEnkZlRxtFb0YkzmSdmTk6fiY8Vj
+ p09nxR2Np4h/klCWSDhjkiSeTJe8k7KY+iJtML3j7JWMosyUrPBsXI7VOc1cifPseai8
+ zfypgp7CK0UZfxGKbUtUS/nKqMt2ypcvvKp4fnHk0mjlpyrWas0a/JWztY1Xx+q+XeO+
+ rtOAb0xrqm8eafnYirkp02bZHtKR09l06+ntzS6mu0r3XLrje2p6h/u+3JccCBhsGgIP
+ nR/deSw5Ujsq87Tnues4YqJl0nfq0PTi64bZxLc58wuLTsvzq+fW7T5JfWb/SvsduQtI
+ 8T/IfaScgFIEoHoeAPtLAFi5AHBFHAChaijPvQPAkhYAWxUA180BsJfFAHakAfzJH7RA
+ GBgCb5AKasEQWIWhYbIwO1gMrBx2BzYN+wnnhmvBPeEp8Dr4E/hnBCdCB+GLOIfoRMwh
+ qZEKSHdkJrIDuUDGQKZFFkx2iWwcRYXSQUWhWlBr5CLkPuRXyFcopCjCKe5RUlM6U16j
+ glE5UrVQo6mDqZ/RKNNcpKWgJdLOoI3RnXQidCUYWkwC5it9CP0yA45hltGTcYkpiOkL
+ cwILmqWcVZq1j82FbZs9l0OW4zlnJBc31yh3Ko8uL+DtwSbzmfGz8y8L3D6UK+gvZCgs
+ KEIjsi06J/ZMvF/iluQNqSbpRpkW2Q657sOP5GcUPikhlZlVBFQl1WTVZTTENLFaDNpw
+ 7Q2dad17epX6aQYhho5HdI9KG/EY05kgTHZMP5q9N39nMWf51mrBetVmy3bXntKB1VHY
+ ScXZzAV37OTxAtcmtxH3D55o3GG8k1ec92Wf+77zfrsBDIF8QWLBUiGSBNET/ESWUMrQ
+ 72ErERyRZlFJ0fdifp0yiM07vRpvlnD7jHxSZ4pR6nx6agZfZkO2ds6b3Nw8xwKNIqPi
+ yNL7Fzgvoivhl79Vb15Zv7pWv3Z9o3G7ebeVoo2zQ/qW/h2nu37dEb2n++MHYh9EPAwc
+ dh/JGO149n6c78XxlxXTizOybxLmxt+JL6WtLK0dWa/7hNk6uf1hx/v70i5h//1BB6SA
+ FQgHJeAeWIBRw+SgfxNJsKuwR7ANOBNcFe4OT4M3wV8iEAhJhBMiGdGMmEXSItWRAchS
+ 5GPkLzJZMjxZGRR3OpQpKh31gJyK3Iz8PPkUhSAFkaKXkoUykHKASoAqkeodtTH1LRpx
+ mgpaZtpMNAqdSAfoEjAITBo9mr6IgZ+hkVGbcZwpiBnFXMmiwzLHmsImyTbBnsAhw/GG
+ M4/rKDeSu5fnDK8hlgY7wVfJHypgeIjn0I7ghFC78EWRItFcsWzxbInzkiVSNdI3ZR7I
+ zsh9lWdWUFXEKWUrd6lsqAmqu2mUak5r8+jgdRv1fhgYGGYceWREZqxk4mmaYlZj3mMx
+ ZfnRGmnDYitmp23v5BDqmOPU4Dzi8uk4i6uGm7d7rsddz3W8gJejd47PgO+uv3yAX+CF
+ oKchcILcCXdidujtsOUIukilKPfojJiOk0uxrKeN4mLjWxLenxFIOp5ckjKZxprudPZC
+ xkKWZHZUzkAu2/mQvOECmcLSv9DF6aU0ZQUXhCsGL/ldpqlqqXGuRV5tqne7jmnoa4pq
+ kb6xfPNKu1+n5K3NO7fuJnab9rL2zd9vGjw1ZPyIfXh0xO7J/NOY5zxjIxMZkzZTQq9g
+ r+dmB97Wz+e8Iy7ZrHC+r1gT/tC8oflxZNNta2M7/ivdTvF3nh8Vuxy/cvbjzwp0AAFU
+ gCdgD4q9N6wYdh+2BeeHW8OT4O3wNQQfwhF63oeQCKQmMgbZjtwmUyCLIOtCkaEsUKWo
+ 9+Rq5OfIlyn0KaooKSgJlK+oTKm6qZWgSOvSDNM60b5Hn6ZjpmvCWGA+0RcyaDKsMJYz
+ 2TDTMj9kSWc1ZWNgm2Kv5iBy6nAxcq1yD/BU8aZgA/hs+XUE5A4JC/IKcQpziGBFxcVU
+ oGzkIXlKqkS6S2ZBDn1YXZ6o0KC4oaygkqD6TF1EI0lzUdtUp11PXL/KkO/IZSNR45um
+ +maTFgQrGusmWxfoee1yinCRP7bj2u2e5emKV/Sm8XnpVxJgFLgSHB3y80QY8V2YZfiN
+ SPooYvTYSdVTl05Tx0XFLyU6nhlO1k25lSaf3pahkTmU7ZSzmns6jz6/slC6qLNYs+Re
+ mXp5WwXZRdNLBZWzVWLVkTX3a5mvetfduoa+jm+408TcTGh51Cpy82zbhw6rzvbbPHdS
+ utbvOXT39Ir3FfTvDfgPjg1pP6wfZnkcOvJwlPOp77Nrz9+PC0w4vEicrH35cOrd9M/X
+ mBneWfE3Cm9V5zTntRe032kuqi4pLcuuiL3nX0Wvrqx1fohcV1hf26j+6PSJ6tOdTe8t
+ zFbH52PbYLvyi+6Xua9xO1w7nd/svn38nvlD+EfvT9efO7t5v6R/De3hSfE/qJdI+QNQ
+ 6YUEhhCxpnr6+8P/3iUoMByqyfYbA3SlCfY0h+osqAoFYJkQZkmqBVmg3/fQCBsDqMdA
+ 5RDG28/Q6DfG4j30TSDMBfEyMb565hCmgbCpN9HQGsKQHZijv4exJYTREPb3Craz+c1H
+ EQL3a1ySzFlCmC5Jng3CZV6hBn9kWmN8bR1+6w4Qw63tIHwIkhkLCDEhyZN87eC99H+v
+ DY4MDjQ3hXhozXAmvzAj0vqZICwG5VEPQAQ+wAtIAlOgB/R/X7EQj4XGIdCsFwiF5Bb2
+ 5f5I2e+P/f6PliSUlUn2IvZ1AsAihIPc/BKJkK0D60MAB3EeIPgPI1MvsyLz889o32Pg
+ vtc/GibQ6H8zB5YOVncw4wfwkNQfHvdHg+Q5qMU74q+QaFV7X6QQUg7K/7pIqExEqgAs
+ kgXJASSR8khlpA5SC6kGzamMrLWv/b2Wg73x/PseTaB1eEF5h7QjwX+z/88r8IO+YezX
+ 7tAuAxR0NsqaSeh+VGw8qf+fLcwrCqrrAdALIUQT/Xx8w7A60JcLLwmsUTBOSgIrJyMr
+ A/4FJe1eNwplbmRzdHJlYW0KZW5kb2JqCjgyIDAgb2JqCjM5MTAKZW5kb2JqCjYyIDAg
+ b2JqClsgL0lDQ0Jhc2VkIDgxIDAgUiBdCmVuZG9iago4MyAwIG9iago8PCAvTGVuZ3Ro
+ IDg0IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAGtWHVYVN323hMMPQzdMIB0I92tdLdSM3SNQ6NISEqJ1EeJ
+ IiCCUiKhopQgiogKiKCggIQgKIhiIPcM6Pf94rnP/efu55mz3/3uFfvstc9Zsw4A9Fwe
+ BEIgHAAQFBxGtD6ii3V0csaSTwEYIAfUgAFweOBCCTqWlqaQyL9pXyYgaag9lyTZGjwh
+ 1Wu5kir+JogtVyXQOuvfKP2h0UTIIQAwCYhg8jnA2iTseYBtSTgyjBAGyfiSMM7XAw/h
+ UxCWINpa60G4FsJonwPcQcKeB/gBCUfgfEi6kwCgGILxfsEAkK9BWBPvFYqDpkl+8fhQ
+ XBCEzwEA1wwKCoHsY0YhXgRHIEK6mB0IHyLtC9RDLbgRABULyGbsP5zrawBudEG2X/zD
+ iRoDwEgHwNDoP9yW9f5ewViehHoflts3B6PRBYBsZm9vSwjSPw/Abu7e3o/Kvb3dywAg
+ XgHQHYgLJ0bsy0JOYY8B+E/jg3v+rYGAgkMKsDp4BnOBrcPTEaqIPeQEWR9qgHyS4guV
+ ELUrTT1ake4FfQwjD9N9FiIbH/srznxuK14W7AR/+SG8kJTwuGi0OLtEg5SOdL+sntwN
+ eQ6FKMVhZVaVY6qlamMaSE0ZLWftNJ1W3bf6aAN1Q58jeUe7jVZNWEy1zfzN0yxqLPut
+ Zq2/2TLaidlrO1g74pxCneNcMo4VHi9zLXTLck/0CPf0xTnhj3rJe2N9qHw++77y6/Ov
+ CzgXSAiyCpYJoQtZJwyfqCOmhnqGaYazh29FPI6sjUqIdoiROok6+fZUd2zl6fS4iHj/
+ BHwi/ox/UlhyUkpRalvaRPp2BlPm4Syr7KCc9HOVuXfOj+WtFSAKOYqk/9IptinBl4aX
+ JZfnX7hc0Xzx3qXhypeXF6s2q39doaxlvMpTJ16vds3yun9DZuPNppUWwRv+ra1tFO3u
+ HV2do7fmb3/ugt+lucfQzdhD2wvv/dj3sr/rftlA5KD5A+Eh1NDqw5FH9cMJjy1HWEde
+ PDk7qjT65mn8M75nPc9Pj2mPw8Z7J5JeGE6STw69zJgym6abfvoq77XdDMvMxGzhG4e3
+ 7G+n5y7Oey9ILXx7N7BYsOSzrLaCWVl6f3U1YE1qbeND0zphQ2Zj4+P1TwGbopuLW5Wf
+ 3bY5t198yftqsUO9M/jtzHet7z9+3PwZvCu8O/Mrf894bw+Kvzxog6nBOuCG8AVEPtKB
+ TAxFT05NQU3JSSVNfYymG61AV0cvwlDFJMLcxKrMNsThxLnOnc7Li+3idxCYFHQUeiKi
+ L9ogzixBkOyVRsuYyabItR9eUKBWlFZSUz6qYqPqquavHqYRq5mila1dqFOuW61Xr99k
+ 0Gp480jL0Saj68ZXTapMK8yKzHMsUi3jrMKsA2zcbe3t9O0PO/A7Yhx3nVacx1zuHqs5
+ nu0a6ubkruGB9djznMDV4WO9LLz5vLd8+n3z/XD+cgEg4HFgaZBfsELwr5BBQs4JRyKW
+ uBzaGBYZrhGBiHgYeS7KPpor+m1MzcnAUwqxIPbJ6cq4mHinBM1E0TMcSXTJlCnkqRRp
+ tOmMZ9kyuDP5s4SyxXKkzsnmHj6vkKeYr1ygXKhcpPiXfLFciWypbJlcueIFtQr9ixaX
+ jlUGXY6vyq+ur3lw5d1VRB0vdD4crhMbshprm3qap1s+t9LeFGzTaLft8O+Mu5V/+8qd
+ jq6Bu6P3xrtf9Iz3jvT19bfdrxrIHAx94DKk+1D0EebR1+GZx/0j9U9yRyOfHn+m91xk
+ jGZsY/z5RNuL4snYlx5ThtPirzCvtl+/mumbrXtT9rZ2rnO+f2EIOhN3l5qWL6ykvT+x
+ 6rim9UF4HbP+fWPx4+wmfEvos9F2wJeMr9d3Rr9t/+D5ab6b+KtrP/78IBJ8gTnABuF6
+ 8CGEGxKF7CCLRhmQM5NvUExRblIz0ajR+qAL6Pox3xlkGP2ZaplXWCXZwthvc8K5FLn9
+ eUp5h7Bb/CwChw8ZCToIuQvjRfCibmIO4iYS0pJ0kh+lnko3y+TIBsmZHBaWh8lPK7Qq
+ Zil5K2upYFTmVG+oJanbaQhr7Gg+0CrW9tdR10XrvtG7oZ9sYGsoYLh5pOdojtFxYzHj
+ LyY9pplm9uZY8xWLG5YnrXSsUdYPbXJsbexY7CbtSxyOOXI5vnYqdz7uwuUyBb0/rFyp
+ XfvdYt0V3Fc9Kj0dcTS4bnyol6DXpHe6j4rPsm+Rn4Hfln9lgGXAz8CrQQ7BiOCmkGME
+ SkLrCTciBbE51CUMGXYt3C78Z0RVpEnkZlRxtFb0YkzmSdmTk6fiY8Vjp09nxR2Np4h/
+ klCWSDhjkiSeTJe8k7KY+iJtML3j7JWMosyUrPBsXI7VOc1cifPseai8zfypgp7CK0UZ
+ fxGKbUtUS/nKqMt2ypcvvKp4fnHk0mjlpyrWas0a/JWztY1Xx+q+XeO+rtOAb0xrqm8e
+ afnYirkp02bZHtKR09l06+ntzS6mu0r3XLrje2p6h/u+3JccCBhsGgIPnR/deSw5Ujsq
+ 87Tnues4YqJl0nfq0PTi64bZxLc58wuLTsvzq+fW7T5JfWb/SvsduQtI8T/IfaScgFIE
+ oHoeAPtLAFi5AHBFHAChaijPvQPAkhYAWxUA180BsJfFAHakAfzJH7RAGBgCb5AKasEQ
+ WIWhYbIwO1gMrBx2BzYN+wnnhmvBPeEp8Dr4E/hnBCdCB+GLOIfoRMwhqZEKSHdkJrID
+ uUDGQKZFFkx2iWwcRYXSQUWhWlBr5CLkPuRXyFcopCjCKe5RUlM6U16jglE5UrVQo6mD
+ qZ/RKNNcpKWgJdLOoI3RnXQidCUYWkwC5it9CP0yA45hltGTcYkpiOkLcwILmqWcVZq1
+ j82FbZs9l0OW4zlnJBc31yh3Ko8uL+DtwSbzmfGz8y8L3D6UK+gvZCgsKEIjsi06J/ZM
+ vF/iluQNqSbpRpkW2Q657sOP5GcUPikhlZlVBFQl1WTVZTTENLFaDNpw7Q2dad17epX6
+ aQYhho5HdI9KG/EY05kgTHZMP5q9N39nMWf51mrBetVmy3bXntKB1VHYScXZzAV37OTx
+ AtcmtxH3D55o3GG8k1ec92Wf+77zfrsBDIF8QWLBUiGSBNET/ESWUMrQ72ErERyRZlFJ
+ 0fdifp0yiM07vRpvlnD7jHxSZ4pR6nx6agZfZkO2ds6b3Nw8xwKNIqPiyNL7Fzgvoivh
+ l79Vb15Zv7pWv3Z9o3G7ebeVoo2zQ/qW/h2nu37dEb2n++MHYh9EPAwcdh/JGO149n6c
+ 78XxlxXTizOybxLmxt+JL6WtLK0dWa/7hNk6uf1hx/v70i5h//1BB6SAFQgHJeAeWIBR
+ w+SgfxNJsKuwR7ANOBNcFe4OT4M3wV8iEAhJhBMiGdGMmEXSItWRAchS5GPkLzJZMjxZ
+ GRR3OpQpKh31gJyK3Iz8PPkUhSAFkaKXkoUykHKASoAqkeodtTH1LRpxmgpaZtpMNAqd
+ SAfoEjAITBo9mr6IgZ+hkVGbcZwpiBnFXMmiwzLHmsImyTbBnsAhw/GGM4/rKDeSu5fn
+ DK8hlgY7wVfJHypgeIjn0I7ghFC78EWRItFcsWzxbInzkiVSNdI3ZR7Izsh9lWdWUFXE
+ KWUrd6lsqAmqu2mUak5r8+jgdRv1fhgYGGYceWREZqxk4mmaYlZj3mMxZfnRGmnDYitm
+ p23v5BDqmOPU4Dzi8uk4i6uGm7d7rsddz3W8gJejd47PgO+uv3yAX+CFoKchcILcCXdi
+ dujtsOUIukilKPfojJiOk0uxrKeN4mLjWxLenxFIOp5ckjKZxprudPZCxkKWZHZUzkAu
+ 2/mQvOECmcLSv9DF6aU0ZQUXhCsGL/ldpqlqqXGuRV5tqne7jmnoa4pqkb6xfPNKu1+n
+ 5K3NO7fuJnab9rL2zd9vGjw1ZPyIfXh0xO7J/NOY5zxjIxMZkzZTQq9gr+dmB97Wz+e8
+ Iy7ZrHC+r1gT/tC8oflxZNNta2M7/ivdTvF3nh8Vuxy/cvbjzwp0AAFUgCdgD4q9N6wY
+ dh+2BeeHW8OT4O3wNQQfwhF63oeQCKQmMgbZjtwmUyCLIOtCkaEsUKWo9+Rq5OfIlyn0
+ KaooKSgJlK+oTKm6qZWgSOvSDNM60b5Hn6ZjpmvCWGA+0RcyaDKsMJYz2TDTMj9kSWc1
+ ZWNgm2Kv5iBy6nAxcq1yD/BU8aZgA/hs+XUE5A4JC/IKcQpziGBFxcVUoGzkIXlKqkS6
+ S2ZBDn1YXZ6o0KC4oaygkqD6TF1EI0lzUdtUp11PXL/KkO/IZSNR45um+maTFgQrGusm
+ Wxfoee1yinCRP7bj2u2e5emKV/Sm8XnpVxJgFLgSHB3y80QY8V2YZfiNSPooYvTYSdVT
+ l05Tx0XFLyU6nhlO1k25lSaf3pahkTmU7ZSzmns6jz6/slC6qLNYs+RemXp5WwXZRdNL
+ BZWzVWLVkTX3a5mvetfduoa+jm+408TcTGh51Cpy82zbhw6rzvbbPHdSutbvOXT39Ir3
+ FfTvDfgPjg1pP6wfZnkcOvJwlPOp77Nrz9+PC0w4vEicrH35cOrd9M/XmBneWfE3Cm9V
+ 5zTntRe032kuqi4pLcuuiL3nX0Wvrqx1fohcV1hf26j+6PSJ6tOdTe8tzFbH52PbYLvy
+ i+6Xua9xO1w7nd/svn38nvlD+EfvT9efO7t5v6R/De3hSfE/qJdI+QNQ6YUEhhCxpnr6
+ +8P/3iUoMByqyfYbA3SlCfY0h+osqAoFYJkQZkmqBVmg3/fQCBsDqMdA5RDG28/Q6DfG
+ 4j30TSDMBfEyMb565hCmgbCpN9HQGsKQHZijv4exJYTREPb3Craz+c1HEQL3a1ySzFlC
+ mC5Jng3CZV6hBn9kWmN8bR1+6w4Qw63tIHwIkhkLCDEhyZN87eC99H+vDY4MDjQ3hXho
+ zXAmvzAj0vqZICwG5VEPQAQ+wAtIAlOgB/R/X7EQj4XGIdCsFwiF5Bb25f5I2e+P/f6P
+ liSUlUn2IvZ1AsAihIPc/BKJkK0D60MAB3EeIPgPI1MvsyLz889o32Pgvtc/GibQ6H8z
+ 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>
+ 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
+ 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 adbdab6..0b3c856 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 403dd4f..d32a781 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 f9602f8..7ab96d7 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 c16214e..fd17e98 100644
--- a/drm/common/ReadWriteUtils.cpp
+++ b/drm/common/ReadWriteUtils.cpp
@@ -85,7 +85,7 @@
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 @@
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 e34046fe..dfc7fb2 100644
--- a/drm/jni/android_drm_DrmManagerClient.cpp
+++ b/drm/jni/android_drm_DrmManagerClient.cpp
@@ -169,7 +169,7 @@
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 67f58ca..b222b8f 100644
--- a/drm/libdrmframework/DrmManagerClientImpl.cpp
+++ b/drm/libdrmframework/DrmManagerClientImpl.cpp
@@ -54,7 +54,7 @@
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 @@
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 7799040..0273a4b 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 @@
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 @@
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 @@
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 @@
(!decodeSessionMap.isCreated(decryptHandle->decryptId))) {
fileDesc = dup(fd);
} else {
- LOGE("FwdLockEngine::onOpenDecryptSession parameter error");
+ ALOGE("FwdLockEngine::onOpenDecryptSession parameter error");
return result;
}
@@ -550,13 +550,13 @@
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 @@
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 @@
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 c4ef993..bc1db4d 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 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/utils/GenerationCache.h b/include/utils/GenerationCache.h
index da85a9a..40722d1 100644
--- a/include/utils/GenerationCache.h
+++ b/include/utils/GenerationCache.h
@@ -205,7 +205,7 @@
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 e045b2c..46420c1 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -1278,7 +1278,7 @@
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 @@
}
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 @@
// 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 9945f91..e20d8a3 100644
--- a/libs/binder/Binder.cpp
+++ b/libs/binder/Binder.cpp
@@ -89,7 +89,7 @@
// 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 e8fb1d9..47a62db 100644
--- a/libs/binder/BpBinder.cpp
+++ b/libs/binder/BpBinder.cpp
@@ -50,7 +50,7 @@
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 0733378..a6e5f71 100644
--- a/libs/binder/CursorWindow.cpp
+++ b/libs/binder/CursorWindow.cpp
@@ -150,7 +150,7 @@
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 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::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 2111fe8..cd2451a 100644
--- a/libs/binder/IMemory.cpp
+++ b/libs/binder/IMemory.cpp
@@ -298,11 +298,11 @@
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 @@
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 @@
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 641134a..a42c336 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -493,7 +493,7 @@
void IPCThreadState::stopProcess(bool immediate)
{
- //LOGI("**** STOPPING PROCESS");
+ //ALOGI("**** STOPPING PROCESS");
flushCommands();
int fd = mProcess->mDriverFD;
mProcess->mDriverFD = -1;
@@ -530,9 +530,9 @@
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 @@
}
#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 @@
}
}
- //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 @@
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 @@
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 1fa4c35..33b305d 100644
--- a/libs/binder/IServiceManager.cpp
+++ b/libs/binder/IServiceManager.cpp
@@ -78,7 +78,7 @@
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 @@
// 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 @@
// 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 @@
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 f299924..8d0e0a7 100644
--- a/libs/binder/MemoryDealer.cpp
+++ b/libs/binder/MemoryDealer.cpp
@@ -210,7 +210,7 @@
#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 @@
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 e171374..d1cbf1c 100644
--- a/libs/binder/MemoryHeapBase.cpp
+++ b/libs/binder/MemoryHeapBase.cpp
@@ -53,7 +53,7 @@
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 @@
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 @@
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 03322ea..66bcf4d 100644
--- a/libs/binder/MemoryHeapPmem.cpp
+++ b/libs/binder/MemoryHeapPmem.cpp
@@ -79,7 +79,7 @@
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 @@
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 @@
#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 @@
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 @@
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 4ec2243..dea14bb 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -139,7 +139,7 @@
}
}
- 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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
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::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 @@
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 @@
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 f06a59e..f96fe50 100644
--- a/libs/binder/ProcessState.cpp
+++ b/libs/binder/ProcessState.cpp
@@ -109,7 +109,7 @@
// 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 @@
} 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 @@
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 @@
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 eef1dd2..ee458f1 100644
--- a/libs/camera/Camera.cpp
+++ b/libs/camera/Camera.cpp
@@ -47,7 +47,7 @@
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 @@
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 @@
{
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 @@
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 @@
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 209d84a..059a8a5 100644
--- a/libs/camera/CameraParameters.cpp
+++ b/libs/camera/CameraParameters.cpp
@@ -231,12 +231,12 @@
{
// 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 @@
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 @@
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 4bfbdf3..ffee039 100644
--- a/libs/cpustats/ThreadCpuUsage.cpp
+++ b/libs/cpustats/ThreadCpuUsage.cpp
@@ -31,7 +31,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
(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 @@
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 fa8d0ea..785da39 100644
--- a/libs/gui/BitTube.cpp
+++ b/libs/gui/BitTube.cpp
@@ -40,7 +40,7 @@
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 @@
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 fee1feb..3b3ccaa 100644
--- a/libs/gui/DisplayEventReceiver.cpp
+++ b/libs/gui/DisplayEventReceiver.cpp
@@ -81,7 +81,7 @@
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 ca7c8f8..95b2379 100644
--- a/libs/gui/ISurfaceComposer.cpp
+++ b/libs/gui/ISurfaceComposer.cpp
@@ -148,27 +148,27 @@
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 @@
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 ee21c45..b95dd902 100644
--- a/libs/gui/SensorEventQueue.cpp
+++ b/libs/gui/SensorEventQueue.cpp
@@ -70,12 +70,12 @@
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 @@
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 dafcdea..b80da56 100644
--- a/libs/gui/SensorManager.cpp
+++ b/libs/gui/SensorManager.cpp
@@ -78,7 +78,7 @@
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 @@
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 ff45fa3..337950c 100644
--- a/libs/gui/Surface.cpp
+++ b/libs/gui/Surface.cpp
@@ -167,7 +167,7 @@
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 @@
} 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::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 fa0ee8c..3abe84a 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 @@
}
// 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 @@
// 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 @@
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::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::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 b6f3c11..d0934ba 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -157,7 +157,7 @@
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 @@
return i;
}
}
- LOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
+ ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
return BAD_VALUE;
}
@@ -230,7 +230,7 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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::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 fa1e9b8..d1af1a3 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -50,7 +50,7 @@
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 b8ba23d..656a384 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -1210,10 +1210,8 @@
// 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 8462307..790c143 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -150,7 +150,7 @@
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::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 @@
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 @@
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 a88a59a..3678788 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -154,7 +154,7 @@
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 f122396..e320eb2 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -185,14 +185,14 @@
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 @@
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 9101953..12ed205 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -172,7 +172,7 @@
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 @@
#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 @@
*/
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 701314d..984461c 100644
--- a/libs/hwui/Program.cpp
+++ b/libs/hwui/Program.cpp
@@ -55,13 +55,13 @@
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 @@
// 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 2c0f3ab..30ce690 100644
--- a/libs/hwui/ShapeCache.h
+++ b/libs/hwui/ShapeCache.h
@@ -503,7 +503,7 @@
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 @@
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 237911b..cc09aae 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -125,7 +125,7 @@
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 @@
SkAutoLockPixels alp(*bitmap);
if (!bitmap->readyToDraw()) {
- LOGE("Cannot generate texture from bitmap");
+ ALOGE("Cannot generate texture from bitmap");
return;
}
@@ -249,7 +249,7 @@
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 e79cd0f..1f70e66 100644
--- a/libs/rs/driver/rsdAllocation.cpp
+++ b/libs/rs/driver/rsdAllocation.cpp
@@ -172,7 +172,7 @@
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 @@
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 @@
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 917b419..24bb288 100644
--- a/libs/rs/driver/rsdBcc.cpp
+++ b/libs/rs/driver/rsdBcc.cpp
@@ -69,7 +69,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
rsdLaunchThreads(mrsc, wc_x, &mtls);
}
- //LOGE("launch 1");
+ //ALOGE("launch 1");
} else {
RsForEachStubParamStruct p;
memset(&p, 0, sizeof(p));
@@ -380,7 +380,7 @@
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 @@
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 @@
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 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 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 9292fa1..b514e21 100644
--- a/libs/rs/driver/rsdCore.cpp
+++ b/libs/rs/driver/rsdCore.cpp
@@ -146,7 +146,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 d4deefb..b53a68cf 100644
--- a/libs/rs/driver/rsdGL.cpp
+++ b/libs/rs/driver/rsdGL.cpp
@@ -107,14 +107,14 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
}
}
- 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 24a7183..99d79dc 100644
--- a/libs/rs/driver/rsdMeshObj.cpp
+++ b/libs/rs/driver/rsdMeshObj.cpp
@@ -133,7 +133,7 @@
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 af44b02..fca9ba9 100644
--- a/libs/rs/driver/rsdProgramStore.cpp
+++ b/libs/rs/driver/rsdProgramStore.cpp
@@ -70,7 +70,7 @@
drv->depthFunc = GL_NOTEQUAL;
break;
default:
- LOGE("Unknown depth function.");
+ ALOGE("Unknown depth function.");
goto error;
}
@@ -111,7 +111,7 @@
drv->blendSrc = GL_SRC_ALPHA_SATURATE;
break;
default:
- LOGE("Unknown blend src mode.");
+ ALOGE("Unknown blend src mode.");
goto error;
}
@@ -141,7 +141,7 @@
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 b927ed2..e315539 100644
--- a/libs/rs/driver/rsdRuntimeMath.cpp
+++ b/libs/rs/driver/rsdRuntimeMath.cpp
@@ -122,7 +122,7 @@
}
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 b457d8b..14c2970 100644
--- a/libs/rs/driver/rsdRuntimeStubs.cpp
+++ b/libs/rs/driver/rsdRuntimeStubs.cpp
@@ -686,7 +686,7 @@
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 e9ce7c2..a10deb4 100644
--- a/libs/rs/driver/rsdShader.cpp
+++ b/libs/rs/driver/rsdShader.cpp
@@ -190,7 +190,7 @@
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 @@
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 @@
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 @@
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 @@
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 2871a12..f6236e7 100644
--- a/libs/rs/driver/rsdShaderCache.cpp
+++ b/libs/rs/driver/rsdShaderCache.cpp
@@ -135,7 +135,7 @@
}
//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 @@
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 @@
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 @@
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 @@
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 6e8ca70..177fb60 100644
--- a/libs/rs/rsAdapter.cpp
+++ b/libs/rs/rsAdapter.cpp
@@ -140,7 +140,7 @@
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 c1192fe..2773d5c 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -75,7 +75,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
- LOGE("not implemented");
+ ALOGE("not implemented");
}
/////////////////
@@ -587,7 +587,7 @@
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 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 48b4f02..a4093d9 100644
--- a/libs/rs/rsAnimation.cpp
+++ b/libs/rs/rsAnimation.cpp
@@ -126,7 +126,7 @@
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 293fc3a..ad2ff0f 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -40,7 +40,7 @@
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 @@
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::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 @@
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 @@
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 @@
}
if (mError != RS_ERROR_NONE) {
- LOGE("Errors during thread init");
+ ALOGE("Errors during thread init");
return false;
}
@@ -602,12 +602,12 @@
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 @@
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 c6582c9..61c29f9 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -50,13 +50,13 @@
#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 56c31b6..dff9585 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -107,7 +107,7 @@
// 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 f4a8bc6..d50f3e0 100644
--- a/libs/rs/rsFBOCache.cpp
+++ b/libs/rs/rsFBOCache.cpp
@@ -46,12 +46,12 @@
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::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 8b8008d..163a44b 100644
--- a/libs/rs/rsFifoSocket.cpp
+++ b/libs/rs/rsFifoSocket.cpp
@@ -48,31 +48,31 @@
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 530e79e..ac658c8 100644
--- a/libs/rs/rsFileA3D.cpp
+++ b/libs/rs/rsFileA3D.cpp
@@ -278,17 +278,17 @@
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 @@
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 @@
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 @@
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 @@
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 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 @@
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 7b3aa70..4f21b3b 100644
--- a/libs/rs/rsFont.cpp
+++ b/libs/rs/rsFont.cpp
@@ -39,7 +39,7 @@
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 @@
}
if (error) {
- LOGE("Unable to initialize font %s", name);
+ ALOGE("Unable to initialize font %s", name);
return false;
}
@@ -61,7 +61,7 @@
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 @@
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 @@
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 @@
#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 @@
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 @@
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 @@
// 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 @@
// 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 @@
}
/*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 @@
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 ce69a60..0466d8b 100644
--- a/libs/rs/rsLocklessFifo.cpp
+++ b/libs/rs/rsLocklessFifo.cpp
@@ -45,12 +45,12 @@
// 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 bf9284f..67c7299 100644
--- a/libs/rs/rsMesh.cpp
+++ b/libs/rs/rsMesh.cpp
@@ -107,7 +107,7 @@
// 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::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::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 @@
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 2105288..6512372 100644
--- a/libs/rs/rsMutex.cpp
+++ b/libs/rs/rsMutex.cpp
@@ -30,7 +30,7 @@
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 @@
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 @@
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 addf932..6a64582 100644
--- a/libs/rs/rsObjectBase.cpp
+++ b/libs/rs/rsObjectBase.cpp
@@ -204,14 +204,14 @@
// 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 a9fd877..8061515 100644
--- a/libs/rs/rsProgram.cpp
+++ b/libs/rs/rsProgram.cpp
@@ -139,13 +139,13 @@
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::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::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 81eedc4..4e73ca6 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -38,12 +38,12 @@
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 @@
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 @@
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 7fc128e..357dbe3 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -41,9 +41,9 @@
}
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::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 @@
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 @@
// 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 @@
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 ce3c643..afc8ba0 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -72,7 +72,7 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 ec15bc0..183e207 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -115,7 +115,7 @@
//////////////////////////////////////////////////////////////////////////////
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 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 @@
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 26e2374..7964792 100644
--- a/libs/rs/rsScriptC_LibGL.cpp
+++ b/libs/rs/rsScriptC_LibGL.cpp
@@ -147,11 +147,11 @@
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 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 413ac2b..3f6a13c 100644
--- a/libs/rs/rsSignal.cpp
+++ b/libs/rs/rsSignal.cpp
@@ -32,13 +32,13 @@
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 @@
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 @@
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 @@
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 @@
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 13e789d..8ba1a0e 100644
--- a/libs/rs/rsThreadIO.cpp
+++ b/libs/rs/rsThreadIO.cpp
@@ -40,22 +40,22 @@
}
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 @@
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 @@
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 @@
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 @@
}
}
- //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 271c9e2..7966470 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -167,7 +167,7 @@
// 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 3a6c85a..db6f592 100644
--- a/libs/rs/rsUtils.h
+++ b/libs/rs/rsUtils.h
@@ -40,7 +40,7 @@
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 b3f6c55..6b84e56 100644
--- a/libs/rs/rsg_generator.c
+++ b/libs/rs/rsg_generator.c
@@ -235,7 +235,7 @@
}
}
- //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 @@
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 @@
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 8949730..f5ed981 100644
--- a/libs/ui/FramebufferNativeWindow.cpp
+++ b/libs/ui/FramebufferNativeWindow.cpp
@@ -85,10 +85,10 @@
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 @@
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 @@
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 54a3ffa..f549a37 100644
--- a/libs/ui/GraphicBuffer.cpp
+++ b/libs/ui/GraphicBuffer.cpp
@@ -167,7 +167,7 @@
{
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 b2b70c1..d344737 100644
--- a/libs/ui/GraphicBufferAllocator.cpp
+++ b/libs/ui/GraphicBufferAllocator.cpp
@@ -38,7 +38,7 @@
{
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 @@
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 @@
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 07c0674..b173c85 100644
--- a/libs/ui/GraphicBufferMapper.cpp
+++ b/libs/ui/GraphicBufferMapper.cpp
@@ -38,7 +38,7 @@
{
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 @@
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 @@
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 @@
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 @@
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 267a9f7..263c8d9 100644
--- a/libs/ui/Input.cpp
+++ b/libs/ui/Input.cpp
@@ -345,7 +345,7 @@
#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 00716d7..09cbb31 100644
--- a/libs/ui/InputTransport.cpp
+++ b/libs/ui/InputTransport.cpp
@@ -88,12 +88,12 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
#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 @@
#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 @@
#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 @@
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 @@
} 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 @@
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 @@
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 @@
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 @@
// 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 @@
}
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 @@
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 e1d5e8b..485234c 100644
--- a/libs/ui/KeyCharacterMap.cpp
+++ b/libs/ui/KeyCharacterMap.cpp
@@ -95,11 +95,11 @@
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 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 @@
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 @@
}
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::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 @@
} 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 @@
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 @@
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 @@
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 @@
}
}
- LOGE("%s: Expected ',' or ':' after property name.",
+ ALOGE("%s: Expected ',' or ':' after property name.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
@@ -634,12 +634,12 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 7ba654a57..44a9420 100644
--- a/libs/ui/KeyLayoutMap.cpp
+++ b/libs/ui/KeyLayoutMap.cpp
@@ -53,11 +53,11 @@
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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 10bb39c..e4611f7 100644
--- a/libs/ui/Keyboard.cpp
+++ b/libs/ui/Keyboard.cpp
@@ -50,7 +50,7 @@
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 @@
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 @@
}
// 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 d9ad863..8cd047a 100644
--- a/libs/ui/Region.cpp
+++ b/libs/ui/Region.cpp
@@ -69,7 +69,7 @@
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 @@
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 @@
}
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 @@
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 90c092d..62d5b59 100644
--- a/libs/ui/VirtualKeyMap.cpp
+++ b/libs/ui/VirtualKeyMap.cpp
@@ -51,11 +51,11 @@
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 @@
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 @@
&& 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 @@
} 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 @@
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 7c34c6a..50e701a 100644
--- a/libs/utils/Asset.cpp
+++ b/libs/utils/Asset.cpp
@@ -89,7 +89,7 @@
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 @@
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 @@
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 @@
/* 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 @@
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 @@
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 @@
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 @@
*/
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 e7c4d47..47a2b99 100644
--- a/libs/utils/AssetManager.cpp
+++ b/libs/utils/AssetManager.cpp
@@ -117,14 +117,14 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
}
}
- 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 @@
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 @@
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 @@
}
if (pAsset == NULL) {
/* unexpected */
- LOGW("create from segment failed\n");
+ ALOGW("create from segment failed\n");
}
return pAsset;
@@ -1427,7 +1427,7 @@
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 @@
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 @@
: 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 @@
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 5afe2dc0..f956306 100644
--- a/libs/utils/BackupData.cpp
+++ b/libs/utils/BackupData.cpp
@@ -78,7 +78,7 @@
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 @@
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 @@
}
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 aee7ff0..f77a891 100644
--- a/libs/utils/BackupHelpers.cpp
+++ b/libs/utils/BackupHelpers.cpp
@@ -100,7 +100,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
}
}
- 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 @@
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 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 @@
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 @@
} 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 @@
// [ 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 4970828..e52cf2f 100644
--- a/libs/utils/BlobCache.cpp
+++ b/libs/utils/BlobCache.cpp
@@ -69,11 +69,11 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 b2a61f1..9ce370e 100644
--- a/libs/utils/FileMap.cpp
+++ b/libs/utils/FileMap.cpp
@@ -108,7 +108,7 @@
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 @@
(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 @@
#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 @@
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 @@
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 1bc92cf..d1aa664 100644
--- a/libs/utils/Looper.cpp
+++ b/libs/utils/Looper.cpp
@@ -163,7 +163,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 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 2907b56..ddf5991 100644
--- a/libs/utils/ObbFile.cpp
+++ b/libs/utils/ObbFile.cpp
@@ -90,14 +90,14 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 99603ab..5520702 100644
--- a/libs/utils/PropertyMap.cpp
+++ b/libs/utils/PropertyMap.cpp
@@ -84,7 +84,7 @@
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 @@
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 @@
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 @@
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 @@
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 0b7dd92..ad0939e 100644
--- a/libs/utils/RefBase.cpp
+++ b/libs/utils/RefBase.cpp
@@ -98,7 +98,7 @@
#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 @@
#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 @@
}
}
if (dumpStack) {
- LOGE("above errors at:");
+ ALOGE("above errors at:");
CallStack stack;
stack.update();
stack.dump();
@@ -205,7 +205,7 @@
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 @@
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 559afd8..15b83bb 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -107,20 +107,20 @@
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 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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
} 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 @@
// 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 @@
((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 @@
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 @@
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 @@
};
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
: 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 @@
: 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 @@
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 @@
}
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 @@
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 @@
<= (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 @@
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 @@
}
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 @@
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 @@
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::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 @@
}
}
- //LOGI("Final theme:");
+ //ALOGI("Final theme:");
//dumpToLog();
return NO_ERROR;
@@ -1712,7 +1712,7 @@
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 @@
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 @@
{
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 @@
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 @@
{
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 @@
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 @@
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 @@
}
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 @@
}
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 @@
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 @@
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 @@
// 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 @@
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 @@
// 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 @@
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 @@
<< 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 @@
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 @@
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 @@
*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 @@
}
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 @@
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 @@
&& 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 @@
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 @@
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 @@
}
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 @@
<< ", 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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
(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 @@
}
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 @@
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 @@
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 @@
| (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 ceca435..bfcb2da 100644
--- a/libs/utils/Static.cpp
+++ b/libs/utils/Static.cpp
@@ -57,8 +57,8 @@
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 59a46f9..8512170a 100644
--- a/libs/utils/StreamingZipInflater.cpp
+++ b/libs/utils/StreamingZipInflater.cpp
@@ -138,7 +138,7 @@
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 @@
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 @@
//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 89a052f..8b8ac10 100644
--- a/libs/utils/SystemClock.cpp
+++ b/libs/utils/SystemClock.cpp
@@ -69,20 +69,20 @@
#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 fe4b8e6..e343c62 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -163,7 +163,7 @@
(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 @@
{
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 @@
{
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 68752b4..efda2bf 100644
--- a/libs/utils/Tokenizer.cpp
+++ b/libs/utils/Tokenizer.cpp
@@ -55,12 +55,12 @@
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 @@
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 3069352..1498aac 100644
--- a/libs/utils/ZipFileRO.cpp
+++ b/libs/utils/ZipFileRO.cpp
@@ -120,7 +120,7 @@
{
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 @@
*/
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 @@
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 @@
* 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 @@
{
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 @@
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 @@
// 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 @@
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 @@
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 @@
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::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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
*/
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 @@
/* 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 @@
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 @@
*/
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 @@
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 @@
/* 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 cc5c68a..2dbdc1d 100644
--- a/libs/utils/ZipUtils.cpp
+++ b/libs/utils/ZipUtils.cpp
@@ -77,10 +77,10 @@
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 @@
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 @@
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 @@
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 386986e..55074aa 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -396,6 +396,7 @@
setDefaultRingtoneFileNames();
mExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
+ //mClient.testGenreNameConverter();
}
private void setDefaultRingtoneFileNames() {
@@ -623,9 +624,37 @@
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 @@
}
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 @@
} 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 b320515..8eb9332 100644
--- a/media/java/android/media/ThumbnailUtils.java
+++ b/media/java/android/media/ThumbnailUtils.java
@@ -104,8 +104,10 @@
}
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 @@
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 f749d51..0dc3b65 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -153,13 +153,13 @@
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 @@
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 @@
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 @@
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 0272a03..39fd9a9 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -80,7 +80,7 @@
// 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 @@
}
int w;
if (0 != mp->getVideoWidth(&w)) {
- LOGE("getVideoWidth failed");
+ ALOGE("getVideoWidth failed");
w = 0;
}
ALOGV("getVideoWidth: %d", w);
@@ -422,7 +422,7 @@
}
int h;
if (0 != mp->getVideoHeight(&h)) {
- LOGE("getVideoHeight failed");
+ ALOGE("getVideoHeight failed");
h = 0;
}
ALOGV("getVideoHeight: %d", h);
@@ -659,7 +659,7 @@
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 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 31ef046..acc65f1 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -77,7 +77,7 @@
// 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 @@
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 @@
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 @@
// 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 67c85cc..5d27966 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -48,7 +48,7 @@
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 @@
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 @@
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 @@
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 27e46a4..47963b1 100644
--- a/media/jni/android_media_Utils.cpp
+++ b/media/jni/android_media_Utils.cpp
@@ -39,7 +39,7 @@
}
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 4dbcb90..99e543b 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -174,7 +174,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 c71410b..113784e 100644
--- a/media/jni/android_mtp_MtpDevice.cpp
+++ b/media/jni/android_mtp_MtpDevice.cpp
@@ -92,7 +92,7 @@
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 @@
}
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 @@
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 @@
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 @@
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 107db08..5252a3a 100644
--- a/media/jni/android_mtp_MtpServer.cpp
+++ b/media/jni/android_mtp_MtpServer.cpp
@@ -65,7 +65,7 @@
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 @@
if (server)
server->run();
else
- LOGE("server is null in run");
+ ALOGE("server is null in run");
}
static void
@@ -89,7 +89,7 @@
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 @@
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 @@
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 @@
}
}
} else {
- LOGE("server is null in add_storage");
+ ALOGE("server is null in add_storage");
}
}
@@ -162,7 +162,7 @@
delete storage;
}
} else
- LOGE("server is null in remove_storage");
+ ALOGE("server is null in remove_storage");
}
// ----------------------------------------------------------------------------
@@ -187,48 +187,48 @@
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 d517a58..3b325b7 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -112,14 +112,14 @@
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 @@
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 @@
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 @@
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 @@
ALOGV("EVENT_PARAMETER_CHANGED");
break;
case AudioEffect::EVENT_ERROR:
- LOGW("EVENT_ERROR");
+ ALOGW("EVENT_ERROR");
break;
}
@@ -195,7 +195,7 @@
// 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 @@
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 @@
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 @@
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 @@
"<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 @@
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 @@
&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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
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 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 b64505c..ecd4d07 100644
--- a/media/jni/audioeffect/android_media_Visualizer.cpp
+++ b/media/jni/audioeffect/android_media_Visualizer.cpp
@@ -113,7 +113,7 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
&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 @@
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 c13f6ff..479d8b6 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 7083a91c..c84a883 100755
--- a/media/jni/mediaeditor/VideoEditorMain.cpp
+++ b/media/jni/mediaeditor/VideoEditorMain.cpp
@@ -441,7 +441,7 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 40db37f..14a5309 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -52,7 +52,7 @@
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 @@
// 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 @@
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 @@
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 bbb56ff..ba3b482 100644
--- a/media/jni/soundpool/SoundPoolThread.cpp
+++ b/media/jni/soundpool/SoundPoolThread.cpp
@@ -91,7 +91,7 @@
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 f86892f..fe1c20a 100644
--- a/media/jni/soundpool/android_media_SoundPool.cpp
+++ b/media/jni/soundpool/android_media_SoundPool.cpp
@@ -288,27 +288,27 @@
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 ee2279a..9f6599f 100644
--- a/media/libeffects/factory/EffectsFactory.c
+++ b/media/libeffects/factory/EffectsFactory.c
@@ -279,7 +279,7 @@
ret = init();
if (ret < 0) {
- LOGW("EffectCreate() init error: %d", ret);
+ ALOGW("EffectCreate() init error: %d", ret);
return ret;
}
@@ -293,7 +293,7 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
#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 c99552b..e988e06 100755
--- a/media/libeffects/preprocessing/PreProcessing.cpp
+++ b/media/libeffects/preprocessing/PreProcessing.cpp
@@ -240,7 +240,7 @@
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 @@
break;
default:
- LOGW("AgcGetParameter() unknown param %08x", param);
+ ALOGW("AgcGetParameter() unknown param %08x", param);
status = -EINVAL;
break;
}
@@ -305,7 +305,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 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 @@
}
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 52fbf79..5241660 100644
--- a/media/libeffects/testlibs/EffectEqualizer.cpp
+++ b/media/libeffects/testlibs/EffectEqualizer.cpp
@@ -165,7 +165,7 @@
ret = Equalizer_init(pContext);
if (ret < 0) {
- LOGW("EffectLibCreateEffect() init failed");
+ ALOGW("EffectLibCreateEffect() init failed");
delete pContext;
return ret;
}
@@ -735,7 +735,7 @@
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 419a41c..ebb72c1 100644
--- a/media/libeffects/testlibs/EffectReverb.c
+++ b/media/libeffects/testlibs/EffectReverb.c
@@ -154,7 +154,7 @@
}
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 @@
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 b2a7a35..5d70a9b 100644
--- a/media/libeffects/visualizer/EffectVisualizer.cpp
+++ b/media/libeffects/visualizer/EffectVisualizer.cpp
@@ -212,7 +212,7 @@
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 @@
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 6e53a15..6639d06 100644
--- a/media/libmedia/AudioEffect.cpp
+++ b/media/libmedia/AudioEffect.cpp
@@ -101,18 +101,18 @@
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 @@
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 @@
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 @@
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 dd1c6a5..2674070 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -54,12 +54,12 @@
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 @@
}
// validate parameters
if (!audio_is_valid_format(format)) {
- LOGE("Invalid format");
+ ALOGE("Invalid format");
return BAD_VALUE;
}
@@ -177,7 +177,7 @@
(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 @@
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);
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 @@
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 @@
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 @@
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 @@
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 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 @@
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 @@
}
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 61d0dad..f7f129c 100644
--- a/media/libmedia/AudioSystem.cpp
+++ b/media/libmedia/AudioSystem.cpp
@@ -56,7 +56,7 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
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 @@
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 97fb955..191fbaf 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -158,7 +158,7 @@
AutoMutex lock(mLock);
if (mAudioTrack != 0) {
- LOGE("Track already in use");
+ ALOGE("Track already in use");
return INVALID_OPERATION;
}
@@ -188,7 +188,7 @@
// validate parameters
if (!audio_is_valid_format(format)) {
- LOGE("Invalid format");
+ ALOGE("Invalid format");
return BAD_VALUE;
}
@@ -198,7 +198,7 @@
}
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 @@
(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 @@
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;
}
}
@@ -324,7 +324,7 @@
if (t != 0) {
if (t->exitPending()) {
if (t->requestExitAndWait() == WOULD_BLOCK) {
- LOGE("AudioTrack::start called from thread");
+ ALOGE("AudioTrack::start called from thread");
return;
}
}
@@ -567,12 +567,12 @@
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;
}
@@ -728,7 +728,7 @@
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;
}
@@ -771,7 +771,7 @@
}
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;
@@ -781,7 +781,7 @@
// 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);
@@ -801,12 +801,12 @@
&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;
@@ -885,7 +885,7 @@
// 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();
@@ -897,7 +897,7 @@
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;
}
@@ -920,7 +920,7 @@
// 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();
}
@@ -966,7 +966,7 @@
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;
}
@@ -1099,7 +1099,7 @@
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;
@@ -1167,7 +1167,7 @@
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
@@ -1223,7 +1223,7 @@
}
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;
@@ -1231,7 +1231,7 @@
}
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
@@ -1239,7 +1239,7 @@
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) {
@@ -1248,7 +1248,7 @@
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();
}
@@ -1262,7 +1262,7 @@
}
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;
}
@@ -1331,7 +1331,7 @@
bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
}
} else if (u > server) {
- LOGW("stepServer occurred after track reset");
+ ALOGW("stepServer occurred after track reset");
u = server;
}
@@ -1352,7 +1352,7 @@
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;
}
@@ -1370,13 +1370,13 @@
// 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;
@@ -1431,7 +1431,7 @@
} 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 bedf8d3..abd491f 100644
--- a/media/libmedia/IAudioFlinger.cpp
+++ b/media/libmedia/IAudioFlinger.cpp
@@ -112,7 +112,7 @@
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 @@
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 @@
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 ba0d55b..8c7a960 100644
--- a/media/libmedia/IAudioRecord.cpp
+++ b/media/libmedia/IAudioRecord.cpp
@@ -50,7 +50,7 @@
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 bc8ff34..0b372f3 100644
--- a/media/libmedia/IAudioTrack.cpp
+++ b/media/libmedia/IAudioTrack.cpp
@@ -54,7 +54,7 @@
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 @@
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 da33edb..8525482 100644
--- a/media/libmedia/IMediaDeathNotifier.cpp
+++ b/media/libmedia/IMediaDeathNotifier.cpp
@@ -44,7 +44,7 @@
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 @@
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 @@
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 7d2fbce..d2f5f71 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -407,7 +407,7 @@
#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 afa84b7..188e582 100644
--- a/media/libmedia/JetPlayer.cpp
+++ b/media/libmedia/JetPlayer.cpp
@@ -68,21 +68,21 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
//-------------------------------------------------------------------------------------------------
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 @@
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 109f294..c905762 100644
--- a/media/libmedia/MediaProfiles.cpp
+++ b/media/libmedia/MediaProfiles.cpp
@@ -620,7 +620,7 @@
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 @@
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 @@
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 @@
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 @@
}
}
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 @@
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 @@
}
}
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 @@
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 @@
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 @@
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 @@
}
}
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 @@
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 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 @@
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 cda185f..79cab74 100644
--- a/media/libmedia/MediaScanner.cpp
+++ b/media/libmedia/MediaScanner.cpp
@@ -153,7 +153,7 @@
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 629b165..40b8188 100644
--- a/media/libmedia/MediaScannerClient.cpp
+++ b/media/libmedia/MediaScannerClient.cpp
@@ -142,12 +142,12 @@
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 @@
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 8eeebbb..546a9b0 100644
--- a/media/libmedia/Metadata.cpp
+++ b/media/libmedia/Metadata.cpp
@@ -135,7 +135,7 @@
{
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 @@
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 28b54b5..35dfbb8 100644
--- a/media/libmedia/ToneGenerator.cpp
+++ b/media/libmedia/ToneGenerator.cpp
@@ -805,7 +805,7 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
// 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 @@
mThreadCanCallJava);
if (mpAudioTrack->initCheck() != NO_ERROR) {
- LOGE("AudioTrack->initCheck failed");
+ ALOGE("AudioTrack->initCheck failed");
goto initAudioTrack_exit;
}
@@ -1261,7 +1261,7 @@
// 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 de40f98..d08ffa5 100644
--- a/media/libmedia/Visualizer.cpp
+++ b/media/libmedia/Visualizer.cpp
@@ -61,7 +61,7 @@
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 @@
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 fd8c065..88e269f 100644
--- a/media/libmedia/mediametadataretriever.cpp
+++ b/media/libmedia/mediametadataretriever.cpp
@@ -43,7 +43,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 695c4a8..2284927 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -115,7 +115,7 @@
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 @@
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 @@
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 @@
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 @@
}
return ret;
}
- LOGE("start called in state %d", mCurrentState);
+ ALOGE("start called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -317,7 +317,7 @@
}
return ret;
}
- LOGE("stop called in state %d", mCurrentState);
+ ALOGE("stop called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -336,7 +336,7 @@
}
return ret;
}
- LOGE("pause called in state %d", mCurrentState);
+ ALOGE("pause called in state %d", mCurrentState);
return INVALID_OPERATION;
}
@@ -348,7 +348,7 @@
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 @@
*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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 ec62978..8d947d8 100644
--- a/media/libmedia/mediarecorder.cpp
+++ b/media/libmedia/mediarecorder.cpp
@@ -33,11 +33,11 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
}
}
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 @@
{
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 @@
}
}
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
// 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 @@
{
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 @@
mSurfaceMediaSource =
mMediaRecorder->querySurfaceMediaSource();
if (mSurfaceMediaSource == NULL) {
- LOGE("SurfaceMediaSource could not be initialized!");
+ ALOGE("SurfaceMediaSource could not be initialized!");
}
return mSurfaceMediaSource;
}
@@ -369,21 +369,21 @@
{
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::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 @@
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
break;
default: {
- LOGE("Unexpected non-existing state: %d", mCurrentState);
+ ALOGE("Unexpected non-existing state: %d", mCurrentState);
break;
}
}
@@ -567,12 +567,12 @@
{
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 @@
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 487c433..f5cb019 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -112,14 +112,14 @@
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 @@
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 @@
if (NULL == data)
{
- LOGE("Filter had no data");
+ ALOGE("Filter had no data");
*status = BAD_VALUE;
return false;
}
@@ -184,7 +184,7 @@
#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 @@
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 @@
}
}
if (p == NULL) {
- LOGE("Failed to create player object");
+ ALOGE("Failed to create player object");
}
return p;
}
@@ -688,7 +688,7 @@
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 @@
if (mStatus == NO_ERROR) {
mPlayer = p;
} else {
- LOGE(" error: %d", mStatus);
+ ALOGE(" error: %d", mStatus);
}
return mStatus;
}
@@ -725,7 +725,7 @@
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 @@
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 @@
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 @@
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 @@
if (status != OK) {
metadata.resetParcel();
- LOGE("getMetadata failed %d", status);
+ ALOGE("getMetadata failed %d", status);
return status;
}
@@ -975,7 +975,7 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
} 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 @@
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 @@
}
} 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 ca92c77..d219fc2 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -54,7 +54,7 @@
#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 @@
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 @@
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 @@
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 @@
}
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 f945c6a3..7dbb57f 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
@@ -98,11 +98,11 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 4946956..7cb8c29 100644
--- a/media/libmediaplayerservice/MidiFile.cpp
+++ b/media/libmediaplayerservice/MidiFile.cpp
@@ -69,13 +69,13 @@
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 @@
}
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 @@
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 @@
}
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 @@
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 @@
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 @@
{
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::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 @@
// 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 @@
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 @@
// 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 @@
}
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 bb65ed4..465209f 100644
--- a/media/libmediaplayerservice/MidiMetadataRetriever.cpp
+++ b/media/libmediaplayerservice/MidiMetadataRetriever.cpp
@@ -63,7 +63,7 @@
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 @@
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 @@
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 c0ba091..4632016 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -97,7 +97,7 @@
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 @@
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 @@
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 @@
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 @@
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::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 @@
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 @@
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::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 @@
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 @@
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::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::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::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::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 @@
// 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 @@
// 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 @@
// 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::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 @@
// 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 @@
// 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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
break;
default:
- LOGE("Unsupported output file format: %d", mOutputFormat);
+ ALOGE("Unsupported output file format: %d", mOutputFormat);
status = UNKNOWN_ERROR;
break;
}
@@ -801,7 +801,7 @@
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 @@
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 @@
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::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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
break;
default:
- LOGE("Unsupported audio encoder: %d", mAudioEncoder);
+ ALOGE("Unsupported audio encoder: %d", mAudioEncoder);
return UNKNOWN_ERROR;
}
@@ -1667,7 +1667,7 @@
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 169e49a..0f0ff65 100644
--- a/media/libmediaplayerservice/TestPlayerStub.cpp
+++ b/media/libmediaplayerservice/TestPlayerStub.cpp
@@ -134,7 +134,7 @@
// 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 @@
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 @@
"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 079f6fa..22b8847 100644
--- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
@@ -111,9 +111,9 @@
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 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 03aa42e..b731d0f 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -383,7 +383,7 @@
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 @@
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 @@
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 @@
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::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 3539e3f..15259cb 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -228,7 +228,7 @@
#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 @@
+ 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 6d28298..6eb0d07 100644
--- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
@@ -226,7 +226,7 @@
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 2e63b3b..7c9bc5e 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
@@ -58,7 +58,7 @@
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 @@
&& 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 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 03fb33b..1673ccd 100644
--- a/media/libstagefright/AACWriter.cpp
+++ b/media/libstagefright/AACWriter.cpp
@@ -84,7 +84,7 @@
}
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 @@
}
}
- 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 ebf5fab..ca44ea3 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -394,7 +394,7 @@
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 @@
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 @@
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 @@
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 @@
&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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
&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 @@
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 @@
}
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 @@
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 @@
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 7eca5e4..5a28347 100644
--- a/media/libstagefright/AMRExtractor.cpp
+++ b/media/libstagefright/AMRExtractor.cpp
@@ -85,7 +85,7 @@
};
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 @@
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 142fa5b..a3187b7 100644
--- a/media/libstagefright/AVIExtractor.cpp
+++ b/media/libstagefright/AVIExtractor.cpp
@@ -625,7 +625,7 @@
}
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 @@
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 @@
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 3fae957..2172cc0 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -37,7 +37,7 @@
break;
}
case AudioRecord::EVENT_OVERRUN: {
- LOGW("AudioRecord reported overrun!");
+ ALOGW("AudioRecord reported overrun!");
break;
}
default:
@@ -259,7 +259,7 @@
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 @@
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 6fb16f5..7a2d7b3 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -132,7 +132,7 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 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 @@
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 @@
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 @@
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 @@
&& 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 @@
if (err != OK) {
mConnectingDataSource.clear();
- LOGI("mConnectingDataSource->connect() returned %d", err);
+ ALOGI("mConnectingDataSource->connect() returned %d", err);
return err;
}
@@ -2073,7 +2073,7 @@
}
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 @@
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 080faa6..1850c9c 100755
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -111,7 +111,7 @@
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 @@
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 @@
(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 @@
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 @@
// 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 @@
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 @@
// 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 @@
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 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 @@
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 @@
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 @@
}
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 @@
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::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 22c3182..263ab50 100644
--- a/media/libstagefright/CameraSourceTimeLapse.cpp
+++ b/media/libstagefright/CameraSourceTimeLapse.cpp
@@ -140,7 +140,7 @@
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 @@
// 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 1f3d581..9452ab1 100644
--- a/media/libstagefright/DRMExtractor.cpp
+++ b/media/libstagefright/DRMExtractor.cpp
@@ -286,7 +286,7 @@
*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 1b225fa..4a0c35c 100644
--- a/media/libstagefright/ESDS.cpp
+++ b/media/libstagefright/ESDS.cpp
@@ -162,7 +162,7 @@
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 a0c08e2..668d7f7 100644
--- a/media/libstagefright/FLACExtractor.cpp
+++ b/media/libstagefright/FLACExtractor.cpp
@@ -327,7 +327,7 @@
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 @@
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 @@
}
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
(getTotalSamples() * 1000000LL) / getSampleRate());
}
} else {
- LOGE("missing STREAMINFO");
+ ALOGE("missing STREAMINFO");
return NO_INIT;
}
if (mFileMetadata != 0) {
@@ -603,13 +603,13 @@
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 @@
// 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 0794f57..73cb48c 100644
--- a/media/libstagefright/FileSource.cpp
+++ b/media/libstagefright/FileSource.cpp
@@ -101,7 +101,7 @@
} 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 3c5a8a5..d7eea3f 100644
--- a/media/libstagefright/HTTPBase.cpp
+++ b/media/libstagefright/HTTPBase.cpp
@@ -111,11 +111,11 @@
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 @@
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::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 ab1dc5c..2215c07 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -431,7 +431,7 @@
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 @@
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 0a69df4..bc88015 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -1250,7 +1250,7 @@
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 @@
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 @@
} 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 @@
// 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 @@
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 @@
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 @@
}
if (isMalFormed) {
- LOGE("Video is malformed");
+ ALOGE("Video is malformed");
mBuffer->release();
mBuffer = NULL;
return ERROR_MALFORMED;
@@ -2422,7 +2422,7 @@
}
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 a368e0a..06dd875 100755
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -327,7 +327,7 @@
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 @@
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 @@
// 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 @@
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 @@
}
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 @@
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 @@
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::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 *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 @@
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 @@
// 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 @@
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 @@
nextStartCode = parseParamSet(tmp + 4, bytesLeft - 4, type, ¶mSetLen);
} 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 @@
}
nextStartCode = parseParamSet(tmp + 4, bytesLeft - 4, type, ¶mSetLen);
} 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 @@
// 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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
!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 @@
} 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 @@
} 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 0b14f1e..96271e4 100644
--- a/media/libstagefright/MediaBuffer.cpp
+++ b/media/libstagefright/MediaBuffer.cpp
@@ -135,7 +135,7 @@
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 20d0632..249c298 100644
--- a/media/libstagefright/NuCachedSource2.cpp
+++ b/media/libstagefright/NuCachedSource2.cpp
@@ -302,7 +302,7 @@
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 @@
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 @@
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 @@
if (mFetching || keepAlive) {
if (keepAlive) {
- LOGI("Keep alive");
+ ALOGI("Keep alive");
}
fetchInternal();
@@ -363,7 +363,7 @@
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 @@
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 @@
return OK;
}
- LOGI("new range: offset= %lld", offset);
+ ALOGI("new range: offset= %lld", offset);
mCacheOffset = offset;
@@ -634,7 +634,7 @@
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 @@
}
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 f9f92d2..60d9bb7 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -179,9 +179,9 @@
#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 @@
// 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 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 @@
// 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 @@
} 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 @@
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 @@
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 @@
} 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 @@
&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 @@
}
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 @@
&& 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 @@
}
if (err != OK) {
- LOGE("allocate_buffer_with_backup failed");
+ ALOGE("allocate_buffer_with_backup failed");
return err;
}
@@ -1849,7 +1849,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 5a68d79..73efc27 100644
--- a/media/libstagefright/OggExtractor.cpp
+++ b/media/libstagefright/OggExtractor.cpp
@@ -189,9 +189,9 @@
#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 @@
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 @@
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 7b8e008..81ec5c1 100644
--- a/media/libstagefright/SampleIterator.cpp
+++ b/media/libstagefright/SampleIterator.cpp
@@ -77,7 +77,7 @@
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 err;
if ((err = getChunkOffset(chunk, &mCurrentChunkOffset)) != OK) {
- LOGE("getChunkOffset return error");
+ ALOGE("getChunkOffset return error");
return err;
}
@@ -107,7 +107,7 @@
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 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 3e287fa..d9858d76 100644
--- a/media/libstagefright/SampleTable.cpp
+++ b/media/libstagefright/SampleTable.cpp
@@ -347,7 +347,7 @@
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 @@
}
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 4345184..bd7a226 100644
--- a/media/libstagefright/StagefrightMediaScanner.cpp
+++ b/media/libstagefright/StagefrightMediaScanner.cpp
@@ -57,7 +57,7 @@
// 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 2634da0..43bfd9e 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -127,7 +127,7 @@
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 @@
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 @@
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 @@
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 2f807d0..2233d1b 100644
--- a/media/libstagefright/SurfaceMediaSource.cpp
+++ b/media/libstagefright/SurfaceMediaSource.cpp
@@ -112,7 +112,7 @@
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 @@
// 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 @@
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 @@
// 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 @@
// 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 @@
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::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 @@
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 @@
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 @@
*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 @@
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 @@
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 43511ec..12c9c36 100644
--- a/media/libstagefright/TimedEventQueue.cpp
+++ b/media/libstagefright/TimedEventQueue.cpp
@@ -265,7 +265,7 @@
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 @@
}
}
- 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 ecff538..6ac5a83 100644
--- a/media/libstagefright/VBRISeeker.cpp
+++ b/media/libstagefright/VBRISeeker.cpp
@@ -120,7 +120,7 @@
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 26eda0c..2092cb6 100644
--- a/media/libstagefright/WVMExtractor.cpp
+++ b/media/libstagefright/WVMExtractor.cpp
@@ -53,7 +53,7 @@
}
if (gVendorLibHandle == NULL) {
- LOGE("Failed to open libwvm.so");
+ ALOGE("Failed to open libwvm.so");
return;
}
}
@@ -67,7 +67,7 @@
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 1ed9e577..65c1848 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -290,7 +290,7 @@
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 @@
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 c408b2c..da9d280 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp
+++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp
@@ -116,7 +116,7 @@
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 @@
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 @@
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 @@
// 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 @@
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 2b15b75..2b8633d 100644
--- a/media/libstagefright/codecs/aacenc/AACEncoder.cpp
+++ b/media/libstagefright/codecs/aacenc/AACEncoder.cpp
@@ -53,7 +53,7 @@
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 @@
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 @@
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, ¶ms)) {
- LOGE("Failed to set AAC encoder parameters");
+ ALOGE("Failed to set AAC encoder parameters");
return UNKNOWN_ERROR;
}
@@ -106,7 +106,7 @@
}
}
- 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 @@
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 @@
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 err = mSource->start(params);
if (err != OK) {
- LOGE("AudioSource is not available");
+ ALOGE("AudioSource is not available");
return err;
}
@@ -177,7 +177,7 @@
}
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 c0a588f..7602f2d 100644
--- a/media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp
+++ b/media/libstagefright/codecs/amrnb/dec/SoftAMR.cpp
@@ -304,7 +304,7 @@
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 d361ef4..3afbc4f 100644
--- a/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
+++ b/media/libstagefright/codecs/amrnb/enc/AMRNBEncoder.cpp
@@ -71,7 +71,7 @@
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 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::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 5eacc16..60b1163 100644
--- a/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
+++ b/media/libstagefright/codecs/amrwbenc/AMRWBEncoder.cpp
@@ -80,7 +80,7 @@
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 @@
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 @@
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 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::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 18c5550..e202a2b 100644
--- a/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
+++ b/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
@@ -41,7 +41,7 @@
*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 @@
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 @@
mInputFrameData(NULL),
mGroup(NULL) {
- LOGI("Construct software AVCEncoder");
+ ALOGI("Construct software AVCEncoder");
mHandle = new tagAVCHandle;
memset(mHandle, 0, sizeof(tagAVCHandle));
@@ -214,7 +214,7 @@
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 @@
// 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 @@
}
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::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 @@
*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 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 15e2c26..32ef003 100644
--- a/media/libstagefright/codecs/g711/dec/SoftG711.cpp
+++ b/media/libstagefright/codecs/g711/dec/SoftG711.cpp
@@ -210,7 +210,7 @@
}
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 bedfc58..a34a0ca 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -207,7 +207,7 @@
(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 @@
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 @@
mHandle, &bitstream, ×tamp, &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 2e3d12d..d538603 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp
+++ b/media/libstagefright/codecs/m4v_h263/enc/M4vH263Encoder.cpp
@@ -43,16 +43,16 @@
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 @@
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 @@
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 @@
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 @@
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 @@
mInputFrameData(NULL),
mGroup(NULL) {
- LOGI("Construct software M4vH263Encoder");
+ ALOGI("Construct software M4vH263Encoder");
mHandle = new tagvideoEncControls;
memset(mHandle, 0, sizeof(tagvideoEncControls));
@@ -207,7 +207,7 @@
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 @@
// 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 @@
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 @@
}
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::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 @@
// 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 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 @@
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 43fb30a..ad55295 100644
--- a/media/libstagefright/codecs/mp3dec/SoftMP3.cpp
+++ b/media/libstagefright/codecs/mp3dec/SoftMP3.cpp
@@ -223,10 +223,10 @@
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 c5fe199..bf9ab3a 100644
--- a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
+++ b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
@@ -138,7 +138,7 @@
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 @@
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 dede3ac..6c3f834 100644
--- a/media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp
+++ b/media/libstagefright/codecs/on2/h264dec/SoftAVC.cpp
@@ -204,7 +204,7 @@
(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 @@
}
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 47dbd5c..ac88107 100644
--- a/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp
+++ b/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp
@@ -353,14 +353,14 @@
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 3246021..e892f92 100644
--- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp
+++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
@@ -135,7 +135,7 @@
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 @@
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 3b3f786..40c5a3c 100644
--- a/media/libstagefright/foundation/AHierarchicalStateMachine.cpp
+++ b/media/libstagefright/foundation/AHierarchicalStateMachine.cpp
@@ -63,7 +63,7 @@
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 e399f2f..dff931d 100644
--- a/media/libstagefright/foundation/ALooperRoster.cpp
+++ b/media/libstagefright/foundation/ALooperRoster.cpp
@@ -82,7 +82,7 @@
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 @@
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 @@
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 @@
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 f039bc1..0a6776e 100644
--- a/media/libstagefright/foundation/AMessage.cpp
+++ b/media/libstagefright/foundation/AMessage.cpp
@@ -471,7 +471,7 @@
default:
{
- LOGE("This type of object cannot cross process boundaries.");
+ ALOGE("This type of object cannot cross process boundaries.");
TRESPASS();
}
}
@@ -535,7 +535,7 @@
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 9f6bf9e..16c1ca5 100644
--- a/media/libstagefright/foundation/hexdump.cpp
+++ b/media/libstagefright/foundation/hexdump.cpp
@@ -67,7 +67,7 @@
}
}
- 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 5f5c6d4..7560642 100644
--- a/media/libstagefright/httplive/LiveDataSource.cpp
+++ b/media/libstagefright/httplive/LiveDataSource.cpp
@@ -59,7 +59,7 @@
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_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 6f4b875..0cddd2e7 100644
--- a/media/libstagefright/httplive/LiveSession.cpp
+++ b/media/libstagefright/httplive/LiveSession.cpp
@@ -168,9 +168,9 @@
}
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 @@
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::onDisconnect() {
- LOGI("onDisconnect");
+ ALOGI("onDisconnect");
mDataSource->queueEOS(ERROR_END_OF_STREAM);
@@ -360,7 +360,7 @@
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 @@
// 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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
return;
}
- LOGI("Retrying with a different bandwidth stream.");
+ ALOGI("Retrying with a different bandwidth stream.");
mLastPlaylistFetchTimeUs = -1;
bandwidthIndex = getBandwidthIndex();
@@ -744,7 +744,7 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 a50970e..7d3cf05 100644
--- a/media/libstagefright/httplive/M3UParser.cpp
+++ b/media/libstagefright/httplive/M3UParser.cpp
@@ -169,7 +169,7 @@
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 @@
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 943a937..6dde9d8 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -129,7 +129,7 @@
}
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 474c794..4fbf47e 100644
--- a/media/libstagefright/matroska/MatroskaExtractor.cpp
+++ b/media/libstagefright/matroska/MatroskaExtractor.cpp
@@ -245,7 +245,7 @@
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 @@
#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 da911e4..3f4de1f 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -282,7 +282,7 @@
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 @@
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 @@
}
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 @@
// 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 @@
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 @@
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 @@
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 edb4232..7fd99a8 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -144,7 +144,7 @@
}
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 @@
}
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 @@
}
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 @@
}
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 @@
#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 @@
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 @@
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 @@
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 @@
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 df30a9c..dd714c9 100644
--- a/media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp
+++ b/media/libstagefright/mpeg2ts/MPEG2PSExtractor.cpp
@@ -315,7 +315,7 @@
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 @@
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 @@
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 @@
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 @@
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 17cf45a..03033f5 100644
--- a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
+++ b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
@@ -199,7 +199,7 @@
}
}
- 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 c8278ab..d698939 100644
--- a/media/libstagefright/omx/OMXMaster.cpp
+++ b/media/libstagefright/omx/OMXMaster.cpp
@@ -81,7 +81,7 @@
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 @@
}
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 802c429..8938e33 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -150,7 +150,7 @@
&& 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 @@
&& 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 @@
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 @@
&index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex failed");
+ ALOGE("OMX_GetExtensionIndex failed");
return StatusFromOMXError(err);
}
@@ -302,7 +302,7 @@
err = OMX_SetParameter(mHandle, index, ¶ms);
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 @@
&index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex failed");
+ ALOGE("OMX_GetExtensionIndex failed");
return StatusFromOMXError(err);
}
@@ -340,7 +340,7 @@
err = OMX_GetParameter(mHandle, index, ¶ms);
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 @@
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 @@
params.nPortIndex = portIndex;
params.bStoreMetaData = enable;
if ((err = OMX_SetParameter(mHandle, index, ¶ms)) != 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 @@
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 @@
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 @@
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 @@
&index);
if (err != OMX_ErrorNone) {
- LOGE("OMX_GetExtensionIndex failed");
+ ALOGE("OMX_GetExtensionIndex failed");
return StatusFromOMXError(err);
}
@@ -510,7 +510,7 @@
err = OMX_SetParameter(mHandle, index, ¶ms);
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 @@
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 @@
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::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 @@
}
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 8aeb763..da3ae42 100644
--- a/media/libstagefright/omx/SoftOMXPlugin.cpp
+++ b/media/libstagefright/omx/SoftOMXPlugin.cpp
@@ -72,7 +72,7 @@
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 d4354db..8faf544 100644
--- a/media/libstagefright/omx/tests/OMXHarness.cpp
+++ b/media/libstagefright/omx/tests/OMXHarness.cpp
@@ -174,7 +174,7 @@
#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 @@
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 @@
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 @@
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 @@
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::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 11d9c22..b0c7007 100644
--- a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp
+++ b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp
@@ -196,7 +196,7 @@
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 @@
// 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 @@
}
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 3f4cdb5..6cf1301 100644
--- a/media/libstagefright/rtsp/APacketSource.cpp
+++ b/media/libstagefright/rtsp/APacketSource.cpp
@@ -193,7 +193,7 @@
if (i == 0) {
FindAVCDimensions(nal, width, height);
- LOGI("dimensions %dx%d", *width, *height);
+ ALOGI("dimensions %dx%d", *width, *height);
}
}
@@ -371,7 +371,7 @@
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 c5d8740..8c9dd8d 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -294,7 +294,7 @@
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 @@
} 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 @@
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 @@
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 @@
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 c6bcb12..7a05b88 100644
--- a/media/libstagefright/rtsp/ARTPSession.cpp
+++ b/media/libstagefright/rtsp/ARTPSession.cpp
@@ -53,24 +53,24 @@
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 @@
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 @@
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 @@
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 dc5f17e..ed68790 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -147,7 +147,7 @@
}
if (it != mQueue.end() && (uint32_t)(*it)->int32Data() == seqNum) {
- LOGW("Discarding duplicate buffer");
+ ALOGW("Discarding duplicate buffer");
return false;
}
@@ -174,7 +174,7 @@
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::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 b602511..0d07043 100644
--- a/media/libstagefright/rtsp/ARTPWriter.cpp
+++ b/media/libstagefright/rtsp/ARTPWriter.cpp
@@ -269,7 +269,7 @@
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 @@
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 d8107bc..80a010e 100644
--- a/media/libstagefright/rtsp/ARTSPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTSPConnection.cpp
@@ -55,7 +55,7 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 56fdd9d..a9b3330 100644
--- a/media/libstagefright/rtsp/ASessionDescription.cpp
+++ b/media/libstagefright/rtsp/ASessionDescription.cpp
@@ -80,7 +80,7 @@
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 21ef298..2391c5c 100644
--- a/media/libstagefright/rtsp/MyHandler.h
+++ b/media/libstagefright/rtsp/MyHandler.h
@@ -155,7 +155,7 @@
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 @@
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 @@
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 @@
|| 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 @@
}
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 @@
(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 @@
(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 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 @@
} else {
mKeepAliveTimeoutUs = timeoutSecs * 1000000ll;
- LOGI("server specified timeout of %lu secs.",
+ ALOGI("server specified timeout of %lu secs.",
timeoutSecs);
}
}
@@ -625,7 +625,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
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 @@
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 @@
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 @@
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 576b3ca..47ea6f1 100644
--- a/media/libstagefright/rtsp/UDPPusher.cpp
+++ b/media/libstagefright/rtsp/UDPPusher.cpp
@@ -71,7 +71,7 @@
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 @@
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 @@
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 @@
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 f0cb5a5..d43cd2a 100644
--- a/media/libstagefright/rtsp/rtp_test.cpp
+++ b/media/libstagefright/rtsp/rtp_test.cpp
@@ -204,7 +204,7 @@
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 fbb606d..ac37b28 100644
--- a/media/libstagefright/tests/DummyRecorder.cpp
+++ b/media/libstagefright/tests/DummyRecorder.cpp
@@ -47,7 +47,7 @@
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 6be5e9a..76b507f 100644
--- a/media/libstagefright/tests/SurfaceMediaSource_test.cpp
+++ b/media/libstagefright/tests/SurfaceMediaSource_test.cpp
@@ -731,7 +731,7 @@
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 @@
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 @@
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 7c8a747..3014b0b 100644
--- a/media/libstagefright/timedtext/TimedTextPlayer.cpp
+++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp
@@ -91,7 +91,7 @@
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 b712062..0d67c96 100644
--- a/media/libstagefright/yuv/YUVImage.cpp
+++ b/media/libstagefright/yuv/YUVImage.cpp
@@ -54,7 +54,7 @@
// 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 @@
mVdata = mYdata + numberOfPixels;
mUdata = mVdata + 1;
} else {
- LOGE("Format not supported");
+ ALOGE("Format not supported");
return false;
}
return true;
@@ -98,7 +98,7 @@
*uOffset = 2*uvOffset;
*vOffset = 2*uvOffset;
} else {
- LOGE("Format not supported");
+ ALOGE("Format not supported");
return false;
}
@@ -122,7 +122,7 @@
*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 b5f85f9..21496a9 100644
--- a/media/mediaserver/main_mediaserver.cpp
+++ b/media/mediaserver/main_mediaserver.cpp
@@ -31,7 +31,7 @@
{
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 cfea7e8..930f0b0 100644
--- a/media/mtp/MtpDataPacket.cpp
+++ b/media/mtp/MtpDataPacket.cpp
@@ -418,7 +418,7 @@
// 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 b370225..bf7795c 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -53,7 +53,7 @@
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 @@
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 @@
}
}
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 @@
}
usb_device_close(device);
- LOGE("device not found");
+ ALOGE("device not found");
return NULL;
}
@@ -232,7 +232,7 @@
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 @@
}
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 @@
property->print();
delete property;
} else {
- LOGE("could not fetch property: %s",
+ ALOGE("could not fetch property: %s",
MtpDebug::getObjectPropCodeName(prop));
}
}
@@ -584,7 +584,7 @@
&& 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 @@
// 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 @@
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 @@
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 @@
// 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 @@
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 39815d4..dd07843 100644
--- a/media/mtp/MtpPacket.cpp
+++ b/media/mtp/MtpPacket.cpp
@@ -36,7 +36,7 @@
{
mBuffer = (uint8_t *)malloc(bufferSize);
if (!mBuffer) {
- LOGE("out of memory!");
+ ALOGE("out of memory!");
abort();
}
}
@@ -57,7 +57,7 @@
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 @@
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 @@
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 8016c35..64dd45b 100644
--- a/media/mtp/MtpProperty.cpp
+++ b/media/mtp/MtpProperty.cpp
@@ -91,7 +91,7 @@
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 @@
mStepSize.u.u64 = step;
break;
default:
- LOGE("unsupported type for MtpProperty::setRange");
+ ALOGE("unsupported type for MtpProperty::setRange");
break;
}
}
@@ -306,7 +306,7 @@
mEnumValues[i].u.u64 = value;
break;
default:
- LOGE("unsupported type for MtpProperty::setEnum");
+ ALOGE("unsupported type for MtpProperty::setEnum");
break;
}
}
@@ -320,18 +320,18 @@
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 @@
buffer += ", ";
print(mStepSize, buffer);
buffer += ")";
- LOGI("%s", (const char *)buffer);
+ ALOGI("%s", (const char *)buffer);
break;
case kFormEnum:
buffer = " Enum { ";
@@ -353,13 +353,13 @@
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 @@
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 @@
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 @@
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 838c13e..5606187 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -179,7 +179,7 @@
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 @@
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 @@
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 @@
return;
}
}
- LOGE("ObjectEdit not found in removeEditObject");
+ ALOGE("ObjectEdit not found in removeEditObject");
}
void MtpServer::commitEdit(ObjectEdit* edit) {
@@ -314,7 +314,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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::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 @@
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 @@
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 209e71c..42df66c 100644
--- a/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
+++ b/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
@@ -113,7 +113,7 @@
// mode == DecodePixels
if (!this->allocPixelRef(bm, NULL)) {
- LOGI("Cannot allocPixelRef()!");
+ ALOGI("Cannot allocPixelRef()!");
return false;
}
@@ -141,7 +141,7 @@
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 615493f..455e950 100644
--- a/native/android/looper.cpp
+++ b/native/android/looper.cpp
@@ -44,7 +44,7 @@
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_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 a4233e7..f2f36b62 100644
--- a/native/android/storage_manager.cpp
+++ b/native/android/storage_manager.cpp
@@ -87,13 +87,13 @@
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 @@
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 022de09..6a006aa 100644
--- a/opengl/libagl/TextureObjectManager.cpp
+++ b/opengl/libagl/TextureObjectManager.cpp
@@ -195,7 +195,7 @@
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 9ceb5e9..eb55bee 100644
--- a/opengl/libagl/egl.cpp
+++ b/opengl/libagl/egl.cpp
@@ -184,7 +184,7 @@
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 @@
// 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 @@
// 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 @@
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 ccd77b7..e142a58 100644
--- a/opengl/libagl/mipmap.cpp
+++ b/opengl/libagl/mipmap.cpp
@@ -174,7 +174,7 @@
}
}
} 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 561862b..2fc6125 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -278,7 +278,7 @@
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 @@
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 da1b397..e053589 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -141,7 +141,7 @@
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 @@
}
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 fb61397..664f258 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -352,7 +352,7 @@
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 @@
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 @@
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 @@
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 c4a7466..7fd6519 100644
--- a/opengl/libs/EGL/egl_cache.cpp
+++ b/opengl/libs/EGL/egl_cache.cpp
@@ -101,7 +101,7 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
// 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 @@
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 ad5bdfc..53eaf9a 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -201,7 +201,7 @@
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 @@
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 @@
// 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 20cdc7e..26e8c3e 100644
--- a/opengl/libs/EGL/egl_object.cpp
+++ b/opengl/libs/EGL/egl_object.cpp
@@ -45,7 +45,7 @@
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 df1b261..7106fa5 100644
--- a/opengl/libs/EGL/egl_object.h
+++ b/opengl/libs/EGL/egl_object.h
@@ -110,7 +110,7 @@
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 @@
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 6946ecd..41cfae1 100644
--- a/opengl/libs/EGL/egl_tls.cpp
+++ b/opengl/libs/EGL/egl_tls.cpp
@@ -73,7 +73,7 @@
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 e525d02..7bbaa18 100644
--- a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
+++ b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
@@ -100,7 +100,7 @@
case GL_UNSIGNED_BYTE:
break;
default:
- LOGE("GetBytesPerPixel: unknown type %x", type);
+ ALOGE("GetBytesPerPixel: unknown type %x", type);
}
switch (format) {
@@ -115,7 +115,7 @@
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 ee29f12..2d31a35 100644
--- a/opengl/libs/GLES_CM/gl.cpp
+++ b/opengl/libs/GLES_CM/gl.cpp
@@ -132,7 +132,7 @@
#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 0fe97ce..c237d75 100644
--- a/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
@@ -84,7 +84,7 @@
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 5a439e3..5220aa4 100644
--- a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
@@ -51,7 +51,7 @@
case GL_UNSIGNED_BYTE:
break;
default:
- LOGE("GetBytesPerPixel: unknown type %x", type);
+ ALOGE("GetBytesPerPixel: unknown type %x", type);
}
switch (format) {
@@ -66,7 +66,7 @@
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 @@
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 7758e48..ce3fae5 100644
--- a/opengl/libs/GLES_trace/src/gltrace_transport.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
@@ -31,7 +31,7 @@
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 @@
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 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 c2fabe6..fa6bd93 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 @@
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 @@
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 @@
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 ef66841..cf86020 100644
--- a/opengl/tests/gl_jni/jni/gl_code.cpp
+++ b/opengl/tests/gl_jni/jni/gl_code.cpp
@@ -18,7 +18,7 @@
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 a069f67..389381f 100644
--- a/opengl/tests/gl_perf/fill_common.cpp
+++ b/opengl/tests/gl_perf/fill_common.cpp
@@ -26,7 +26,7 @@
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 @@
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 @@
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 @@
} 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 f993371..2f04183 100644
--- a/opengl/tests/gl_perfapp/jni/gl_code.cpp
+++ b/opengl/tests/gl_perfapp/jni/gl_code.cpp
@@ -43,7 +43,7 @@
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 @@
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 @@
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 f1f0a1f..22867ed 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 @@
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 @@
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 @@
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 6579f95..7390bb7 100644
--- a/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
+++ b/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
@@ -39,7 +39,7 @@
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 2232995..c4a92f7 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 @@
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 @@
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 8255823..cc65651 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -105,14 +105,14 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 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 @@
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 @@
} 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 @@
lStatus = initCheck();
if (lStatus != NO_ERROR) {
- LOGE("Audio driver not initialized.");
+ ALOGE("Audio driver not initialized.");
goto Exit;
}
@@ -1534,7 +1534,7 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
mixerStatus = MIXER_TRACKS_ENABLED;
}
}
- mAudioMixer->disable();
+ mAudioMixer->disable(name);
}
}
@@ -3158,7 +3164,7 @@
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 @@
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 @@
// 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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
lStatus = initCheck();
if (lStatus != NO_ERROR) {
- LOGE("Audio driver not initialized.");
+ ALOGE("Audio driver not initialized.");
goto Exit;
}
@@ -4620,7 +4626,7 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
(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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
// 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 @@
}
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 @@
}
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 @@
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 7baa8fc..cf8d495 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -730,7 +730,7 @@
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 @@
status_t start();
status_t stop();
void setSuspended(bool suspended);
- bool suspended();
+ bool suspended() const;
sp<EffectHandle> controlHandle();
@@ -1138,7 +1138,7 @@
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 d994a87..36cdeb8 100644
--- a/services/audioflinger/AudioMixer.cpp
+++ b/services/audioflinger/AudioMixer.cpp
@@ -41,7 +41,7 @@
// ----------------------------------------------------------------------------
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);
@@ -140,120 +140,120 @@
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;
@@ -269,11 +269,11 @@
track.prevAuxLevel = valueInt << 16;
}
}
- invalidateState(1<<mActiveTrack);
+ invalidateState(1 << name);
}
- } break;
+ break;
default:
- // bad name
+ // bad param
assert(false);
}
break;
@@ -348,9 +348,11 @@
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;
}
@@ -363,7 +365,7 @@
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;
@@ -1002,7 +1004,7 @@
// 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 9c129b8..4ba6845 100644
--- a/services/audioflinger/AudioMixer.h
+++ b/services/audioflinger/AudioMixer.h
@@ -42,7 +42,7 @@
enum { // names
- // track units (MAX_NUM_TRACKS units)
+ // track names (MAX_NUM_TRACKS units)
TRACK0 = 0x1000,
// 0x2000 is unused
@@ -69,16 +69,16 @@
};
+ // 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 @@
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 bc4c90c..f572fce 100644
--- a/services/audioflinger/AudioPolicyService.cpp
+++ b/services/audioflinger/AudioPolicyService.cpp
@@ -52,7 +52,7 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
// 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 @@
}
}
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 @@
{
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 @@
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 @@
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 @@
}
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 7205045..fbdcb62 100644
--- a/services/audioflinger/AudioResampler.cpp
+++ b/services/audioflinger/AudioResampler.cpp
@@ -121,7 +121,7 @@
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 @@
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 @@
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 @@
// 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 @@
}
// 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 @@
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 @@
}
}
- // 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 @@
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 @@
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 @@
// 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 @@
}
// 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 @@
}
- // 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 @@
}
}
- // 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 4d721f6..587c7be 100644
--- a/services/audioflinger/AudioResamplerCubic.cpp
+++ b/services/audioflinger/AudioResamplerCubic.cpp
@@ -68,7 +68,7 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
}
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 658e25e..34087b5 100644
--- a/services/camera/libcameraservice/CameraHardwareInterface.h
+++ b/services/camera/libcameraservice/CameraHardwareInterface.h
@@ -88,21 +88,21 @@
~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 @@
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 @@
// 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 f922630..cdfb2f5 100644
--- a/services/camera/libcameraservice/CameraHardwareStub.cpp
+++ b/services/camera/libcameraservice/CameraHardwareStub.cpp
@@ -57,7 +57,7 @@
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 @@
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 d0cafb2..06fc708 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -73,7 +73,7 @@
CameraService::CameraService()
:mSoundRef(0), mModule(0)
{
- LOGI("CameraService started (pid=%d)", getpid());
+ ALOGI("CameraService started (pid=%d)", getpid());
gCameraService = this;
}
@@ -83,13 +83,13 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
}
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 cdfbc56..bad41f5 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -76,7 +76,6 @@
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 69f60ca..1055538 100644
--- a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp
+++ b/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp
@@ -217,7 +217,7 @@
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 f179208..6db750ee 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -246,7 +246,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
}
} 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 @@
// 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 @@
} 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 @@
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 @@
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 @@
// 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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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::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 @@
// 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 @@
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 @@
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 4ade595..f2994ab 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -121,7 +121,7 @@
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 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 @@
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 @@
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 @@
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 @@
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 @@
|| 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 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
}
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 @@
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 @@
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 @@
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 @@
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::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 @@
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 5dfa5d5..6a6547b 100644
--- a/services/input/InputManager.cpp
+++ b/services/input/InputManager.cpp
@@ -53,13 +53,13 @@
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::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 55ab0f6..bc17272 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -349,9 +349,9 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
#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 @@
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 @@
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 @@
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 @@
} 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 @@
} 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 @@
// 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 @@
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 @@
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 @@
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 @@
} 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 @@
} 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 @@
} 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 @@
} 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 @@
&& 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 @@
// 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 @@
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 @@
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 0ae2ab8..b15d4c8 100644
--- a/services/input/SpriteController.cpp
+++ b/services/input/SpriteController.cpp
@@ -160,7 +160,7 @@
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 @@
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 @@
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 @@
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 @@
&& (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 @@
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 @@
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 @@
&& (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 @@
} 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 @@
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 bc8ce7d..9573fda 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -55,6 +55,7 @@
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 @@
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 @@
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 36442a0..32aa7a4 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -713,8 +713,7 @@
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 @@
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 @@
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 5f189a2..c2f6151 100644
--- a/services/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/jni/com_android_server_AlarmManagerService.cpp
@@ -46,7 +46,7 @@
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 @@
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 @@
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 2ceb535..1cadc4e 100644
--- a/services/jni/com_android_server_BatteryService.cpp
+++ b/services/jni/com_android_server_BatteryService.cpp
@@ -93,7 +93,7 @@
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 @@
} 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 @@
}
default: {
- LOGW("Unknown battery health[2] '%s'", status);
+ ALOGW("Unknown battery health[2] '%s'", status);
return gConstants.healthUnknown;
}
}
@@ -137,7 +137,7 @@
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 @@
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 @@
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 @@
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 145f713..e163826 100644
--- a/services/jni/com_android_server_InputManager.cpp
+++ b/services/jni/com_android_server_InputManager.cpp
@@ -312,7 +312,7 @@
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 @@
return;
}
- LOGI("Setting pointer speed to %d.", speed);
+ ALOGI("Setting pointer speed to %d.", speed);
mLocked.pointerSpeed = speed;
} // release lock
@@ -702,7 +702,7 @@
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 @@
}
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 @@
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 @@
}
}
} 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 @@
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 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 @@
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 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 08650e1..d2b3118 100644
--- a/services/jni/com_android_server_PowerManagerService.cpp
+++ b/services/jni/com_android_server_PowerManagerService.cpp
@@ -58,7 +58,7 @@
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 40f0dbd..0cd94b9 100644
--- a/services/jni/com_android_server_UsbDeviceManager.cpp
+++ b/services/jni/com_android_server_UsbDeviceManager.cpp
@@ -42,7 +42,7 @@
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 @@
{
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 @@
{
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 @@
{
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 @@
{
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 f1abf56..d0a6cdf 100644
--- a/services/jni/com_android_server_UsbHostManager.cpp
+++ b/services/jni/com_android_server_UsbHostManager.cpp
@@ -45,7 +45,7 @@
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 @@
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 @@
{
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 @@
{
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 0912d43..2b3f74a 100644
--- a/services/jni/com_android_server_VibratorService.cpp
+++ b/services/jni/com_android_server_VibratorService.cpp
@@ -36,13 +36,13 @@
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 d9b8a14..ab8c959 100644
--- a/services/jni/com_android_server_connectivity_Vpn.cpp
+++ b/services/jni/com_android_server_connectivity_Vpn.cpp
@@ -63,21 +63,21 @@
// 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 @@
{
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 @@
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 @@
}
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 @@
}
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 @@
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 @@
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 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 2e5b5d6..50bd46e 100755
--- a/services/jni/com_android_server_location_GpsLocationProvider.cpp
+++ b/services/jni/com_android_server_location_GpsLocationProvider.cpp
@@ -62,7 +62,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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_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_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_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 @@
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 @@
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 4178039..286ae91 100644
--- a/services/jni/onload.cpp
+++ b/services/jni/onload.cpp
@@ -43,7 +43,7 @@
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 d76f19c..b724ce2 100644
--- a/services/sensorservice/Fusion.cpp
+++ b/services/sensorservice/Fusion.cpp
@@ -338,7 +338,7 @@
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 8f23506..2244a86 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -105,13 +105,13 @@
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 @@
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 @@
{
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 be8eaff..468aa61 100644
--- a/services/sensorservice/SensorInterface.cpp
+++ b/services/sensorservice/SensorInterface.cpp
@@ -34,7 +34,7 @@
: 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 3e4a2f5..dd6c426 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -234,7 +234,7 @@
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 @@
}
} while (count >= 0 || Thread::exitPending());
- LOGW("Exiting SensorService::threadLoop => aborting...");
+ ALOGW("Exiting SensorService::threadLoop => aborting...");
abort();
return false;
}
@@ -369,13 +369,13 @@
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 @@
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 3bbc75e..cf131b1 100644
--- a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
+++ b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
@@ -53,7 +53,7 @@
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 @@
{
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 @@
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 @@
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 @@
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 @@
*/
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 @@
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 @@
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);
+ 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);
- 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("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 174dcd7..f4afeea 100644
--- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
+++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
@@ -76,7 +76,7 @@
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 @@
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 be9b226..f17bf43 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -44,10 +44,10 @@
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 dc39f88..9245781 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -209,7 +209,7 @@
}
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 68e6660..c127fa6 100644
--- a/services/surfaceflinger/LayerScreenshot.cpp
+++ b/services/surfaceflinger/LayerScreenshot.cpp
@@ -93,7 +93,7 @@
// 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 85845c9..cbd530c 100644
--- a/services/surfaceflinger/MessageQueue.cpp
+++ b/services/surfaceflinger/MessageQueue.cpp
@@ -70,12 +70,12 @@
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 789e03c..bbb30b0 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -110,7 +110,7 @@
void SurfaceFlinger::init()
{
- LOGI("SurfaceFlinger is starting");
+ ALOGI("SurfaceFlinger is starting");
// debugging stuff...
char value[PROPERTY_VALUE_MAX];
@@ -127,9 +127,9 @@
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 @@
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 @@
{
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 @@
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 @@
// 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 @@
{
// 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 @@
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 @@
}
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 @@
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 @@
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> 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> 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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 4619899..ffe848d 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -134,7 +134,8 @@
// 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 26967a0..dab72a9 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -559,14 +559,23 @@
}
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 93a723e..6096cb0 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 @@
*/
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 @@
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 @@
@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 @@
if (isDataSetupCompleteOk(ar)) {
DataConnectionAc dcac = apnContext.getDataConnectionAc();
+
+ 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));
+ }
+ }
if (dcac == null) {
- throw new RuntimeException("onDataSetupCompete: No dcac");
- }
- DataConnection dc = apnContext.getDataConnection();
+ 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;
+ 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);
}
- 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);
+ 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);
}
}
- } else {
- SystemProperties.set("gsm.defaultpdpcontext.active", "false");
+
+ // 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");
+ }
+ notifyDefaultData(apnContext);
}
- notifyDefaultData(apnContext);
} else {
String apnString;
- DataConnection.FailCause cause;
cause = (DataConnection.FailCause) (ar.result);
if (DBG) {
@@ -1989,7 +2013,10 @@
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 @@
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 0000000..e02ae00
--- /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 0000000..9c5478d
--- /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 43285fb..91e403e 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -399,6 +399,16 @@
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 430f0f1..5851113 100644
--- a/tests/TileBenchmark/Android.mk
+++ b/tests/TileBenchmark/Android.mk
@@ -21,12 +21,8 @@
LOCAL_PACKAGE_NAME := TileBenchmark
-include $(BUILD_PACKAGE)
+LOCAL_MODULE_TAGS := tests
-##################################################
-include $(CLEAR_VARS)
+LOCAL_JAVA_LIBRARIES := android.test.runner
-include $(BUILD_MULTI_PREBUILT)
-
-# 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 ab61a9e..f125c70 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
similarity index 98%
rename from tests/TileBenchmark/tests/src/com/test/tilebenchmark/PerformanceTest.java
rename to tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
index 6bf6f6b..cc39b75 100644
--- a/tests/TileBenchmark/tests/src/com/test/tilebenchmark/PerformanceTest.java
+++ b/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
@@ -80,7 +80,7 @@
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 8b235ec..0000000
--- 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 703b152..0000000
--- 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 d7ac15e..89942de 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -425,6 +425,7 @@
/*
* 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 @@
}
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 @@
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 b00135e..b575988 100644
--- a/tools/aapt/ZipEntry.cpp
+++ b/tools/aapt/ZipEntry.cpp
@@ -90,7 +90,7 @@
* prefer the CDE values.)
*/
if (!hasDD && !compareHeaders()) {
- LOGW("warning: header mismatch\n");
+ ALOGW("warning: header mismatch\n");
// keep going?
}
@@ -200,7 +200,7 @@
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 a2d5b80..0705be3 100644
--- a/tools/aapt/ZipFile.cpp
+++ b/tools/aapt/ZipFile.cpp
@@ -603,7 +603,7 @@
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 @@
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 @@
* 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 @@
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 270b494..4db5738 100644
--- a/voip/jni/rtp/AudioGroup.cpp
+++ b/voip/jni/rtp/AudioGroup.cpp
@@ -510,7 +510,7 @@
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 @@
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 @@
{
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
(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 6127d3c..e223136 100644
--- a/voip/jni/rtp/EchoSuppressor.cpp
+++ b/voip/jni/rtp/EchoSuppressor.cpp
@@ -177,7 +177,7 @@
}
}
}
- //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 f5efc17..6540099 100644
--- a/voip/jni/rtp/RtpStream.cpp
+++ b/voip/jni/rtp/RtpStream.cpp
@@ -116,7 +116,7 @@
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;