1939837d76f33abdd3b44ce986329293d808ed41cChiao Chengpackage com.android.contacts.common; 2939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 3939837d76f33abdd3b44ce986329293d808ed41cChiao Chengimport android.provider.ContactsContract.CommonDataKinds.Phone; 4939837d76f33abdd3b44ce986329293d808ed41cChiao Chengimport android.test.suitebuilder.annotation.SmallTest; 5939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 6939837d76f33abdd3b44ce986329293d808ed41cChiao Chengimport junit.framework.TestCase; 7939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 8939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng/** 9939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng * Tests for MoreContactsUtils. 10939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng */ 11939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng@SmallTest 12939837d76f33abdd3b44ce986329293d808ed41cChiao Chengpublic class MoreContactUtilsTest extends TestCase { 13939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 14939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng public void testShouldCollapse() throws Exception { 15939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("1", true, null, null, null, null); 16939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("2", true, "a", "b", "a", "b"); 17939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 18939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("11", false, "a", null, null, null); 19939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("12", false, null, "a", null, null); 20939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("13", false, null, null, "a", null); 21939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("14", false, null, null, null, "a"); 22939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 23939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("21", false, "a", "b", null, null); 24939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("22", false, "a", "b", "a", null); 25939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("23", false, "a", "b", null, "b"); 26939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("24", false, "a", "b", "a", "x"); 27939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("25", false, "a", "b", "x", "b"); 28939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 29939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("31", false, null, null, "a", "b"); 30939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("32", false, "a", null, "a", "b"); 31939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("33", false, null, "b", "a", "b"); 32939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("34", false, "a", "x", "a", "b"); 33939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("35", false, "x", "b", "a", "b"); 34939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 35939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("41", true, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, null); 36939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("42", true, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "1"); 37939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 38939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("51", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "2"); 39939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("52", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, null); 40939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("53", false, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, "2"); 41939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 42939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // Test phone numbers 43939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("60", true, Phone.CONTENT_ITEM_TYPE, "1234567", Phone.CONTENT_ITEM_TYPE, 44939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "1234567"); 45939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("61", false, Phone.CONTENT_ITEM_TYPE, "1234567", Phone.CONTENT_ITEM_TYPE, 46939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "1234568"); 47939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("62", true, Phone.CONTENT_ITEM_TYPE, "1234567;0", Phone.CONTENT_ITEM_TYPE, 48939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "1234567;0"); 49939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("63", false, Phone.CONTENT_ITEM_TYPE, "1234567;89321", 50939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "1234567;89322"); 51939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("64", true, Phone.CONTENT_ITEM_TYPE, "1234567;89321", 52939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "1234567;89321"); 53939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("65", false, Phone.CONTENT_ITEM_TYPE, "1234567;0111111111", 54939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "1234567;"); 55939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("66", false, Phone.CONTENT_ITEM_TYPE, "12345675426;91970xxxxx", 56939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "12345675426"); 57939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("67", false, Phone.CONTENT_ITEM_TYPE, "12345675426;23456xxxxx", 58939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "12345675426;234567xxxx"); 59939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("68", true, Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567", 60939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567"); 61939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("69", false, Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567", 62939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "1234567;1234567"); 63939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 64939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // test some numbers with country and area code 65939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("70", true, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678", 66939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678"); 67939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("71", true, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678", 68939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49 (89)12345678"); 69939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("72", true, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234", 70939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49 (8092)1234"); 71939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("73", false, Phone.CONTENT_ITEM_TYPE, "0049 (8092) 1234", 72939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49/80921234"); 73939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("74", false, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678", 74939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345679"); 75939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 76939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // test special handling of collapsing country code for NANP region only 77939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // This is non symmetrical, because we prefer the number with the +1. 78939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("100", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 79939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "+1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212")); 80939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("101", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 81939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "+14155551212", Phone.CONTENT_ITEM_TYPE, "4155551212")); 82939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("102", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 83939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "(415) 555-1212", Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212")); 84939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("103", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 85939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "4155551212", Phone.CONTENT_ITEM_TYPE, "+14155551212")); 86939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // Require explicit +1 country code declaration to collapse 87939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("104", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 88939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "1-415-555-1212", Phone.CONTENT_ITEM_TYPE, "415-555-1212")); 89939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("105", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 90939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "14155551212", Phone.CONTENT_ITEM_TYPE, "4155551212")); 91939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("106", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 92939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "+1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, " 1 (415) 555-1212")); 93939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("107", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 94939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "+14155551212", Phone.CONTENT_ITEM_TYPE, " 14155551212")); 95939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("108", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 96939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212")); 97939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("109", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 98939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "14155551212", Phone.CONTENT_ITEM_TYPE, "+14155551212")); 99939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 100939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // test some numbers with wait symbol and area code 101939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("200", true, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89321", 102939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49/80921234;89321"); 103939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("201", false, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89321", 104939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49/80921235;89321"); 105939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("202", false, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89322", 106939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "+49/80921234;89321"); 107939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("203", true, Phone.CONTENT_ITEM_TYPE, "1234567;+49 (8092) 1234", 108939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng Phone.CONTENT_ITEM_TYPE, "1234567;+49/80921234"); 109939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 110939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("300", true, Phone.CONTENT_ITEM_TYPE, "", Phone.CONTENT_ITEM_TYPE, ""); 111939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 112939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("301", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, ""); 113939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 114939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("302", false, Phone.CONTENT_ITEM_TYPE, "", Phone.CONTENT_ITEM_TYPE, "1"); 115939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 116939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("303", true, Phone.CONTENT_ITEM_TYPE, "---", Phone.CONTENT_ITEM_TYPE, "---"); 117939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 118939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("304", false, Phone.CONTENT_ITEM_TYPE, "1-/().", Phone.CONTENT_ITEM_TYPE, 119939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "--$%1"); 120939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 121939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // Test numbers using keypad letters. This is non-symmetrical, because we prefer 122939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // the version with letters. 123939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("400", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 124939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "abcdefghijklmnopqrstuvwxyz", Phone.CONTENT_ITEM_TYPE, 125939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "22233344455566677778889999")); 126939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("401", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 127939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "22233344455566677778889999", Phone.CONTENT_ITEM_TYPE, 128939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "abcdefghijklmnopqrstuvwxyz")); 129939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 130939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("402", false, Phone.CONTENT_ITEM_TYPE, "1;2", Phone.CONTENT_ITEM_TYPE, 131939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "12"); 132939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 133939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertCollapses("403", false, Phone.CONTENT_ITEM_TYPE, "1,2", Phone.CONTENT_ITEM_TYPE, 134939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "12"); 135939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng } 136939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 137939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng public void testShouldCollapse_collapsesSameNumberWithDifferentFormats() { 138939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("1", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 139939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "555-1212", Phone.CONTENT_ITEM_TYPE, "5551212")); 140939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("1", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 141939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "415-555-1212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212")); 142939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("2", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 143939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "4155551212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212")); 144939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("3", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 145939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "1-415-555-1212", Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212")); 146939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals("4", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, 147939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng "14155551212", Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212")); 148939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng } 149939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 150939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng private void assertCollapses(String message, boolean expected, CharSequence mimetype1, 151939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng CharSequence data1, CharSequence mimetype2, CharSequence data2) { 152939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype1, data1, mimetype2, 153939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng data2)); 154939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype2, data2, mimetype1, 155939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng data1)); 156939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 157939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // If data1 and data2 are the same instance, make sure the same test passes with different 158939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // instances. 159939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng if (data1 == data2 && data1 != null) { 160939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // Create a different instance 161939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng final CharSequence data2_newref = new StringBuilder(data2).append("").toString(); 162939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 163939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng if (data1 == data2_newref) { 164939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // In some cases no matter what we do the runtime reuses the same instance, so 165939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // we can't do the "different instance" test. 166939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng return; 167939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng } 168939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng 169939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng // we have two different instances, now make sure we get the same result as before 170939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype1, data1, 171939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng mimetype2, data2_newref)); 172939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype2, data2_newref, 173939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng mimetype1, data1)); 174939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng } 175939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng } 176939837d76f33abdd3b44ce986329293d808ed41cChiao Cheng} 177