xref: /xnu-8796.141.3/iokit/Tests/Tests.cpp (revision 1b191cb58250d0705d8a51287127505aa4bc0789)
1 /*
2  * Copyright (c) 1998-2021 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  *
30  */
31 
32 #define TEST_HEADERS    0
33 #define IOKIT_ENABLE_SHARED_PTR
34 
35 #if TEST_HEADERS
36 
37 #include <libkern/OSByteOrder.h>
38 #include <libkern/c++/OSArray.h>
39 #include <libkern/c++/OSAllocation.h>
40 #include <libkern/c++/OSBoolean.h>
41 #include <libkern/c++/OSBoundedArray.h>
42 #include <libkern/c++/OSBoundedArrayRef.h>
43 #include <libkern/c++/OSBoundedPtr.h>
44 #include <libkern/c++/OSCollection.h>
45 #include <libkern/c++/OSCollectionIterator.h>
46 #include <libkern/c++/OSContainers.h>
47 #include <libkern/c++/OSCPPDebug.h>
48 #include <libkern/c++/OSData.h>
49 #include <libkern/c++/OSDictionary.h>
50 #include <libkern/c++/OSEndianTypes.h>
51 #include <libkern/c++/OSIterator.h>
52 #include <libkern/c++/OSKext.h>
53 #include <libkern/c++/OSLib.h>
54 #include <libkern/c++/OSMetaClass.h>
55 #include <libkern/c++/OSNumber.h>
56 #include <libkern/c++/OSObject.h>
57 #include <libkern/c++/OSOrderedSet.h>
58 #include <libkern/c++/OSSerialize.h>
59 #include <libkern/c++/OSSet.h>
60 #include <libkern/c++/OSSharedPtr.h>
61 #include <libkern/c++/OSString.h>
62 #include <libkern/c++/OSSymbol.h>
63 #include <libkern/c++/OSUnserialize.h>
64 #include <libkern/c++/OSValueObject.h>
65 #include <libkern/crypto/aes.h>
66 #include <libkern/crypto/aesxts.h>
67 #include <libkern/crypto/crypto_internal.h>
68 #include <libkern/crypto/des.h>
69 #include <libkern/crypto/md5.h>
70 #include <libkern/crypto/register_crypto.h>
71 #include <libkern/crypto/sha1.h>
72 #include <libkern/crypto/sha2.h>
73 #include <libkern/kernel_mach_header.h>
74 #include <libkern/kext_request_keys.h>
75 #include <libkern/kxld.h>
76 #include <libkern/kxld_types.h>
77 #include <libkern/locks.h>
78 #include <libkern/mkext.h>
79 #include <libkern/OSAtomic.h>
80 #include <libkern/OSBase.h>
81 #include <libkern/OSDebug.h>
82 #include <libkern/OSKextLib.h>
83 #include <libkern/OSKextLibPrivate.h>
84 #include <libkern/OSReturn.h>
85 #include <libkern/OSSerializeBinary.h>
86 #include <libkern/OSTypes.h>
87 #include <libkern/prelink.h>
88 #include <libkern/stack_protector.h>
89 #include <libkern/sysctl.h>
90 #include <libkern/tree.h>
91 #include <libkern/zconf.h>
92 #include <libkern/zlib.h>
93 
94 #include <IOKit/AppleKeyStoreInterface.h>
95 #include <IOKit/assert.h>
96 #include <IOKit/IOBSD.h>
97 #include <IOKit/IOBufferMemoryDescriptor.h>
98 #include <IOKit/IOCatalogue.h>
99 #include <IOKit/IOCommand.h>
100 #include <IOKit/IOCommandGate.h>
101 #include <IOKit/IOCommandPool.h>
102 #include <IOKit/IOCommandQueue.h>
103 #include <IOKit/IOConditionLock.h>
104 #include <IOKit/IOCPU.h>
105 //#include <IOKit/IODataQueue.h>
106 #include <IOKit/IODataQueueShared.h>
107 #include <IOKit/IODeviceMemory.h>
108 #include <IOKit/IODeviceTreeSupport.h>
109 #include <IOKit/IODMACommand.h>
110 #include <IOKit/IODMAController.h>
111 #include <IOKit/IODMAEventSource.h>
112 #include <IOKit/IOEventSource.h>
113 #include <IOKit/IOFilterInterruptEventSource.h>
114 #include <IOKit/IOHibernatePrivate.h>
115 #include <IOKit/IOInterleavedMemoryDescriptor.h>
116 #include <IOKit/IOInterruptAccounting.h>
117 #include <IOKit/IOInterruptAccountingPrivate.h>
118 #include <IOKit/IOInterruptController.h>
119 #include <IOKit/IOInterruptEventSource.h>
120 #include <IOKit/IOInterrupts.h>
121 #include <IOKit/IOKernelReporters.h>
122 #include <IOKit/IOKernelReportStructs.h>
123 #include <IOKit/IOKitDebug.h>
124 #include <IOKit/IOKitDiagnosticsUserClient.h>
125 #include <IOKit/IOKitKeys.h>
126 #include <IOKit/IOKitKeysPrivate.h>
127 #include <IOKit/IOKitServer.h>
128 #include <IOKit/IOLib.h>
129 #include <IOKit/IOLocks.h>
130 #include <IOKit/IOLocksPrivate.h>
131 #include <IOKit/IOMapper.h>
132 #include <IOKit/IOMemoryCursor.h>
133 #include <IOKit/IOMemoryDescriptor.h>
134 #include <IOKit/IOMessage.h>
135 #include <IOKit/IOMultiMemoryDescriptor.h>
136 #include <IOKit/IONotifier.h>
137 #include <IOKit/IONVRAM.h>
138 #include <IOKit/IOPlatformExpert.h>
139 #include <IOKit/IOPolledInterface.h>
140 #include <IOKit/IORangeAllocator.h>
141 #include <IOKit/IORegistryEntry.h>
142 #include <IOKit/IOReportMacros.h>
143 #include <IOKit/IOReportTypes.h>
144 #include <IOKit/IOReturn.h>
145 #include <IOKit/IOService.h>
146 #include <IOKit/IOServicePM.h>
147 #include <IOKit/IOSharedDataQueue.h>
148 #include <IOKit/IOSharedLock.h>
149 #include <IOKit/IOStatistics.h>
150 #include <IOKit/IOStatisticsPrivate.h>
151 #include <IOKit/IOSubMemoryDescriptor.h>
152 #include <IOKit/IOSyncer.h>
153 #include <IOKit/IOTimerEventSource.h>
154 #include <IOKit/IOTimeStamp.h>
155 #include <IOKit/IOTypes.h>
156 #include <IOKit/IOUserClient.h>
157 #include <IOKit/IOWorkLoop.h>
158 #include <IOKit/nvram/IONVRAMController.h>
159 #include <IOKit/OSMessageNotification.h>
160 #include <IOKit/platform/AppleMacIO.h>
161 #include <IOKit/platform/AppleMacIODevice.h>
162 #include <IOKit/platform/AppleNMI.h>
163 #include <IOKit/platform/ApplePlatformExpert.h>
164 #include <IOKit/power/IOPwrController.h>
165 #include <IOKit/pwr_mgt/IOPM.h>
166 #include <IOKit/pwr_mgt/IOPMinformee.h>
167 #include <IOKit/pwr_mgt/IOPMinformeeList.h>
168 #include <IOKit/pwr_mgt/IOPMLibDefs.h>
169 #include <IOKit/pwr_mgt/IOPMlog.h>
170 #include <IOKit/pwr_mgt/IOPMPowerSource.h>
171 #include <IOKit/pwr_mgt/IOPMPowerSourceList.h>
172 #include <IOKit/pwr_mgt/IOPMpowerState.h>
173 #include <IOKit/pwr_mgt/IOPMPrivate.h>
174 #include <IOKit/pwr_mgt/IOPowerConnection.h>
175 #include <IOKit/pwr_mgt/RootDomain.h>
176 #include <IOKit/rtc/IORTCController.h>
177 #include <IOKit/system.h>
178 #include <IOKit/system_management/IOWatchDogTimer.h>
179 #include <math.h>
180 
181 #endif /* TEST_HEADERS */
182 
183 #include <sys/sysctl.h>
184 #include <libkern/c++/OSData.h>
185 #include <IOKit/IOService.h>
186 #include <IOKit/IOUserClient.h>
187 #include "Tests.h"
188 
189 
190 #if DEVELOPMENT || DEBUG
191 
192 #include <IOKit/IOWorkLoop.h>
193 #include <IOKit/IOTimerEventSource.h>
194 #include <IOKit/IOInterruptEventSource.h>
195 #include <IOKit/IOCommandGate.h>
196 #include <IOKit/IOPlatformExpert.h>
197 #include <IOKit/IOSharedDataQueue.h>
198 #include <IOKit/IODataQueueShared.h>
199 #include <IOKit/IOServiceStateNotificationEventSource.h>
200 #include <IOKit/IOKitKeysPrivate.h>
201 #include <IOKit/IOKitServer.h>
202 #include <IOKit/IOBSD.h>
203 #include <IOKit/IODeviceTreeSupport.h>
204 #include <kern/ipc_kobject.h>
205 #include <libkern/Block.h>
206 #include <libkern/Block_private.h>
207 #include <libkern/c++/OSAllocation.h>
208 #include <libkern/c++/OSBoundedArray.h>
209 #include <libkern/c++/OSBoundedArrayRef.h>
210 #include <libkern/c++/OSBoundedPtr.h>
211 #include <libkern/c++/OSSharedPtr.h>
212 #include <os/cpp_util.h>
213 #include <DriverKit/IODataQueueDispatchSource.h>
214 #include <libkern/zlib.h>
215 
216 static uint64_t gIOWorkLoopTestDeadline;
217 
218 #if TEST_ZLIB
219 
220 static void *
TestZLib_alloc(void * __unused opaque,u_int items,u_int size)221 TestZLib_alloc(void * __unused opaque, u_int items, u_int size)
222 {
223 	kern_return_t kr;
224 	vm_offset_t result;
225 
226 	kr = kmem_alloc(kernel_map, &result,
227 	    round_page(items * size) + ptoa(2),
228 	    (kma_flags_t)
229 	    (KMA_NOFAIL | KMA_KSTACK | KMA_KOBJECT |
230 	    KMA_GUARD_FIRST | KMA_GUARD_LAST),
231 	    VM_KERN_MEMORY_DIAG);
232 
233 	assert(KERN_SUCCESS == kr);
234 
235 	return (void *)(uintptr_t) (result + ptoa(1));
236 }
237 
238 static void
TestZLib_free(void * __unused ref,void * ptr)239 TestZLib_free(void * __unused ref, void * ptr)
240 {
241 }
242 
243 static int
TestZLib(int newValue)244 TestZLib(int newValue)
245 {
246 	static const char reproData[] =
247 	    "AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVA"
248 	    "AWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABS"
249 	    "ABTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACOAC"
250 	    "PACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKADLA"
251 	    "DMADNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEGAEHAEI"
252 	    "AEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAFDAFEAF"
253 	    "FAFGAFHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAGBA"
254 	    "GCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWAGX"
255 	    "AGYAGZAHBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAHSAHTAH"
256 	    "UAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQA"
257 	    "IRAISAITAIUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMAJN"
258 	    "AJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJAK"
259 	    "KAKLAKMAKNAKOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEALFALGA"
260 	    "LHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMBAMCAMD"
261 	    "AMEAMFAMGAMHAMIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
262 	    "XAMYAM"
263 	    "ZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUANVA"
264 	    "NWANXANYANZAOBAOCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQAORAOS"
265 	    "AOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAP"
266 	    "PAPQAPRAPSAPTAPUAPVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQLA"
267 	    "QMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHARI"
268 	    "ARJARKARLARMARNAROARPARQARRARSARTARUARVARWARXARYARZASBASCASDASEAS"
269 	    "FASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYASZATBA"
270 	    "TCATDATEATFATGATHATIATJATKATLATMATNATOATPATQATRATSATTATUATVATWATX"
271 	    "ATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUTAU"
272 	    "UAUVAUWAUXAUYAUZAVBAVCAVDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOAVPAVQA"
273 	    "VRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMAWN"
274 	    "AWOAWPAWQAWRAWSAWTAWUAWVAWWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJAX"
275 	    "KAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAYGA"
276 	    "YHAYIAYJAYKAYLAYMAYNAYOAYPAYQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZD"
277 	    "AZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZXAZYAZ"
278 	    "ZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVBBW"
279 	    "BBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCTBC"
280 	    "UBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBDHBDIBDJBDKBDLBDMBDNBDOBDPBDQBDRB"
281 	    "DSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBEOBEP"
282 	    "BEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBFDBFEBFFBFGBFHBFIBFJBFKBFLBFMBF"
283 	    "NBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBGKB"
284 	    "GLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBGXBGYBGZBHCBHDBHEBHFBHGBHHBHI"
285 	    "BHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBIEBIFBI"
286 	    "GBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBITBIUBIVBIWBIXBIYBIZBJCBJDB"
287 	    "JEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYBJZ"
288 	    "BKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBKPBKQBKRBKSBKTBKUBKVBKWBK"
289 	    "XBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSBLTBLUB"
290 	    "LVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBMLBMMBMNBMOBMPBMQBMRBMS"
291 	    "BMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNPBN"
292 	    "QBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBOHBOIBOJBOKBOLBOMBONB"
293 	    "OOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJBPKBPL"
294 	    "BPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBQDBQEBQFBQGBQHBQIBQ"
295 	    "JBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBRGB"
296 	    "RHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBRXBRYBRZBSCBSDBSE"
297 	    "BSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBSYBSZBT"
298 	    "CBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBTTBTUBTVBTWBTXB"
299 	    "TYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUBUV"
300 	    "BUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBVPBVQBVRBVSBV"
301 	    "TBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQB"
302 	    "WRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBXLBXMBXNBXO"
303 	    "BXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYLBY"
304 	    "MBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBZHBZIBZJB"
305 	    "ZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCCGCCHCC"
306 	    "ICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECDFCDGC"
307 	    "DHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEECEF"
308 	    "CEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZCFDCF"
309 	    "ECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZC"
310 	    "GDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGWCGXCGY"
311 	    "CGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHWCH"
312 	    "XCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCIVC"
313 	    "IWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJSCJTCJU"
314 	    "CJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCKSCK"
315 	    "TCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCLRC"
316 	    "LSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPCMQ"
317 	    "CMRCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCN"
318 	    "PCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLCOMCONC"
319 	    "OOCOPCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLCPM"
320 	    "CPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQKCQ"
321 	    "LCQMCQNCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHCRICRJC"
322 	    "RKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGCSHCSI"
323 	    "CSJCSKCSLCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTGCT"
324 	    "HCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECUFC"
325 	    "UGCUHCUICUJCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVE"
326 	    "CVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCVYCVZCW"
327 	    "DCWECWFCWGCWHCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCWYC"
328 	    "WZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWCXX"
329 	    "CXYCXZCYDCYECYFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCYUCYVCY"
330 	    "WCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSCZTCZUC"
331 	    "ZVCZWCZXCZYCZZDDDEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDTDD"
332 	    "UDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDETD"
333 	    "EUDEVDEWDEXDEYDEZDFEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFT"
334 	    "DFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDGRDGSDG"
335 	    "TDGUDGVDGWDGXDGYDGZDHEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDHSD"
336 	    "HTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRDIS"
337 	    "DITDIUDIVDIWDIXDIYDIZDJEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJQDJRDJ"
338 	    "SDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPDKQDKRD"
339 	    "KSDKTDKUDKVDKWDKXDKYDKZDLEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQDLR"
340 	    "DLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQDM"
341 	    "RDMSDMTDMUDMVDMWDMXDMYDMZDNEDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQD"
342 	    "NRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQ"
343 	    "DORDOSDOTDOUDOVDOWDOXDOYDOZDPEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPPDP"
344 	    "QDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQPD"
345 	    "QQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDRFDRGDRHDRIDRJDRKDRLDRMDRNDRODRP"
346 	    "DRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDSNDSODS"
347 	    "PDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTOD"
348 	    "TPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUNDUO"
349 	    "DUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDVFDVGDVHDVIDVJDVKDVLDVMDVNDV"
350 	    "ODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWND"
351 	    "WODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXEDXFDXGDXHDXIDXJDXKDXLDXMDXN"
352 	    "DXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYMDY"
353 	    "NDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDZFDZGDZHDZIDZJDZKDZLDZMD"
354 	    "ZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEELEEMEE"
355 	    "NEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEFGEFHEFIEFJEFKEFLEFMEFNE"
356 	    "FOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNEGO"
357 	    "EGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEHIEHJEHKEHLEHMEHNEHOEH"
358 	    "PEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPE"
359 	    "IQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJEJKEJLEJMEJNEJOEJPEJQ"
360 	    "EJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQEK"
361 	    "REKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLELMELNELOELPELQELRE"
362 	    "LSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQEMREMS"
363 	    "EMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNENOENPENQENRENSEN"
364 	    "TENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEOTE"
365 	    "OUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPEPQEPREPSEPTEPU"
366 	    "EPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQ"
367 	    "VEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERRERSERTERUERVE"
368 	    "RWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVESW"
369 	    "ESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTETUETVETWET"
370 	    "XETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVEUWEUXE"
371 	    "UYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEVWEVXEVY"
372 	    "EVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWYEW"
373 	    "ZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXEXYEXZE"
374 	    "YFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZF"
375 	    "EZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZZFFFGF"
376 	    "FHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHFGI"
377 	    "FGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJFH"
378 	    "KFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJFIKFILF"
379 	    "IMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJLFJMFJN"
380 	    "FJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFK"
381 	    "PFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFLQF"
382 	    "LRFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMS"
383 	    "FMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFN"
384 	    "UFNVFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFOVF"
385 	    "OWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWFPX"
386 	    "FPYFPZFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQXFQYFQ"
387 	    "ZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYFRZFSGF"
388 	    "SHFSIFSJFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTI"
389 	    "FTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJFU"
390 	    "KFULFUMFUNFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLF"
391 	    "VMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWN"
392 	    "FWOFWPFWQFWRFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXOFX"
393 	    "PFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFYQF"
394 	    "YRFYSFYTFYUFYVFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQFZRFZS"
395 	    "FZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSGGTGGUG"
396 	    "GVGGWGGXGGYGGZGHHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHX"
397 	    "GHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZGJ"
398 	    "HGJIGJJGJKGJLGJMGJNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJG"
399 	    "KKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLM"
400 	    "GLNGLOGLPGLQGLRGLSGLTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMOGM"
401 	    "PGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGNRG"
402 	    "NSGNTGNUGNVGNWGNXGNYGNZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOSGOTGOU"
403 	    "GOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGPVGPWGP"
404 	    "XGPYGPZGQHGQIGQJGQKGQLGQMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZG"
405 	    "RHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIGSJ"
406 	    "GSKGSLGSMGSNGSOGSPGSQGSRGSSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGT"
407 	    "MGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOG"
408 	    "UPGUQGURGUSGUTGUUGUVGUWGUXGUYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQGVR"
409 	    "GVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWTGW"
410 	    "UGWVGWWGWXGWYGWZGXHGXIGXJGXKGXLGXMGXNGXOGXPGXQGXRGXSGXTGXUGXVGXWG"
411 	    "XXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYXGYYGYZ"
412 	    "GZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZRGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJH"
413 	    "HKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMHIN"
414 	    "HIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJ"
415 	    "RHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUH"
416 	    "KVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHLPHLQHLRHLSHLTHLUHLVHLWHLXHLY"
417 	    "HLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJHN"
418 	    "KHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHNXHNYHNZHOIHOJHOKHOLHOMHONH"
419 	    "OOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPPHPQHPR"
420 	    "HPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHQNHQOHQPHQQHQRHQSHQTHQUHQ"
421 	    "VHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYH"
422 	    "RZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHSVHSWHSXHSYHSZHTIHTJHTK"
423 	    "HTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHU"
424 	    "OHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHVLHVMHVNHVOHVPHVQHVRH"
425 	    "VSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUHWV"
426 	    "HWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHXTHXUHXVHXWHXXHXYHX"
427 	    "ZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIHZJHZKH"
428 	    "ZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJIIKIILIIMIINIIOII"
429 	    "PIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTI"
430 	    "JUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTIKUIKVIKWIKXIKY"
431 	    "IKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIM"
432 	    "MIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMINNINOINPINQI"
433 	    "NRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUIOV"
434 	    "IOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIPXIPYIPZIQ"
435 	    "JIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLIRMIRNI"
436 	    "ROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPISQISRISS"
437 	    "ISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITWIT"
438 	    "XITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIVJIVKI"
439 	    "VLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWP"
440 	    "IWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSIXTIX"
441 	    "UIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIYYI"
442 	    "YZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJMJJ"
443 	    "NJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJKRJKSJ"
444 	    "KTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLWJLXJLY"
445 	    "JLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJN"
446 	    "OJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJOTJ"
447 	    "OUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZ"
448 	    "JQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJR"
449 	    "PJRQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJSUJ"
450 	    "SVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJUK"
451 	    "JULJUMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJVOJVPJV"
452 	    "QJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJWUJWVJ"
453 	    "WWJWXJWYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYL"
454 	    "JYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZ"
455 	    "RJZSJZTJZUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKX"
456 	    "KKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKM"
457 	    "PKMQKMRKMSKMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKNVK"
458 	    "NWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMKPN"
459 	    "KPOKPPKPQKPRKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQSKQTKQ"
460 	    "UKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYKRZKSLK"
461 	    "SMKSNKSOKSPKSQKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTS"
462 	    "KTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKU"
463 	    "ZKVLKVMKVNKVOKVPKVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQK"
464 	    "WRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXX"
465 	    "KXYKXZKYLKYMKYNKYOKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZOKZ"
466 	    "PKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVLLW"
467 	    "LLXLLYLLZLMMLMNLMOLMPLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLNOLNPLN"
468 	    "QLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVLOWLOXL"
469 	    "OYLOZLPMLPNLPOLPPLPQLPRLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQR"
470 	    "LQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLR"
471 	    "ZLSMLSNLSOLSPLSQLSRLSSLSTLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSL"
472 	    "TTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVM"
473 	    "LVNLVOLVPLVQLVRLVSLVTLVULVVLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWTLW"
474 	    "ULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLYNL"
475 	    "YOLYPLYQLYRLYSLYTLYULYVLYWLYXLYYLYZLZMLZNLZOLZPLZQLZRLZSLZTLZULZV"
476 	    "LZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOMNPMNQM"
477 	    "NRMNSMNTMNUMNVMNWMNXMNYMNZMONMOOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYMOZ"
478 	    "MPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQ"
479 	    "VMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQM"
480 	    "SRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
481 	    "MTYMTZ"
482 	    "MUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUYMUZMVNMVOMVPMVQMVRMVSMVTMVUMV"
483 	    "VMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMXQM"
484 	    "XRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYQMYRMYSMYTMYUMYVMYWMYXMYYMYZ"
485 	    "MZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTNNUNNVN"
486 	    "NWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNOXNOYNOZNPONPPNPQNPRNPSNPT"
487 	    "NPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNR"
488 	    "RNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNSTNSUNSVNSWNSXNSYNSZNTON"
489 	    "TPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUY"
490 	    "NUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONWPNWQNWRNWSNWTNWUNWVNW"
491 	    "WNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNYTN"
492 	    "YUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNZXNZYNZZOOOPOOQOOROO"
493 	    "SOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPOQQOQRO"
494 	    "QSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWORXORYORZOSPOSQOSR"
495 	    "OSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOU"
496 	    "ROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWOVXOVYOVZOWPOWQO"
497 	    "WROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQ"
498 	    "OYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWOZXOZYOZZPPPQP"
499 	    "PRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRPRS"
500 	    "PRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTQPTRPTSPTTPT"
501 	    "UPTVTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACO"
502 	    "ACPACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKAD"
503 	    "LADMADAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATA"
504 	    "AUAAVAAWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQ"
505 	    "ABRABSABHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAG"
506 	    "BAGCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWA"
507 	    "GXAGYAGZAHNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEG"
508 	    "AEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAF"
509 	    "DAFEAFFAFGAFUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMA"
510 	    "JNAJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJ"
511 	    "AKKAKLAKMAKNAKBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAH"
512 	    "SAHTAHUAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOA"
513 	    "IPAIQAIRAISAITAIIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
514 	    "XAMY"
515 	    "AMZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUAN"
516 	    "VANWANXANYANZAOBAOOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEA"
517 	    "LFALGALHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMB"
518 	    "AMCAMDAMEAMFAMGAMHAMVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQ"
519 	    "LAQMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHA"
520 	    "RIARJARKARLARMARNAROARCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQ"
521 	    "AORAOSAOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAP"
522 	    "NAPOAPPAPQAPRAPSAPTAPUAPJATKATLATMATNATOATPATQATRATSATTATUATVATWA"
523 	    "TXATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUT"
524 	    "AUUAUVAUWAUXAUYAUZAVBAVCAVPARQARRARSARTARUARVARWARXARYARZASBASCAS"
525 	    "DASEASFASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYA"
526 	    "SZATBATCATDATEATFATGATHATIATWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJ"
527 	    "AXKAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAY"
528 	    "GAYHAYIAYJAYKAYLAYMAYNAYOAYPAYDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOA"
529 	    "VPAVQAVRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWL"
530 	    "AWMAWNAWOAWPAWQAWRAWSAWTAWUAWVAWBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVB"
531 	    "BWBBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCT"
532 	    "BCUBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZB"
533 	    "AZCAZDAZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZ"
534 	    "XAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBFDBFEBFFBFGBFHBFIBFJBFKBFLBFM"
535 	    "BFNBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBG"
536 	    "KBGLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBDHBDIBDJBDKBDLBDMBDNBDOBDPB"
537 	    "DQBDRBDSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBEN"
538 	    "BEOBEPBEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBITBIUBIVBIWBIXBIYBIZBJCBJ"
539 	    "DBJEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYB"
540 	    "JZBKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBGXBGYBGZBHCBHDBHEBHFBHG"
541 	    "BHHBHIBHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBI"
542 	    "EBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBMLBMMBMNBMOBMPBMQBMRB"
543 	    "MSBMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNP"
544 	    "BNQBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBKPBKQBKRBKSBKTBKUBK"
545 	    "VBKWBKXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSB"
546 	    "LTBLUBLVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBQDBQEBQFBQGBQHBQI"
547 	    "BQJBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBR"
548 	    "GBRHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBOHBOIBOJBOKBOLB"
549 	    "OMBONBOOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJ"
550 	    "BPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBTTBTUBTVBTWBT"
551 	    "XBTYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUB"
552 	    "UVBUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBRXBRYBRZBSC"
553 	    "BSDBSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBS"
554 	    "YBSZBTCBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBXLBXMBXNB"
555 	    "XOBXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYL"
556 	    "BYMBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBVPBVQBV"
557 	    "RBVSBVTBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOB"
558 	    "WPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBCDFCD"
559 	    "GCDHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEEC"
560 	    "EFCEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZZHB"
561 	    "ZIBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCC"
562 	    "GCCHCCICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDEC"
563 	    "GYCGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHW"
564 	    "CHXCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCI"
565 	    "VCFDCFECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXC"
566 	    "FYCFZCGDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGW"
567 	    "CGXCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCL"
568 	    "RCLSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPC"
569 	    "MQCMRCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJS"
570 	    "CJTCJUCJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCK"
571 	    "RCKSCKTCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLC"
572 	    "PMCPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQK"
573 	    "CQLCQMCQNCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCN"
574 	    "NCNOCNPCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLC"
575 	    "OMCONCOOCOPCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTG"
576 	    "CTHCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECU"
577 	    "FCUGCUHCUICUJCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHC"
578 	    "RICRJCRKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSG"
579 	    "CSHCSICSJCSKCSLCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCW"
580 	    "YCWZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWC"
581 	    "XXCXYCXZCYDCYECYFCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZ"
582 	    "CVDCVECVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCV"
583 	    "YCVZCWDCWECWFCWGCWHEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDT"
584 	    "DDUDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDE"
585 	    "TDEUDEVDEWDEXDEYDEZDFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCY"
586 	    "UCYVCYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSC"
587 	    "ZTCZUCZVCZWCZXCZYCZZDDDEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDH"
588 	    "SDHTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRD"
589 	    "ISDITDIUDIVDIWDIXDIYDIZDJEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFR"
590 	    "DFSDFTDFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDG"
591 	    "RDGSDGTDGUDGVDGWDGXDGYDGZDHEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQD"
592 	    "LRDLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQ"
593 	    "DMRDMSDMTDMUDMVDMWDMXDMYDMZDNEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJ"
594 	    "QDJRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPD"
595 	    "KQDKRDKSDKTDKUDKVDKWDKXDKYDKZDLEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPP"
596 	    "DPQDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQ"
597 	    "PDQQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDNFDNGDNHDNIDNJDNKDNLDNMDNNDNOD"
598 	    "NPDNQDNRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOO"
599 	    "DOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZDPEDTFDTGDTHDTIDTJDTKDTLDTMDTNDT"
600 	    "ODTPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUND"
601 	    "UODUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDRFDRGDRHDRIDRJDRKDRLDRMDRN"
602 	    "DRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDS"
603 	    "NDSODSPDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDXFDXGDXHDXIDXJDXKDXLDXMD"
604 	    "XNDXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYM"
605 	    "DYNDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDVFDVGDVHDVIDVJDVKDVLDV"
606 	    "MDVNDVODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLD"
607 	    "WMDWNDWODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXFGEFHEFIEFJEFKEFLEFMEF"
608 	    "NEFOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNE"
609 	    "GOEGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEEDZFDZGDZHDZIDZJDZKD"
610 	    "ZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEE"
611 	    "LEEMEENEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEJKEJLEJMEJNEJOEJPE"
612 	    "JQEJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQ"
613 	    "EKREKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLEHIEHJEHKEHLEHMEH"
614 	    "NEHOEHPEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINE"
615 	    "IOEIPEIQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJENOENPENQENRENS"
616 	    "ENTENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEO"
617 	    "TEOUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPELMELNELOELPE"
618 	    "LQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQ"
619 	    "EMREMSEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNERSERTERUER"
620 	    "VERWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVE"
621 	    "SWESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTEPQEPREPS"
622 	    "EPTEPUEPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQ"
623 	    "TEQUEQVEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERREVWEVXE"
624 	    "VYEVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWY"
625 	    "EWZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXETUET"
626 	    "VETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVE"
627 	    "UWEUXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEFF"
628 	    "GFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHF"
629 	    "GIFGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJ"
630 	    "XYEXZEYFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYY"
631 	    "EYZEZFEZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZ"
632 	    "ZFFJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKO"
633 	    "FKPFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFL"
634 	    "QFLRFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJF"
635 	    "IKFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJL"
636 	    "FJMFJNFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFO"
637 	    "VFOWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWF"
638 	    "PXFPYFPZFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQ"
639 	    "FMRFMSFMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFN"
640 	    "SFNTFNUFNVFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHF"
641 	    "TIFTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJ"
642 	    "FUKFULFUMFUNFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQ"
643 	    "XFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYF"
644 	    "RZFSGFSHFSIFSJFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXO"
645 	    "FXPFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFY"
646 	    "QFYRFYSFYTFYUFYVFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJF"
647 	    "VKFVLFVMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWL"
648 	    "FWMFWNFWOFWPFWQFWRHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWG"
649 	    "HXGHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZ"
650 	    "GJHGJIGJJGJKGJLGJMGJFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQ"
651 	    "FZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSG"
652 	    "GTGGUGGVGGWGGXGGYGGZGHTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMO"
653 	    "GMPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGN"
654 	    "RGNSGNTGNUGNVGNWGNXGNYGNNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHG"
655 	    "KIGKJGKKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLK"
656 	    "GLLGLMGLNGLOGLPGLQGLRGLSGLMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQ"
657 	    "ZGRHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIG"
658 	    "SJGSKGSLGSMGSNGSOGSPGSQGSRGSZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOS"
659 	    "GOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGP"
660 	    "VGPWGPXGPYGPZGQHGQIGQJGQKGQLGQYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQG"
661 	    "VRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWT"
662 	    "GWUGWVGWWGWXGWYGWZGXHGXIGXJGXKGXSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGT"
663 	    "KGTLGTMGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMG"
664 	    "UNGUOGUPGUQGURGUSGUTGUUGUVGUWGUXGURGZSGZTGZUGZVGZWGZXGZYGZZHHHIHH"
665 	    "JHHKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMH"
666 	    "INHIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHLGXMGXNGXOGXPGXQGXRGXSGXTGXUG"
667 	    "XVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYX"
668 	    "GYYGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZLPHLQHLRHLSHLTHLUHLVHLWHLXH"
669 	    "LYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJ"
670 	    "HNKHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHIZHJIHJJHJKHJLHJMHJNHJOHJ"
671 	    "PHJQHJRHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSH"
672 	    "KTHKUHKVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHQNHQOHQPHQQHQRHQSHQTHQU"
673 	    "HQVHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHR"
674 	    "YHRZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHNXHNYHNZHOIHOJHOKHOLH"
675 	    "OMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPP"
676 	    "HPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHVLHVMHVNHVOHVPHVQHV"
677 	    "RHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUH"
678 	    "WVHWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHSVHSWHSXHSYHSZHTI"
679 	    "HTJHTKHTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHU"
680 	    "MHUNHUOHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHIIKIILIIMIINIIO"
681 	    "IIPIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJ"
682 	    "TIJUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTXTHXUHXVHXWHX"
683 	    "XHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIH"
684 	    "ZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJINNINOINPIN"
685 	    "QINRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUI"
686 	    "OVIOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIKUIKVIKW"
687 	    "IKXIKYIKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIM"
688 	    "KIMLIMMIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMISQISRI"
689 	    "SSISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITW"
690 	    "ITXITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIPXIP"
691 	    "YIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLI"
692 	    "RMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPIXT"
693 	    "IXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIY"
694 	    "YIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJI"
695 	    "VJIVKIVLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWN"
696 	    "IWOIWPIWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIX"
697 	    "SYJLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNN"
698 	    "JNOJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJO"
699 	    "TJOMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJ"
700 	    "KRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLW"
701 	    "JLXJLQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJS"
702 	    "UJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJ"
703 	    "UKJULJUUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPX"
704 	    "JPYJPZJQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJR"
705 	    "NJROJRPJRYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJ"
706 	    "YLJYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQ"
707 	    "JZRJZSJZTJZMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJV"
708 	    "OJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJ"
709 	    "WUJWVJWWJWXJWMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKN"
710 	    "VKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMK"
711 	    "PNKPOKPPKPQKPRKUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKV"
712 	    "KKWKKXKKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKM"
713 	    "NKMOKMPKMQKMRKMSKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRK"
714 	    "TSKTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUY"
715 	    "KUZKVLKVMKVNKVOKVPKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQ"
716 	    "SKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYK"
717 	    "RZKSLKSMKSNKSOKSPKSQKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZO"
718 	    "KZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVL"
719 	    "LWLLXLLYLLZLMMLMNLMOLMPVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOK"
720 	    "WPKWQKWRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXV"
721 	    "KXWKXXKXYKXZKYLKYMKYNKYOKLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQL"
722 	    "QRLQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRY"
723 	    "LRZLSMLSNLSOLSPLSQLSRLSSLSTLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLN"
724 	    "OLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVL"
725 	    "OWLOXLOYLOZLPMLPNLPOLPPLPQLPRLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWT"
726 	    "LWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLY"
727 	    "NLYOLYPLYQLYRLYSLYTLYULYVLYWLYXLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQL"
728 	    "TRLTSLTTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUY"
729 	    "LUZLVMLVNLVOLVPLVQLVRLVSLVTLVULVVOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYM"
730 	    "OZMPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQU"
731 	    "MQVMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRLYYLYZLZMLZNLZOLZPLZQLZRLZSLZT"
732 	    "LZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOM"
733 	    "NPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOYMUZMVNMVOMVPMVQMVRMVSMVTMVU"
734 	    "MVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMX"
735 	    "QMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYTMRUMRVMRWMRXMRYMRZMSNMSOM"
736 	    "SPMSQMSRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
737 	    "MTYMTZMUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUOXNOYNOZNPONPPNPQNPRNPSN"
738 	    "PTNPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQ"
739 	    "NRRNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNQMYRMYSMYTMYUMYVMYWMYX"
740 	    "MYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTN"
741 	    "NUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNWPNWQNWRNWSNWTNWUNWV"
742 	    "NWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNY"
743 	    "TNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNSTNSUNSVNSWNSXNSYN"
744 	    "SZNTONTPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUW"
745 	    "NUXNUYNUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONORXORYORZOSPOSQO"
746 	    "SROSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQ"
747 	    "OUROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWZXNZYNZZOOOPOO"
748 	    "QOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPO"
749 	    "QQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWOZXOZYOZZPPP"
750 	    "QPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRP"
751 	    "RSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTOVXOVYOVZO"
752 	    "WPOWQOWROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZ"
753 	    "OYPOYQOYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWQPTRPTSP"
754 	    "TTPTUPTV";
755 
756 	z_stream strm = {};
757 	uint8_t *buf;
758 	size_t count;
759 	uLong bound;
760 
761 	strm.zalloc = &TestZLib_alloc;
762 	strm.zfree  = &TestZLib_free;
763 	deflateInit2(&strm,
764 	    Z_DEFAULT_COMPRESSION,
765 	    Z_DEFLATED,
766 	    15,
767 	    1,
768 	    Z_FIXED);
769 
770 	count = strlen(reproData);
771 	bound = deflateBound(&strm, count);
772 	buf   = IONew(uint8_t, bound);
773 
774 	strm.avail_out  = (uInt) bound;
775 	strm.next_out   = buf;
776 	strm.next_in    = (Bytef *) &reproData[0];
777 	strm.avail_in   = (uInt) count;
778 
779 	deflate(&strm, Z_FINISH);
780 	deflateEnd(&strm);
781 	IODelete(buf, uint8_t, bound);
782 
783 	return 0;
784 }
785 #endif /* TEST_ZLIB */
786 
787 
788 static void
TESAction(OSObject * owner,IOTimerEventSource * tes)789 TESAction(OSObject * owner, IOTimerEventSource * tes)
790 {
791 	if (mach_absolute_time() < gIOWorkLoopTestDeadline) {
792 		tes->setTimeout(1, kMicrosecondScale);
793 	}
794 }
795 
796 static int
IOWorkLoopTest(int newValue)797 IOWorkLoopTest(int newValue)
798 {
799 	IOReturn err;
800 	uint32_t idx;
801 	OSSharedPtr<IOWorkLoop> wl;
802 	OSSharedPtr<IOTimerEventSource> tes;
803 	OSSharedPtr<IOInterruptEventSource> ies;
804 
805 	wl = IOWorkLoop::workLoop();
806 	assert(wl);
807 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsPriorityWorkLoop, wl.get(), &TESAction);
808 	assert(tes);
809 	err = wl->addEventSource(tes.get());
810 	assert(kIOReturnSuccess == err);
811 	clock_interval_to_deadline(100, kMillisecondScale, &gIOWorkLoopTestDeadline);
812 	for (idx = 0; mach_absolute_time() < gIOWorkLoopTestDeadline; idx++) {
813 		tes->setTimeout(idx & 1023, kNanosecondScale);
814 	}
815 	tes->cancelTimeout();
816 	wl->removeEventSource(tes.get());
817 
818 	int value = 3;
819 
820 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsDefault, wl.get(), ^(IOTimerEventSource * tes){
821 		kprintf("wl %p, value %d\n", wl.get(), value);
822 	});
823 	err = wl->addEventSource(tes.get());
824 	assert(kIOReturnSuccess == err);
825 
826 	value = 2;
827 	tes->setTimeout(1, kNanosecondScale);
828 	IOSleep(1);
829 	wl->removeEventSource(tes.get());
830 
831 	ies = IOInterruptEventSource::interruptEventSource(wl.get(), NULL, 0, ^void (IOInterruptEventSource *sender, int count){
832 		kprintf("ies block %p, %d\n", sender, count);
833 	});
834 
835 	assert(ies);
836 	kprintf("ies %p\n", ies.get());
837 	err = wl->addEventSource(ies.get());
838 	assert(kIOReturnSuccess == err);
839 	ies->interruptOccurred(NULL, NULL, 0);
840 	IOSleep(1);
841 	ies->interruptOccurred(NULL, NULL, 0);
842 	IOSleep(1);
843 	wl->removeEventSource(ies.get());
844 
845 	return 0;
846 }
847 
848 static int
OSCollectionTest(int newValue)849 OSCollectionTest(int newValue)
850 {
851 	OSSharedPtr<OSArray> array = OSArray::withCapacity(8);
852 	array->setObject(kOSBooleanTrue);
853 	array->setObject(kOSBooleanFalse);
854 	array->setObject(kOSBooleanFalse);
855 	array->setObject(kOSBooleanTrue);
856 	array->setObject(kOSBooleanFalse);
857 	array->setObject(kOSBooleanTrue);
858 
859 	__block unsigned int index;
860 	index = 0;
861 	array->iterateObjects(^bool (OSObject * obj) {
862 		kprintf("%d:%d ", index, (obj == kOSBooleanTrue) ? 1 : (obj == kOSBooleanFalse) ? 0 : 2);
863 		index++;
864 		return false;
865 	});
866 	kprintf("\n");
867 
868 	OSSharedPtr<OSDictionary> dict = IOService::resourceMatching("hello");
869 	assert(dict);
870 	index = 0;
871 	dict->iterateObjects(^bool (const OSSymbol * sym, OSObject * obj) {
872 		OSString * str = OSDynamicCast(OSString, obj);
873 		assert(str);
874 		kprintf("%d:%s=%s\n", index, sym->getCStringNoCopy(), str->getCStringNoCopy());
875 		index++;
876 		return false;
877 	});
878 
879 	OSSharedPtr<OSSerializer> serializer = OSSerializer::withBlock(^bool (OSSerialize * s){
880 		return gIOBSDUnitKey->serialize(s);
881 	});
882 	assert(serializer);
883 	IOService::getPlatform()->setProperty("OSSerializer_withBlock", serializer.get());
884 
885 	OSSharedPtr<OSString> ab = OSString::withCString("abcdef", 2);
886 	assert(strcmp(ab->getCStringNoCopy(), "ab") == 0);
887 	OSSharedPtr<OSString> defgh = OSString::withCString("defgh", 10);
888 	assert(strcmp(defgh->getCStringNoCopy(), "defgh") == 0);
889 	OSSharedPtr<OSString> zyxwvut = OSString::withCString("zyxwvut", 7);
890 	assert(strcmp(zyxwvut->getCStringNoCopy(), "zyxwvut") == 0);
891 
892 
893 	dict = OSDictionary::withCapacity(4);
894 	OSSharedPtr<OSNumber> num = OSNumber::withDouble(1234.5678);
895 	dict->setObject("test", num);
896 
897 	OSSharedPtr<OSSerialize> s = OSSerialize::binaryWithCapacity(4096);
898 	dict->serialize(s.get());
899 
900 	OSSharedPtr<OSObject> o = OSUnserializeXML((const char *) s->text(), s->getLength());
901 	assert(dict->isEqualTo(o.get()));
902 
903 	dict = OSDynamicPtrCast<OSDictionary>(o);
904 	OSNumber * nnum = OSDynamicCast(OSNumber, dict->getObject("test"));
905 	assert(12345678 == (int)(10000 * nnum->doubleValue()));
906 
907 	return 0;
908 }
909 
910 static int
OSAllocationTests(int)911 OSAllocationTests(int)
912 {
913 	OSDataAllocation<int> ints(100, OSAllocateMemory);
914 	assert(ints);
915 
916 	{
917 		int counter = 0;
918 		for (int& i : ints) {
919 			i = counter++;
920 		}
921 	}
922 
923 	{
924 		int counter = 0;
925 		for (int& i : ints) {
926 			assert(i == counter);
927 			++counter;
928 		}
929 	}
930 
931 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
932 	assert(arrayZero);
933 	for (const auto& i : arrayZero) {
934 		assert(i == 0);
935 	}
936 
937 #if XNU_PLATFORM_MacOSX
938 	// Make sure we can have two-level OSAllocations
939 	{
940 		OSAllocation<OSDataAllocation<int> > testArray(10, OSAllocateMemory);
941 		for (int i = 0; i < 10; i++) {
942 			testArray[i] = OSDataAllocation<int>(10, OSAllocateMemory);
943 			for (int j = 0; j < 10; ++j) {
944 				testArray[i][j] = i + j;
945 			}
946 		}
947 
948 		for (int i = 0; i < 10; i++) {
949 			for (int j = 0; j < 10; ++j) {
950 				assert(testArray[i][j] == i + j);
951 			}
952 		}
953 	}
954 #endif /* XNU_PLATFORM_MacOSX */
955 
956 	return 0;
957 }
958 
959 static int
OSDataAllocationTests(int)960 OSDataAllocationTests(int)
961 {
962 	OSDataAllocation<int> ints(100, OSAllocateMemory);
963 	assert(ints);
964 
965 	{
966 		int counter = 0;
967 		for (int& i : ints) {
968 			i = counter++;
969 		}
970 	}
971 
972 	{
973 		int counter = 0;
974 		for (const int& i : ints) {
975 			assert(i == counter);
976 			++counter;
977 		}
978 	}
979 
980 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
981 	assert(arrayZero);
982 	for (const auto& i : arrayZero) {
983 		assert(i == 0);
984 	}
985 
986 	return 0;
987 }
988 
989 static int
OSBoundedArrayTests(int)990 OSBoundedArrayTests(int)
991 {
992 	OSBoundedArray<int, 5> ints = {0, 1, 2, 3, 4};
993 	assert(ints.size() == 5);
994 
995 	{
996 		int counter = 0;
997 		for (int& i : ints) {
998 			i = counter++;
999 		}
1000 	}
1001 
1002 	{
1003 		int counter = 0;
1004 		for (int& i : ints) {
1005 			assert(i == counter);
1006 			++counter;
1007 		}
1008 	}
1009 
1010 	return 0;
1011 }
1012 
1013 static int
OSBoundedArrayRefTests(int)1014 OSBoundedArrayRefTests(int)
1015 {
1016 	OSBoundedArray<int, 5> storage = {0, 1, 2, 3, 4};
1017 	OSBoundedArrayRef<int> ints(storage);
1018 	assert(ints);
1019 
1020 	{
1021 		int counter = 0;
1022 		for (int& i : ints) {
1023 			i = counter++;
1024 		}
1025 	}
1026 
1027 	{
1028 		int counter = 0;
1029 		for (int& i : ints) {
1030 			assert(i == counter);
1031 			++counter;
1032 		}
1033 	}
1034 
1035 	assert(ints.length() == 5);
1036 	ints = OSBoundedArrayRef<int>();
1037 	assert(ints.length() == 0);
1038 	return 0;
1039 }
1040 
1041 class OSArraySubclass : public OSArray {
1042 	OSDeclareDefaultStructors(OSArraySubclass);
1043 public:
1044 	static OSSharedPtr<OSArraySubclass> withCapacity(unsigned int inCapacity);
1045 	virtual unsigned int iteratorSize() const APPLE_KEXT_OVERRIDE;
1046 };
1047 
1048 OSDefineMetaClassAndStructors(OSArraySubclass, OSArray);
1049 
1050 OSSharedPtr<OSArraySubclass>
withCapacity(unsigned int inCapacity)1051 OSArraySubclass::withCapacity(unsigned int inCapacity)
1052 {
1053 	OSSharedPtr<OSArraySubclass> me = OSMakeShared<OSArraySubclass>();
1054 
1055 	if (me && !me->initWithCapacity(inCapacity)) {
1056 		return nullptr;
1057 	}
1058 
1059 	return me;
1060 }
1061 
1062 unsigned int
iteratorSize() const1063 OSArraySubclass::iteratorSize() const
1064 {
1065 	unsigned int result = 64;
1066 	// Has to be larger than the OSArray iterator size to prevent out-of-bounds writes
1067 	assert(result >= OSArray::iteratorSize());
1068 	return result;
1069 }
1070 
1071 class OSCISubclass : public OSCollectionIterator {
1072 	OSDeclareDefaultStructors(OSCISubclass);
1073 public:
1074 	static OSSharedPtr<OSCISubclass> withCollection(const OSCollection * inColl);
1075 };
1076 
1077 OSDefineMetaClassAndStructors(OSCISubclass, OSCollectionIterator);
1078 
1079 OSSharedPtr<OSCISubclass>
withCollection(const OSCollection * inColl)1080 OSCISubclass::withCollection(const OSCollection * inColl)
1081 {
1082 	OSSharedPtr<OSCISubclass> me = OSMakeShared<OSCISubclass>();
1083 
1084 	if (me && !me->initWithCollection(inColl)) {
1085 		return nullptr;
1086 	}
1087 
1088 	return me;
1089 }
1090 
1091 static int
OSCollectionIteratorTests(int)1092 OSCollectionIteratorTests(int)
1093 {
1094 	OSSharedPtr<OSArray> array = OSArray::withCapacity(0);
1095 	OSSharedPtr<OSString> firstObj = OSString::withCString("test object");
1096 	OSSharedPtr<OSString> secondObj = OSString::withCString("test object 2");
1097 	OSObject * current = NULL;
1098 	OSSharedPtr<OSCollectionIterator> osci = NULL;
1099 	OSSharedPtr<OSCISubclass> osciSubclass = NULL;
1100 	size_t index = 0;
1101 	array->setObject(firstObj);
1102 	array->setObject(secondObj);
1103 
1104 	// Test iteration over a normal OSArray
1105 	osci = OSCollectionIterator::withCollection(array.get());
1106 	assert(osci != NULL);
1107 
1108 	index = 0;
1109 	while ((current = osci->getNextObject()) != NULL) {
1110 		if (index == 0) {
1111 			assert(current == firstObj);
1112 		} else if (index == 1) {
1113 			assert(current == secondObj);
1114 		} else {
1115 			panic("index out of range");
1116 		}
1117 		index++;
1118 	}
1119 
1120 	// Test iteration with a OSCollectionIterator subclass over a normal OSArray
1121 	osciSubclass = OSCISubclass::withCollection(array.get());
1122 	assert(osciSubclass != NULL);
1123 
1124 	index = 0;
1125 	while ((current = osciSubclass->getNextObject()) != NULL) {
1126 		if (index == 0) {
1127 			assert(current == firstObj);
1128 		} else if (index == 1) {
1129 			assert(current == secondObj);
1130 		} else {
1131 			panic("index out of range");
1132 		}
1133 		index++;
1134 	}
1135 
1136 	// Create the OSArray subclass
1137 	OSSharedPtr<OSArraySubclass> arraySubclass = OSArraySubclass::withCapacity(0);
1138 	arraySubclass->setObject(firstObj);
1139 	arraySubclass->setObject(secondObj);
1140 	// Test iteration over a subclassed OSArray, with a large iterator size
1141 	osci = OSCollectionIterator::withCollection(arraySubclass.get());
1142 	assert(osci != NULL);
1143 
1144 	index = 0;
1145 	while ((current = osci->getNextObject()) != NULL) {
1146 		if (index == 0) {
1147 			assert(current == firstObj);
1148 		} else if (index == 1) {
1149 			assert(current == secondObj);
1150 		} else {
1151 			panic("index out of range");
1152 		}
1153 		index++;
1154 	}
1155 
1156 	// Test iteration with a OSCollectionIterator subclass over a subclassed OSArray,
1157 	// with a large iterator size.
1158 	osciSubclass = OSCISubclass::withCollection(arraySubclass.get());
1159 	assert(osciSubclass != NULL);
1160 
1161 	index = 0;
1162 	while ((current = osciSubclass->getNextObject()) != NULL) {
1163 		if (index == 0) {
1164 			assert(current == firstObj);
1165 		} else if (index == 1) {
1166 			assert(current == secondObj);
1167 		} else {
1168 			panic("index out of range");
1169 		}
1170 		index++;
1171 	}
1172 
1173 	return 0;
1174 }
1175 
1176 static int
OSBoundedPtrTests(int)1177 OSBoundedPtrTests(int)
1178 {
1179 	int array[5] = {55, 66, 77, 88, 99};
1180 	OSBoundedPtr<int> begin(&array[0], &array[0], &array[5]);
1181 	OSBoundedPtr<int> end(&array[5], &array[0], &array[5]);
1182 
1183 	{
1184 		int counter = 0;
1185 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1186 			*b = counter++;
1187 		}
1188 	}
1189 
1190 	{
1191 		int counter = 0;
1192 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1193 			assert(*b == counter);
1194 			++counter;
1195 		}
1196 	}
1197 
1198 	return 0;
1199 }
1200 
1201 static int
IODataQueueDispatchSourceTests(int)1202 IODataQueueDispatchSourceTests(int)
1203 {
1204 	constexpr uint32_t NUM_ELEMENTS = 10;
1205 	constexpr uint32_t ELEMENT_SIZE = 16;
1206 	size_t entryHeaderSize;
1207 	IODataQueueDispatchSource * dqds;
1208 	kern_return_t kr;
1209 	IODataQueueClientEnqueueEntryBlock enqueueBlock = ^(void *data, size_t dataSize) {};
1210 	IODataQueueClientDequeueEntryBlock dequeueBlock = ^(const void *data, size_t dataSize) {};
1211 	uint32_t enqueued = 0;
1212 	uint32_t tail = 0;
1213 	uint32_t head = 0;
1214 
1215 	entryHeaderSize = IODataQueueDispatchSource::GetDataQueueEntryHeaderSize();
1216 
1217 	kr = IODataQueueDispatchSource::Create(NUM_ELEMENTS * (ELEMENT_SIZE + entryHeaderSize), NULL, &dqds);
1218 	assert(kr == kIOReturnSuccess);
1219 	assert(dqds != NULL);
1220 
1221 	// empty queue, should be able to enqueue NUM_ELEMENTS
1222 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS);
1223 	assert(kr == kIOReturnSuccess);
1224 
1225 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS + 1);
1226 	assert(kr == kIOReturnOverrun);
1227 
1228 	for (uint32_t i = 0; i < NUM_ELEMENTS * 10000; i++) {
1229 		// Randomly dequeue and enqueue elements
1230 
1231 		if (enqueued > 0) {
1232 			if (enqueued < NUM_ELEMENTS - 1 && (random() % 2) == 0) {
1233 				kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1234 				assert(kr == kIOReturnSuccess);
1235 				enqueued++;
1236 				tail++;
1237 			} else {
1238 				kr = dqds->Dequeue(dequeueBlock);
1239 				assert(kr == kIOReturnSuccess);
1240 				enqueued--;
1241 				head++;
1242 			}
1243 		} else {
1244 			kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1245 			assert(kr == kIOReturnSuccess);
1246 			enqueued++;
1247 			tail++;
1248 		}
1249 		if (tail > NUM_ELEMENTS) {
1250 			tail = 1;
1251 		}
1252 		if (head > NUM_ELEMENTS) {
1253 			head = 1;
1254 		}
1255 
1256 		for (uint32_t j = 0; j <= NUM_ELEMENTS; j++) {
1257 			// Can we enqueue `j` elements
1258 			kr = dqds->CanEnqueueData(ELEMENT_SIZE, j);
1259 
1260 			if (j < NUM_ELEMENTS - enqueued || (head <= tail && tail == enqueued && j == NUM_ELEMENTS - enqueued)) {
1261 				if (kr != kIOReturnSuccess) {
1262 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnSuccess\n", i, j, enqueued, head, tail, kr);
1263 				}
1264 			} else {
1265 				if (kr != kIOReturnOverrun) {
1266 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnOverrun\n", i, j, enqueued, head, tail, kr);
1267 				}
1268 			}
1269 
1270 			if ((random() % 16) == 1) {
1271 				// Verify result of CanEnqueueData
1272 
1273 				if (kr == kIOReturnSuccess) {
1274 					// There is space for `j` elements
1275 
1276 					for (uint32_t k = 0; k < j; k++) {
1277 						kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1278 						assert(kr == kIOReturnSuccess);
1279 						enqueued++;
1280 						tail++;
1281 						if (tail > NUM_ELEMENTS) {
1282 							tail = 1;
1283 						}
1284 					}
1285 				} else if (j == 1) {
1286 					// if we are checking to see if we can enqueue one element and CanEnqueueData says there's no space,
1287 					// ensure we can't Enqueue that element
1288 					kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1289 					assert(kr == kIOReturnOverrun);
1290 				}
1291 			}
1292 		}
1293 	}
1294 
1295 	OSSafeReleaseNULL(dqds);
1296 
1297 	return kIOReturnSuccess;
1298 }
1299 
1300 struct TrivialAggregateTestType {
1301 	int a;
1302 	bool b;
1303 	float c;
1304 };
1305 class NonTrivialConstructorAggregateTestType
1306 {
1307 public:
1308 	NonTrivialConstructorAggregateTestType() = default;
1309 	int a = 3;
1310 	bool b = true;
1311 	float c = 999.f;
1312 };
1313 OSDefineValueObjectForDependentType(int)
OSDefineValueObjectForDependentType(TrivialAggregateTestType)1314 OSDefineValueObjectForDependentType(TrivialAggregateTestType)
1315 OSDefineValueObjectForDependentType(NonTrivialConstructorAggregateTestType)
1316 
1317 static int
1318 OSValueObjectTests(int)
1319 {
1320 	constexpr auto nearlyEqual = [](float a, float b)
1321 	    {
1322 		    constexpr float epsilon = 0.000001f;
1323 		    const auto diff = a - b;
1324 		    return (diff >= -epsilon) && (diff <= epsilon);
1325 	    };
1326 
1327 	// test simple built-in type
1328 	{
1329 		using T = int;
1330 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1331 		assert(test);
1332 		if (test) {
1333 			assert(test->getRef() == 0);
1334 			assert(test->isEqualTo(0));
1335 			assert(test->getBytesNoCopy());
1336 			assert(test->getBytesNoCopy() == test->getMutableBytesNoCopy());
1337 			assert(test->getLength() == sizeof(T));
1338 		}
1339 	}
1340 
1341 	// test trivial aggregate type
1342 	{
1343 		using T = TrivialAggregateTestType;
1344 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1345 		assert(test);
1346 		if (test) {
1347 			const auto *const bytes = reinterpret_cast<const uint8_t*>(test->getBytesNoCopy());
1348 			bool bytesAreZero = true;
1349 			for (size_t byteIndex = 0; byteIndex < test->getLength(); byteIndex++) {
1350 				bytesAreZero &= bytes[byteIndex] == 0;
1351 			}
1352 			assert(bytesAreZero);
1353 		}
1354 	}
1355 
1356 	// test aggregate type with non-trivial constructor
1357 	{
1358 		using T = NonTrivialConstructorAggregateTestType;
1359 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1360 		assert(test);
1361 		if (test) {
1362 			const T other;
1363 			assert(test->isEqualTo(other));
1364 			assert(test->getRef().a == other.a);
1365 			assert(test->getRef().b == other.b);
1366 			assert(nearlyEqual(test->getRef().c, other.c));
1367 		}
1368 	}
1369 
1370 	// test copying of OSValueObject
1371 	{
1372 		using T = NonTrivialConstructorAggregateTestType;
1373 		OSSharedPtr<OSValueObject<T> > test1;
1374 		T valueCopy;
1375 		{
1376 			T value; // declared in sub-scope to ensure instance-independence when it falls out of scope
1377 			value.a = 1;
1378 			value.b = true;
1379 			value.c = 3.f;
1380 			valueCopy = value;
1381 			test1 = OSValueObject<T>::withValue(value);
1382 			assert(test1);
1383 			if (test1) {
1384 				assert(test1->isEqualTo(value));
1385 				assert(test1->getRef().a == value.a);
1386 				assert(test1->getRef().b == value.b);
1387 				assert(nearlyEqual(test1->getRef().c, value.c));
1388 			}
1389 			valueCopy.a = 100;
1390 			test1->getMutableRef().a = valueCopy.a;
1391 		}
1392 		if (test1) {
1393 			OSSharedPtr<OSValueObject<T> > test2 = OSValueObject<T>::withValueObject(test1.get());
1394 			if (test2) {
1395 				assert(test2->isEqualTo(test1.get()));
1396 				assert(test2->getRef().a == valueCopy.a);
1397 				assert(test2->getRef().b == valueCopy.b);
1398 				assert(nearlyEqual(test2->getRef().c, valueCopy.c));
1399 			}
1400 		}
1401 	}
1402 
1403 	return KERN_SUCCESS;
1404 }
1405 
1406 
1407 static int
IOSharedDataQueue_44636964(__unused int newValue)1408 IOSharedDataQueue_44636964(__unused int newValue)
1409 {
1410 	OSSharedPtr<IOSharedDataQueue> sd = IOSharedDataQueue::withCapacity(DATA_QUEUE_ENTRY_HEADER_SIZE + sizeof(UInt64));
1411 	UInt64 data = 0x11223344aa55aa55;
1412 	UInt32 data2 = 0x44332211;
1413 	UInt32 size = sizeof(UInt32);
1414 	/* enqueue moves tail to end */
1415 	sd->enqueue(&data, sizeof(UInt64));
1416 	/* dequeue moves head to end */
1417 	sd->dequeue(&data, &size);
1418 	/* Tail wraps around, head is still at end */
1419 	sd->enqueue(&data2, sizeof(UInt32));
1420 	/* something in the queue so peek() should return non-null */
1421 	assert(sd->peek() != NULL);
1422 	return KERN_SUCCESS;
1423 }
1424 
1425 #if 0
1426 #include <IOKit/IOUserClient.h>
1427 class TestUserClient : public IOUserClient
1428 {
1429 	OSDeclareDefaultStructors(TestUserClient);
1430 	virtual void stop( IOService *provider) APPLE_KEXT_OVERRIDE;
1431 	virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE;
1432 	virtual IOReturn externalMethod( uint32_t selector,
1433 	    IOExternalMethodArguments * arguments,
1434 	    IOExternalMethodDispatch * dispatch,
1435 	    OSObject * target,
1436 	    void * reference ) APPLE_KEXT_OVERRIDE;
1437 };
1438 
1439 void
1440 TestUserClient::stop( IOService *provider)
1441 {
1442 	kprintf("TestUserClient::stop\n");
1443 }
1444 bool
1445 TestUserClient::finalize(IOOptionBits options)
1446 {
1447 	kprintf("TestUserClient::finalize\n");
1448 	return true;
1449 }
1450 IOReturn
1451 TestUserClient::externalMethod( uint32_t selector,
1452     IOExternalMethodArguments * arguments,
1453     IOExternalMethodDispatch * dispatch,
1454     OSObject * target,
1455     void * reference )
1456 {
1457 	getProvider()->terminate();
1458 	IOSleep(500);
1459 	return 0;
1460 }
1461 OSDefineMetaClassAndStructors(TestUserClient, IOUserClient);
1462 #endif
1463 
1464 static int
IOServiceTest(int newValue)1465 IOServiceTest(int newValue)
1466 {
1467 	OSSharedPtr<OSDictionary> matching;
1468 	IONotifier        * note;
1469 	__block IOService * found;
1470 
1471 #if 0
1472 	found = new IOService;
1473 	found->init();
1474 	found->setName("IOTestUserClientProvider");
1475 	found->attach(IOService::getPlatform());
1476 	found->setProperty("IOUserClientClass", "TestUserClient");
1477 	found->registerService();
1478 #endif
1479 
1480 	matching = IOService::serviceMatching("IOPlatformExpert");
1481 	assert(matching);
1482 	found = nullptr;
1483 	note = IOService::addMatchingNotification(gIOMatchedNotification, matching.get(), 0,
1484 	    ^bool (IOService * newService, IONotifier * notifier) {
1485 		kprintf("found %s, %d\n", newService->getName(), newService->getRetainCount());
1486 		found = newService;
1487 		found->retain();
1488 		return true;
1489 	}
1490 	    );
1491 	assert(note);
1492 	assert(found);
1493 	note->remove();
1494 
1495 	note = found->registerInterest(gIOBusyInterest,
1496 	    ^IOReturn (uint32_t messageType, IOService * provider,
1497 	    void   * messageArgument, size_t argSize) {
1498 		kprintf("%p messageType 0x%08x %p\n", provider, messageType, messageArgument);
1499 		return kIOReturnSuccess;
1500 	}).detach();
1501 	assert(note);
1502 	IOSleep(1 * 1000);
1503 	note->remove();
1504 	found->release();
1505 
1506 	return 0;
1507 }
1508 
1509 static void
OSStaticPtrCastTests()1510 OSStaticPtrCastTests()
1511 {
1512 	// const& overload
1513 	{
1514 		OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1515 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1516 		assert(collection == dict);
1517 	}
1518 	{
1519 		OSSharedPtr<OSDictionary> const dict = nullptr;
1520 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1521 		assert(collection == nullptr);
1522 	}
1523 	// && overload
1524 	{
1525 		OSSharedPtr<OSDictionary> dict = OSMakeShared<OSDictionary>();
1526 		OSDictionary* oldDict = dict.get();
1527 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1528 		assert(collection.get() == oldDict);
1529 		assert(dict == nullptr);
1530 	}
1531 	{
1532 		OSSharedPtr<OSDictionary> dict = nullptr;
1533 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1534 		assert(collection == nullptr);
1535 		assert(dict == nullptr);
1536 	}
1537 }
1538 
1539 static void
OSConstPtrCastTests()1540 OSConstPtrCastTests()
1541 {
1542 	// const& overload
1543 	{
1544 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1545 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1546 		assert(dict2 == dict);
1547 	}
1548 	{
1549 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1550 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1551 		assert(dict2 == dict);
1552 	}
1553 	{
1554 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1555 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1556 		assert(dict2 == nullptr);
1557 	}
1558 	{
1559 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1560 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1561 		assert(dict2 == nullptr);
1562 	}
1563 
1564 	// && overload
1565 	{
1566 		OSSharedPtr<OSDictionary const> dict = OSMakeShared<OSDictionary>();
1567 		OSDictionary const* oldDict = dict.get();
1568 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1569 		assert(dict == nullptr);
1570 		assert(dict2 == oldDict);
1571 	}
1572 	{
1573 		OSSharedPtr<OSDictionary const> dict = nullptr;
1574 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1575 		assert(dict == nullptr);
1576 		assert(dict2 == nullptr);
1577 	}
1578 }
1579 
1580 static void
OSDynamicPtrCastTests()1581 OSDynamicPtrCastTests()
1582 {
1583 	OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1584 	{
1585 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1586 		assert(collection != nullptr);
1587 	}
1588 	{
1589 		OSSharedPtr<OSArray> array = OSDynamicPtrCast<OSArray>(dict);
1590 		assert(array == nullptr);
1591 		assert(dict != nullptr);
1592 	}
1593 	{
1594 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1595 		OSTaggedSharedPtr<OSCollection, OSCollection> collection = OSDynamicPtrCast<OSCollection>(taggedDict);
1596 		assert(collection != nullptr);
1597 	}
1598 	{
1599 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1600 		OSTaggedSharedPtr<OSArray, OSCollection> array = OSDynamicPtrCast<OSArray>(taggedDict);
1601 		assert(array == nullptr);
1602 		assert(dict != nullptr);
1603 	}
1604 	{
1605 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1606 		assert(collection.get() == OSDynamicCast(OSDictionary, dict.get()));
1607 		OSSharedPtr<OSDictionary> newDict = OSDynamicPtrCast<OSDictionary>(os::move(collection));
1608 		assert(collection == nullptr);
1609 		assert(newDict != nullptr);
1610 		assert(newDict.get() == dict.get());
1611 	}
1612 }
1613 
1614 
1615 class IOTestUserNotification : public IOUserNotification
1616 {
1617 	OSDeclareDefaultStructors(IOTestUserNotification);
1618 };
1619 
1620 OSDefineMetaClassAndStructors(IOTestUserNotification, IOUserNotification)
1621 
1622 struct IOUserNotificationTestThreadArgs {
1623 	IOTestUserNotification * userNotify;
1624 	IOLock * lock;
1625 	size_t * completed;
1626 	size_t iterations;
1627 };
1628 
1629 static bool
IOUserNotificationMatchingHandler(void * target __unused,void * ref __unused,IOService * newService __unused,IONotifier * notifier __unused)1630 IOUserNotificationMatchingHandler( void * target __unused,
1631     void * ref __unused, IOService * newService __unused, IONotifier * notifier __unused )
1632 {
1633 	return true;
1634 }
1635 
1636 static void
IOUserNotificationTestThread(void * arg,wait_result_t result __unused)1637 IOUserNotificationTestThread(void * arg, wait_result_t result __unused)
1638 {
1639 	IOUserNotificationTestThreadArgs * threadArgs = (IOUserNotificationTestThreadArgs *)arg;
1640 
1641 	OSSharedPtr<OSDictionary> dict = OSDictionary::withCapacity(0);
1642 	OSSharedPtr<OSString> rootPath = OSString::withCStringNoCopy(":/");
1643 	dict->setObject(gIOPathMatchKey, rootPath);
1644 
1645 	for (size_t i = 0; i < threadArgs->iterations; i++) {
1646 		if (i % 2 == 0) {
1647 			IONotifier * notify = IOService::addMatchingNotification( gIOWillTerminateNotification, dict.get(),
1648 			    &IOUserNotificationMatchingHandler, NULL );
1649 			threadArgs->userNotify->setNotification(notify);
1650 		} else {
1651 			threadArgs->userNotify->setNotification(NULL);
1652 		}
1653 	}
1654 
1655 	threadArgs->userNotify->setNotification(NULL);
1656 
1657 	IOLockLock(threadArgs->lock);
1658 	*threadArgs->completed = *threadArgs->completed + 1;
1659 	IOLockWakeup(threadArgs->lock, (event_t)threadArgs->completed, true);
1660 	IOLockUnlock(threadArgs->lock);
1661 }
1662 
1663 static int
IOUserNotificationTests(__unused int newValue)1664 IOUserNotificationTests(__unused int newValue)
1665 {
1666 	constexpr size_t numThreads = 10;
1667 	constexpr size_t numIterations = 500000;
1668 	OSSharedPtr<IOTestUserNotification> userNotify = OSMakeShared<IOTestUserNotification>();
1669 	IOLock * lock = IOLockAlloc();
1670 	size_t threadsCompleted;
1671 	size_t i = 0;
1672 	thread_t threads[numThreads];
1673 	kern_return_t kr;
1674 	bool result;
1675 
1676 	struct IOUserNotificationTestThreadArgs threadArgs = {
1677 		.userNotify = userNotify.get(),
1678 		.lock = lock,
1679 		.completed = &threadsCompleted,
1680 		.iterations = numIterations,
1681 	};
1682 
1683 	result = userNotify->init();
1684 	assert(result);
1685 
1686 	for (i = 0; i < numThreads; i++) {
1687 		kr = kernel_thread_start(&IOUserNotificationTestThread, (void *)&threadArgs, &threads[i]);
1688 		assert(kr == KERN_SUCCESS);
1689 	}
1690 
1691 	IOLockLock(lock);
1692 	while (threadsCompleted < numThreads) {
1693 		IOLockSleep(lock, &threadsCompleted, THREAD_UNINT);
1694 		IOLog("%s: Threads completed: %zu/%zu\n", __func__, threadsCompleted, numThreads);
1695 	}
1696 	IOLockUnlock(lock);
1697 
1698 	for (i = 0; i < numThreads; i++) {
1699 		thread_deallocate(threads[i]);
1700 	}
1701 
1702 	userNotify->setNotification(NULL);
1703 
1704 	IOLockFree(lock);
1705 
1706 	return KERN_SUCCESS;
1707 }
1708 
1709 static void
IOServiceMatchingSharedPtrTests()1710 IOServiceMatchingSharedPtrTests()
1711 {
1712 	OSSharedPtr<const OSSymbol> name = OSSymbol::withCString("name");
1713 	OSSharedPtr<const OSSymbol> value = OSSymbol::withCString("value");
1714 
1715 	{
1716 		OSSharedPtr<OSDictionary> table;
1717 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching("name", table);
1718 		assert(result);
1719 		assert(result->getRetainCount() == 1);
1720 
1721 		table = result;
1722 		assert(table->getRetainCount() == 2);
1723 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching("name", table);
1724 		assert(result2);
1725 		assert(result2 == table);
1726 		assert(result2->getRetainCount() == 3);
1727 	}
1728 
1729 	{
1730 		OSSharedPtr<OSDictionary> table;
1731 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching(name.get(), table);
1732 		assert(result);
1733 		assert(result->getRetainCount() == 1);
1734 
1735 		table = result;
1736 		assert(table->getRetainCount() == 2);
1737 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching(name.get(), table);
1738 		assert(result2);
1739 		assert(result2 == table);
1740 		assert(result2->getRetainCount() == 3);
1741 	}
1742 
1743 	{
1744 		OSSharedPtr<OSDictionary> table;
1745 		OSSharedPtr<OSDictionary> result = IOService::nameMatching("name", table);
1746 		assert(result);
1747 		assert(result->getRetainCount() == 1);
1748 
1749 		table = result;
1750 		assert(table->getRetainCount() == 2);
1751 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching("name", table);
1752 		assert(result2);
1753 		assert(result2 == table);
1754 		assert(result2->getRetainCount() == 3);
1755 	}
1756 
1757 	{
1758 		OSSharedPtr<OSDictionary> table;
1759 		OSSharedPtr<OSDictionary> result = IOService::nameMatching(name.get(), table);
1760 		assert(result);
1761 		assert(result->getRetainCount() == 1);
1762 
1763 		table = result;
1764 		assert(table->getRetainCount() == 2);
1765 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching(name.get(), table);
1766 		assert(result2);
1767 		assert(result2 == table);
1768 		assert(result2->getRetainCount() == 3);
1769 	}
1770 
1771 	{
1772 		OSSharedPtr<OSDictionary> table;
1773 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching("name", table);
1774 		assert(result);
1775 		assert(result->getRetainCount() == 1);
1776 
1777 		table = result;
1778 		assert(table->getRetainCount() == 2);
1779 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching("name", table);
1780 		assert(result2);
1781 		assert(result2 == table);
1782 		assert(result2->getRetainCount() == 3);
1783 	}
1784 
1785 	{
1786 		OSSharedPtr<OSDictionary> table;
1787 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching(name.get(), table);
1788 		assert(result);
1789 		assert(result->getRetainCount() == 1);
1790 
1791 		table = result;
1792 		assert(table->getRetainCount() == 2);
1793 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching(name.get(), table);
1794 		assert(result2);
1795 		assert(result2 == table);
1796 		assert(result2->getRetainCount() == 3);
1797 	}
1798 
1799 	{
1800 		OSSharedPtr<OSDictionary> table;
1801 		OSSharedPtr<OSDictionary> result = IOService::propertyMatching(name.get(), value.get(), table);
1802 		assert(result);
1803 		assert(result->getRetainCount() == 1);
1804 
1805 		table = result;
1806 		assert(table->getRetainCount() == 2);
1807 		OSSharedPtr<OSDictionary> result2 = IOService::propertyMatching(name.get(), value.get(), table);
1808 		assert(result2);
1809 		assert(result2 == table);
1810 		assert(result2->getRetainCount() == 3);
1811 	}
1812 
1813 	{
1814 		OSSharedPtr<OSDictionary> table;
1815 		OSSharedPtr<OSDictionary> result = IOService::registryEntryIDMatching(12, table);
1816 		assert(result);
1817 		assert(result->getRetainCount() == 1);
1818 
1819 		table = result;
1820 		assert(table->getRetainCount() == 2);
1821 		OSSharedPtr<OSDictionary> result2 = IOService::registryEntryIDMatching(12, table);
1822 		assert(result2);
1823 		assert(result2 == table);
1824 		assert(result2->getRetainCount() == 3);
1825 	}
1826 }
1827 
1828 static int
OSSharedPtrTests(int)1829 OSSharedPtrTests(int)
1830 {
1831 	OSDynamicPtrCastTests();
1832 	OSConstPtrCastTests();
1833 	OSStaticPtrCastTests();
1834 	IOServiceMatchingSharedPtrTests();
1835 	return 0;
1836 }
1837 
1838 static int
IOServiceStateNotificationTests(int)1839 IOServiceStateNotificationTests(int)
1840 {
1841 	IOService * service = IOService::getSystemStateNotificationService();
1842 	OSSharedPtr<OSString> str = OSString::withCString(kIOSystemStateClamshellKey);
1843 	kern_return_t kr = service->StateNotificationItemCreate(str.get(), NULL);
1844 	assert(kIOReturnSuccess == kr);
1845 
1846 	void (^sendClam)(OSBoolean * state) = ^void (OSBoolean * state) {
1847 		OSSharedPtr<OSDictionary> value;
1848 		kern_return_t kr;
1849 
1850 		value = OSDictionary::withCapacity(4);
1851 		value->setObject("value", state);
1852 		kr = IOService::getSystemStateNotificationService()->StateNotificationItemSet(str.get(), value.get());
1853 		assert(kIOReturnSuccess == kr);
1854 	};
1855 	sendClam(kOSBooleanTrue);
1856 	IOSleep(100);
1857 	sendClam(kOSBooleanFalse);
1858 
1859 	str = OSString::withCString("test");
1860 	OSSharedPtr<OSArray> array = OSArray::withCapacity(4);
1861 	array->setObject(str.get());
1862 	IOStateNotificationListenerRef listenerRef;
1863 	kr = service->stateNotificationListenerAdd(array.get(), &listenerRef, ^kern_return_t () {
1864 		IOLog("test handler\n");
1865 		kern_return_t kr;
1866 		OSDictionary * dict;
1867 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1868 		if (kIOReturnSuccess == kr) {
1869 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1870 		        dict->serialize(s.get());
1871 		        IOLog("test handler %s\n", s->text());
1872 		}
1873 		return kIOReturnSuccess;
1874 	});
1875 	assert(kIOReturnSuccess == kr);
1876 
1877 	OSSharedPtr<IOEventSource> es =
1878 	    IOServiceStateNotificationEventSource::serviceStateNotificationEventSource(
1879 		service, array.get(),
1880 		^void () {
1881 		IOLog("test es handler\n");
1882 		kern_return_t kr;
1883 		OSDictionary * dict;
1884 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1885 		if (kIOReturnSuccess == kr) {
1886 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1887 		        dict->serialize(s.get());
1888 		        IOLog("test es handler %s\n", s->text());
1889 		}
1890 	});
1891 	assert(es);
1892 	IOService::getPlatform()->getWorkLoop()->addEventSource(es.get());
1893 	es->enable();
1894 	IOSleep(30 * 1000);
1895 	IOService::getPlatform()->getWorkLoop()->removeEventSource(es.get());
1896 
1897 	return kIOReturnSuccess;
1898 }
1899 
1900 static int
IOMallocPageableTests(int)1901 IOMallocPageableTests(int)
1902 {
1903 	vm_size_t size = 0;
1904 	vm_size_t alignment = 0;
1905 
1906 	for (size = 0; size <= 4 * page_size; size += 64) {
1907 		for (alignment = 1; alignment <= page_size; alignment <<= 1) {
1908 			uintptr_t alignMask = alignment - 1;
1909 			void * addr = IOMallocPageable(size, alignment);
1910 			if (addr == NULL) {
1911 				IOLog("IOMallocPageable(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1912 				return kIOReturnError;
1913 			}
1914 			if (((uintptr_t)addr & alignMask) != 0) {
1915 				IOLog("IOMallocPageable(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1916 				return kIOReturnError;
1917 			}
1918 			IOFreePageable(addr, size);
1919 
1920 			addr = IOMallocPageableZero(size, alignment);
1921 			if (addr == NULL) {
1922 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1923 				return kIOReturnError;
1924 			}
1925 			if (((uintptr_t)addr & alignMask) != 0) {
1926 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1927 				return kIOReturnError;
1928 			}
1929 			for (char * ptr = (char *)addr; ptr < (char *)addr + size; ptr++) {
1930 				if (*ptr != 0) {
1931 					IOLog("IOMallocPageableZero(size=%u, alignment=%u) -> %p, byte at %p is nonzero\n", (uint32_t)size, (uint32_t)alignment, addr, ptr);
1932 				}
1933 			}
1934 			IOFreePageable(addr, size);
1935 		}
1936 	}
1937 
1938 	return kIOReturnSuccess;
1939 }
1940 
1941 static int
Test100367284(int)1942 Test100367284(int)
1943 {
1944 	OSSharedPtr<IOService> entry;
1945 	OSSharedPtr<IOService> replace;
1946 	OSSharedPtr<IOService> root;
1947 
1948 	root = OSDynamicPtrCast<IOService>(IORegistryEntry::fromPath("/", gIODTPlane));
1949 	entry = OSMakeShared<IOService>();
1950 	entry->init();
1951 	entry->attachToParent(root.get(), gIODTPlane);
1952 	entry->attachToParent(root.get(), gIOServicePlane);
1953 
1954 	replace = OSMakeShared<IOService>();
1955 	replace->init(entry.get(), gIODTPlane);
1956 	replace->detachFromParent(root.get(), gIODTPlane);
1957 
1958 	return kIOReturnSuccess;
1959 }
1960 
1961 
1962 #endif  /* DEVELOPMENT || DEBUG */
1963 
1964 #ifndef __clang_analyzer__
1965 // All the scary things that this function is doing, such as the intentional
1966 // overrelease of an OSData, are hidden from the static analyzer.
1967 static int
sysctl_iokittest(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)1968 sysctl_iokittest(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
1969 {
1970 	int error;
1971 	int newValue, changed;
1972 
1973 	error = sysctl_io_number(req, 0, sizeof(int), &newValue, &changed);
1974 	if (error) {
1975 		return error;
1976 	}
1977 
1978 #if DEVELOPMENT || DEBUG
1979 	if (changed && (66 == newValue)) {
1980 		IOReturn ret;
1981 		OSSharedPtr<IOWorkLoop> wl = IOWorkLoop::workLoop();
1982 		OSSharedPtr<IOCommandGate> cg = IOCommandGate::commandGate(wl.get());
1983 		ret = wl->addEventSource(cg.get());
1984 
1985 		struct x {
1986 			uint64_t h;
1987 			uint64_t l;
1988 		};
1989 		struct x y;
1990 
1991 		y.h = 0x1111111122222222;
1992 		y.l = 0x3333333344444444;
1993 
1994 		kprintf("ret1 %d\n", ret);
1995 		ret = cg->runActionBlock(^(){
1996 			printf("hello %d 0x%qx\n", wl->inGate(), y.h);
1997 			return 99;
1998 		});
1999 		kprintf("ret %d\n", ret);
2000 	}
2001 
2002 	if (changed && (999 == newValue)) {
2003 		OSSharedPtr<OSData> data = OSData::withCapacity(16);
2004 		data->release();
2005 	}
2006 
2007 	if (changed && (newValue >= 6666) && (newValue <= 6669)) {
2008 		OSSharedPtr<OSIterator> iter;
2009 		IOService  * service;
2010 
2011 		service = NULL;
2012 		OSSharedPtr<OSDictionary> matchingDict = IOService::nameMatching("XHC1");
2013 		iter = IOService::getMatchingServices(matchingDict.get());
2014 		if (iter && (service = (IOService *) iter->getNextObject())) {
2015 			if (newValue == 6666) {
2016 				IOLog("terminating 0x%qx\n", service->getRegistryEntryID());
2017 				service->terminate();
2018 			} else if (newValue == 6667) {
2019 				IOLog("register 0x%qx\n", service->getRegistryEntryID());
2020 				service->registerService();
2021 			}
2022 		}
2023 		if (service) {
2024 			return 0;
2025 		}
2026 	}
2027 
2028 
2029 	if (changed && (555 == newValue)) {
2030 		IOServiceStateNotificationTests(newValue);
2031 	}
2032 #if TEST_ZLIB
2033 	if (changed && (122 == newValue)) {
2034 		error = TestZLib(newValue);
2035 		assert(KERN_SUCCESS == error);
2036 	}
2037 #endif /* TEST_ZLIB */
2038 	if (changed && newValue) {
2039 		error = Test100367284(newValue);
2040 		assert(KERN_SUCCESS == error);
2041 		error = IOWorkLoopTest(newValue);
2042 		assert(KERN_SUCCESS == error);
2043 		error = IOServiceTest(newValue);
2044 		assert(KERN_SUCCESS == error);
2045 		error = OSCollectionTest(newValue);
2046 		assert(KERN_SUCCESS == error);
2047 		error = OSCollectionIteratorTests(newValue);
2048 		assert(KERN_SUCCESS == error);
2049 		error = OSAllocationTests(newValue);
2050 		assert(KERN_SUCCESS == error);
2051 		error = OSDataAllocationTests(newValue);
2052 		assert(KERN_SUCCESS == error);
2053 		error = OSBoundedArrayTests(newValue);
2054 		assert(KERN_SUCCESS == error);
2055 		error = OSBoundedArrayRefTests(newValue);
2056 		assert(KERN_SUCCESS == error);
2057 		error = OSBoundedPtrTests(newValue);
2058 		assert(KERN_SUCCESS == error);
2059 		error = OSValueObjectTests(newValue);
2060 		assert(KERN_SUCCESS == error);
2061 		error = IOMemoryDescriptorTest(newValue);
2062 		assert(KERN_SUCCESS == error);
2063 		error = OSSharedPtrTests(newValue);
2064 		assert(KERN_SUCCESS == error);
2065 		error = IOSharedDataQueue_44636964(newValue);
2066 		assert(KERN_SUCCESS == error);
2067 		error = IOUserNotificationTests(newValue);
2068 		assert(KERN_SUCCESS == error);
2069 		error = IOMallocPageableTests(newValue);
2070 		assert(KERN_SUCCESS == error);
2071 		error = IODataQueueDispatchSourceTests(newValue);
2072 		assert(KERN_SUCCESS == error);
2073 	}
2074 #endif  /* DEVELOPMENT || DEBUG */
2075 
2076 	return error;
2077 }
2078 
2079 SYSCTL_PROC(_kern, OID_AUTO, iokittest,
2080     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_KERN | CTLFLAG_LOCKED,
2081     NULL, 0, sysctl_iokittest, "I", "");
2082 #endif // __clang_analyzer__
2083 
2084 #if DEVELOPMENT || DEBUG
2085 
2086 /*
2087  * A simple wrapper around an IOService. This terminates the IOService in free().
2088  */
2089 class TestIOServiceHandle : public OSObject
2090 {
2091 	OSDeclareDefaultStructors(TestIOServiceHandle);
2092 public:
2093 	static TestIOServiceHandle * withService(IOService * service);
2094 
2095 private:
2096 	bool initWithService(IOService * service);
2097 	virtual void free() APPLE_KEXT_OVERRIDE;
2098 
2099 	IOService * fService;
2100 };
2101 
2102 OSDefineMetaClassAndStructors(TestIOServiceHandle, OSObject);
2103 
2104 TestIOServiceHandle *
withService(IOService * service)2105 TestIOServiceHandle::withService(IOService * service)
2106 {
2107 	TestIOServiceHandle * handle = new TestIOServiceHandle;
2108 	if (handle && !handle->initWithService(service)) {
2109 		return NULL;
2110 	}
2111 	return handle;
2112 }
2113 
2114 bool
initWithService(IOService * service)2115 TestIOServiceHandle::initWithService(IOService * service)
2116 {
2117 	fService = service;
2118 	fService->retain();
2119 	return true;
2120 }
2121 
2122 void
free()2123 TestIOServiceHandle::free()
2124 {
2125 	if (fService) {
2126 		fService->terminate();
2127 		OSSafeReleaseNULL(fService);
2128 	}
2129 }
2130 
2131 /*
2132  * Set up test IOServices. See the available services in xnu/iokit/Tests/TestServices.
2133  *
2134  * xnu darwintests use this sysctl to make these test services available. A send right is pushed
2135  * to the task that called the sysctl, which when deallocated removes the service. This ensures
2136  * that the registry isn't polluted by misbehaving tests.
2137  *
2138  * Since this sysctl allows callers to instantiate arbitrary classes based on their class name,
2139  * this can be a security concern. Tests that call this sysctl need the
2140  * kIOServiceTestServiceManagementEntitlementKey entitlement.
2141  */
2142 static int
sysctl_iokit_test_service_setup(struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)2143 sysctl_iokit_test_service_setup(struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
2144 {
2145 	char classname[128] = {0};
2146 	IOService * service; // must not release
2147 	OSObject * obj = NULL; // must release
2148 	IOService * provider = NULL; // must not release
2149 	TestIOServiceHandle * handle = NULL; // must release
2150 	mach_port_name_t name __unused;
2151 	int error;
2152 
2153 	if (!IOTaskHasEntitlement(current_task(), kIOServiceTestServiceManagementEntitlementKey)) {
2154 		error = EPERM;
2155 		goto finish;
2156 	}
2157 
2158 	error = sysctl_handle_string(oidp, classname, sizeof(classname), req);
2159 	if (error != 0) {
2160 		goto finish;
2161 	}
2162 
2163 	/*
2164 	 * All test services currently attach to IOResources.
2165 	 */
2166 	provider = IOService::getResourceService();
2167 	if (!provider) {
2168 		IOLog("Failed to find IOResources\n");
2169 		error = ENOENT;
2170 		goto finish;
2171 	}
2172 
2173 	obj = OSMetaClass::allocClassWithName(classname);
2174 	if (!obj) {
2175 		IOLog("Failed to alloc class %s\n", classname);
2176 		error = ENOENT;
2177 		goto finish;
2178 	}
2179 
2180 	service = OSDynamicCast(IOService, obj);
2181 
2182 	if (!service) {
2183 		IOLog("Instance of class %s is not an IOService\n", classname);
2184 		error = EINVAL;
2185 		goto finish;
2186 	}
2187 
2188 	if (!service->init()) {
2189 		IOLog("Failed to initialize %s\n", classname);
2190 		error = EINVAL;
2191 		goto finish;
2192 	}
2193 
2194 	if (!service->attach(provider)) {
2195 		IOLog("Failed to attach %s\n", classname);
2196 		error = EINVAL;
2197 		goto finish;
2198 	}
2199 
2200 	if (!service->start(provider)) {
2201 		IOLog("Failed to start %s\n", classname);
2202 		error = EINVAL;
2203 		goto finish;
2204 	}
2205 
2206 	handle = TestIOServiceHandle::withService(service);
2207 	if (!handle) {
2208 		IOLog("Failed to create service handle\n");
2209 		error = ENOMEM;
2210 		goto finish;
2211 	}
2212 	name = iokit_make_send_right(current_task(), handle, IKOT_IOKIT_OBJECT);
2213 
2214 	error = 0;
2215 
2216 finish:
2217 
2218 	OSSafeReleaseNULL(obj);
2219 	OSSafeReleaseNULL(handle);
2220 	return error;
2221 }
2222 
2223 
2224 SYSCTL_PROC(_kern, OID_AUTO, iokit_test_service_setup,
2225     CTLTYPE_STRING | CTLFLAG_WR | CTLFLAG_KERN | CTLFLAG_LOCKED,
2226     NULL, 0, sysctl_iokit_test_service_setup, "-", "");
2227 
2228 #endif /* DEVELOPMENT || DEBUG */
2229 
2230 
2231 static __unused void
CastCompileTest(OSObject * obj)2232 CastCompileTest(OSObject *obj)
2233 {
2234 	IOService * service1 = OSDynamicCast(IOService, obj);
2235 	if (service1) {
2236 		service1->terminate();
2237 	}
2238 	IOService *service2 = OSRequiredCast(IOService, obj);
2239 	if (service2) {
2240 		service2->terminate();
2241 	}
2242 }
2243