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
216static uint64_t gIOWorkLoopTestDeadline;
217
218#if TEST_ZLIB
219
220static void *
221TestZLib_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
238static void
239TestZLib_free(void * __unused ref, void * ptr)
240{
241}
242
243static int
244TestZLib(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
788static void
789TESAction(OSObject * owner, IOTimerEventSource * tes)
790{
791 if (mach_absolute_time() < gIOWorkLoopTestDeadline) {
792 tes->setTimeout(1, kMicrosecondScale);
793 }
794}
795
796static int
797IOWorkLoopTest(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
848static int
849OSCollectionTest(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
910static int
911OSAllocationTests(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
959static int
960OSDataAllocationTests(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
989static int
990OSBoundedArrayTests(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
1013static int
1014OSBoundedArrayRefTests(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
1041class OSArraySubclass : public OSArray {
1042 OSDeclareDefaultStructors(OSArraySubclass);
1043public:
1044 static OSSharedPtr<OSArraySubclass> withCapacity(unsigned int inCapacity);
1045 virtual unsigned int iteratorSize() const APPLE_KEXT_OVERRIDE;
1046};
1047
1048OSDefineMetaClassAndStructors(OSArraySubclass, OSArray);
1049
1050OSSharedPtr<OSArraySubclass>
1051OSArraySubclass::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
1062unsigned int
1063OSArraySubclass::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
1071class OSCISubclass : public OSCollectionIterator {
1072 OSDeclareDefaultStructors(OSCISubclass);
1073public:
1074 static OSSharedPtr<OSCISubclass> withCollection(const OSCollection * inColl);
1075};
1076
1077OSDefineMetaClassAndStructors(OSCISubclass, OSCollectionIterator);
1078
1079OSSharedPtr<OSCISubclass>
1080OSCISubclass::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
1091static int
1092OSCollectionIteratorTests(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
1176static int
1177OSBoundedPtrTests(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
1201static int
1202IODataQueueDispatchSourceTests(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
1300struct TrivialAggregateTestType {
1301 int a;
1302 bool b;
1303 float c;
1304};
1305OSDefineValueObjectForDependentType(int)
1306OSDefineValueObjectForDependentType(TrivialAggregateTestType)
1307
1308static int
1309OSValueObjectTests(int)
1310{
1311 // test simple built-in type
1312 {
1313 using T = int;
1314 OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1315 assert(test);
1316 if (test) {
1317 assert(test->getRef() == 0);
1318 assert(test->isEqualTo(0));
1319 assert(test->getBytesNoCopy());
1320 assert(test->getBytesNoCopy() == test->getMutableBytesNoCopy());
1321 assert(test->getLength() == sizeof(T));
1322 }
1323 }
1324
1325 // test trivial aggregate type
1326 {
1327 using T = TrivialAggregateTestType;
1328 OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1329 assert(test);
1330 if (test) {
1331 const auto *const bytes = reinterpret_cast<const uint8_t*>(test->getBytesNoCopy());
1332 bool bytesAreZero = true;
1333 for (size_t byteIndex = 0; byteIndex < test->getLength(); byteIndex++) {
1334 bytesAreZero &= bytes[byteIndex] == 0;
1335 }
1336 assert(bytesAreZero);
1337 }
1338 }
1339
1340 return KERN_SUCCESS;
1341}
1342
1343
1344static int
1345IOSharedDataQueue_44636964(__unused int newValue)
1346{
1347 OSSharedPtr<IOSharedDataQueue> sd = IOSharedDataQueue::withCapacity(DATA_QUEUE_ENTRY_HEADER_SIZE + sizeof(UInt64));
1348 UInt64 data = 0x11223344aa55aa55;
1349 UInt32 data2 = 0x44332211;
1350 UInt32 size = sizeof(UInt32);
1351 /* enqueue moves tail to end */
1352 sd->enqueue(&data, sizeof(UInt64));
1353 /* dequeue moves head to end */
1354 sd->dequeue(&data, &size);
1355 /* Tail wraps around, head is still at end */
1356 sd->enqueue(&data2, sizeof(UInt32));
1357 /* something in the queue so peek() should return non-null */
1358 assert(sd->peek() != NULL);
1359 return KERN_SUCCESS;
1360}
1361
1362#if 0
1363#include <IOKit/IOUserClient.h>
1364class TestUserClient : public IOUserClient
1365{
1366 OSDeclareDefaultStructors(TestUserClient);
1367 virtual void stop( IOService *provider) APPLE_KEXT_OVERRIDE;
1368 virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE;
1369 virtual IOReturn externalMethod( uint32_t selector,
1370 IOExternalMethodArguments * arguments,
1371 IOExternalMethodDispatch * dispatch,
1372 OSObject * target,
1373 void * reference ) APPLE_KEXT_OVERRIDE;
1374};
1375
1376void
1377TestUserClient::stop( IOService *provider)
1378{
1379 kprintf("TestUserClient::stop\n");
1380}
1381bool
1382TestUserClient::finalize(IOOptionBits options)
1383{
1384 kprintf("TestUserClient::finalize\n");
1385 return true;
1386}
1387IOReturn
1388TestUserClient::externalMethod( uint32_t selector,
1389 IOExternalMethodArguments * arguments,
1390 IOExternalMethodDispatch * dispatch,
1391 OSObject * target,
1392 void * reference )
1393{
1394 getProvider()->terminate();
1395 IOSleep(500);
1396 return 0;
1397}
1398OSDefineMetaClassAndStructors(TestUserClient, IOUserClient);
1399#endif
1400
1401static int
1402IOServiceTest(int newValue)
1403{
1404 OSSharedPtr<OSDictionary> matching;
1405 IONotifier * note;
1406 __block IOService * found;
1407
1408#if 0
1409 found = new IOService;
1410 found->init();
1411 found->setName("IOTestUserClientProvider");
1412 found->attach(IOService::getPlatform());
1413 found->setProperty("IOUserClientClass", "TestUserClient");
1414 found->registerService();
1415#endif
1416
1417 matching = IOService::serviceMatching("IOPlatformExpert");
1418 assert(matching);
1419 found = nullptr;
1420 note = IOService::addMatchingNotification(gIOMatchedNotification, matching.get(), 0,
1421 ^bool (IOService * newService, IONotifier * notifier) {
1422 kprintf("found %s, %d\n", newService->getName(), newService->getRetainCount());
1423 found = newService;
1424 found->retain();
1425 return true;
1426 }
1427 );
1428 assert(note);
1429 assert(found);
1430 note->remove();
1431
1432 note = found->registerInterest(gIOBusyInterest,
1433 ^IOReturn (uint32_t messageType, IOService * provider,
1434 void * messageArgument, size_t argSize) {
1435 kprintf("%p messageType 0x%08x %p\n", provider, messageType, messageArgument);
1436 return kIOReturnSuccess;
1437 }).detach();
1438 assert(note);
1439 IOSleep(1 * 1000);
1440 note->remove();
1441 found->release();
1442
1443 return 0;
1444}
1445
1446static void
1447OSStaticPtrCastTests()
1448{
1449 // const& overload
1450 {
1451 OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1452 OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1453 assert(collection == dict);
1454 }
1455 {
1456 OSSharedPtr<OSDictionary> const dict = nullptr;
1457 OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1458 assert(collection == nullptr);
1459 }
1460 // && overload
1461 {
1462 OSSharedPtr<OSDictionary> dict = OSMakeShared<OSDictionary>();
1463 OSDictionary* oldDict = dict.get();
1464 OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1465 assert(collection.get() == oldDict);
1466 assert(dict == nullptr);
1467 }
1468 {
1469 OSSharedPtr<OSDictionary> dict = nullptr;
1470 OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1471 assert(collection == nullptr);
1472 assert(dict == nullptr);
1473 }
1474}
1475
1476static void
1477OSConstPtrCastTests()
1478{
1479 // const& overload
1480 {
1481 OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1482 OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1483 assert(dict2 == dict);
1484 }
1485 {
1486 OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1487 OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1488 assert(dict2 == dict);
1489 }
1490 {
1491 OSSharedPtr<OSDictionary const> const dict = nullptr;
1492 OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1493 assert(dict2 == nullptr);
1494 }
1495 {
1496 OSSharedPtr<OSDictionary const> const dict = nullptr;
1497 OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1498 assert(dict2 == nullptr);
1499 }
1500
1501 // && overload
1502 {
1503 OSSharedPtr<OSDictionary const> dict = OSMakeShared<OSDictionary>();
1504 OSDictionary const* oldDict = dict.get();
1505 OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1506 assert(dict == nullptr);
1507 assert(dict2 == oldDict);
1508 }
1509 {
1510 OSSharedPtr<OSDictionary const> dict = nullptr;
1511 OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1512 assert(dict == nullptr);
1513 assert(dict2 == nullptr);
1514 }
1515}
1516
1517static void
1518OSDynamicPtrCastTests()
1519{
1520 OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1521 {
1522 OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1523 assert(collection != nullptr);
1524 }
1525 {
1526 OSSharedPtr<OSArray> array = OSDynamicPtrCast<OSArray>(dict);
1527 assert(array == nullptr);
1528 assert(dict != nullptr);
1529 }
1530 {
1531 OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1532 OSTaggedSharedPtr<OSCollection, OSCollection> collection = OSDynamicPtrCast<OSCollection>(taggedDict);
1533 assert(collection != nullptr);
1534 }
1535 {
1536 OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1537 OSTaggedSharedPtr<OSArray, OSCollection> array = OSDynamicPtrCast<OSArray>(taggedDict);
1538 assert(array == nullptr);
1539 assert(dict != nullptr);
1540 }
1541 {
1542 OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1543 assert(collection.get() == OSDynamicCast(OSDictionary, dict.get()));
1544 OSSharedPtr<OSDictionary> newDict = OSDynamicPtrCast<OSDictionary>(os::move(collection));
1545 assert(collection == nullptr);
1546 assert(newDict != nullptr);
1547 assert(newDict.get() == dict.get());
1548 }
1549}
1550
1551
1552class IOTestUserNotification : public IOUserNotification
1553{
1554 OSDeclareDefaultStructors(IOTestUserNotification);
1555};
1556
1557OSDefineMetaClassAndStructors(IOTestUserNotification, IOUserNotification)
1558
1559struct IOUserNotificationTestThreadArgs {
1560 IOTestUserNotification * userNotify;
1561 IOLock * lock;
1562 size_t * completed;
1563 size_t iterations;
1564};
1565
1566static bool
1567IOUserNotificationMatchingHandler( void * target __unused,
1568 void * ref __unused, IOService * newService __unused, IONotifier * notifier __unused )
1569{
1570 return true;
1571}
1572
1573static void
1574IOUserNotificationTestThread(void * arg, wait_result_t result __unused)
1575{
1576 IOUserNotificationTestThreadArgs * threadArgs = (IOUserNotificationTestThreadArgs *)arg;
1577
1578 OSSharedPtr<OSDictionary> dict = OSDictionary::withCapacity(0);
1579 OSSharedPtr<OSString> rootPath = OSString::withCStringNoCopy(":/");
1580 dict->setObject(gIOPathMatchKey, rootPath);
1581
1582 for (size_t i = 0; i < threadArgs->iterations; i++) {
1583 if (i % 2 == 0) {
1584 IONotifier * notify = IOService::addMatchingNotification( gIOWillTerminateNotification, dict.get(),
1585 &IOUserNotificationMatchingHandler, NULL );
1586 threadArgs->userNotify->setNotification(notify);
1587 } else {
1588 threadArgs->userNotify->setNotification(NULL);
1589 }
1590 }
1591
1592 threadArgs->userNotify->setNotification(NULL);
1593
1594 IOLockLock(threadArgs->lock);
1595 *threadArgs->completed = *threadArgs->completed + 1;
1596 IOLockWakeup(threadArgs->lock, (event_t)threadArgs->completed, true);
1597 IOLockUnlock(threadArgs->lock);
1598}
1599
1600static int
1601IOUserNotificationTests(__unused int newValue)
1602{
1603 constexpr size_t numThreads = 10;
1604 constexpr size_t numIterations = 500000;
1605 OSSharedPtr<IOTestUserNotification> userNotify = OSMakeShared<IOTestUserNotification>();
1606 IOLock * lock = IOLockAlloc();
1607 size_t threadsCompleted;
1608 size_t i = 0;
1609 thread_t threads[numThreads];
1610 kern_return_t kr;
1611 bool result;
1612
1613 struct IOUserNotificationTestThreadArgs threadArgs = {
1614 .userNotify = userNotify.get(),
1615 .lock = lock,
1616 .completed = &threadsCompleted,
1617 .iterations = numIterations,
1618 };
1619
1620 result = userNotify->init();
1621 assert(result);
1622
1623 for (i = 0; i < numThreads; i++) {
1624 kr = kernel_thread_start(&IOUserNotificationTestThread, (void *)&threadArgs, &threads[i]);
1625 assert(kr == KERN_SUCCESS);
1626 }
1627
1628 IOLockLock(lock);
1629 while (threadsCompleted < numThreads) {
1630 IOLockSleep(lock, &threadsCompleted, THREAD_UNINT);
1631 IOLog("%s: Threads completed: %zu/%zu\n", __func__, threadsCompleted, numThreads);
1632 }
1633 IOLockUnlock(lock);
1634
1635 for (i = 0; i < numThreads; i++) {
1636 thread_deallocate(threads[i]);
1637 }
1638
1639 userNotify->setNotification(NULL);
1640
1641 IOLockFree(lock);
1642
1643 return KERN_SUCCESS;
1644}
1645
1646static void
1647IOServiceMatchingSharedPtrTests()
1648{
1649 OSSharedPtr<const OSSymbol> name = OSSymbol::withCString("name");
1650 OSSharedPtr<const OSSymbol> value = OSSymbol::withCString("value");
1651
1652 {
1653 OSSharedPtr<OSDictionary> table;
1654 OSSharedPtr<OSDictionary> result = IOService::serviceMatching("name", table);
1655 assert(result);
1656 assert(result->getRetainCount() == 1);
1657
1658 table = result;
1659 assert(table->getRetainCount() == 2);
1660 OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching("name", table);
1661 assert(result2);
1662 assert(result2 == table);
1663 assert(result2->getRetainCount() == 3);
1664 }
1665
1666 {
1667 OSSharedPtr<OSDictionary> table;
1668 OSSharedPtr<OSDictionary> result = IOService::serviceMatching(name.get(), table);
1669 assert(result);
1670 assert(result->getRetainCount() == 1);
1671
1672 table = result;
1673 assert(table->getRetainCount() == 2);
1674 OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching(name.get(), table);
1675 assert(result2);
1676 assert(result2 == table);
1677 assert(result2->getRetainCount() == 3);
1678 }
1679
1680 {
1681 OSSharedPtr<OSDictionary> table;
1682 OSSharedPtr<OSDictionary> result = IOService::nameMatching("name", table);
1683 assert(result);
1684 assert(result->getRetainCount() == 1);
1685
1686 table = result;
1687 assert(table->getRetainCount() == 2);
1688 OSSharedPtr<OSDictionary> result2 = IOService::nameMatching("name", table);
1689 assert(result2);
1690 assert(result2 == table);
1691 assert(result2->getRetainCount() == 3);
1692 }
1693
1694 {
1695 OSSharedPtr<OSDictionary> table;
1696 OSSharedPtr<OSDictionary> result = IOService::nameMatching(name.get(), table);
1697 assert(result);
1698 assert(result->getRetainCount() == 1);
1699
1700 table = result;
1701 assert(table->getRetainCount() == 2);
1702 OSSharedPtr<OSDictionary> result2 = IOService::nameMatching(name.get(), table);
1703 assert(result2);
1704 assert(result2 == table);
1705 assert(result2->getRetainCount() == 3);
1706 }
1707
1708 {
1709 OSSharedPtr<OSDictionary> table;
1710 OSSharedPtr<OSDictionary> result = IOService::resourceMatching("name", table);
1711 assert(result);
1712 assert(result->getRetainCount() == 1);
1713
1714 table = result;
1715 assert(table->getRetainCount() == 2);
1716 OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching("name", table);
1717 assert(result2);
1718 assert(result2 == table);
1719 assert(result2->getRetainCount() == 3);
1720 }
1721
1722 {
1723 OSSharedPtr<OSDictionary> table;
1724 OSSharedPtr<OSDictionary> result = IOService::resourceMatching(name.get(), table);
1725 assert(result);
1726 assert(result->getRetainCount() == 1);
1727
1728 table = result;
1729 assert(table->getRetainCount() == 2);
1730 OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching(name.get(), table);
1731 assert(result2);
1732 assert(result2 == table);
1733 assert(result2->getRetainCount() == 3);
1734 }
1735
1736 {
1737 OSSharedPtr<OSDictionary> table;
1738 OSSharedPtr<OSDictionary> result = IOService::propertyMatching(name.get(), value.get(), table);
1739 assert(result);
1740 assert(result->getRetainCount() == 1);
1741
1742 table = result;
1743 assert(table->getRetainCount() == 2);
1744 OSSharedPtr<OSDictionary> result2 = IOService::propertyMatching(name.get(), value.get(), table);
1745 assert(result2);
1746 assert(result2 == table);
1747 assert(result2->getRetainCount() == 3);
1748 }
1749
1750 {
1751 OSSharedPtr<OSDictionary> table;
1752 OSSharedPtr<OSDictionary> result = IOService::registryEntryIDMatching(12, table);
1753 assert(result);
1754 assert(result->getRetainCount() == 1);
1755
1756 table = result;
1757 assert(table->getRetainCount() == 2);
1758 OSSharedPtr<OSDictionary> result2 = IOService::registryEntryIDMatching(12, table);
1759 assert(result2);
1760 assert(result2 == table);
1761 assert(result2->getRetainCount() == 3);
1762 }
1763}
1764
1765static int
1766OSSharedPtrTests(int)
1767{
1768 OSDynamicPtrCastTests();
1769 OSConstPtrCastTests();
1770 OSStaticPtrCastTests();
1771 IOServiceMatchingSharedPtrTests();
1772 return 0;
1773}
1774
1775static int
1776IOServiceStateNotificationTests(int)
1777{
1778 IOService * service = IOService::getSystemStateNotificationService();
1779 OSSharedPtr<OSString> str = OSString::withCString(kIOSystemStateClamshellKey);
1780 kern_return_t kr = service->StateNotificationItemCreate(str.get(), NULL);
1781 assert(kIOReturnSuccess == kr);
1782
1783 void (^sendClam)(OSBoolean * state) = ^void (OSBoolean * state) {
1784 OSSharedPtr<OSDictionary> value;
1785 kern_return_t kr;
1786
1787 value = OSDictionary::withCapacity(4);
1788 value->setObject("value", state);
1789 kr = IOService::getSystemStateNotificationService()->StateNotificationItemSet(str.get(), value.get());
1790 assert(kIOReturnSuccess == kr);
1791 };
1792 sendClam(kOSBooleanTrue);
1793 IOSleep(100);
1794 sendClam(kOSBooleanFalse);
1795
1796 str = OSString::withCString("test");
1797 OSSharedPtr<OSArray> array = OSArray::withCapacity(4);
1798 array->setObject(str.get());
1799 IOStateNotificationListenerRef listenerRef;
1800 kr = service->stateNotificationListenerAdd(array.get(), &listenerRef, ^kern_return_t () {
1801 IOLog("test handler\n");
1802 kern_return_t kr;
1803 OSDictionary * dict;
1804 kr = service->StateNotificationItemCopy(str.get(), &dict);
1805 if (kIOReturnSuccess == kr) {
1806 OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1807 dict->serialize(s.get());
1808 IOLog("test handler %s\n", s->text());
1809 }
1810 return kIOReturnSuccess;
1811 });
1812 assert(kIOReturnSuccess == kr);
1813
1814 OSSharedPtr<IOEventSource> es =
1815 IOServiceStateNotificationEventSource::serviceStateNotificationEventSource(
1816 service, array.get(),
1817 ^void () {
1818 IOLog("test es handler\n");
1819 kern_return_t kr;
1820 OSDictionary * dict;
1821 kr = service->StateNotificationItemCopy(str.get(), &dict);
1822 if (kIOReturnSuccess == kr) {
1823 OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1824 dict->serialize(s.get());
1825 IOLog("test es handler %s\n", s->text());
1826 }
1827 });
1828 assert(es);
1829 IOService::getPlatform()->getWorkLoop()->addEventSource(es.get());
1830 es->enable();
1831 IOSleep(30 * 1000);
1832 IOService::getPlatform()->getWorkLoop()->removeEventSource(es.get());
1833
1834 return kIOReturnSuccess;
1835}
1836
1837static int
1838IOMallocPageableTests(int)
1839{
1840 vm_size_t size = 0;
1841 vm_size_t alignment = 0;
1842
1843 for (size = 0; size <= 4 * page_size; size += 64) {
1844 for (alignment = 1; alignment <= page_size; alignment <<= 1) {
1845 uintptr_t alignMask = alignment - 1;
1846 void * addr = IOMallocPageable(size, alignment);
1847 if (addr == NULL) {
1848 IOLog("IOMallocPageable(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1849 return kIOReturnError;
1850 }
1851 if (((uintptr_t)addr & alignMask) != 0) {
1852 IOLog("IOMallocPageable(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1853 return kIOReturnError;
1854 }
1855 IOFreePageable(addr, size);
1856
1857 addr = IOMallocPageableZero(size, alignment);
1858 if (addr == NULL) {
1859 IOLog("IOMallocPageableZero(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1860 return kIOReturnError;
1861 }
1862 if (((uintptr_t)addr & alignMask) != 0) {
1863 IOLog("IOMallocPageableZero(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1864 return kIOReturnError;
1865 }
1866 for (char * ptr = (char *)addr; ptr < (char *)addr + size; ptr++) {
1867 if (*ptr != 0) {
1868 IOLog("IOMallocPageableZero(size=%u, alignment=%u) -> %p, byte at %p is nonzero\n", (uint32_t)size, (uint32_t)alignment, addr, ptr);
1869 }
1870 }
1871 IOFreePageable(addr, size);
1872 }
1873 }
1874
1875 return kIOReturnSuccess;
1876}
1877
1878static int
1879Test100367284(int)
1880{
1881 OSSharedPtr<IOService> entry;
1882 OSSharedPtr<IOService> replace;
1883 OSSharedPtr<IOService> root;
1884
1885 root = OSDynamicPtrCast<IOService>(IORegistryEntry::fromPath("/", gIODTPlane));
1886 entry = OSMakeShared<IOService>();
1887 entry->init();
1888 entry->attachToParent(root.get(), gIODTPlane);
1889 entry->attachToParent(root.get(), gIOServicePlane);
1890
1891 replace = OSMakeShared<IOService>();
1892 replace->init(entry.get(), gIODTPlane);
1893 replace->detachFromParent(root.get(), gIODTPlane);
1894
1895 return kIOReturnSuccess;
1896}
1897
1898// Test the lockForArbitration(not-required) path
1899
1900struct LockForArbitrationTestThreadArgs {
1901 OSSharedPtr<IOService> a;
1902 OSSharedPtr<IOService> b;
1903 IOLock lock;
1904 int state;
1905};
1906
1907static void
1908TestLockForArbitrationThread(void * arg, wait_result_t result __unused)
1909{
1910 LockForArbitrationTestThreadArgs * threadArgs = (LockForArbitrationTestThreadArgs *)arg;
1911 bool ok;
1912
1913 ok = threadArgs->b->lockForArbitration();
1914 assert(ok);
1915
1916 IOLockLock(&threadArgs->lock);
1917 threadArgs->state = 1;
1918 thread_wakeup(&threadArgs->state);
1919 IOLockUnlock(&threadArgs->lock);
1920
1921 ok = threadArgs->a->lockForArbitration(false);
1922 assert(!ok); // fails
1923 threadArgs->b->unlockForArbitration();
1924
1925 IOLockLock(&threadArgs->lock);
1926 threadArgs->state = 2;
1927 thread_wakeup(&threadArgs->state);
1928 IOLockUnlock(&threadArgs->lock);
1929}
1930
1931static int
1932TestLockForArbitration(int)
1933{
1934 struct LockForArbitrationTestThreadArgs threadArgs;
1935 thread_t thread;
1936 kern_return_t kr;
1937 bool ok;
1938
1939 threadArgs.a = OSMakeShared<IOService>();
1940 threadArgs.a->init();
1941 threadArgs.b = OSMakeShared<IOService>();
1942 threadArgs.b->init();
1943 IOLockInlineInit(&threadArgs.lock);
1944 threadArgs.state = 0;
1945
1946 ok = threadArgs.a->lockForArbitration();
1947 assert(ok);
1948
1949 IOLockLock(&threadArgs.lock);
1950 kr = kernel_thread_start(&TestLockForArbitrationThread, (void *)&threadArgs, &thread);
1951 assert(kr == KERN_SUCCESS);
1952 while (1 != threadArgs.state) {
1953 IOLockSleep(&threadArgs.lock, &threadArgs.state, THREAD_UNINT);
1954 }
1955 IOLockUnlock(&threadArgs.lock);
1956
1957 ok = threadArgs.b->lockForArbitration();
1958 assert(ok);
1959 threadArgs.b->unlockForArbitration();
1960 threadArgs.a->unlockForArbitration();
1961
1962 IOLockLock(&threadArgs.lock);
1963 while (2 != threadArgs.state) {
1964 IOLockSleep(&threadArgs.lock, &threadArgs.state, THREAD_UNINT);
1965 }
1966 IOLockUnlock(&threadArgs.lock);
1967 IOLockInlineDestroy(&threadArgs.lock);
1968
1969 return kIOReturnSuccess;
1970}
1971
1972// --
1973
1974#endif /* DEVELOPMENT || DEBUG */
1975
1976#ifndef __clang_analyzer__
1977// All the scary things that this function is doing, such as the intentional
1978// overrelease of an OSData, are hidden from the static analyzer.
1979static int
1980sysctl_iokittest(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
1981{
1982 int error;
1983 int newValue, changed;
1984
1985 error = sysctl_io_number(req, bigValue: 0, valueSize: sizeof(int), pValue: &newValue, changed: &changed);
1986 if (error) {
1987 return error;
1988 }
1989
1990#if DEVELOPMENT || DEBUG
1991 if (changed && (66 == newValue)) {
1992 IOReturn ret;
1993 OSSharedPtr<IOWorkLoop> wl = IOWorkLoop::workLoop();
1994 OSSharedPtr<IOCommandGate> cg = IOCommandGate::commandGate(wl.get());
1995 ret = wl->addEventSource(cg.get());
1996
1997 struct x {
1998 uint64_t h;
1999 uint64_t l;
2000 };
2001 struct x y;
2002
2003 y.h = 0x1111111122222222;
2004 y.l = 0x3333333344444444;
2005
2006 kprintf("ret1 %d\n", ret);
2007 ret = cg->runActionBlock(^(){
2008 printf("hello %d 0x%qx\n", wl->inGate(), y.h);
2009 return 99;
2010 });
2011 kprintf("ret %d\n", ret);
2012 }
2013
2014 if (changed && (999 == newValue)) {
2015 OSSharedPtr<OSData> data = OSData::withCapacity(16);
2016 data->release();
2017 }
2018
2019 if (changed && (newValue >= 6666) && (newValue <= 6669)) {
2020 OSSharedPtr<OSIterator> iter;
2021 IOService * service;
2022
2023 service = NULL;
2024 OSSharedPtr<OSDictionary> matchingDict = IOService::nameMatching("XHC1");
2025 iter = IOService::getMatchingServices(matchingDict.get());
2026 if (iter && (service = (IOService *) iter->getNextObject())) {
2027 if (newValue == 6666) {
2028 IOLog("terminating 0x%qx\n", service->getRegistryEntryID());
2029 service->terminate();
2030 } else if (newValue == 6667) {
2031 IOLog("register 0x%qx\n", service->getRegistryEntryID());
2032 service->registerService();
2033 }
2034 }
2035 if (service) {
2036 return 0;
2037 }
2038 }
2039
2040
2041 if (changed && (555 == newValue)) {
2042 IOServiceStateNotificationTests(newValue);
2043 }
2044#if TEST_ZLIB
2045 if (changed && (122 == newValue)) {
2046 error = TestZLib(newValue);
2047 assert(KERN_SUCCESS == error);
2048 }
2049#endif /* TEST_ZLIB */
2050 if (changed && newValue) {
2051 error = TestLockForArbitration(newValue);
2052 assert(KERN_SUCCESS == error);
2053 error = Test100367284(newValue);
2054 assert(KERN_SUCCESS == error);
2055 error = IOWorkLoopTest(newValue);
2056 assert(KERN_SUCCESS == error);
2057 error = IOServiceTest(newValue);
2058 assert(KERN_SUCCESS == error);
2059 error = OSCollectionTest(newValue);
2060 assert(KERN_SUCCESS == error);
2061 error = OSCollectionIteratorTests(newValue);
2062 assert(KERN_SUCCESS == error);
2063 error = OSAllocationTests(newValue);
2064 assert(KERN_SUCCESS == error);
2065 error = OSDataAllocationTests(newValue);
2066 assert(KERN_SUCCESS == error);
2067 error = OSBoundedArrayTests(newValue);
2068 assert(KERN_SUCCESS == error);
2069 error = OSBoundedArrayRefTests(newValue);
2070 assert(KERN_SUCCESS == error);
2071 error = OSBoundedPtrTests(newValue);
2072 assert(KERN_SUCCESS == error);
2073 error = OSValueObjectTests(newValue);
2074 assert(KERN_SUCCESS == error);
2075 error = IOMemoryDescriptorTest(newValue);
2076 assert(KERN_SUCCESS == error);
2077 error = OSSharedPtrTests(newValue);
2078 assert(KERN_SUCCESS == error);
2079 error = IOSharedDataQueue_44636964(newValue);
2080 assert(KERN_SUCCESS == error);
2081 error = IOUserNotificationTests(newValue);
2082 assert(KERN_SUCCESS == error);
2083 error = IOMallocPageableTests(newValue);
2084 assert(KERN_SUCCESS == error);
2085 error = IODataQueueDispatchSourceTests(newValue);
2086 assert(KERN_SUCCESS == error);
2087 }
2088#endif /* DEVELOPMENT || DEBUG */
2089
2090 return error;
2091}
2092
2093
2094SYSCTL_PROC(_kern, OID_AUTO, iokittest,
2095 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_KERN | CTLFLAG_LOCKED,
2096 NULL, 0, sysctl_iokittest, "I", "");
2097#endif // __clang_analyzer__
2098
2099#if DEVELOPMENT || DEBUG
2100
2101/*
2102 * A simple wrapper around an IOService. This terminates the IOService in free().
2103 */
2104class TestIOServiceHandle : public OSObject
2105{
2106 OSDeclareDefaultStructors(TestIOServiceHandle);
2107public:
2108 static TestIOServiceHandle * withService(IOService * service);
2109
2110private:
2111 bool initWithService(IOService * service);
2112 virtual void free() APPLE_KEXT_OVERRIDE;
2113
2114 IOService * fService;
2115};
2116
2117OSDefineMetaClassAndStructors(TestIOServiceHandle, OSObject);
2118
2119TestIOServiceHandle *
2120TestIOServiceHandle::withService(IOService * service)
2121{
2122 TestIOServiceHandle * handle = new TestIOServiceHandle;
2123 if (handle && !handle->initWithService(service)) {
2124 return NULL;
2125 }
2126 return handle;
2127}
2128
2129bool
2130TestIOServiceHandle::initWithService(IOService * service)
2131{
2132 fService = service;
2133 fService->retain();
2134 return true;
2135}
2136
2137void
2138TestIOServiceHandle::free()
2139{
2140 if (fService) {
2141 fService->terminate();
2142 OSSafeReleaseNULL(fService);
2143 }
2144}
2145
2146/*
2147 * Set up test IOServices. See the available services in xnu/iokit/Tests/TestServices.
2148 *
2149 * xnu darwintests use this sysctl to make these test services available. A send right is pushed
2150 * to the task that called the sysctl, which when deallocated removes the service. This ensures
2151 * that the registry isn't polluted by misbehaving tests.
2152 *
2153 * Since this sysctl allows callers to instantiate arbitrary classes based on their class name,
2154 * this can be a security concern. Tests that call this sysctl need the
2155 * kIOServiceTestServiceManagementEntitlementKey entitlement.
2156 */
2157static int
2158sysctl_iokit_test_service_setup(struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
2159{
2160 char classname[128] = {0};
2161 IOService * service; // must not release
2162 OSObject * obj = NULL; // must release
2163 IOService * provider = NULL; // must not release
2164 TestIOServiceHandle * handle = NULL; // must release
2165 mach_port_name_t name __unused;
2166 int error;
2167
2168 if (!IOTaskHasEntitlement(current_task(), kIOServiceTestServiceManagementEntitlementKey)) {
2169 error = EPERM;
2170 goto finish;
2171 }
2172
2173 error = sysctl_handle_string(oidp, classname, sizeof(classname), req);
2174 if (error != 0) {
2175 goto finish;
2176 }
2177
2178 /*
2179 * All test services currently attach to IOResources.
2180 */
2181 provider = IOService::getResourceService();
2182 if (!provider) {
2183 IOLog("Failed to find IOResources\n");
2184 error = ENOENT;
2185 goto finish;
2186 }
2187
2188 obj = OSMetaClass::allocClassWithName(classname);
2189 if (!obj) {
2190 IOLog("Failed to alloc class %s\n", classname);
2191 error = ENOENT;
2192 goto finish;
2193 }
2194
2195 service = OSDynamicCast(IOService, obj);
2196
2197 if (!service) {
2198 IOLog("Instance of class %s is not an IOService\n", classname);
2199 error = EINVAL;
2200 goto finish;
2201 }
2202
2203 if (!service->init()) {
2204 IOLog("Failed to initialize %s\n", classname);
2205 error = EINVAL;
2206 goto finish;
2207 }
2208
2209 if (!service->attach(provider)) {
2210 IOLog("Failed to attach %s\n", classname);
2211 error = EINVAL;
2212 goto finish;
2213 }
2214
2215 if (!service->start(provider)) {
2216 IOLog("Failed to start %s\n", classname);
2217 error = EINVAL;
2218 goto finish;
2219 }
2220
2221 handle = TestIOServiceHandle::withService(service);
2222 if (!handle) {
2223 IOLog("Failed to create service handle\n");
2224 error = ENOMEM;
2225 goto finish;
2226 }
2227 name = iokit_make_send_right(current_task(), handle, IKOT_IOKIT_OBJECT);
2228
2229 error = 0;
2230
2231finish:
2232
2233 OSSafeReleaseNULL(obj);
2234 OSSafeReleaseNULL(handle);
2235 return error;
2236}
2237
2238
2239SYSCTL_PROC(_kern, OID_AUTO, iokit_test_service_setup,
2240 CTLTYPE_STRING | CTLFLAG_WR | CTLFLAG_KERN | CTLFLAG_LOCKED,
2241 NULL, 0, sysctl_iokit_test_service_setup, "-", "");
2242
2243#endif /* DEVELOPMENT || DEBUG */
2244
2245
2246static __unused void
2247CastCompileTest(OSObject *obj)
2248{
2249 IOService * service1 = OSDynamicCast(IOService, obj);
2250 if (service1) {
2251 service1->terminate();
2252 }
2253 IOService *service2 = OSRequiredCast(IOService, obj);
2254 if (service2) {
2255 service2->terminate();
2256 }
2257}
2258