1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/* 259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012 OMRON SOFTWARE Co., Ltd. 3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License. 6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at 7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and 14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License. 15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_lib.h" 18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_err.h" 19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_ext.h" 20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_dic.h" 21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 set_previous_selection(NJ_CLASS *iwnn, NJ_RESULT *result); 25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 set_learn_word_info(NJ_CLASS *iwnn, NJ_LEARN_WORD_INFO *lword, NJ_RESULT *result); 26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_select(NJ_CLASS *iwnn, NJ_RESULT *r_result) { 30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_INT16 ret; 31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_DIC_SET *dics; 32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (iwnn == NULL) { 35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SELECT, NJ_ERR_PARAM_ENV_NULL); 37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project dics = &(iwnn->dic_set); 39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (dics->rHandle[NJ_MODE_TYPE_HENKAN] == NULL) { 41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SELECT, NJ_ERR_NO_RULEDIC); 42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if ( r_result != NULL ) { 46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = set_previous_selection(iwnn, r_result); 48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret < 0) { 49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project set_previous_selection(iwnn, NULL); 54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_init(NJ_CLASS *iwnn) { 59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (iwnn == NULL) { 61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_INIT, NJ_ERR_PARAM_ENV_NULL); 63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project set_previous_selection(iwnn, NULL); 67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_get_candidate(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *buf, NJ_UINT16 buf_size) { 71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_INT16 ret; 72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (iwnn == NULL) { 75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_PARAM_ENV_NULL); 77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (result == NULL) { 79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_PARAM_RESULT_NULL); 80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if ((buf == NULL) || (buf_size == 0)) { 83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_BUFFER_NOT_ENOUGH); 84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (NJ_GET_RESULT_OP(result->operation_id)) { 87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case NJ_OP_SEARCH: 88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_get_candidate(iwnn, result, buf, buf_size); 89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_INVALID_RESULT); 94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_get_stroke(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *buf, NJ_UINT16 buf_size) { 101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_INT16 ret; 102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (iwnn == NULL) { 105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_PARAM_ENV_NULL); 107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (result == NULL) { 109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_PARAM_RESULT_NULL); 110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if ((buf == NULL) || (buf_size == 0)) { 113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_BUFFER_NOT_ENOUGH); 114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (NJ_GET_RESULT_OP(result->operation_id)) { 117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case NJ_OP_SEARCH: 118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_get_stroke(iwnn, result, buf, buf_size); 119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_INVALID_RESULT); 124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 set_previous_selection(NJ_CLASS *iwnn, NJ_RESULT *result) { 131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_INT16 ret; 132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_PREVIOUS_SELECTION_INFO *prev_info = &(iwnn->previous_selection); 133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (result == NULL) { 136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project prev_info->count = 0; 137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = set_learn_word_info(iwnn, &(prev_info->selection_data), result); 139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret < 0) { 140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project prev_info->count = 1; 145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 set_learn_word_info(NJ_CLASS *iwnn, NJ_LEARN_WORD_INFO *lword, NJ_RESULT *result) 151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{ 152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_INT16 ret; 153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NJ_DIC_SET *dics = &(iwnn->dic_set); 154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#if 0 158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njx_get_stroke(iwnn, result, lword->yomi, sizeof(lword->yomi)); 160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret < 0) { 161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->yomi_len = (NJ_UINT8)ret; 164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njx_get_candidate(iwnn, result, lword->hyouki, sizeof(lword->hyouki)); 165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret < 0) { 166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->hyouki_len = (NJ_UINT8)ret; 169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#else 170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->yomi[0] = 0x0000; 171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->yomi_len = 0; 172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->hyouki[0] = 0x0000; 173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->hyouki_len = 0; 174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#endif 175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->f_hinsi = NJ_GET_FPOS_FROM_STEM(&(result->word)); 178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->stem_b_hinsi = NJ_GET_BPOS_FROM_STEM(&(result->word)); 179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->b_hinsi = NJ_GET_BPOS_FROM_STEM(&(result->word)); 180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_F); 183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if ((ret != 0) && (lword->f_hinsi == (NJ_UINT16)ret)) { 184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_F); 185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret != 0) { 186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->f_hinsi = (NJ_UINT16)ret; 187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_B); 192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if ((ret != 0) && (lword->b_hinsi == (NJ_UINT16)ret)) { 193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_B); 194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret != 0) { 195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->b_hinsi = (NJ_UINT16)ret; 196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_B); 201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if ((ret != 0) && (lword->stem_b_hinsi == (NJ_UINT16)ret)) { 202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_B); 203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ret != 0) { 204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project lword->stem_b_hinsi = (NJ_UINT16)ret; 205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 211